C blokk · Vezérlési szerkezetek · 5. tananyag
A C4-es for akkor jó, ha előre tudod a lépésszámot. De a legtöbb igazi ismétlés nem ilyen: „addig kérdezz, amíg számot nem kapok”, „addig fusson a menü, amíg ki nem lép”. És ma váltjuk be a C blokk legrégebbi ígéretét: a program végre újra tud kérdezni hibás bevitelnél.
for és mikor
while/do-while.while ciklust írsz —
elöltesztelő: akár nulla kör is lehet.do-while ciklust írsz —
hátultesztelő: legalább egy kör.while + !TryParse).| Kérdés | Ciklus |
|---|---|
| „Pontosan N-szer?” — a lépésszám előre ismert | for (C4) |
| „Amíg igaz egy feltétel?” — lehet, hogy egyszer sem | while |
| „Legalább egyszer, aztán amíg igaz?” | do-while |
A for valójában a while
csinosabb testvére: a három fejrészt csomagolja egybe. A
while-nál ezek szétszedve, a te felelősségedre kerülnek a helyükre.
int i = 1; // "inicializálás" — a ciklus előtt while (i <= 5) // feltétel — minden kör ELŐTT { Console.WriteLine(i); i++; // "léptetés" — a TE dolgod a törzsben! }
Igazi példa — a B9.9-es lekötött betét folytatása: hány év alatt duplázódik? Ezt nem tudjuk előre — pont ezért while:
decimal egyenleg = 500000m; const decimal Kamat = 0.065m; int ev = 0; while (egyenleg < 1000000m) { egyenleg *= 1 + Kamat; ev++; } Console.WriteLine($"{ev} év alatt éri el az egymilliót: {egyenleg:N0} Ft.");
A ciklusnak itt is van „léptetése” — az egyenleg nő minden körben, így a feltétel egyszer biztosan hamissá válik.
Ha a törzs nem változtat a feltételen, a program „megfagy”: fut, de sosem ér véget. A konzol nem válaszol — a VS-ben a piros négyzet (Stop) állítja le. Nem összeomlás, hanem logikai hiba: keresd meg, mi kellene, hogy hamissá tegye a feltételt, és tedd be a törzsbe.
do { // törzs — ez LEGALÁBB EGYSZER lefut } while (feltetel); // ← figyelem: itt pontosvessző jár!
while (…) után
pontosvessző áll — az egyetlen hely, ahol a
ciklusfej után tényleg ; jár!A kérdés: ismert-e a lépésszám — és kell-e legalább egy kör?
A C1 óta ígérjük: a program hibás bevitelnél ne csak szóljon — kérdezzen újra, amíg jó nem lesz. Íme a recept, amelyet mostantól mindenhol használni fogsz:
int eletkor; // az out változó KÍVÜL — a ciklus után is kell! Console.Write("Hány éves vagy? "); while (!int.TryParse(Console.ReadLine(), out eletkor)) { Konzol.Hiba("Ez nem egész szám — próbáld újra!"); Console.Write("Hány éves vagy? "); } Konzol.Siker($"Rendben: {eletkor} év.");
Hogyan olvasd? „Amíg a beolvasás nem
sikerül (! —
C1),
ismételj: hibaüzenet, új kérdés.” Ha a felhasználó elsőre jót ír, a
törzs egyszer sem fut — pont ezért while, nem do-while.
eletkor a ciklus előtt,
önállóan van deklarálva: a
C4-es hatókör-szabály
miatt így a ciklus után is él.int tipp; do { Console.Write("Tipp (1–6): "); } while (!int.TryParse(Console.ReadLine(), out tipp) || tipp < 1 || tipp > 6);
A feltétel: „ismételj, ha nem szám VAGY kilóg a tartományból”.
| Tünet | Mi történt? | Mit tegyél? |
|---|---|---|
| a program „megfagy”, nem válaszol | végtelen ciklus: a törzs nem változtatja a feltételt | tedd a törzsbe a „léptetést”; leállítás: Stop a VS-ben |
| a menü-ciklus sosem áll meg | || került a záró feltételbe && helyett | „nem k ÉS nem K” — gondold végig igazságtáblával |
| a ciklus egyszer sem fut, pedig kellene | while-t írtál oda, ahol legalább egy kör kell | bevitelhez, menühöz do-while |
CS1002: ; expected a do-while végén | lemaradt a pontosvessző a while (…) után | while (feltetel); — itt jár a ; |
| a while utáni blokk egyszer, feltétel nélkül fut | pontosvessző a while fej után: üres törzs | a fej után nincs ; (a do-while VÉGÉN van!) |
| mindig ugyanazt az értéket vizsgálja | a beolvasás a cikluson KÍVÜL maradt | a ReadLine/ReadKey a törzsbe (vagy a feltételbe) kerüljön |
CS0165 a ciklus utáni felhasználásnál | az out/beolvasott változó a ciklusban volt deklarálva | deklaráld a ciklus előtt (makacs beolvasás receptje) |
SzamKitalalo, .NET 10 +
Konzol.cs.Konzol.Siker + hány
próbálkozásból sikerült.Szamkitalalo: while + makacs beolvasas.Betűre és tartományon kívüli számra nem áll le, csak újrakérdez; a próbálkozás-számláló pontos; a titkos szám elsőre eltalálva is jól működik.
⭐ alap · ⭐⭐ haladó · ⭐⭐⭐ kihívás
Visszaszámlálás újra: írd át a C4.1-es visszaszámlálót while ciklusra — ugyanaz a kimenet, más szerkezet.
Felezgető: kérj be egy pozitív egészet, és írd ki, hányszor felezhető (egészosztással), amíg 1-nél nagyobb. Pl. 100 → 50 → 25 → 12 → 6 → 3 → 1: 6 felezés.
PIN-kód: tárolt PIN, a felhasználónak legfeljebb 3 próbálkozása van (do-while + számláló). Helyes kódra zöld üdvözlés, a harmadik hibás után piros „A kártya zárolva.”
Megtakarítás-tervező: kérd be, mennyit tudsz félretenni havonta és mi a célösszeg (mindkettőt makacs beolvasással!) — írd ki, hány hónap alatt jön össze, és a végén az összegyűlt pénzt.
Minden kérdésnél egy válasz helyes. A végén pontszámot kapsz.
| Fogalom | Jelentés |
|---|---|
| logikai ciklus | ismétlés, amelynek lépésszámát feltétel dönti el, nem előírás |
while | elöltesztelő ciklus: feltétel a kör előtt — akár nulla kör |
do-while | hátultesztelő ciklus: feltétel a kör után — legalább egy kör |
| elöltesztelő / hátultesztelő | hol áll a feltétel: belépés előtt vagy a kör végén |
| makacs beolvasás | while (!TryParse(…)) — újrakérdezés, amíg a bevitel jó nem lesz |
| visszatérő menü | do-while + switch: a menü kilépésig ismétlődik |
| végtelen ciklus | a feltétel sosem válik hamissá — a program „megfagy” |
for; feltételtől
függő → while (akár 0 kör) vagy
do-while (legalább 1 kör).while (!int.TryParse(…, out x)))
mostantól alapfelszerelés: a program addig kérdez, amíg jó választ
nem kap.break, continue)
— ez a blokk utolsó fejezete.