Vezérlőpult
C5. While és do-while · Vezérlési szerkezetek

C blokk · Vezérlési szerkezetek · 5. tananyag

Logikai ciklusok: while és do-while

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.

2 tanórawhile · do-whilea makacs beolvasás

Tanulási célok

1Amikor a lépésszámot nem te írod elő

KérdésCiklus
„Pontosan N-szer?” — a lépésszám előre ismertfor (C4)
„Amíg igaz egy feltétel?” — lehet, hogy egyszer semwhile
„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.

2A while: elöltesztelő ciklus

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.

⚠️ VÉGTELEN CIKLUS

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.

3A do-while: hátultesztelő ciklus

do
{
    // törzs — ez LEGALÁBB EGYSZER lefut
}
while (feltetel);      // ← figyelem: itt pontosvessző jár!

for, while vagy do-while?

A kérdés: ismert-e a lépésszám — és kell-e legalább egy kör?

1 / 8Pontszám: 0
…

4A nagy ígéret beváltása: a makacs beolvasás

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.

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

6Gyakori hibák

TünetMi történt?Mit tegyél?
a program „megfagy”, nem válaszolvégtelen ciklus: a törzs nem változtatja a feltételttedd 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 kellenewhile-t írtál oda, ahol legalább egy kör kellbevitelhez, menühöz do-while
CS1002: ; expected a do-while végénlemaradt a pontosvessző a while (…) utánwhile (feltetel); — itt jár a ;
a while utáni blokk egyszer, feltétel nélkül futpontosvessző a while fej után: üres törzsa fej után nincs ; (a do-while VÉGÉN van!)
mindig ugyanazt az értéket vizsgáljaa beolvasás a cikluson KÍVÜL maradta ReadLine/ReadKey a törzsbe (vagy a feltételbe) kerüljön
CS0165 a ciklus utáni felhasználásnálaz out/beolvasott változó a ciklusban volt deklarálvadeklaráld a ciklus előtt (makacs beolvasás receptje)

7Gyakorlat — számkitaláló

  1. Új projekt: Console App, név: SzamKitalalo, .NET 10 + Konzol.cs.
  2. Tárolj egy titkos számot konstansban (1–100 között; igazi véletlent az I blokkban kap majd a játék).
  3. Makacs beolvasással kérj tippet (szám ÉS 1–100 közé essen — a 4. szakasz receptje).
  4. Amíg a tipp nem talál: írd ki sárgával, hogy „Nagyobb!” vagy „Kisebb!” (C1), és kérj új tippet. Számold a próbálkozásokat (C4 akkumulátor!).
  5. Találatkor: Konzol.Siker + hány próbálkozásból sikerült.
  6. Commit: Szamkitalalo: while + makacs beolvasas.
✅ ELLENŐRZŐ PONT

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.

8Feladatok

Gyakorló feladatok

⭐ alap · ⭐⭐ haladó · ⭐⭐⭐ kihívás

C5.1⭐

Visszaszámlálás újra: írd át a C4.1-es visszaszámlálót while ciklusra — ugyanaz a kimenet, más szerkezet.

C5.2⭐⭐

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.

C5.3⭐⭐

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

C5.4⭐⭐

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.

C5.5⭐⭐⭐

A menü hazatér: alakítsd át a C2–C3-as KonzolMenu projektet visszatérő menüvé (5. szakasz): kilépésig ismétlődjön, és a számot kérő menüpontokban a sima TryParse-ot cseréld makacs beolvasásra.

9Önellenőrző kvíz

Ellenőrizd magad!

Minden kérdésnél egy válasz helyes. A végén pontszámot kapsz.

10Fogalomtár

FogalomJelentés
logikai ciklusismétlés, amelynek lépésszámát feltétel dönti el, nem előírás
whileelöltesztelő ciklus: feltétel a kör előtt — akár nulla kör
do-whilehá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áswhile (!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 ciklusa feltétel sosem válik hamissá — a program „megfagy”

11Összegzés

  1. Ismert lépésszám → for; feltételtől függő → while (akár 0 kör) vagy do-while (legalább 1 kör).
  2. A while-nál a „léptetés” a te felelősséged a törzsben — nélküle végtelen ciklus.
  3. A do-while a „előbb csináld, aztán kérdezd” szerkezete — és a végén pontosvessző jár.
  4. A makacs beolvasás (while (!int.TryParse(…, out x))) mostantól alapfelszerelés: a program addig kérdez, amíg jó választ nem kap.
  5. A do-while + switch visszatérő menü a játékaink főciklusának őse.
  6. Ami még hiányzik: ciklus a ciklusban, és a kiugrás menet közben (break, continue) — ez a blokk utolsó fejezete.