U programu se kriju tri problematične greške koje ga ujedno sprječavaju da se program izvrši i da dođe do kraja.
1) Uvjet "j!=0" je uvijek istinit zbog toga što, kada određeni broj j dijeliš prostim brojevima, on će u određenom koraku doći do vrijednosti -1 ili 1 (ovisi je li i negativan ili pozitivan). Uvjet "j%p==0" se nikada neće ispuniti jer je p>1 (i raste), stoga nikako neće dijeliti broj -1 ili 1. Shodno tome, broj j nikada neće biti jednak nuli i program je zaglavio u beskonačnoj while petlji.
2) Naredba "p++" je na krivom mjestu. Ona je izvan while petlje, što znači da ti zapravo j pokušavaš podijeliti s brojem 2 koliko god možeš, a to nije bio cilj.
Također, "p++" bi se trebao izvršiti samo ako broj j više nije djeljiv s trenutnim brojem p. Naime, j može, npr., biti djeljiv s 4, stoga bi trebali dva puta podijeliti s 2 i onda petlja ide dalje.
Program bi trebao ići ovako:
[code:1]while(j!=-1||j!=1)
{
if(j%p==0)
{
...
}
else
++p;
}[/code:1]
3) Naredba "scanf("%%");" nema smisla, a još uz to i zaustavlja program te se ne može zatvoriti. To treba maknuti.
Program bi sada trebao raditi (barem meni radi)! :)
To je što se tiče tvoje prve verzije programa. Ovu drugu još nisam pogledao, sad ću je proučiti...
Inače, ako u zadatku slučajno piše "ignorirajući kratnost", tada bi za svaki broj svaki prosti djelitelj trebali ubrojiti samo jednom. Npr., ako je j=32, tada ne bi trebali sumi prebrojiti 2+2+2+2+2=12, nego samo 2. Tada samo ubaci uvjet koji će svaki prosti broj prebrojiti samo jednom.
Naravno, ako to ne piše, program ovako valja (pretpostavljam da se to traži).
P. S. Također, tvoj program uopće ne provjerava je li neki broj prost ili nije, međutim, to nije ni potrebno, zato što, kada određeni broj dijeliš s nekim prostim brojem koliko god možeš, taj broj poslije neće biti djeljiv s nijednim njegovim višekratnikom, tj. neće biti djeljiv s nijednim složenim brojem većim od njega. Stoga neće ni ići u traženu sumu. :D
(Ovo podsjeća na Eratostenovo sito s nedavnog predavanja, barem za moju grupu.)
------
Što se tiče druge verzije programa, imaš 2 ključne greške (inače program funkcionira):
1) Krivo unosiš broj n. Treba ići "%d", a ne "&n".
(Ovakve greške su vjerovatno najgore koje se mogu napraviti. Teško ih je vidjeti, ali se zato lako da iznervirati oko tvrdoglavog nefunkcionalnog programa.)
2) U funkciji, ispred "p++" treba ići "else" zbog toga što neki broj može biti djeljiv s nekom većom potencijom prostog broja (npr., s 4, 8, 16 ili više, a ne samo s 2).
U programu se kriju tri problematične greške koje ga ujedno sprječavaju da se program izvrši i da dođe do kraja.
1) Uvjet "j!=0" je uvijek istinit zbog toga što, kada određeni broj j dijeliš prostim brojevima, on će u određenom koraku doći do vrijednosti -1 ili 1 (ovisi je li i negativan ili pozitivan). Uvjet "j%p==0" se nikada neće ispuniti jer je p>1 (i raste), stoga nikako neće dijeliti broj -1 ili 1. Shodno tome, broj j nikada neće biti jednak nuli i program je zaglavio u beskonačnoj while petlji.
2) Naredba "p++" je na krivom mjestu. Ona je izvan while petlje, što znači da ti zapravo j pokušavaš podijeliti s brojem 2 koliko god možeš, a to nije bio cilj.
Također, "p++" bi se trebao izvršiti samo ako broj j više nije djeljiv s trenutnim brojem p. Naime, j može, npr., biti djeljiv s 4, stoga bi trebali dva puta podijeliti s 2 i onda petlja ide dalje.
Program bi trebao ići ovako:
Kod: | while(j!=-1||j!=1)
{
if(j%p==0)
{
...
}
else
++p;
} |
3) Naredba "scanf("%%");" nema smisla, a još uz to i zaustavlja program te se ne može zatvoriti. To treba maknuti.
Program bi sada trebao raditi (barem meni radi)!
To je što se tiče tvoje prve verzije programa. Ovu drugu još nisam pogledao, sad ću je proučiti...
Inače, ako u zadatku slučajno piše "ignorirajući kratnost", tada bi za svaki broj svaki prosti djelitelj trebali ubrojiti samo jednom. Npr., ako je j=32, tada ne bi trebali sumi prebrojiti 2+2+2+2+2=12, nego samo 2. Tada samo ubaci uvjet koji će svaki prosti broj prebrojiti samo jednom.
Naravno, ako to ne piše, program ovako valja (pretpostavljam da se to traži).
P. S. Također, tvoj program uopće ne provjerava je li neki broj prost ili nije, međutim, to nije ni potrebno, zato što, kada određeni broj dijeliš s nekim prostim brojem koliko god možeš, taj broj poslije neće biti djeljiv s nijednim njegovim višekratnikom, tj. neće biti djeljiv s nijednim složenim brojem većim od njega. Stoga neće ni ići u traženu sumu.
(Ovo podsjeća na Eratostenovo sito s nedavnog predavanja, barem za moju grupu.)
------
Što se tiče druge verzije programa, imaš 2 ključne greške (inače program funkcionira):
1) Krivo unosiš broj n. Treba ići "%d", a ne "&n".
(Ovakve greške su vjerovatno najgore koje se mogu napraviti. Teško ih je vidjeti, ali se zato lako da iznervirati oko tvrdoglavog nefunkcionalnog programa.)
2) U funkciji, ispred "p++" treba ići "else" zbog toga što neki broj može biti djeljiv s nekom većom potencijom prostog broja (npr., s 4, 8, 16 ili više, a ne samo s 2).
|