1 Hernyák Zoltán Web: Magasszintű Programozási Nyelvek I. Eszterházy Károly Főiskola Számítástudományi tsz
2 Programvezérlési szerkezetek Az utasítások végrehajtási sorrendjét szabályozzák. 1.Szekvencia: ugyanabban a sorrendben kell végrehajtani az utasításokat, amilyen sorrendben az a forráskódban szerepel 2.Szelekció (elágazás): utasítások csoportját vagy végre kell hajtani, vagy nem 3.Iteráció (ciklus): utasítások csoportját ismételten, többször is végre kell hajtani
3 A logikai feltételt (kifejezést) ciklus vezérlő feltételnek hívják. Az utasítást (utasításblokkot) ciklusmagnak hívják. A vezérlő feltétel szabályozza, hogy meddig kell végrehajtani a ciklusmag utasításait. while ( logikai-feltétel ) utasítás;
4 Pozitív vezérlésű ciklusok: a ciklusmag utasításait mindaddig újra-és-újra végre kell hajtani, amíg a vezérlő feltétel értéke IGAZ. Ciklusok osztályozása vezérlés szerint Ez esetben a ciklus vezérlő feltételét ‘ciklusban maradás feltételének’ szokták hívni.
5 Ciklusok osztályozása vezérlés szerint Negatív vezérlésű ciklusok: a ciklusmag utasításait addig kell ismételni, amíg a vezérlő feltétel értéke HAMIS. Ez esetben a ciklus vezérlő feltételét ‘ciklusból kilépés feltételének’ szokták hívni.
6 Előltesztelő ciklusok: a, kiértékelődik a ciklus vezérlő feltétele b, ha nem megfelelő, akkor ‘e’ lépés c, ciklusmag végrehajtása d, ugrás az ‘a’ lépésre e, futás folytatása a ciklust követő következő utasítással (ciklus vége) Ciklusok osztályozása tesztelés szerint
7 Pozitív vezérlésű előltesztelős ciklus: vezérlő feltétel Ciklusmag utasításai IGAZ HAMIS
8 Negatív vezérlésű előltesztelős ciklus: vezérlő feltétel Ciklusmag utasításai HAMIS IGAZ
9 Fontos jellemzőjük, hogy elképzelhető olyan eset, hogy a ciklusmag egyetlen egyszer sem hajtódik végre, amennyiben a vezérlő feltétel már legelső esetben sem megfelelő értékű. Ekkor a ciklus ‘el sem indul’. Előltesztelő ciklusok
10 Hátultesztelő ciklusok: a, ciklusmag végrehajtása b, kiértékelődik a ciklus vezérlő feltétele b, ha megfelelő, akkor ‘a’ lépés újra c, futás folytatása a ciklust követő következő utasítással (ciklus vége) Ciklusok osztályozása tesztelés szerint
11 Pozitív vezérlésű hátultesztelős ciklus: vezérlő feltétel Ciklusmag utasításai IGAZ HAMIS
12 Negatív vezérlésű hátultesztelős ciklus: vezérlő feltétel Ciklusmag utasításai HAMIS IGAZ
13 Fontos jellemzőjük, hogy a ciklusmag egyszer garantáltan végrehajtódik, legfeljebb többször már nem. Hátultesztelős ciklusok
while (feltétel) utasítás; while (feltétel) utasítás; 14 Pozitív vezérlésű logikai előltesztelős ciklus while (feltétel) { utasítás; } köv.utasítás while (feltétel) { utasítás; } köv.utasítás IGAZ? HAMIS? IGAZ! HAMIS!
do utasítás; while (feltétel); do utasítás; while (feltétel); 15 Pozitív vezérlésű logikai hátultesztelős ciklus do { utasítás; } while (feltétel); köv.utasítás do { utasítás; } while (feltétel); köv.utasítás IGAZ? HAMIS?IGAZ!HAMIS!
16 Példa: int i=1; while (i<=10) { Console.WriteLine(i); i++;// i = i+1; } Console.WriteLine(”Kész”); int i=1; while (i<=10) { Console.WriteLine(i); i++;// i = i+1; } Console.WriteLine(”Kész”);
17 Példa: int a = int.Parse( Console.ReadLine() ); int i=2, db=0; while (i<a) { if (a%i==0) db++; i++; } Console.WriteLine(”Db={0}”,db); int a = int.Parse( Console.ReadLine() ); int i=2, db=0; while (i<a) { if (a%i==0) db++; i++; } Console.WriteLine(”Db={0}”,db);
18 BREAK utasítás A „break” azonnal terminálja az őt tartalmazó ciklust, a végrehajtás azonnal a ciklust követő utasításra ugrik.
19 Példa (‘középentesztelős’ ciklus): int db=0; while (true) { int a = int.Parse( Console.ReadLine() ); if (a==0) break; if (a%2==0) db++; } Console.WriteLine(”Db={0}”,db); int db=0; while (true) { int a = int.Parse( Console.ReadLine() ); if (a==0) break; if (a%2==0) db++; } Console.WriteLine(”Db={0}”,db);
20 CONTINUE utasítás A „continue” azonnal befejezi az aktuális ciklusmag végrehajtását (átugorja a maradék sorokat), és a vezérlés átkerül a ciklus vezérlő feltételének kiértékelésére.
21 Példa: int i=0,ossz=0; while (i<10) { int a = int.Parse( Console.ReadLine() ); if (a<0) continue ossz = ossz + a; i++; } Console.WriteLine(”Osszeg={0}”,ossz); int i=0,ossz=0; while (i<10) { int a = int.Parse( Console.ReadLine() ); if (a<0) continue ossz = ossz + a; i++; } Console.WriteLine(”Osszeg={0}”,ossz);
22 FOR ciklus Logikai előltesztelős ciklusok csoportjába tartozik. Működése szimulálható WHILE ciklussal…
23 Példa: int i=0; while (i<10) { … i++; } int i=0; while (i<10) { … i++; } for (int i=0;i<10;i++) { … } for (int i=0;i<10;i++) { … }
24 for(kezdőkif; log.feltétel; it.lépés) ut; Kezdőkifejezés általában értékadó utasítás csak egyszer hajtódik végre a ciklus vezérlő feltétele, pozitív vezérlésű, előltesztelős eset Iterációs lépés minden ciklusmag végrehajtás után automatikusan lefut ez a lépés is ciklusmag a, kezdőkif. végrehajtása b, amennyiben feltétel hamis –> break c, ciklusmag d, iterációs lépés e, újra ‘b’ lépés
25 for(kezdőkif; log.feltétel; it.lépés) ut; BREAK: hasonlóan működik, azonnal kilép a for ciklusból a következő utasításra. CONTINUE: először az iterációs lépésre ugrik, csak utána a feltétel kiértékelésre!
26 Példa: int ossz=0; for (int i=0;i<10;i++) { int a = int.Parse( Console.ReadLine() ); if (a<0) continue ossz = ossz + a; } Console.WriteLine(”Osszeg={0}”,ossz); int ossz=0; for (int i=0;i<10;i++) { int a = int.Parse( Console.ReadLine() ); if (a<0) continue ossz = ossz + a; } Console.WriteLine(”Osszeg={0}”,ossz); ez uaz, mint a 21-es fólia while ciklusa?
27 foreach ciklus Lista-alapú ciklus, egy adott lista minden elemét fel kell dolgozni egyesével, később lesz szó róla a lista mint adatszerkezet ismertetése után