C# programozás kezdőknek › 3.3 lecke

C# tanfolyam · 3.3 lecke

switch és switch-kifejezés

Egy játékmenü, a hét napjai, egy jegy szöveges neve: ha egy változó sok konkrét értéke közül kell választani, a hosszú else if lánc helyett van egy átláthatóbb megoldás. Ebben a leckében a klasszikus switch utasítást és a modern, tömör switch-kifejezést is megismered.

  • kb. 45 perc
  • kezdő szint
  • 9. osztály
Nyitókép helye (16:9)

A lecke végére

  • switch utasítással választasz egy változó értékei közül;
  • tudod, mire való a case, a break és a default;
  • több értéket egy ágba fogsz össze;
  • tömör switch-kifejezést írsz, relációs mintákkal is;
  • eldöntöd, mikor jobb a switch, és mikor az else if.

Ehhez használod

Több érték egy ágon

Program.csC#
Console.Write("Milyen nap van ma? ");string nap = Console.ReadLine().Trim().ToLower();switch (nap){    case "szombat":    case "vasárnap":        Console.WriteLine("Hétvége, pihenj! 😎");        break;    case "péntek":        Console.WriteLine("Már csak egy nap!");        break;    default:        Console.WriteLine("Hétköznap, irány a suli!");        break;}

Ha több case közvetlenül egymás alatt áll, és közöttük nincs utasítás, ugyanaz az ág fut le mindegyiknél. A .Trim().ToLower() miatt a „ Szombat ” is működik.

A modern switch-kifejezés

Ha a switch csak arra kell, hogy egy értékből egy másikat készítsen, sokkal rövidebben is írható. Ez a switch-kifejezés (a C# 8-as változata óta van):

Program.csC#
int napSzam = 3;string napNev = napSzam switch{    1 => "hétfő",    2 => "kedd",    3 => "szerda",    4 => "csütörtök",    5 => "péntek",    6 or 7 => "hétvége",    _ => "nincs ilyen nap"};Console.WriteLine(napNev);
RészJelentése
napSzam switch { … }A vizsgált változó áll elöl, a kifejezés eredménye egy érték.
1 => "hétfő",Ha az érték 1, az eredmény „hétfő”. Az ágakat vessző választja el.
6 or 7Több érték egy ágon.
_„Minden más”: olyan, mint a default.
};A végén pontosvessző, hiszen ez egy értékadás.

Relációs minták: tartományok is mehetnek

A switch-kifejezésben nemcsak pontos értéket, hanem összehasonlítást is írhatsz. Emlékszel a 3.2 jelvényrendszerére? Így is lehet:

Program.csC#
int pont = 72;string jelveny = pont switch{    >= 90 => "Arany 🥇",    >= 70 => "Ezüst 🥈",    >= 50 => "Bronz 🥉",    _ => "Gyakorolj még!"};

🔮 Jósold meg!

Itt is számít a sorrend, mint a 3.2-ben? Mi történne, ha a >= 50 ág kerülne előre?

Megoldás

Igen, számít: az ágakat felülről lefelé vizsgálja, és az első illeszkedőt választja. Ha a >= 50 állna elöl, a fordító hibát jelez (CS8510), mert a lejjebb lévő >= 70 és >= 90 ágak már soha nem futhatnának le. A switch-kifejezésnél tehát a fordító is figyel rád!

Átlagkalkulátor: jegy az átlagból

A 3.2-ben határértékekkel minősítettünk. Másik megoldás: kerekítsük az átlagot egész jegyre, és ahhoz rendeljük a nevét.

Program.cs – a mini projekt folytatásaC#
int jegy = (int)Math.Round(atlag, MidpointRounding.AwayFromZero);string minosites = jegy switch{    5 => "jeles",    4 => "jó",    3 => "közepes",    2 => "elégséges",    _ => "elégtelen"};Console.WriteLine($"Kerekített jegy: {jegy} ({minosites})");

⚠️ Tudtad? Furcsa kerekítés

Próbáld ki: Console.WriteLine(Math.Round(2.5)); Az eredmény 2, nem 3! A C# alapból az úgynevezett bankár-kerekítést használja: a pontosan feles értéket a páros szomszédjához kerekíti (2,5 → 2; 3,5 → 4). Az iskolában tanult kerekítéshez meg kell adni: MidpointRounding.AwayFromZero. Az (int) pedig egész számmá alakítja az eredményt.

Melyiket mikor?

HelyzetJó választás
Egy változó sok konkrét értéke (menüpont, nap, jegy)switch
Egy értékből egy másik értéket kell készíteniswitch-kifejezés
Több különböző változót kell vizsgálni, összetett feltétellel (vanJegye && kor >= 16)if, else if
Csak két lehetőség vanif, else

Hibavadászat

🐞 1. Elfelejtett break

Hibás kódC#
case "1":    Console.WriteLine("Indul a játék!");case "2":    Console.WriteLine("Ranglista");    break;
Mi a baj?

A fordító hibát jelez (CS0163): a vezérlés nem „csúszhat át” egyik ágból a másikba. Más nyelvekben (C, C++, JavaScript) ez szabályos, és sok rejtett hibát okoz, ezért a C# megtiltja. Minden utasítást tartalmazó ág végére break; kell.

🐞 2. Kétszer ugyanaz

Hibás kódC#
case 1:    Console.WriteLine("hétfő");    break;case 1:    Console.WriteLine("kedd");    break;
Mi a baj?

Egy érték csak egyszer szerepelhet címkeként (CS0152). Valószínűleg elírás: a második case 2: akart lenni.

🐞 3. Hiányzó „minden más”

Hibás kódC#
string nev = jegy switch{    5 => "jeles",    4 => "jó"};
Mi a baj?

Mi legyen az eredmény, ha a jegy 3? A fordító figyelmeztet (CS8509: nem minden lehetséges érték van lefedve), és ha futás közben tényleg ilyen érték jön, a program kivétellel leáll. Mindig legyen egy _ => … ág a végén.

🐞 4. Kis- és nagybetű

Hibás kódC#
string nap = Console.ReadLine();switch (nap){    case "Szombat":        …
Mi a baj?

Ha a felhasználó „szombat”-ot ír, nincs egyezés. Alakítsd át a bemenetet (.Trim().ToLower()), és a címkéket is kisbetűvel írd.

Kihívások

🍂 1. Melyik évszak?

Kérd be a hónap sorszámát (1–12), és írd ki az évszakot switch-kifejezéssel. Tipp: 12 or 1 or 2 => "tél".

🧮 2. Mini számológép

Kérj be két számot és egy műveleti jelet (+, -, *, /), és írd ki az eredményt. A műveleti jel szerint válassz switch-csel. Mi történjen, ha ismeretlen jelet írnak be? És ha nullával osztanak?

Egy lehetséges megoldás
Program.csC#
Console.Write("Első szám: ");double a = double.Parse(Console.ReadLine());Console.Write("Művelet (+ - * /): ");string muvelet = Console.ReadLine().Trim();Console.Write("Második szám: ");double b = double.Parse(Console.ReadLine());string eredmeny = muvelet switch{    "+" => $"{a + b}",    "-" => $"{a - b}",    "*" => $"{a * b}",    "/" when b != 0 => $"{a / b:F2}",    "/" => "Nullával nem lehet osztani!",    _ => "Ismeretlen művelet."};Console.WriteLine($"Eredmény: {eredmeny}");

A when egy plusz feltételt ad az ághoz: a „/” ág csak akkor illeszkedik, ha b nem nulla. Ezt a számológépet a 4.7-es mini projektben metódusokra bontva továbbfejleszted.

✊ 3. Kő–papír–olló

A gép véletlenszerűen választ, te beírod a tippedet. Írd ki mindkettőt szöveggel! Véletlenszám így készül: Random r = new Random(); int gep = r.Next(1, 4); (1, 2 vagy 3; a felső határ már nem lehet). A győztes eldöntéséhez a 3.2 logikai operátorai kellenek.

Tipp

A szám szöveggé alakításához: string gepNev = gep switch { 1 => "kő", 2 => "papír", _ => "olló" }; A győzelem feltétele vagy-okkal: te kő és a gép olló, VAGY te papír és a gép kő, VAGY te olló és a gép papír. Egyenlő választásnál döntetlen.

Összefoglalás

  • A switch egy változó konkrét értékei közül választ; a default a „minden más”.
  • C#-ban minden ágat break zár, átcsúszás nincs.
  • Több egymás alatti case ugyanazt az ágat futtatja.
  • A switch-kifejezés (x switch { 1 => …, _ => … }) egy értéket ad vissza; benne or, relációs minta (>= 90) és when is lehet.
  • A Math.Round alapból bankár-kerekítést használ; iskolai kerekítéshez: MidpointRounding.AwayFromZero.
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: többirányú elágazás; az algoritmus és a nyelvi elemek közötti választás szempontjai.

Módszertan

A lecke a Microsoft Learn „Branch the flow of code using the switch-case construct in C#” moduljára épül, a modern switch-kifejezéssel és a relációs mintákkal bővítve, amelyek a mai C#-kódokban gyakoriak. A konzolos menü előkészíti a 3.7 mini projektet. A bankár-kerekítés jó alkalom a dokumentáció olvasásának és az „elvárás kontra valós viselkedés” tesztelésének gyakorlására. A „Melyiket mikor?” táblázat a nyelvi elemek közötti tudatos választást fejleszti.

Időterv

A switch utasítás: 10 perc. Több érték egy ágon: 5 perc. A switch-kifejezés: 12 perc. Jegy az átlagból: 8 perc. Melyiket mikor: 3 perc. Hibavadászat: 7 perc. A kihívások otthoni vagy differenciáló feladatok.

Következő lecke: 3.4 for ciklus

Eddig minden sor legfeljebb egyszer futott le. A ciklusokkal a program ismételni is tud: visszaszámlálás, szorzótábla, csillagminták.