menu
shopping_cart
0
KOSÁR

19. lecke

A ciklusos dolgok bedurvulnak

lightbulb_outlineA végtelen ciklus és az egymásba ágyazás

Végtelen ciklus

Vajon mi történik akkor, ha elrontjuk a feltétel részt? Nézzük meg azt az esetet, amikor a ciklust 0-ról indítjuk el, és azt szabjuk feltételnek, hogy addig fusson, amíg a ciklusváltozó nagyobb, mint -10:

  • ha 0-tól indul a ciklus
  • és feltételnek azt adtuk meg, hogy ciklus > -10
  • akkor a feltétel mindig igaz lesz, hisz egy -10-nél nagyobb számhoz +2-t adva továbbra is -10-nél nagyobb lesz a szám
  • soha nem fog leállni a kiírás, a számok csak pörögnek, pörögnek...
  • ez a végtelen ciklus
#include<stdio.h>

int main(){

    int ciklus;

    for(ciklus = 0; ciklus>=-10; ciklus=ciklus+2 ){
        printf("%d ", ciklus);
    }

return 0;
}

vegtelen.c c

Persze itt online nem látjuk olyan szépen az eredményt, mert az oldalunk leállítja ezt az amúgy hibás működésű programot - de ha egy offline fejlesztőkörnyezetben kipróbáljuk, akkor csak pörögnek és pörögnek a számok...

Végtelen ciklust úgy is elő lehet idézni, ha teljes egészében kihagyjuk a feltétel részt, így nincs ami leállítsa a vezérlést:

#include<stdio.h>

int main(){

    int ciklus;

    for(ciklus = 0;        ; ciklus=ciklus+2 ){
        printf("%d ", ciklus);
    }

return 0;
}

vegtelen.c c

A végtelen ciklus érdekes jószág azonban kerülni kell, hisz ez hibás programműködés. Ha sokáig hagyjuk futni a végtelen ciklust, akkor egyszer csak elérjük az int típus határát, a kb 2 milliárdos számértéket, ekkor a számláló átfordul és kezdi a negatív végén a számegyenesnek a számolást -2 milliárdánál.

Nézzük meg a FOR ciklus folyamatábráját:

A folyamatábrában látható egy hurok, amiben addig körözünk amíg a feltétel igaz. Hamis feltétel esetén folytatjuk a programot a többi paranccsal.

Feladat: 3-mal osztható számok

Kérjünk be a felhasználótól egy számot és írjuk ki eddig az összes 3-mal osztható pozitív egész számot.

Tervezzük meg az algoritmust:

  • Milyen változók kellenek?
    • kell egy a bekért számnak (szam)
    • kell egy a ciklusváltozónak (i)
  • Milyen építőelemekből álljon az algoritmus?
    • Előbb azt kell meggondolni hogyan csináljuk a való életben?
    • A kezdők úgy csinálnák, hogy elkezdenék nézni egyesével 0-tól a számokat fejben, és csak azokat írják le egy papírra, amiben egész számszor megvan a 3.
    • A haladók tudják, hogy a 3-mal osztható számok pontosan 3 távolságra helyezkednek el egymástól.

A kezdő megoldás:

#include<stdio.h>

int main(){

    int i;  //ciklusvaltozo
    int szam;   //a bekért szám

    scanf("%d", &szam);

    for(i=0; i<=szam; i=i+1){
        if( i % 3 == 0){  printf("%d ", i);  }
    }

return 0;
}

harommaloszthato.c c 12

A szokás az, hogy a ciklusváltozókat az "i" betűtől kezdődően csak 1 darab karakterrel nevezzük el, így nem kell annyit gépeni. Tehát a programozók ciklusváltozó nevének az i,j,k… betűket szokták használni. Létrehozunk egy ”szam” nevű változót is, amibe bekérjük a felhasználótól, hogy meddig írjuk ki a hárommal osztható számokat.

Ezután létrehozunk egy FOR ciklust, ami végigpásztázza ezt a tartományt. A FOR cikluson belül van egy IF, ami megvizsgálja az összes ciklusváltozó értéket, ami létrejöhet, és ha talál egy olyat amiben maradék nélkül megvan a 3, akkor kiírja ezt a ciklusváltozó értéket, tehát az ”i”-t.

Ez az első kódunk, ami egymásba ágyazást alkalmaz. Az egymásba ágyazás azt jelenti, hogy egy programszerkezet egy másik belsejébe van belerakva. A most megírt program egy FOR-ba ágyazott IF-et tartalmaz:

Az egymásba ágyazások előnye, hogy segítéségével bonyolult problémákat is meg tuduk oldani, mert egy külső programszerkezet változóit gond nélkül kezelhetjük egy belső programszerkezettel. Ez történik most is: A FOR ciklusváltozóját megvizsgáljuk az IF-fel, és kiírjuk ha kell.

A haladó megoldás:

Egyszerűen írunk egy for ciklust, ami 3-asával léptet, egészen a megadott számig.

#include<stdio.h>

int main(){

    int i;  //ciklusvaltozo
    int szam;   //a bekért szám

    scanf("%d", &szam);

    for(i=0; i<=szam; i=i+3 ){
        printf("%d ", i);
    }

return 0;
}

harommal_egyszeru.c c 12