c++ alapok
Miért van szükség ciklusokra C++-ban?
Képzeld el, hogy le kell írnod a táblára egy mondatot… mondjuk 100-szor.
Vagy be kell kérned 6 futó adatait.
Vagy ki kell írnod 1-től 1000-ig minden számot.
Ezek mind olyan feladatok, amiket kézzel megcsinálni rémálom, de a számítógépnek egyetlen utasítás:
👉 „Ezt ismételd meg ennyiszer.”
És pontosan ez a ciklusok lényege.
A ciklusok olyanok, mint a programozás „repeat” gombjai:
-
ha valamit újra és újra kell végrehajtani,
-
ha egy adatsoron végig kell menni,
-
ha valamit csak addig csinálunk, amíg egy feltétel igaz,
akkor ott biztos, hogy ciklust fogsz használni.
A C++ két klasszikus ciklusa, amit most megtanulunk:
✨ while – amíg a feltétel igaz, ismétel
✨ for – egy előre tudott, számlálós ismétlés
És hidd el, ahogy összeáll, hirtelen minden feladat egyszerűbb lesz:
-
ismétlődő műveletek
-
adatok összegzése
-
min–max keresés
-
tömbök bejárása
Most pedig lépjünk bele a ciklusok világába, kezdjük azzal, hogyan működik a while, és miért viselkedik másképp, mint a for.
While - do-while ciklus
A ciklusok akkor jönnek jól, amikor valamit többször egymás után szeretnénk végrehajtani. Nem akarunk százszor leírni egy utasítást, elég egyszer megadni, és a gép elismétli helyettünk.
A while kulcsszó azt jelenti:
👉 „amíg teljesül a feltétel, ismételd az utasítást.”
Ez egy úgynevezett előtesztelő ciklus, mert még belépés előtt megnézi, igaz-e a feltétel. Ha már az elején hamis, akkor egyáltalán nem fut le a ciklusmag.
Példa:
A program először megnézi, hogy i <= 10 igaz-e.
Ha igen, belép a ciklusba, kiírja a „Szia”-t, majd ++i növeli az i értékét.
Ahogy látjuk, pontosan tízszer fut le – a feltétel addig igaz, amíg az i el nem éri a 11-et.
A ciklusban található rész a ciklusmag.
A feltétel: i <= 10.
A változás: ++i, ami biztosítja, hogy a feltétel egyszer hamissá váljon, különben végtelen ciklusba futnánk.
Ha a „Szia” helyett i-t iratod ki, akkor szépen elszámol 1-től 10-ig.
do-while – mindig lefut egyszer
A while párja a do-while, ami szintén ciklus, de egy nagyon fontos különbséggel: a do-while egyszer mindig lefut és csak utána vizsgálja a feltételt. Ezért nevezzük utótesztelő ciklusnak.
Hiába a false feltétel, a ciklusmag egyszer biztosan lefut. Ez akkor hasznos, ha valamit mindenképp meg akarunk jeleníteni a képernyőn, pl. egy bekérést.
For ciklus
A while ciklusnál megtanultuk, hogy addig ismételünk, amíg a feltétel igaz.
A for ciklusnál viszont már az elején tudjuk:
-
honnan indulunk,
-
meddig szeretnénk menni,
-
és hogyan változik a számláló.
Ezért a for olyan, mint a „számlálós ismétlés” beépített csodafegyvere:
rövid, átlátható, és a legtöbb programozási feladatnál ez lesz a kedvenced.
A for ciklus valójában három részből áll (mind egy sorban!):
for (kezdőérték; feltétel; léptetés)
Működése
1. beállítja a kezdőértéket
2. Megvizsgálja a feltételt
3. Ha igaz, lefut a ciklusmag
4. A végén elvégzi a léptetést (pl. ++i)
5. Újra ellenőrzi a feltételt … és megy tovább.
Addig ismétel, amíg a feltétel hamis nem lesz
Ez szó szerint azt mondja:
1. Indulj egytől
2. Menj addig, amíg i <= 10
3. Minden körben növeld eggyel
És így a program elszámol 1-től 10-ig.
Egymásba ágyazott ciklusok - Csillagpiramis építése
A ciklusokat nem csak külön-külön használhatjuk, hanem egymásba is ágyazhatjuk őket.
Ez azt jelenti, hogy egy cikluson belül fut egy másik ciklus.
Ennek a legegyszerűbb és leglátványosabb példája, amikor csillagokból építünk ábrát:
-
a külső ciklus (
i) azt mondja meg, HÁNY sor legyen, -
a belső ciklus (
j) azt mondja meg, egy sorban HÁNY csillag legyen.
Ha az i értéke 1, akkor 1 csillagot írunk ki,
ha az i értéke 2, akkor 2 csillagot,
…és így tovább.
1. feladat
Kérj be a felhasználótól egy számot és írd ki az összes számot 1-től eddig az értékig
Mit csinál?
int n; -> létrehoz egy dobozt, amelyben n nevű egész szám típusú változó van
std::cin >> n; -> beteszi a dobozba azt az értéket, amit a felhasználó megadott
int i = 1 -> ezzel létrejött egy i nevű új változó, ami egy egész szám. Kapott egy kezdőértéket: 1
i <= n -> minden ciklusfuttatás előtt ezt ellenőrzi a program. Ha igaz, lefut a ciklusmag. Ha hamis, vége a ciklusnak
++i -> minden kör végén növeli az i értékét eggyel. Ez viszi előre a ciklust.
Mi a különbség az i és az n között?
Az i csak ebben a ciklusban él, az n a cikluson kivül lett meghatározva, tehát később is vissza lehet nyúlni hozzá
2. feladat
Kérj be a felhasználótól egy egész számot (N) és számold ki, mennyi 1+2+3+ … + N összege
int N; -> bekéri az N -et
std::cin >> N; -> beteszi az N értékét egy dobozba
int osszeg = 0; -> van egy összeg változónk, ami nulláról indítja a számolást. Minden ciklusban belerakunk egy osszeg + i-t.
for ciklusunk:
int i = 1 – ez a ciklus számlálója. Ez számolja, hányszor futott le a ciklus, illetve melyik számnál tart. A kezdeti értéke egy, célja, hogy elérje az N értéket. Tehát ez egyről indul
Feltételvizsgálat: i <= N. Ez minden kör előtt lefut. A gép megkérdezi: a jelenlegi i érték még belefér? Ha igen, lefut a ciklusmag, ha nem, kilép a ciklusból.
N = 6, tehát belefér az 1, 2, 3, 4, 5, 6 és kilép a 7-nél.
osszeg +=i; – ez történik minden körben: fogjuk az összeg változóban levő értékét és hozzáadjuk az aktuális i-t, majd visszarakjuk ugyanabba a dobozba. Ha i = 3, akkor osszeg = osszeg + 3. Az osszeg += i az ugyanazt jelenti, mint osszeg = osszeg + i;
3. feladat
Hány páros szám van 1 és n között?. Kérj be a felhasználótól egy n egész számot, majd vizsgáld meg 1-től n-ig az összes számot és számold meg, hány páros szám van köztük. Végül írd ki a darabszámot.
int n; – létrehozol egy egész típusú változót, a neve: n. Ez lesz a dibiz, amibe a felhasználó által megadott szám kerül. Kiírja az üzenetet a képernyőre, a felhasználó megadja a számot.
std::cin >> n; – beleteszi a megadott számot a dobozba. Beírtam, hogy 6, innentől az n = 6 lesz.
int db = 0; -> egy újabb doboz, ez fogja számolni azt, hogy hány páros számot talált. Int = egész típusú változó. 0 – mert kezdetben 0 darab párosról tudunk.
for ciklus:
int i = 1; -> létrejön egy i nevű számláló, kezdőértéke 1. Az első vizsgált szám az 1
int <= n; -> feltétel, amíg i <= n, addig fut a ciklus. Ha n = 6, akkor az i felvett értékei: 1, 2, 3, 4, 5, 6.
Amikor i = 7, a feltétel hamis, kilép
++i -> minden kör végén az i eggyel nő.
cilusmag: {} zárójel között. if (i % 2 == 0 { db++;} Itt döntjük el, hogy az i páros-e. i % 2 == 0 (ha az i-t elosztjuk kettővel, akkor a maradék = 0). Ha ez lefut, akkor a db++ -> a db megnő eggyel. Ha az i páros, akkor a darabszám nő eggyel.
Ha lefutott a ciklus, akkor kiírja a db számát a képernyőre.
4. feladat
Kérj a felhasználótól egy n számot. Ezután döntsd el 1-től n-ig minden számról, hogy osztható-e hárommal. Számold meg, hány ilyen szám van és írd ki az eredményt.
Nagyon hasonlít a megoldása az előző feladathoz, itt most csak a zárójeleket nézzük át:
if (i % 3 == 0) -> a kerek zárójel azt jelzi, ez egy logikai feltétel, ami vagy igaz, vagy hamis. A feltételek mindig () – kerek zárójelben vannak. Itt azt jelenti: mit kérdezünk meg.
{} – kapcsos zárójel, azt mutatja meg, mit csinálunk, ha a válasz igaz.
for (int i = 1; i <= n; i++) { // Ez a for kapcsos nyitója
if (i % 3 == 0) { // Ez az if kapcsos nyitója
db++; // if blokk belseje
} // if blokk kapcsos zárója
} // for kapcsos zárója
5. feladat
Kérj a felhasználótól egy n számot. Ezután vizsgáld meg 1-től n-ig minden számot, hogy 7-esre végződik-e. Számold meg, hány ilyen szám található






