Kezdőoldal » Számítástechnika » Programozás » C-ben miért nem működik "ez"...

C-ben miért nem működik "ez" a ciklus?

Figyelt kérdés

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");



2018. szept. 15. 23:42
1 2
 1/14 anonim válasza:

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);

}

2018. szept. 15. 23:56
Hasznos számodra ez a válasz?
 2/14 A kérdező kommentje:
Tudom, de órán még nem vettük, ezért nem használhatom, elfelejtettem írni.
2018. szept. 16. 00:04
 3/14 anonim ***** válasza:

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á.

2018. szept. 16. 00:05
Hasznos számodra ez a válasz?
 4/14 A kérdező kommentje:
Ja, sqrt()-t sem lehet, "kézzel" kell megcsinálni, úgy feladat.
2018. szept. 16. 00:14
 5/14 A kérdező kommentje:

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);

2018. szept. 16. 00:21
 6/14 A kérdező kommentje:

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");



.

2018. szept. 16. 00:40
 7/14 A kérdező kommentje:

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");

2018. szept. 16. 00:48
 8/14 anonim ***** válasza:
100%

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.

2018. szept. 16. 07:40
Hasznos számodra ez a válasz?
 9/14 A kérdező kommentje:
Nem tanította senki. Feladat volt kiíratni 2 betű közti betűket (írtam a kódját feljebb) úgy, hogy a ciklusban csak 1 parancs lehet, és kíváncsiságból átraktam a léptetést a ciklusfejbe, és nem lett hiba bélőle.
2018. szept. 16. 11:50
 10/14 anonim ***** válasza:
Jól van, kipróbáltad, működik, de most már felejtsd el, semmi haszna.
2018. szept. 16. 14:35
Hasznos számodra ez a válasz?
1 2

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

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!