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 0 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48 50 52 54 56 58 60 62 64 66 68 70 72 74 76 78 80 82 84 86 88 90 92 94 96 98 100 102 104 106 108 110 112 114 116 118 120 122 124 126 128 130 132 134 136 138 140 142 144 146 148 150 152 154 156 158 160 162 164 166 168 170 172 174 176 178 180 182 184 186 188 190 192 194 196 198 200 202 204 206 208 210 212 214 216 218 220 222 224 226 228 230 232 234 236 238 240 242 244 246 248 250 252 254 256 258 260 262 264 266 268 270 272 274 276 278 280 282

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 é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;
}

vegtelen2.c c 0 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48 50 52 54 56 58 60 62 64 66 68 70 72 74 76 78 80 82 84 86 88 90 92 94 96 98 100 102 104 106 108 110 112 114 116 118 120 122 124 126 128 130 132 134 136 138 140 142 144 146 148 150 152 154 156 158 160 162 164 166 168 170 172 174 176 178 180 182 184 186 188 190 192 194 196 198 200 202 204 206 208 210 212 214 216 218 220 222 224 226 228 230 232 234 236 238 240 242 244 246 248 250 252 254 256 258 260 262 264 266 268 270 272 274 276 278 280 282

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 0 3 6 9 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;
}

egyszerubben.c c 12 0 3 6 9 12

Jelentkezz be a hozzászóláshoz.