C# programozás kezdőknek › 3.1 lecke

C# tanfolyam · 3.1 lecke

Feltételek C#-ban: if és else

Eddig a programjaid minden sort végrehajtottak, mindig ugyanabban a sorrendben. Ebben a leckében megtanítod őket dönteni: ha valami igaz, csináljanak egyet, ha nem, mást. Az átlagkalkulátorod is okosabb lesz: észreveszi a hibásan beírt jegyet.

  • kb. 2 × 45 perc
  • kezdő szint
  • 9. osztály
Száz ponttól megnyílik a kapu: 120 ponttal bejut a játékos, 80 ponttal zárva marad.

A lecke végére

  • feltételt írsz az if utasításba összehasonlításból vagy logikai változóból;
  • az else ággal megadod, mi történjen, ha a feltétel hamis;
  • kapcsos zárójelekkel és behúzással átlátható kódblokkokat írsz;
  • folyamatábrán is ábrázolod az elágazást;
  • az átlagkalkulátorod reagál a hibás bemenetre.

Ehhez használod

Döntések mindenhol

Naponta több száz döntést hozol: ha esik az eső, viszel esernyőt; ha lemerült a telefonod, töltőre teszed. A programok ugyanígy döntenek:

🎮 Játék

Ha az életerő 0, akkor „Game over”, különben folytatódik a játék.

📱 Telefon

Ha a PIN-kód helyes, akkor feloldja a képernyőt, különben hibát jelez.

🛒 Webáruház

Ha a kosár értéke legalább 15 000 Ft, akkor ingyenes a szállítás.

🌡 Okosotthon

Ha 20 °C alá csökken a hőmérséklet, akkor bekapcsol a fűtés.

Mindegyikben van egy feltétel, ami vagy igaz, vagy hamis, és ettől függ, mi történik. A C#-ban erre való az if (angolul: ha) és az else (angolul: különben).

Az if: ha igaz, csináld

Az alábbi részleteket a Main metódus kapcsos zárójelei közé írd. Ebben a példában számjegyekkel add meg a pontszámot, például: 99, 100 vagy 101. Az int.Parse a beírt szöveget egész számmá alakítja. Ha például száz-at írsz be, vagy olyan számot adsz meg, amelyet az int már nem tud tárolni (például 3000000000), a program hibával leáll. Később ebben a leckében megtanuljuk, hogyan kezeljük ezt a TryParse segítségével.
Program.csC#
Console.Write("Hány pontot szereztél? ");int pontszam = int.Parse(Console.ReadLine());if (pontszam >= 100){    Console.WriteLine("Kihívás teljesítve!");}Console.WriteLine("A program véget ért.");
RészJelentése
ifKulcsszó: itt döntés következik.
(pontszam >= 100)A feltétel zárójelben. Az eredménye mindig true vagy false, ahogy a 2.2+ leckében a bool értékek.
{ … }A kódblokk: ezek a sorok csak akkor futnak le, ha a feltétel igaz. A blokk belsejét behúzzuk, hogy jól látsszon, mi tartozik hozzá.

🔮 Jósold meg!

Mit ír ki a program, ha 120 pontot adsz meg? Mi jelenik meg 80 pontnál? Előbb jósolj, utána futtasd!

Megoldás

120 pontnál: „Kihívás teljesítve!”, majd „A program véget ért.” 80 pontnál csak az utóbbi jelenik meg. A blokkon kívüli kiírás mindkét esetben lefut. Teszteld 99, 100 és 101 ponttal is: a 100 már teljesíti a feltételt.

Emlékeztető: összehasonlító operátorok

== egyenlő · != nem egyenlő · < kisebb · > nagyobb · <= kisebb vagy egyenlő · >= nagyobb vagy egyenlő. Figyelj: az egyenlőség vizsgálata két egyenlőségjel!

Az else: különben ezt csináld

Program.csC#
Console.Write("Hány pontot szereztél? ");int pontszam = int.Parse(Console.ReadLine());if (pontszam >= 100){    Console.WriteLine("Kihívás teljesítve!");}else{    Console.WriteLine("Gyűjts még pontokat!");}
KimenetKonzol
Gyűjts még pontokat!

Az else-nek nincs feltétele: akkor fut le, amikor az if feltétele hamis. Amikor a program eléri ezt az elágazást, a feltétel alapján pontosan az egyik blokkot hajtja végre.

✍️ Próbáld ki!

Futtasd a programot 99, 100 és 101 ponttal. Írd fel az eredményeket! Ezután cseréld a >= jelet >-re. Melyik bemenet eredménye változik?

A bool kapcsolja a megfelelő ágat

A bool siker = int.TryParse(pontSzoveg, out int pontszam); sor két eredményt ad: a siker jelzi az átalakítás sikerét, a pontszam pedig a kapott egész szám. Az if (siker) közvetlenül ezt a logikai értéket vizsgálja. Sikertelen átalakítás után a 0 értéket nem használjuk pontszámként.
Biztonságosabb pontbekérés – mintamegoldás
Program.cs – a Main metódusbaC#
Console.Write("Hány pontot szereztél? ");string pontSzoveg = Console.ReadLine();bool siker = int.TryParse(pontSzoveg, out int pontszam);if (siker){    if (pontszam >= 100)    {        Console.WriteLine("Kihívás teljesítve!");    }    else    {        Console.WriteLine("Gyűjts még pontokat!");    }}else{    Console.WriteLine("Egész számot adj meg!");}
Próbák: 120, 80, száz és üres bemenet. Az egymásba írt if-ek egymás után ellenőriznek: előbb az átalakítást, majd csak siker esetén a pontszámot.

Két külön if vagy if–else?

Két külön if: két külön ellenőrzés. A program mindkét feltételt megvizsgálja. Nézd meg 120 ponttal:
A Main metódusbaC#
int pontszam = 120;if (pontszam >= 100){    Console.WriteLine("Elérted a 100 pontot!");}if (pontszam >= 50){    Console.WriteLine("Elérted az 50 pontot!");}
Mindkét üzenet megjelenik, mert a 120 legalább 100, és legalább 50 is.If–else: választás két lehetőség közül. Itt azt szeretnénk jelezni, hogy teljesült-e a százpontos kihívás:
A Main metódusbaC#
int pontszam = 120;if (pontszam >= 100){    Console.WriteLine("Kihívás teljesítve!");}else{    Console.WriteLine("Gyűjts még pontokat!");}
120 pontnál csak a „Kihívás teljesítve!” jelenik meg. 80 pontnál csak a „Gyűjts még pontokat!” üzenetet kapod. Az else akkor fut le, ha az előtte álló if feltétele hamis.Próbáld ki: mindkét példában írd át a pontszámot 80-ra! Előbb jósolj, majd futtasd. Az első programban az 50 pontos üzenet jelenik meg; a másodikban a „Gyűjts még pontokat!”.

Rajzold le: folyamatábra

Az algoritmusokat a programozók gyakran folyamatábrán tervezik meg, mielőtt kódot írnának. A döntést rombusz jelöli, amelyből két ág indul: igaz és hamis.

Start, pontszám beolvasása, pontszám legalább 100? Igaz: kihívás teljesítve. Hamis: gyűjts még pontokat. Mindkét ág a Stophoz vezet. Szabályos egész bemenetet feltételezünk.StartBe: pontszámpontszám ≥ 100?igazhamisKi: Kihívás teljesítve!Ki: Gyűjts még pontokat!Stop

✍️ Rajzolj!

Rajzold le a füzetedbe a webáruház ingyenes szállításának folyamatábráját (be: a kosár értéke; döntés: legalább 15 000 Ft?). Utána írd meg hozzá a C#-kódot. Ebben a példában a fizetős szállítás 1 490 Ft. Próbák: 14 999, 15 000 és 15 001 Ft; szabályos, nem negatív egész összegekkel dolgozz.

Melyik kosárhoz jár ingyenes szállítás?Két bevásárlókosár: az A kosár értéke 14 999 forint, a B kosáré 15 000 forint. A webáruházban legalább 15 000 forintos kosárhoz ingyenes a szállítás, egyébként 1 490 forint. Döntsd el, melyik kosár teljesíti a feltételt!Melyik kosárhoz jár ingyenes szállítás?A feltétel: a kosár értéke legalább 15 000 Ft.A kosárB kosár14 999 Ft15 000 FtHa a feltétel hamis, a szállítás díja 1 490 Ft.
Jósolj: az A és a B kosárnál melyik ág fut le? A pontos határértéket is vizsgáljuk.
A webáruház feladatának megoldása
Program.cs – a Main metódusbaC#
Console.Write("A kosár értéke egész forintban: ");int kosar = int.Parse(Console.ReadLine());if (kosar >= 15000){    Console.WriteLine("Ingyenes a szállítás.");}else{    Console.WriteLine("A szállítás díja 1490 Ft.");}
14 999 Ft-nál fizetős, 15 000 és 15 001 Ft-nál ingyenes a szállítás. Folyamatábra: Start → kosár beolvasása → kosár ≥ 15 000? Az igaz ág az ingyenes szállítást, a hamis ág az 1 490 Ft-os díjat írja ki; a két ág közös Stop ponthoz vezet.

Okosabb átlagkalkulátor

A korábbi projektben a sikeres átalakítást már eltároltuk. Most külön ellenőrizzük az átalakítást és a jegyek tartományát. Az alábbi teljes részlettel cseréld le a Main metódus korábbi belsejét, hogy ne maradjon benne feltétel nélküli átlagolás.
Program.cs – a Main metódusbaC#
Console.Write("Neved: ");string nev = Console.ReadLine();Console.Write("Matematika jegy: ");bool siker1 = int.TryParse(Console.ReadLine(), out int jegy1);Console.Write("Magyar jegy: ");bool siker2 = int.TryParse(Console.ReadLine(), out int jegy2);Console.Write("Informatika jegy: ");bool siker3 = int.TryParse(Console.ReadLine(), out int jegy3);bool ervenyes = true;if (siker1 == false){    Console.WriteLine("Az első jegy nem egész szám.");    ervenyes = false;}if (siker2 == false){    Console.WriteLine("A második jegy nem egész szám.");    ervenyes = false;}if (siker3 == false){    Console.WriteLine("A harmadik jegy nem egész szám.");    ervenyes = false;}// Minden jegynek 1 és 5 közé kell esnie.if (jegy1 < 1) { ervenyes = false; }if (jegy1 > 5) { ervenyes = false; }if (jegy2 < 1) { ervenyes = false; }if (jegy2 > 5) { ervenyes = false; }if (jegy3 < 1) { ervenyes = false; }if (jegy3 > 5) { ervenyes = false; }if (ervenyes){    double atlag = (jegy1 + jegy2 + jegy3) / 3.0;    Console.WriteLine($"{nev} átlaga: {Math.Round(atlag, 2)}");    if (atlag >= 4.5)    {        Console.WriteLine("Szép eredmény, gratulálok!");    }    else    {        Console.WriteLine("Gyakorolj tovább a kitűzött célodért!");    }}else{    Console.WriteLine("Nem számolunk átlagot. Mindhárom jegy 1–5 közötti egész szám legyen!");}
Az ervenyes kezdetben igaz. Bármelyik hiba hamisra állítja, és később már nem állítjuk vissza igazra. Az átlagot csak az if (ervenyes) blokkon belül számoljuk. A külön ellenőrzésekhez még nem kell összetett logikai feltétel.A TryParse a 6-ot sikeresen számmá alakítja, de a 6 nem érvényes jegy. Ezért szükséges a tartomány vizsgálata is. A 4,5-ös küszöb ebben a gyakorlóprogramban választott visszajelzési szabály.
Tesztesetek és várt eredmények
  • 5, 5, 4 → átlag 4,67; gratuláció.
  • 5, 4, 4 → átlag 4,33; gyakorlásra ösztönző üzenet.
  • 1, 1, 1 → átlag 1; érvényes bemenet.
  • „öt”, 4, 4 → átalakítási hiba; nincs átlag.
  • 0, 4, 4 és 6, 4, 4 → tartományhiba; nincs átlag.
  • 4, 4,5, 5 → a második jegy nem egész szám; nincs átlag.
Három egész jegy átlaga pontosan 4,5 nem lehet: ehhez 13,5-ös összeg kellene. A küszöb két oldalán a legközelebbi lehetséges átlagok 13/3 és 14/3, azaz körülbelül 4,33 és 4,67. A döntés az eredeti átlagot vizsgálja; kerekítést csak a kiíráshoz használunk.

Hibavadászat

Keresd meg a hibát!

Olvasd el a kódot, és keresd meg, miért működik másképp, mint várnád. A magyarázatot csak a saját próbád után nyisd le!

🐞 1. Egy egyenlőségjel

Hibás kódC#
if (kor = 18){    Console.WriteLine("Nagykorú vagy.");}
Mi a baj?

Az = értékadás, nem összehasonlítás. A fordító hibát jelez (CS0029: az int nem alakítható bool típussá), mert a feltételnek true vagy false értékűnek kell lennie. Helyesen: kor == 18, vagy ha a 18 évesek és az idősebbek is számítanak: kor >= 18.

🐞 2. A rejtélyes pontosvessző

Hibás kódC#
if (pontszam >= 50);{    Console.WriteLine("Sikeres teszt!");}
Mi a baj?

A pontosvessző lezárja az if-et egy üres utasítással, így a kapcsos zárójeles blokk már nem tartozik hozzá, és mindig lefut, 10 pontnál is. A Visual Studio figyelmeztet is (CS0642: lehetséges, hogy tévedésből írt üres utasítás). Az if (…) után soha nincs pontosvessző.

🐞 3. Hiányzó kapcsos zárójel

Hibás kódC#
if (eletero == 0)    Console.WriteLine("Game over!");    Console.WriteLine("Próbáld újra!");
Mi a baj?

Kapcsos zárójel nélkül csak az első utasítás tartozik az if-hez. A „Próbáld újra!” a behúzás ellenére mindig megjelenik: a C#-ot nem a behúzás, hanem a kapcsos zárójel érdekli. Jó szokás mindig kitenni a kapcsos zárójelet, egyetlen sornál is.

🐞 4. Igen vagy igen?

Hibás kódC#
Console.Write("Szereted a pizzát? ");string valasz = Console.ReadLine();if (valasz == "igen"){    Console.WriteLine("Én is! 🍕");}
Mi a baj?

Szövegek összehasonlításánál számít a kis- és nagybetű: ha a felhasználó azt írja, hogy „Igen”, a feltétel hamis. Egy megoldás: alakítsd kisbetűssé a választ: valasz.ToLower() == "igen". A szövegkezelés trükkjeit a 2.5 leckében gyűjtjük össze.

Kihívások

🔐 1. Jelszóellenőrző

Kérj be egy jelszót. Ha megegyezik a programban tárolt jelszóval, írd ki: „Belépés engedélyezve”, különben: „Hibás jelszó”.

Egy lehetséges megoldás
Program.csC#
Console.Write("Jelszó: ");string jelszo = Console.ReadLine();if (jelszo == "Kalap2026"){    Console.WriteLine("Belépés engedélyezve");}else{    Console.WriteLine("Hibás jelszó");}

Fontos: valódi programokban a jelszót soha nem írják bele így a kódba, mert a lefordított programból is kiolvasható. Gyakorlásra viszont jó.

🔢 2. Páros vagy páratlan?

Kérj be egy egész számot, és írd ki, hogy páros vagy páratlan. Tipp: a 2.3 leckében tanult maradékos osztás (%) segít. Próbák: 0, 1, 2, −3 és −4. A 0 páros, és negatív egész számoknál is működik a nullával összehasonlítás.

Egy lehetséges megoldás
Program.csC#
Console.Write("Adj meg egy egész számot: ");int szam = int.Parse(Console.ReadLine());if (szam % 2 == 0){    Console.WriteLine("Páros");}else{    Console.WriteLine("Páratlan");}

🎬 3. Mozijegy

Ebben a kitalált moziban a jegy 2 600 Ft, 18 év alatt életkori kedvezménnyel 1 900 Ft. Kérd be az életkort, és írd ki a jegy árát. Teszteld 17, 18 és 19 évvel: a 18 éves már teljes árat fizet. A feladat szabályos, nem negatív egész életkort feltételez.

Egy lehetséges megoldás
Program.csC#
Console.Write("Hány éves vagy? ");int kor = int.Parse(Console.ReadLine());int ar;if (kor < 18){    ar = 1900;}else{    ar = 2600;}Console.WriteLine($"A jegyed ára: {ar} Ft");

Figyeld meg: az ar változót az if előtt hoztuk létre, így mindkét ág beállíthatja, és a végén ki is írhatjuk. Erről a hatókörnél (4.3) még lesz szó.

❄️ 4. Fagyriasztó

Kérd be a hőmérsékletet (tizedes is lehet). Ha 0 °C alatti, írd ki: „Fagy van, vigyázz az úton!”, különben: „Nincs fagy.” Melyik típust választod, és miért?

Egy lehetséges megoldás
Program.cs – a Main metódusbaC#
Console.Write("Hőmérséklet: ");bool siker = double.TryParse(Console.ReadLine(), out double homerseklet);if (siker){    if (homerseklet < 0)    {        Console.WriteLine("Fagy van, vigyázz az úton!");    }    else    {        Console.WriteLine("Nincs fagy.");    }}else{    Console.WriteLine("Számot adj meg!");}
A double tizedes értéket is tárolhat. A tizedesjel a futtatási környezet területi beállításától függ: magyar beállítás mellett általában vessző, angol mellett pont. Teszteld −0,5; 0; 0,5 értékekkel a megfelelő tizedesjellel, majd szöveggel. Ebben a feladatban a riasztás feltétele szigorúan 0 alatti hőmérséklet; 0-nál az else ág fut.

Összefoglalás

Ellenőrizd magad!

Tudsz már adatot bekérni, feltételt írni és megmagyarázni, melyik ág fut le? Az alábbi pontokat nézd át, majd válassz egy kihívást, amelyet önállóan megoldasz!
  • Az if feltétele mindig true vagy false értékű, zárójelben áll.
  • A kódblokk kapcsos zárójelek közé kerül, és csak igaz feltételnél fut le.
  • Az else-nek nincs feltétele: akkor fut, ha az if feltétele hamis. A kettő közül mindig pontosan egy fut le.
  • Az összehasonlítás ==, az értékadás =; az if (…) után nincs pontosvessző.
  • A döntést folyamatábrán rombusz jelöli, két ággal.
Tanároknak

Kerettantervi kapcsolódás

NAT 2020, Digitális kultúra, 9. évfolyam, Algoritmizálás és formális programozási nyelv használata: elágazás, egyszerű és összetett feltételek, algoritmus leírása folyamatábrával.

Módszertan

A lecke az egyszerű feltételes végrehajtástól a kétágú elágazáson át a bemenetellenőrzésig halad. A rövid kódminták a Main metódusban futtathatók; a kezdeti Parse-példák feltételezését külön jelezzük, majd TryParse-szal bővítjük őket. A jóslós feladatok és a tesztesetek tervezése a PRIMM-szemléletet (Predict, Run, Investigate, Modify, Make) követik. A mini projekt folytatása a korábban tanultak alkalmazását és a fokozatos fejlesztést mutatja meg.

Tipikus tévképzetek

Az = és == összekeverése; a behúzásnak tulajdonított jelentés (3. hibavadász-feladat); hogy az if után következő sorok is a döntéstől függnek.

Időterv

Két tanórára javasolt. Első óra: döntések 5 perc; if adatbekéréssel 12 perc; if–else és határesetek 13 perc; bool és TryParse 10 perc; visszajelzés 5 perc. Második óra: folyamatábra 8 perc; kalkulátor 17 perc; hibavadászat 10 perc; önálló kihívás és megbeszélés 10 perc. A további kihívások differenciáló vagy otthoni feladatok.

Következő lecke: 3.2 else if és logikai operátorok

Mi van, ha nem két, hanem több lehetőség van? Megtanulod az else if-et, és az &&, || és ! operátorokkal összetett feltételeket írsz, például a jegy szöveges értékeléséhez.

Szakmai háttér: Microsoft Learn: if és if–else; Int32.TryParse. A nyitóillusztráció mesterséges intelligencia által előállított kép.