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.
A lecke végére
- switch utasítással választasz egy változó értékei közül;
- tudod, mire való a
case, abreakés adefault; - 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
- az else if láncot és a logikai operátorokat (3.2);
- a szövegmetódusokat (2.5);
- az átlagkalkulátort (2.4–3.2).
Több érték egy ágon
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):
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ész | Jelenté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 7 | Tö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:
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.
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?
| Helyzet | Jó 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íteni | switch-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 van | if, else |
Hibavadászat
🐞 1. Elfelejtett break
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
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”
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ű
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
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
defaulta „minden más”. - C#-ban minden ágat
breakzár, átcsúszás nincs. - Több egymás alatti
caseugyanazt az ágat futtatja. - A switch-kifejezés (
x switch { 1 => …, _ => … }) egy értéket ad vissza; benneor, relációs minta (>= 90) éswhenis lehet. - A
Math.Roundalapbó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.

