Órai Kódok & Soronkénti Magyarázatok

Itt megtalálod az 1., 2. és 3. heti egyetemi órák és előadások összes feladatát és kódját. Nem szakzsargonban, hanem hétköznapi hasonlatokkal, sorról sorra lebontva magyarázunk el mindent, hogy akkor is megértsd és levizsgázz belőle, ha még soha életedben nem programoztál!

1. HÉTI TANANYAG • ELŐADÁS ÉS GYAKORLAT

C++ Alapszerkezet, Típusok, Beolvasás és Számítások

Mit tanultunk az 1. heti előadás diáin? (Emberi nyelven összefoglalva)

1. hét.pptx & Programozás I.pptx kivonata

Féléves követelmények és vizsga:

Összesen 4 ZH dolgozat lesz: 2 darab elméleti és 2 darab gyakorlati programozós a gépek előtt (a 6. és a 12. héten). Mindegyik 25 pontot ér (összesen 100 pont). Gyakorlaton csak az a kód kap pontot, ami hibátlanul lefordul és fut! Javítani a 13. héten lehet.

Dobozok (Típusok) a gépben:

A gépnek mindig meg kell mondanunk, milyen adatot kap:
• int: Egész számokhoz (pl. életkor, darabszám).
• double vagy float: Törtszámokhoz (pl. árfolyam: 410.5, vagy átlag: 4.75).
• char: Egyetlen betű vagy írásjel (pl. 'z', 'A').
• cin >> beviszi a billentyűről, cout << kiírja a képernyőre!

Órai fájl: 2.pelda-negyzet.cpp

2. Példa: Négyzet Kerülete és Értékadás

Mi az a változó és az értékadás?

A számítógép memóriája olyan, mint egy hatalmas raktár tele fiókokkal. Ahhoz, hogy megjegyezzünk egy számot, el kell neveznünk egy fiókot (ezt hívjuk változó deklarálásnak), és bele kell tennünk egy értéket (értékadás).

Hétköznapi hasonlat: Képzelj el egy felcímkézett kartondobozt a szobádban. A dobozra ráírod, hogy 'hossz', és beleteszel egy cédulát, amire a 15-ös számot írtad.
#include <iostream>
using namespace std;
int main()
{
	int hossz;
	hossz = 15;
	cout << "A negyzet kerulete:";
	cout << 4 * hossz << "cm" << endl;	//rövidebben: cout <<"A negyzet kerulete:"<< 4*hossz<<"cm\n";
	return 0;
}
Soronkénti közérthető magyarázat (mit csinál a gép ebben a sorban?):
A kód adott sora Mit jelent ez magyarul, hétköznapi nyelven?
1 #include <iostream> Szólunk a számítógépnek, hogy készítse elő a képernyőt és a billentyűzetet.
Olyan, mint amikor főzés előtt előveszed a vágódeszkát és a kést a fiókból: enélkül nem tudnánk kiírni semmit a képernyőre.
2 using namespace std; Megkímél minket a felesleges gépeléstől: nem kell minden parancs elé odaírni, hogy 'std::'.
Hétköznapi rövidítés a programozásban, hogy tisztább és olvashatóbb legyen a kód.
3 int main() Ez a főkapu, a program legelső pontja, ahol a számítógép elkezdi végrehajtani a feladatot.
Minden C++ program itt indul el, a zárójelek jelzik, hogy ez egy önálló lépéssorozat (függvény).
4 { A program lépéseinek a kezdete (nyitó kapcsos zárójel).
Ami a nyitó és csukó kapcsos zárójel között van, azt a számítógép mind szépen sorban végrehajtja.
5 int hossz; Létrehozunk egy 'hossz' nevű dobozt, amibe csak egész számokat szabad tenni.
Az 'int' az angol integer (egész szám) szóból ered. Nincs benne tizedesvessző, csak tiszta egész szám.
6 hossz = 15; Beletesszük a 15-ös számot a 'hossz' nevű dobozba.
A programozásban az egyenlőségjel (=) nem azt jelenti, hogy 'egyenlő', hanem hogy 'tedd bele a jobb oldali értéket a bal oldaliba'.
7 cout << "A negyzet kerulete:"; Kiírjuk a képernyőre betűről betűre, hogy 'A negyzet kerulete:'.
A 'cout' a konzol képernyője, a kacsacsőrök (<<) pedig mutatják, hogy a szöveg beleszalad a képernyőbe.
8 cout << 4 * hossz << "cm" << endl; A gép kiszámolja a 4 * 15 szorzatot (ami 60), mögé írja, hogy 'cm', majd új sort nyit.
A gép magától elvégzi a beszorzást. Az 'endl' azt mondja: ugorj a következő sor elejére, mint egy Enter leütés.
9 return 0; Jelzés a Windowsnak: 'Kész vagyok, a program hiba nélkül lefutott!'
A 0 a számítástechnikában a sikeresség és a nyugalom jele.
10 } A program legvége (záró kapcsos zárójel).
Itt fejeződik be a főkapu munkája.
Órai fájl: 3.pelda-matek.cpp

3. Példa: Alapműveletek és a Modulo (Maradék)

Hogyan számol a gép és mi az a Modulo (%)?

A négy alapművelet (+, -, *, /) magától értetődő. A legfontosabb újdonság a százalékjel (%), ami a programozásban a maradékos osztást jelenti. Ha egy számot elosztasz 2-vel és a maradék 0, akkor a szám páros! Ha 1, akkor páratlan.

Hétköznapi hasonlat: Ha van 7 almád és 3 gyerek között egyenlően szétosztod, minden gyerek kap 2 egész almát, és 1 alma megmarad a tálban. Ez a maradék az 1!
#include <iostream>
using namespace std;
int main()
{
	int a = 8, b = 4;
	cout << "a + b: " << a + b << endl; //12
	cout << "a - b: " << a - b << endl; //4
	cout << "a * b: " << a * b << endl; //32
	cout << "a / b: " << a / b << endl; //2
	cout << "a % b: " << a % b << endl; //0
	return 0;
}
Soronkénti közérthető magyarázat (mit csinál a gép ebben a sorban?):
A kód adott sora Mit jelent ez magyarul, hétköznapi nyelven?
1 int a = 8, b = 4; Két dobozt csinálunk egyszerre: az 'a' dobozba 8-at, a 'b' dobozba 4-et teszünk.
Nem kötelező külön sorba írni a változókat: vesszővel elválasztva egyetlen sorban is létrehozhatjuk őket.
2 cout << "a + b: " << a + b << endl; Kiírja: 'a + b: 12'. Összeadja a két számot.
Idézőjelek között a szöveg változtatatlanul jelenik meg, az idézőjel nélkül lévő 'a + b'-t pedig kiszámolja a processzor.
3 cout << "a - b: " << a - b << endl; Kiírja: 'a - b: 4'. Kivonja a 4-et a 8-ból.
Hagyományos kivonás.
4 cout << "a * b: " << a * b << endl; Kiírja: 'a * b: 32'. Összeszorozza a két számot.
A számítógépen a csillag (*) a szorzás jele.
5 cout << "a / b: " << a / b << endl; Kiírja: 'a / b: 2'. Elosztja a 8-at 4-gyel.
A perjel (/) az osztás jele. Mivel mindkét szám egész (int), ha törtszám jönne ki, a tizedeseket egyszerűen levágná!
6 cout << "a % b: " << a % b << endl; Kiírja a maradékot: 'a % b: 0'. Mivel a 8-ban a 4 pontosan megvan, a maradék 0.
A % operátor nélkülözhetetlen az egyetemen: oszthatóság, párosság és időszámítás vizsgálatához.
Órai fájl: 4.pelda-kor.cpp & 6.pelda-kor.cpp

4. és 6. Példa: Kör Kerület, Terület és Típuskonverzió

Miért vágja le a gép a tizedeseket (Csonkolás)?

Ha egész számba (int) akarsz beletenni tizedestörtet, a C++ nem kerekít, hanem gondolkodás nélkül levágja a tizedesvessző utáni részt! Ha pontos eredményt akarsz, lebegőpontos típust (float vagy double) kell használnod, vagy kiíratáskor rá kell kényszerítened a (float) típust.

Hétköznapi hasonlat: Ha van egy mérőpoharad, amire csak egész deciliterek vannak rajzolva, és beleöntesz 3.14 decit, a pohár nem tud mit kezdeni a töredékkel: csak a 3-at látja.
// 4.pelda-kor.cpp (Egész típus - tizedesek elvesznek):
int r = 15, k, t;
k = 2 * r * 3.14;
t = r * r * 3.14;
cout << "Az " << r << "cm sugaru kor kerulete: " << k << "cm, terulete pedig: " << t << "cm2" << endl;

// 6.pelda-kor.cpp (Típuskényszerítés - megmaradnak a tizedesek!):
int r = 8;
cout << "A kor kerulete: " << (float)(2 * r * 3.14) << "cm\n";
cout << "A kor terulete: " << (float)(r * r * 3.14) << "cm2" << endl;
Soronkénti közérthető magyarázat (mit csinál a gép ebben a sorban?):
A kód adott sora Mit jelent ez magyarul, hétköznapi nyelven?
1 int r = 15, k, t; Létrehoz három dobozt egész számoknak: az 'r' a sugár (15), a 'k' a kerület, a 't' a terület.
Figyelem: mivel k és t is 'int', csak egész számot tudnak tárolni!
2 k = 2 * r * 3.14; Kiszámolja a 2 * 15 * 3.14 = 94.2 értéket, de a tizedest levágja, így k = 94 lesz!
Ez a csonkolási hiba (truncation). A gép nem kerekített 94-re, hanem levágta a .2-t.
3 cout << (float)(2 * r * 3.14) << ... A (float) felirat megparancsolja a gépnek: 'Ezt a számolást kezeld valódi törtszámként, és írd ki a tizedeseket is!'
Ezt hívjuk explicit típuskonverziónak: zárójelben a kívánt típus neve áll a kifejezés előtt.
Órai fájl: 5.pelda-betu.cpp

5. Példa: Betűk és az ASCII Kódok Titka

Hogyan látja a számítógép a betűket?

A számítógép memóriájában valójában nincsenek betűk, csak számok. Amikor leírod, hogy 'z', a processzor azt jegyzi meg, hogy 122. Ha ezt egész számként kéred le, megkapod a számot; ha karakterként, megkapod a betűt.

Hétköznapi hasonlat: Gondolj a titkosírásra gyerekkorodból: az 'A' betű az 1-es, a 'B' a 2-es... A számítógép pontosan ezt csinálja, csak a világ legelterjedtebb titkosírását, az ASCII kódtáblát használja!
#include <iostream>
using namespace std;
int main()
{
    int i;
    char betu = 'z';    //karakter megadás '' között
    i = betu;           //az i szám típusú változó értéke az adott betű ASCII kódja lesz
    cout << "A betu szamkent: " << i << ", karakterkent: " << betu << endl;
    return 0;
}
Soronkénti közérthető magyarázat (mit csinál a gép ebben a sorban?):
A kód adott sora Mit jelent ez magyarul, hétköznapi nyelven?
1 char betu = 'z'; Létrehozunk egy 'betu' nevű karakteres dobozt, és beletesszük a 'z' betűt.
A 'char' (character) egyetlen betűt jelent. Kötelező szimpla macskakörmök (' ') közé tenni!
2 i = betu; Az egész számokat tároló 'i' változónak odaadjuk a 'z' betűt.
A C++ automatikusan átváltja a betűt a neki megfelelő belső sorszámra (ASCII kód: 122).
3 cout << "A betu szamkent: " << i << ... Kiírja: 'A betu szamkent: 122, karakterkent: z'.
Ugyanaz az adat a memóriában: ha 'int'-ként kérdezed le, számot kapsz, ha 'char'-ként, akkor magát a betűt!
Órai fájl: 7.pelda_teglalap.cpp

7. Példa: Téglalap Oldalainak Bekérése (cin)

Hogyan kérünk be adatot a felhasználótól?

Eddig a kódban mi magunk adtuk meg a számokat. A 'cin >>' parancs arra kényszeríti a számítógépet, hogy álljon meg, és várja meg, amíg a felhasználó bepötyögi a számokat a billentyűzeten és megnyomja az Entert.

Hétköznapi hasonlat: A 'cout' a szád (amivel beszélsz/kiírsz), a 'cin' pedig a füled (amivel meghallgatod, amit a felhasználó mond/beír).
#include <iostream>
using namespace std;
int main()
{
	int a, b;
	cout << "Adja meg a teglalap oldalainak hosszat:  \n";
	cin >> a >> b;
	cout << "A teglalap kerulete: " << 2 * (a + b) << "cm" << endl;
	cout << "A teglalap terulete: " << a * b << "cm2" << endl;
	return 0;
}
Soronkénti közérthető magyarázat (mit csinál a gép ebben a sorban?):
A kód adott sora Mit jelent ez magyarul, hétköznapi nyelven?
1 int a, b; Két üres dobozt készítünk elő: egyet az 'a' oldalnak, egyet a 'b' oldalnak.
Még nincs bennük semmi, a felhasználóra várunk.
2 cout << "Adja meg a teglalap oldalainak hosszat: \n"; Kiír egy üzenetet, hogy a felhasználó tudja, mit vár tőle a program.
A '\n' az újsor jele: a kurzor a következő sorba ugrik.
3 cin >> a >> b; A gép megáll és vár: az első beírt számot beteszi az 'a' dobozba, a másodikat a 'b' dobozba.
A felhasználó beírhatja például: '5 10', majd Enter. A befelé mutató kacsacsőrök (>>) jelzik az adat áramlását a dobozokba.
4 cout << "A teglalap kerulete: " << 2 * (a + b) << "cm" << endl; Kiszámolja a kerületet kétszer a két oldal összegeként, és kiírja az eredményt.
A zárójelezés fontos: először összeadja az oldalakat, majd beszorozza kettővel.
5 cout << "A teglalap terulete: " << a * b << "cm2" << endl; Összeszorozza az 'a' és 'b' oldalakat, megadva a téglalap területét.
Hagyományos szorzás.
Órai fájl: 8.pelda-valuta.cpp

8. Példa: Valutaváltó Kalkulátor (Euró -> Forint)

Hogyan kezelünk pénzügyi törtszámokat?

A 'double' típus a lebegőpontos számok királya a C++-ban: óriási pontossággal képes tizedesjegyeket tárolni. A program bekéri az aktuális árfolyamot, a váltani kívánt összeget, és összeszorozza őket.

Hétköznapi hasonlat: Egy euró ára ritkán kerek egész forint, például 410.5 Ft. Ehhez már nem elég az egész szám (int), igazi tizedestört típusra van szükség.
#include <iostream>
using namespace std;
int main()
{
    double arfolyam;
    double euro;
    int forint;
    cout << "Kerem az aktualis euro arfolyamot (pl.: 410.5): ";
    cin >> arfolyam;
    cout << "Hany eurot szeretne atvaltani?: ";
    cin >> euro;
    forint = euro * arfolyam;
    cout << "\n--- Valutavalto ---" << endl;
    cout << euro << " EUR erteke: " << forint << " HUF." << endl;
    return 0;
}
Soronkénti közérthető magyarázat (mit csinál a gép ebben a sorban?):
A kód adott sora Mit jelent ez magyarul, hétköznapi nyelven?
1 double arfolyam; double euro; int forint; Az árfolyamnak és az eurónak törtszám dobozt (double) adunk, a forintot egész számként (int) kezeljük.
Magyarországon a forintban nincsenek fillérek, ezért a forint eredményt egész számmá csonkoljuk.
2 cin >> arfolyam; A felhasználó beírja a napi árfolyamot (pl. 410.5).
Fontos: programozásban a tizedeseket PONT-tal (.) írjuk, nem vesszővel!
3 cin >> euro; A felhasználó beírja, hány eurót akar átváltani (pl. 50).
Lehet tört is, pl. 12.5 euró.
4 forint = euro * arfolyam; Összeszorozza a pénzmennyiséget az árfolyammal, és beteszi a forint dobozba.
A double szorzat eredménye automatikusan egésszé alakul a 'forint' változóban.
Órai fájl: 9.pelda-ido.cpp

9. Példa: Időátváltó (Másodpercből Óra, Perc, Mp)

Hogyan bontunk fel egy nagy számot részeire?

Ez a klasszikus egyetemi zárthelyi feladat arra tanít meg, hogyan kell felváltva használni az egészosztást (/) és a maradékképzést (%). 1 óra = 3600 másodperc, 1 perc = 60 másodperc.

Hétköznapi hasonlat: Ha kapsz 3665 szem cukorkát, és 3600-anként teszed őket óriás dobozokba: 1 óriás dobozod lesz (1 óra), a maradék 65 cukorkából 1 kis zacskót tudsz tölteni (1 perc = 60 mp), és a legvégén megmarad 5 szem tisztán a kezedben.
#include <iostream>
using namespace std;
int main()
{
    int ido, ora, perc, mp;
    cout << "Adja meg az idot masodpercekben: ";
    cin >> ido;
    ora = ido / 3600;        // 1 óra = 3600 másodperc
    mp = ido % 3600;        // A megmaradt másodpercek az órák után
    perc = mp / 60;         // A megmaradt másodpercekből hány perc jön ki
    mp = mp % 60;           // A végül megmaradt tiszta másodpercek
    cout << "A megadott ido: ";
    cout << ora << " ora, " << perc << " perc es " << mp << " masodperc." << endl;
    return 0;
}
Soronkénti közérthető magyarázat (mit csinál a gép ebben a sorban?):
A kód adott sora Mit jelent ez magyarul, hétköznapi nyelven?
1 ora = ido / 3600; Hány teljes 3600 másodperces óra fér bele a megadott időbe?
Mivel egészosztást végzünk (int / int), a töredék órákat eldobja, csak a tiszta egész órákat kapjuk meg.
2 mp = ido % 3600; Mennyi másodperc maradt meg, miután levontuk a teljes órákat?
A modulo operátor pontosan a fennmaradó perceket és másodperceket adja vissza.
3 perc = mp / 60; A megmaradt másodpercekből hány darab 60 másodperces teljes perc jön ki?
Megkapjuk a kerek percek számát.
4 mp = mp % 60; A percek levonása után mi az a tiszta másodperc, ami már nem ad ki egy egész percet sem?
Ez lesz a végső másodpercek száma (mindig 0 és 59 között).
2. HÉTI TANANYAG • ELŐADÁS ÉS GYAKORLAT

Feltételes Döntések (if-else), Switch Menük és For Ciklusok

Mit tanultunk a 2. heti előadás diáin? (Emberi nyelven összefoglalva)

2. hét.pptx kivonata

Döntéshozatal (if, else if, else):

A számítógép nem tud magától gondolkodni: kérdéseket teszünk fel neki (pl. x > 0). Ha a válasz IGAZ, végrehajtja a parancsot; ha HAMIS, átugorja, vagy a else (különben) ágon mást csinál. A vizsgán fontos: összehasonlításnál mindig dupla egyenlőségjelet használunk (==)!

Számláló ciklus (for):

Ha előre tudod, hányszor kell megismételni valamit (pl. 1-től N-ig kiírni a számokat vagy összeadni őket), a for ciklust használod. Három része van: 1. Honnan indul (i = 0), 2. Meddig megy (i < x), 3. Hogyan lépked (i++).

Órai fájl: 2.1.cpp

2.1. Példa: Pozitív szám vizsgálata (Egyágú elágazás)

Mi az az elágazás (if)?

A program alapból felülről lefelé halad soronként. Az 'if' (magyarul: HA) utasítással feltételt szabhatunk: a kapcsos zárójelek közötti parancs csak és kizárólag akkor fut le, ha a feltétel IGAZ.

Hétköznapi hasonlat: Olyan, mint egy elágazás az úton táblával: 'HA esik az eső, nyisd ki az esernyőt!'. Ha nem esik, egyszerűen sétálsz tovább anélkül, hogy kinyitnád.
#include <iostream>
using namespace std;

int main()
{
	int x;
	cout << "Adjon meg egy szamot! ";
	cin >> x;

	if (x > 0)
	{
		cout << "A megadott szam pozitiv!" << endl;
	}

	return 0;
}
Soronkénti közérthető magyarázat (mit csinál a gép ebben a sorban?):
A kód adott sora Mit jelent ez magyarul, hétköznapi nyelven?
1 cin >> x; A program megkér egy egész számot a billentyűzetről, és beteszi az 'x' dobozba.
Például beírod: 5 vagy -3.
2 if (x > 0) Megkérdezzük a számítógéptől: 'Vajon az x dobozban lévő szám nagyobb, mint nulla?'
A feltételt mindig kerek zárójelbe tesszük. Ha igaz, belép a kapcsos zárójelbe.
3 cout << "A megadott szam pozitiv!" << endl; Csak akkor írja ki ezt a mondatot, ha a szám valóban 0-nál nagyobb volt.
Ha -5-öt adtál meg, a gép ezt a sort átugorja, mintha ott sem lenne!
Órai fájl: 2.2.cpp

2.2. Példa: Pozitív vagy Negatív? (Kétágú if - else)

Mi az az else (KÜLÖNBEN)?

Az 'else' ág garantálja, hogy ha az 'if' feltétel hamisnak bizonyult, a program ne csak némán továbblépjen, hanem csináljon valami mást.

Hétköznapi hasonlat: 'HA van jegyed, bemehetsz a moziba. KÜLÖNBEN (else) menj a jegypénztárhoz!'. Nincs harmadik út, a két lehetőség közül pontosan az egyik fog megtörténni.
#include <iostream>
using namespace std;

int main()
{
	int x;
	cout << "Adjon meg egy szamot! ";
	cin >> x;

	if (x > 0)
	{
		cout << "A megadott szam pozitiv!" << endl;
	}
	else {
		cout << "A megadott szam negativ!" << endl;
	}

	return 0;
}
Soronkénti közérthető magyarázat (mit csinál a gép ebben a sorban?):
A kód adott sora Mit jelent ez magyarul, hétköznapi nyelven?
1 if (x > 0) { ... } Ha x nagyobb mint 0, akkor kiírja, hogy pozitív.
Ez az első útvonal.
2 else { Különben (minden más esetben, amikor az x NEM nagyobb nullánál)...
Az 'else' után nem kell kerek zárójelben feltétel, mert ez a 'minden egyéb eset' gyűjtője.
3 cout << "A megadott szam negativ!" << endl; Kiírja, hogy a szám negatív.
Megjegyzés: ez a kód a 0-t is negatívnak tekintené, ezt javítja a 2.4-es példa!
Órai fájl: 2.3.cpp

2.3. Példa: Páros vagy Páratlan? (Modulo vizsgálat)

Hogyan ismeri fel a gép a páros számokat?

A 2-vel való maradékos osztás (x % 2) eredménye csak 0 vagy 1 lehet. Ha 0, akkor a szám maradék nélkül felezhető, vagyis páros!

Hétköznapi hasonlat: Gondolj a zoknik párba állítására: ha páros számú zoknid van, egyetlen árva zokni sem marad a végén (maradék = 0).
#include <iostream>
using namespace std;

int main()
{
	int x;
	cout << "Adjon meg egy szamot! ";
	cin >> x;

	if (x % 2 == 0)
	{
		cout << "A megadott szam paros!" << endl;
	}
	else {
		cout << "A megadott szam paratlan!" << endl;
	}

	return 0;
}
Soronkénti közérthető magyarázat (mit csinál a gép ebben a sorban?):
A kód adott sora Mit jelent ez magyarul, hétköznapi nyelven?
1 if (x % 2 == 0) Oszd el az x-et kettővel. Vajon a maradék pontosan EGYENLŐ nullával?
FONTOS: Programozásban a dupla egyenlőségjel (==) jelenti az összehasonlítást! Az egyenlő-e kérdés mindig '=='.
2 cout << "A megadott szam paros!" << endl; Ha a maradék 0, kiírja, hogy páros.
Például 4, 10, 100 esetén.
3 else { ... paratlan! } Ha a maradék nem 0 (hanem 1), kiírja, hogy páratlan.
Például 3, 7, 99 esetén.
Órai fájl: 2.4.cpp

2.4. Példa: Pozitív, Negatív vagy éppen Nulla? (else if)

Több mint két lehetőség: az 'else if' lánc

Ha 3 vagy több lehetőség van, az 'else if' segítségével újabb kérdéseket tehetünk fel sorban egymás után.

Hétköznapi hasonlat: Közlekedési lámpa: HA piros -> Állj! KÜLÖNBEN HA sárga -> Készülj! KÜLÖNBEN (zöld) -> Mehetsz!
#include <iostream>
using namespace std;

int main()
{
	int x;
	cout << "Adjon meg egy szamot! ";
	cin >> x;

	if (x > 0)
	{
		cout << "A megadott szam pozitiv!" << endl;
	}
	else if(x < 0) {
		cout << "A megadott szam negativ!" << endl;
	}
	else
	{
		cout << "A megadott szam nulla!" << endl;
	}

	return 0;
}
Soronkénti közérthető magyarázat (mit csinál a gép ebben a sorban?):
A kód adott sora Mit jelent ez magyarul, hétköznapi nyelven?
1 if (x > 0) 1. Kérdés: Nagyobb mint 0? Ha igen, lefut és kész.
Ha nem, akkor lép a következő kérdésre.
2 else if(x < 0) 2. Kérdés: Különben kisebb mint 0? Ha igen, kiírja: negatív.
Csak akkor nézi meg, ha az első kérdésre nem volt a válasz.
3 else 3. Végső eset: Ha se nem nagyobb, se nem kisebb nullánál, akkor mi lehet? Csakis NULLA!
Logikus kizárásos alapon működik.
Órai fájl: 2.5.cpp

2.5. Példa: Egyetemi Érdemjegy Kalkulátor (0-100 Pont)

Hogyan skálázunk pontszámokat érdemjegyekké?

Az egyetemi vizsgákon a pontszámok alapján dől el a jegy. Mivel 'else if'-eket használunk, elég mindig csak a felső határt ellenőrizni, mert a korábbi ágak már kizárták az alacsonyabb értékeket!

Hétköznapi hasonlat: Mint a boltban a méretezés: XS, S, M, L, XL. A beírt pontszámot alulról felfelé megnézzük, melyik kategóriába esik bele először.
#include <iostream>
using namespace std;

int main()
{
	int x;
	cout << "Adjon meg egy pontszamot! ";
	cin >> x;

	if (x < 50)
	{
		cout << "1 - elegtelen" << endl;
	} else if (x < 61)
	{
		cout << "2 - elegseges" << endl;
	} else if (x < 76)
	{
		cout << "3 - kozepes" << endl;
	} else if (x < 86)
	{
		cout << "4 - jo" << endl;
	} else
	{
		cout << "5 - jeles" << endl;
	}

	return 0;
}
Soronkénti közérthető magyarázat (mit csinál a gép ebben a sorban?):
A kód adott sora Mit jelent ez magyarul, hétköznapi nyelven?
1 if (x < 50) Ha 50 pont alatti: azonnal 1-es (elégtelen).
0 és 49 pont közöttiek itt megállnak.
2 else if (x < 61) Különben ha 61 alatti (tehát 50-60 között): 2-es (elégséges).
Mivel az 50 alattiakat már az előbb elkaptuk, ide már csak 50 vagy több ponttal lehet eljutni!
3 else if (x < 76) 61 és 75 pont között: 3-as (közepes).
Következő lépcsőfok.
4 else if (x < 86) 76 és 85 pont között: 4-es (jó).
Következő lépcsőfok.
5 else Mindenki más (aki 86 vagy több pontot szerzett): 5-ös (jeles)!
A legmagasabb kategória.
Órai fájl: 2.6.cpp

2.6. Példa: Nullával Nem Osztunk! (Biztonsági elágazás)

Az informatikusok aranyszabálya: Védd a programot az összeomlástól!

A matematikában és a számítástechnikában a nullával való osztás értelmezhetetlen. Ha a program mégis megpróbálja, a Windows azonnal leállítja egy durva hibaüzenettel (CRASH). Ezért ELSŐKÉNT mindig ellenőrizzük: y != 0.

Hétköznapi hasonlat: Nem ugrunk fejest a medencébe anélkül, hogy megnéznénk, van-e benne víz. Nem osztunk egy számmal anélkül, hogy megnéznénk, nem nulla-e!
#include <iostream>
using namespace std;

int main()
{
	int x, y;
	cout << "Adjon meg egy osztando szamot, majd egy osztot! ";
	cin >> x >> y;
	
	if (y != 0)
	{
		if (x % y == 0)
		{
			cout << "A megadott osztando szam maradek nelkul oszthato a megadott osztoval!" << endl;
		}
		else {
			cout << "A megadott szamok maradek nelkul nem oszthatoak!" << endl;
		}
	}
	else {
		cout << "Nullaval nem osztunk!" << endl;
	}

	return 0;
}
Soronkénti közérthető magyarázat (mit csinál a gép ebben a sorban?):
A kód adott sora Mit jelent ez magyarul, hétköznapi nyelven?
1 if (y != 0) Megnézzük: 'Az osztó NEM EGYENLŐ nullával?'
A felkiáltójel + egyenlőség (!=) jelenti a 'nem egyenlő' vizsgálatot. Ha nem nulla, biztonságban vagyunk!
2 if (x % y == 0) Csak most, a védett burkon belül számoljuk ki a maradékot!
Egymásba ágyazott elágazás (nested if): egy döntésen belül egy újabb döntést hozunk.
3 else { cout << "Nullaval nem osztunk!"; } Ha az osztó 0 volt, nem számolunk semmit, hanem udvariasan figyelmeztetjük a felhasználót.
A program nem omlik össze, elegánsan kezeli a hibás bemenetet.
Órai fájl: 2.7.cpp & 2.8.cpp

2.7. & 2.8. Példa: Switch-Case Menürendszer

Mi az a Switch-Case és a break?

Ha egy konkrét szám vagy betű alapján kell választani előre ismert fix lehetőségek közül, a switch-case sokkal tisztább és gyorsabb, mint 10 darab if-else. A 'break' utasítás kötelező minden ág végén, különben a gép lecsorogna a következő menüpontba is!

Hétköznapi hasonlat: Mint egy italautomata gombjai: 1-es gomb: Kóla, 2-es gomb: Fanta, 0-s gomb: Pénzvisszaadás. Nem kell végigkérdezni az összes lehetőséget, a gép azonnal a megfelelő rekeszhez ugrik.
#include <iostream>
using namespace std;

int main()
{
	int x;
	cout << "Valasszon az alabbi lehetosegek kozul!" << endl;
	cout << "1. Uj feladat" << endl;
	cout << "2. Eredmenyek" << endl;
	cout << "0. Kilepes" << endl;
	cin >> x;
	
	switch (x)
	{
	case 1:
		cout << "Uj feladat" << endl;
		break;
	case 2:
		cout << "Eredmenyek" << endl;
		break;
	case 0:
		cout << "Kilepes" << endl;
		break;
	default:
		cout << "Hibas menupont!" << endl;
		break;
	}

	return 0;
}
Soronkénti közérthető magyarázat (mit csinál a gép ebben a sorban?):
A kód adott sora Mit jelent ez magyarul, hétköznapi nyelven?
1 switch (x) Kapcsolótábla: 'Nézzük meg, mit választott a felhasználó az x változóban!'
A zárójelben lévő érték alapján fog ugrani a megfelelő case sorra.
2 case 1: Abban az esetben, ha x értéke pontosan 1...
Kettősponttal zárul a címke.
3 break; ÁLLJ MEG és ugorj ki a switch blokkból a legvégére!
Kritikus fontosságú: ha lehagynád a break-et, a 2-es menüpontot is kiírná a gép!
4 default: Alapértelmezett eset: ha a felhasználó nem 1-et, nem 2-t és nem 0-t írt be, hanem mondjuk 99-et.
Biztonsági háló az elgépelések ellen.
Órai fájl: 2.9.cpp – 2.13.cpp

2.9. – 2.13. Példa: Számláló Ciklusok (for)

Mi az a Ciklus és a for?

A számítógép legnagyobb ereje az ismétlésben van: másodpercenként akár milliárdnyi kört is le tud futni fáradtság nélkül. A 'for' ciklust akkor használjuk, ha ELŐRE TUDJUK, hányszor kell megismételni valamit.

Hétköznapi hasonlat: Amikor a tesiórán a tanár azt mondja: 'Fuss 5 kört a pálya körül!'. Elindulsz 1-től, minden kör után számolod, hogy hol tartasz, és amikor eléred az 5-öt, megállsz.
// 2.9: Növekvő számlálás 1-től x-ig
for (int i = 0; i < x; i++) {
    cout << i + 1 << endl;
}

// 2.10: Csökkenő visszaszámlálás x-től 1-ig
for (int i = x; i > 0; i--) {
    cout << i << endl;
}

// 2.12: Számok összege 1-től x-ig
int osszeg = 0;
for (int i = 0; i < x; i++) {
    osszeg = osszeg + i;
}

// 2.13: Faktoriális (N!) számítása (1 * 2 * ... * N)
int fakt = 1;
for (int i = 1; i <= x; i++) {
    fakt = fakt * i;
}
Soronkénti közérthető magyarázat (mit csinál a gép ebben a sorban?):
A kód adott sora Mit jelent ez magyarul, hétköznapi nyelven?
1 for (int i = 0; i < x; i++) A számláló 'i' elindul 0-ról; addig megy, amíg kisebb mint x; minden kör végén 1-gyel növekszik (i++).
A ciklus fejlécében 3 dolog van pontosvesszővel elválasztva: 1. Honnan indul? 2. Meddig menjen? 3. Hogyan lépkedjen?
2 i-- Visszafelé számlálás: minden kör után levon egyet a számlálóból.
Az i-- pontosan ugyanaz, mint az i = i - 1.
3 osszeg = osszeg + i; Persely-elv: a meglévő összeghez mindig hozzáadjuk az aktuális számot.
Minden körben gyarapszik a persely tartalma.
4 fakt = fakt * i; Szorzó-persely: minden körben megszorozzuk az eddigi szorzatot az új számmal.
Fontos: a faktoriális gyűjtőjének 1-ről kell indulnia, mert ha 0-val szoroznánk, örökre 0 maradna!
3. HÉTI TANANYAG • ELŐADÁS ÉS GYAKORLAT

While, Do-While Ciklusok, Prímkeresés és Tömbök

Mit tanultunk a 3. heti előadás diáin? (Emberi nyelven összefoglalva)

3. hét.pptx kivonata

While vs Do-While:

A while a kapuban ellenőriz (ha a feltétel hamis, 0-szor fut le). A do-while viszont mindig lefut legalább 1x, mert a vizsgálat a végén van! Ezért használjuk adatbekérés ellenőrzésére.

Lusta kiértékelés (Lazy):

A C++ lusta a logikai műveleteknél: ha az A && B-ben az A hamis, a B-t meg sem nézi, mert az eredmény úgyis hamis. Ezzel rengeteg processzoridőt spórolunk!

Tömbök (0-s indexelés):

Egy tömb olyan, mint egy fiókos szekrény. A legfontosabb egyetemi vizsgakérdés: a számlálás mindig 0-val kezdődik! Egy 8 elemű tömb elemei: tmb[0]-tól tmb[7]-ig tartanak.

Órai fájl: 3.1.cpp & 3.2.cpp

3.1. & 3.2. Példa: Elöltesztelő While Ciklus

Mi az a 'while' (AMÍG) ciklus?

A 'while' ciklus addig ismétli a magjában lévő parancsokat, amíg a feltétele IGAZ. A vizsgálat a ciklus ELŐTT (a kapuban) történik: ha a feltétel már az elején sem teljesül, a gép egyszer sem lép be!

Hétköznapi hasonlat: Olyan, mint amikor azt mondják neked: 'Addig keverd a teát, AMÍG a cukor fel nem olvad!'. Előre nem tudod másodpercre pontosan hány keverés kell, de a feltételt figyeled folyamatosan.
// 3.1.cpp - Név kiírása 10-szer
int i = 0;
while (i < 10)
{
	cout << "Sajat Nev" << endl;
	i++;
}

// 3.2.cpp - Számok összegezése bekért számig
int i = 1, szam, osszeg = 0;
cin >> szam;
while (i <= szam)
{
	osszeg = osszeg + i;
	i++;
}
cout << "Osszeg: " << osszeg << endl;
Soronkénti közérthető magyarázat (mit csinál a gép ebben a sorban?):
A kód adott sora Mit jelent ez magyarul, hétköznapi nyelven?
1 int i = 0; Készítünk egy 'i' nevű számlálót, ami 0-ról indul.
Minden ciklusnak kell egy iránytű, ami mutatja, hol tartunk éppen.
2 while (i < 10) Ameddig az 'i' számláló értéke kisebb mint 10, csináld újra és újra!
Amint az i eléri a 10-et, a gép kilép a ciklusból.
3 i++; Növeld a számlálót 1-gyel a kör végén!
VÉGZETES HIBA, HA LEHAGYOD: ha nem növeled az i-t, az örökre 0 marad, és a ciklus a végtelenségig fog futni, lefagyasztva a programot!
4 osszeg = osszeg + i; Minden lépésben hozzáadjuk az aktuális számot a gyűjtőhöz.
1 + 2 + 3 + ... egészen a beírt számig.
Órai fájl: 3.3.cpp

3.3. Példa: Prímszám Kereső Algoritmus

Hogyan dönti el a gép egy számról, hogy prím-e?

A prímszámoknak csak 2 osztójuk van: az 1 és önmaguk. Az egyetemi algoritmus 2-től indulva elkezdi osztogatni a számot. Ha talál akár egyetlen olyan számot is, amivel a maradék 0, azonnal tudjuk: ez a szám NEM prím!

Hétköznapi hasonlat: Képzeld el a 7-es számot. Megpróbálod elosztani 2-vel (nem megy), 3-mal (nem megy). Nincs semmi, ami maradék nélkül osztaná, csak az 1 és a 7. Tehát prím!
#include <iostream>
using namespace std;

int main()
{
	int i = 2, szam, osztokszama = 0;
	cout << "Adjon meg egy szamot: ";
	cin >> szam;
	while (i <= szam / 2 && osztokszama == 0)
	{
		if (szam % i == 0)
		{
			osztokszama++;
		}
		i++;
	}
	if (osztokszama > 0)
	{
		cout << "A megadott szam nem prim!" << endl;
	}
	else {
		cout << "A megadott szam prim!" << endl;
	}

	return 0;
}
Soronkénti közérthető magyarázat (mit csinál a gép ebben a sorban?):
A kód adott sora Mit jelent ez magyarul, hétköznapi nyelven?
1 int i = 2, osztokszama = 0; A tesztelést 2-vel indítjuk (mert 1-gyel minden szám osztható), és nulláról indítjuk a hibaszámlálót.
Ha az osztokszama a végén is 0 marad, a szám prím.
2 while (i <= szam / 2 && osztokszama == 0) Addig vizsgálódj, amíg nem értük el a szám felét, ÉS még egyetlen osztót sem találtunk!
Zseniális trükk: egy számnak a felénél nagyobb osztója már nem lehet (pl. 100-nak 50 a legnagyobb osztója). Nem kell feleslegesen számolni!
3 if (szam % i == 0) { osztokszama++; } Ha megtaláltuk, hogy maradék nélkül osztható valamivel, feljegyezzük: találtunk egy osztót!
Mivel a feltételben szerepelt az 'osztokszama == 0', a ciklus a legelső talált osztónál azonnal LEÁLL, spórolva az idővel.
4 if (osztokszama > 0) ... nem prim Ha találtunk osztót, kiírja: NEM prím. Különben: PRÍM!
Kétirányú döntés a számláló alapján.
Órai fájl: 3.4.cpp

3.4. Példa: Karakter Kitaláló Játék (Feltételig tartó ciklus)

Addig csináld, amíg el nem találod!

Ez a feladat azt tanítja meg, hogyan kérünk be adatot addig, amíg a felhasználó nem adja meg a titkos jelet ('@'), miközben számoljuk a próbálkozásokat.

Hétköznapi hasonlat: Gondolj a barkochbára: addig teszel fel kérdéseket, amíg ki nem találod a feladványt, és a végén megszámolod, hányadik kérdésre sikerült.
#include <iostream>
using namespace std;

int main()
{
	int db = 1;
	char karakter;
	cout << "Adjon meg egy kulonleges karaktert: ";
	cin >> karakter;
	while (karakter != '@')
	{
		cout << "Nem sikerult, probald ujra!\nAdjon meg egy kulonleges karaktert: ";
		cin >> karakter;
		db++;
	}
	
	cout << "Gratulalok, eltalaltad a karaktert " << db << " db probalkozasbol!" << endl;

	return 0;
}
Soronkénti közérthető magyarázat (mit csinál a gép ebben a sorban?):
A kód adott sora Mit jelent ez magyarul, hétköznapi nyelven?
1 int db = 1; Elindítjuk a próbálkozások számlálóját 1-ről (hiszen az első kísérletet rögtön megtesszük).
Minden rossz tippnél eggyel nőni fog.
2 while (karakter != '@') AMÍG a beírt karakter NEM EGYENLŐ a kukaccal ('@')...
A program nem enged tovább, bezár a ciklusba, amíg el nem találod a kukacot.
3 cin >> karakter; db++; Újra bekérünk egy jelet, és növeljük a próbálkozások számát.
Ha most eltalálta, a következő ellenőrzéskor a ciklus véget ér.
4 cout << "Gratulalok... " << db << " db probalkozasbol!" Sikeres kitalálás esetén dicsérő üzenet az összes próbálkozás számával.
A ciklus utáni sorok csak a sikeres befejezéskor futnak le.
Órai fájl: 3.5.cpp & 3.6.cpp

3.5. & 3.6. Példa: Hátultesztelő Do-While Ciklus

Miért más a 'do-while' (Csináld, majd nézd meg)?

A sima 'while' ciklusnál a kapuban van az ellenőrzés: ha ott nem stimmel valami, be sem enged. A 'do-while' ciklus magja viszont MINDIG LEFUT LEGALÁBB EGYSZER, és csak a végén dönti el, hogy kell-e ismételni. Bemenet ellenőrzésére (pl. 0 és 100 közötti pontszám) ez a legalkalmasabb eszköz!

Hétköznapi hasonlat: A boltban először leveszed a tejet a polcról és a kasszához viszed (megcsinálod egyszer), és a kasszás ott ellenőrzi, elég-e a pénzed. Nem fordítva!
// 3.5.cpp - Pontszám szigorú ellenőrzése 0-100 között
int pontszam;
do {
	cout << "Adjon meg egy pontszamot 0-100 kozott: ";
	cin >> pontszam;
} while (pontszam > 100 || pontszam < 0);

if (pontszam > 49) {
	cout << "Sikeres" << endl;
} else {
	cout << "Sikertelen" << endl;
}

// 3.6.cpp - Összegzés visszaszámlálással
int szam, osszeg = 0;
cin >> szam;
do {
	osszeg = osszeg + szam;
	szam--;
} while (szam > 0);
cout << "Osszeg: " << osszeg << endl;
Soronkénti közérthető magyarázat (mit csinál a gép ebben a sorban?):
A kód adott sora Mit jelent ez magyarul, hétköznapi nyelven?
1 do { Csináld meg a következő lépéseket gondolkodás nélkül legalább egyszer!
Nincs mellette feltétel, feltétel nélkül belép.
2 cin >> pontszam; Bekéri a pontszámot a felhasználótól.
A felhasználó bármit beírhat: -10-et, 150-et vagy 75-öt.
3 } while (pontszam > 100 || pontszam < 0); Ismételd meg az egészet elölről, HA a pontszám 100-nál nagyobb VAGY (||) 0-nál kisebb!
A két függőleges vonal (||) a logikai VAGY: elég, ha az egyik hiba teljesül, a program máris újra bekéri a pontszámot, nem enged tovább rossz adattal!
4 if (pontszam > 49) Mivel a do-while garantálja, hogy a pontszám 0 és 100 között van, itt már nyugodtan eldönthetjük: 50-től sikeres a vizsga.
Tiszta, biztonságos logika.
Órai fájl: 3.7.cpp & 3.8.cpp

3.7. & 3.8. Példa: ASCII Tábla és Karakterfüggvények

Hogyan vizsgálunk karaktereket függvényekkel?

A C++ beépített segédeszközei megmondják egy karakterről, hogy micsoda. Az 'isalpha' megmondja, hogy betű-e, az 'isdigit' pedig azt, hogy számjegy-e.

Hétköznapi hasonlat: Mint a levélválogató gép: megnézi a csomagot, és szétválogatja: betűk a bal oldali rekeszbe, számok a jobb oldaliba, minden egyéb jel a harmadikba.
// 3.7.cpp - A teljes ASCII tábla kiírása (0-tól 255-ig)
for (int i = 0; i < 256; i++) {
	cout << i << ": " << (char)i << endl;
}

// 3.8.cpp - Karakter típusának felismerése
char karakter;
cin >> karakter;
int betu = isalpha(karakter);
int szam = isdigit(karakter);

if (betu) {
	cout << "A megadott karakter betu" << endl;
} else if (szam) {
	cout << "A megadott karakter szam" << endl;
} else {
	cout << "A megadott karakter egyeb jel" << endl;
}
Soronkénti közérthető magyarázat (mit csinál a gép ebben a sorban?):
A kód adott sora Mit jelent ez magyarul, hétköznapi nyelven?
1 cout << i << ": " << (char)i << endl; Kiírja a sorszámot (pl. 65), majd mögé a hozzá tartozó betűt ('A') a (char) átalakítással.
0-tól 255-ig minden létező alapvető karaktert kirajzol a konzolra.
2 betu = isalpha(karakter); Megkérdezzük a beépített nyelvtant: 'Ez egy betű?'. Ha igen, nem-nulla értéket ad vissza.
Az 'isalpha' az alphabet (ábécé) szóból ered.
3 szam = isdigit(karakter); Megkérdezzük: 'Ez egy számjegy (0-9)?'.
A 'digit' az angol számjegy szó.
4 if (betu) ... else if (szam) ... else ... Szétválogatjuk: ha betű volt, azt mondjuk; ha számjegy, akkor azt; minden más esetben (pl. @, #, !) egyéb jel.
Biztonságos hármas kategorizálás.
Órai fájl: 3.9.cpp

3.9. Példa: Tömbök Kezelése C++-ban (Array)

Mi az a Tömb?

Ha 100 darab számot akarnál tárolni, őrültség lenne 100 különböző nevű változót (szam1, szam2...) csinálni. A tömb egyetlen név alatt több azonos típusú adatot tárol egymás mellett a memóriában. FONTOS: A számítástechnikában a számlálás MINDIG 0-val kezdődik, tehát a legelső elem a 0. indexen van!

Hétköznapi hasonlat: Képzelj el egy tojástartót, amiben pontosan 8 férőhely van egymás mellett. Nem kell 8 külön dobozt venned, egyetlen közös tartóban vannak, és a rekeszeket sorszámozzuk: 0., 1., 2. ... 7. hely.
#include <iostream>
using namespace std;

int main()
{
	int tmb[8], osszeg = 0;
	char Tmb[8] = { 'a','b','c','d','e','f','g','h' };
	for (int i = 0; i < 8; i++)
	{
		cout << "Adja meg a(z) " << i + 1 << ". elemet a tombnek: ";
		cin >> tmb[i];
		osszeg = osszeg + tmb[i];
	}
	cout << "A tomb elemeinek osszege: " << osszeg << endl;
	for (int i = 0; i < 8; i++)
	{
		cout << i + 1 << ". karakter: " << Tmb[i] << endl;
	}
	for (int i = 0; i < 8; i++)
	{
		cout << i + 1 << ". szam: " << tmb[i] << endl;
	}

	return 0;
}
Soronkénti közérthető magyarázat (mit csinál a gép ebben a sorban?):
A kód adott sora Mit jelent ez magyarul, hétköznapi nyelven?
1 int tmb[8]; Létrehozunk egy 8 rekeszből álló egész szám tartót, aminek a neve 'tmb'.
A szögletes zárójelben lévő 8 a tömb méretét adja meg.
2 char Tmb[8] = { 'a', 'b', ... }; Létrehozunk egy 8 rekeszes betűtartót, és azonnal bele is pakoljuk az 'a'-tól 'h'-ig tartó betűket.
Ezt hívjuk tömb inicializálásnak: kapcsos zárójelek között adjuk meg az induló értékeket.
3 cin >> tmb[i]; A beírt számot betesszük a tömb i-edik rekeszébe.
Amikor i = 0, a legelső rekeszbe kerül, amikor i = 1, a másodikba, és így tovább.
4 osszeg = osszeg + tmb[i]; Minden beolvasott elemet azonnal hozzáadunk az eddigi összeghez.
Így egyetlen menetben beolvassuk és össze is adjuk a számokat.
5 cout << ... Tmb[i]; Ciklussal sorban kiolvassuk és kiírjuk a tömb rekeszeiben lévő betűket.
A tömböket szinte mindig for ciklussal járjuk be, mert a ciklusváltozó (i) pontosan megfelel a tömb indexének!