C-ben miért nem működik "ez" a ciklus?
A feladat kiíratni a 6-ra végződő négyzetszámokat 1000-től visszafelé, és a feladatot meg is oldottam már, de egy másiknál működött a while ciklus úgy, hogy pl.
int j = 0;
while (j < 10 && j++) ...
Így a
while (j < 10) {
...
j++;
}
lerövidíthető.
Ennél a feladatnál ez már nem működött, és nem tudom, mi miatt.
Így oldottam meg, és a második, belső ciklust akartam rövidíteni:
int i = 1000, j;
while (i > 0) {
if (i % 10 == 6) {
j = 0;
while (j * j <= i) {
if (j * j == i) printf("%d\t%d\n", j, i);
j++;
}
}
i--;
}
printf("\nend\n");
Bele se merek gondolni, hogy ki/hol tanította neked a programozást! Mi a halálért használsz 2 db egymásba ágyazott while ciklus egy olyan feladathoz, amit egy számlálós ciklussal egyszerűbben és hatékonyabban megoldasz?
for(int i = sqrt(1000); i > 0; i--){
if (i*i % 10 == 6) printf("%d\n", i*i);
}
Ennek már az első esetben sem kéne működnie.
Ez a kezdeti inicializálásod:
int j = 0;
Utána teszel egy ilyen ciklusfeltételt:
while(j < 10 && j++)
Ez hogyan értékelődne ki a legelső ciklusiterációban?
0 < 10 && 0
A (0 < 10) true-ra értékelődik ki, a 0 integer viszont false-nak felel meg. Tehát a ciklus a legelső lefutása előtt végetér. Viszont, ha postfix helyett prefix incemernt operátort használnál:
while(j < 10 && ++j)
Akkor ez már úgy értékelődne ki, hogy:
(0 < 10 && 1)
Ami máris igazra értékelődne. Persze itt fennáll az a probléma, hogy a j változót az első logikai kifejezés után növeled, így a 10. cikluslépésben a j < 10 esetében j=9, majd a ciklusfeltétel végére már j=10. Persze ha neked eleve eza szándékod vele, akkor hajrá.
Itt lefut jól:
char a, b;
scanf("%c %c", &a, &b);
if (a > b) {
a += b;
b = a - b;
a = a - b;
}
while (a < b && a++) printf("%c\t", a);
Köszi #3 :) rávilßgítottál a problémára. Ha 0-ról indítom a j-t, akkor, mivel a 0 false-t jelent, a ciklus nem indul el.
Így a megoldás j-t 1-ről indítani :)
Így a kód:
int i = 1000, j;
while (i >0) {
if (i % 10 == 6) {
j = 1;
while (j * j <= i && j++)
if (j * j == i) printf("%d\t%d\n", j, i);
}
i--;
}
printf("\nend\n");
.
A külső ciklus is működik így:
int i = 1000, j;
while (i >0 && i--)
if (i % 10 == 6) {
j = 1;
while (j * j <= i && j++)
if (j * j == i) printf("%d\t%d\n", j, i);
}
printf("\nend\n");
Egyébként a ciklusfeltételbe tenni egy műveletet, aminek semmi köze a feltételhez elég nagy gányolás.
Ezt kezdőknek tanítani meg egyenesen tarkólövést érdemelne.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!