C blokk · Vezérlési szerkezetek · 4. tananyag
Az A8 három alapszerkezetéből kettő már a miénk: a szekvencia és a szelekció (C1–C3). Ma jön a harmadik, az iteráció: amit eddig 100 sorban másolgattál volna, azt a gép ismétli meg helyetted — pontosan annyiszor, ahányszor mondod.
Írd ki a számokat 1-től 10-ig! Eddig ezt csak így tudtad volna:
Console.WriteLine(1); Console.WriteLine(2); // … még 8 sor másolás …
10-ig még megy. És 1000-ig? A ciklus (iteráció) pontosan
erre való: egy kódrészletet többször futtat le. A
for ráadásul számol is közben:
for (int i = 1; i <= 10; i++) { Console.WriteLine(i); }
Négy sor — és ha 1000-ig kell, csak egyetlen számot írsz át. Ez a programozás egyik legnagyobb találmánya: a gép ismétel, nem te.
for (int i = 0; i < 10; i++) { // ciklustörzs — ez ismétlődik }
A fejben három rész, pontosvesszőkkel elválasztva:
| Rész | Példa | Mikor fut? |
|---|---|---|
| inicializálás | int i = 0 | egyszer, legelőször |
| feltétel | i < 10 | minden kör ELŐTT — ha hamis, vége |
| léptetés | i++ | minden kör UTÁN |
Fontos: a feltétel belépési feltétel — ha már az elején
hamis (for (int i = 10; i < 1; i++)), a
törzs egyszer sem fut le.
Embernek az 1-től N-ig természetes
(i = 1; i <= 10), a programozásban mégis
gyakoribb a 0-tól N−1-ig
(i = 0; i < 10) — az E blokk tömbjei
0-tól számozódnak, ezért érdemes már most mindkettőt megszokni.
Mindkettő pontosan 10 kör!
Számold ki fejben: első kör, utolsó kör — a határokon dől el minden.
A ciklusváltozó nem csak számláló — a törzsben használhatod:
// lefelé számolás for (int i = 10; i >= 1; i--) { Console.WriteLine($"{i}…"); } Console.WriteLine("Start!"); // kettesével: csak a párosak for (int i = 2; i <= 20; i += 2) { Console.Write($"{i} "); }
i-- lefelé léptet,
i += 2 kettesével — a léptetés bármilyen
értékadás lehet (a
B2
összetett operátorai!).int i a for
fejében született — ezért csak a ciklusban él. A záró
} után az i már
nem létezik (CS0103); ez nem hiba, hanem rend: minden ciklus tiszta
lappal indulhat.i (index),
aztán j, k —
de ha a változó jelent valamit, nevezd el rendesen:
sorszam, ev,
oszlop.A ciklus körei önmagukban nem emlékeznek egymásra — ehhez egy cikluson kívüli változó kell, amelybe körönként gyűjtünk. Ez az akkumulátor-minta, és mostantól mindenhol ott lesz:
int osszeg = 0; // az akkumulátor — a ciklus ELŐTT for (int i = 1; i <= 100; i++) { osszeg += i; // minden körben hozzáteszünk } Console.WriteLine($"1-től 100-ig az összeg: {osszeg}"); // 5050
A legenda szerint a 8 éves Carl Friedrich Gauss másodpercek alatt adta össze a számokat 1-től 100-ig: észrevette, hogy 1+100 = 2+99 = … = 101, és 50 ilyen pár van. A tanára megdöbbent. A mi ciklusunk nem ilyen elegáns — de bármilyen felsorolásra működik, nem csak a szépekre.
Számlálás feltétellel — a C1 és a C4 kéz a kézben:
int parosDarab = 0; for (int i = 1; i <= 20; i++) { if (i % 2 == 0) { parosDarab++; } } Console.WriteLine($"1 és 20 között {parosDarab} páros szám van.");
Az átlaghoz mindkettő kell: összeg IS, darab IS — és a végén egy osztás (vigyázat, egészosztás: B3!).
Szorzótábla-sor, igazított oszlopokkal (B5):
for (int i = 1; i <= 10; i++) { Console.WriteLine($"{i,2} × 7 = {i * 7,3}"); }
És a B8-ban kézzel rajzolt keret végre bármilyen hosszú névhez illeszkedik:
Console.Write("╔"); for (int i = 0; i < nev.Length + 2; i++) { Console.Write("═"); } Console.WriteLine("╗");
A Write (soremelés nélkül) + ciklus párosa a
sorminták kulcsa: a ciklus egy soron belül is
ismételhet.
(Van ennél rövidebb út is — az I blokk segédosztályai között találkozunk vele. Addig építjük magunk: pont így értjük meg, mi történik.)
| Tünet | Mi történt? | Mit tegyél? |
|---|---|---|
| a ciklus egyszer sem fut le | a feltétel már az elején hamis (i = 10; i < 1) | ellenőrizd a kezdőértéket és az irányt |
| eggyel többször/kevesebbszer fut (off-by-one) | < és <= keveredett | számold ki fejben az első ÉS az utolsó kört |
| a ciklus „nem áll meg” | a léptetés rossz irányba megy (i-- helyett i++) | a feltételnek egyszer hamissá KELL válnia |
CS0103: The name 'i' does not exist… a ciklus után | a ciklusváltozó csak a cikluson belül él | ha utána is kell, deklaráld a ciklus előtt |
| a blokk csak egyszer fut le | pontosvessző a fej után: for (…); | a for után nincs ; — a C1-es if-hiba rokona! |
| furcsa, pontatlan körszámok | double ciklusváltozó (i += 0.1) | a B3-as pontatlanság — számolj int-tel, oszd a törzsben |
| a ciklus összevissza ugrál | a törzsben is módosítod a ciklusváltozót | a léptetés helye a fej — a törzsben csak olvasd az i-t |
SzamsorElemzo, .NET 10 +
Konzol.cs.Szamsor-elemzo: elso for ciklusunk.N=10-re az összeg 55, a párosok száma 5, az átlag 5,50; hibás bevitelre a program szépen szól és nem áll le.
⭐ alap · ⭐⭐ haladó · ⭐⭐⭐ kihívás
Visszaszámlálás: 10-től 1-ig írd ki a számokat, a végén „Start!” — zölddel.
Csillagsor: kérd be, hány csillagból álljon a sor, és írd ki
egyetlen sorba (Write): ★★★★★★
Szorzótábla: kérd be, melyik szám szorzótábláját kéred, és írd ki 1-től 10-ig, szépen igazított oszlopokkal.
Osztóvadász: kérj be egy számot, és írd ki az összes osztóját
(1-től önmagáig, % + if), a végén az
osztók darabszámát. Ellenőrzés: a 12-nek 6 osztója van.
Illeszkedő keret: kérd be a felhasználó nevét, és rajzolj köré pontosan illeszkedő box-drawing keretet (a B8.2-es feladat — de most már ciklussal, bármilyen hosszú névre). A keret színe legyen cián.
Minden kérdésnél egy válasz helyes. A végén pontszámot kapsz.
| Fogalom | Jelentés |
|---|---|
| iteráció | ismétlés: egy kódrészlet többszöri lefuttatása — a harmadik alapszerkezet |
for | előírt lépésszámú ciklus: akkor, ha előre tudjuk, hányszor kell ismételni |
| ciklusfej | a for három része: inicializálás; feltétel; léptetés |
| ciklustörzs | a { } közti rész — ez ismétlődik |
| ciklusváltozó | a fejben született számláló (i) — csak a ciklusban él |
| belépési feltétel | minden kör előtt kiértékelődik — ha már elsőre hamis, a törzs egyszer sem fut |
| akkumulátor | cikluson kívüli gyűjtőváltozó (összeg, darabszám) — a ciklus „emlékezete” |
| off-by-one | eggyel elcsúszott körszám — a </<= határok tipikus hibája |