C blokk · Vezérlési szerkezetek · 1. tananyag
A B blokk végére a programjaid beszélnek, számolnak, színeznek — de mindig
ugyanazt csinálják. Ma megtanulnak dönteni.
És beváltjuk az ígéretet: a B6-os
TryParse eddig parlagon hagyott bool eredménye
végre munkába áll.
==,
!=, <,
>, <=,
>=) írsz logikai kifejezéseket — és tudod,
hogy az eredményük bool érték.= és a
== között.if,
else és
else if szerkezeteket írsz,
helyes blokkokkal és behúzással.&&,
||, !.Eddig minden programunk szekvencia volt: az utasítások sorban, egyszer, felülről lefelé futottak le (A8). A szelekció (elágazás) ezt töri meg: a program egy feltételtől függően választ, melyik úton megy tovább.
Három alakja van:
| Alak | Kérdés | C#-eszköz |
|---|---|---|
| egyágú | „Ha igaz, tegyél meg valamit — különben semmit.” | if |
| kétágú | „Ha igaz, ezt; ha hamis, azt.” | if + else |
| többágú | „Több eset közül melyik áll fenn?” | else if lánc (és a C2-es switch) |
Az elágazással a programodnak több lehetséges útvonala lesz. Teszteléskor mindegyiket ki kell próbálni — nem elég az, amelyik elsőre lefutott. Jegyezd meg: ahány ág, annyi próba.
A bool típus a
B1 óta velünk
van, de eddig statiszta volt. Az if feltétele mindig bool értékű
kifejezés — és ezt leggyakrabban hasonlító
operátorok állítják elő:
| Operátor | Jelentés | Példa | Értéke |
|---|---|---|---|
== | egyenlő | 5 == 5 | true |
!= | nem egyenlő | 5 != 5 | false |
< > | kisebb / nagyobb | 3 < 8 | true |
<= >= | kisebb-egyenlő / nagyobb-egyenlő | 7 <= 6 | false |
A hasonlítás eredménye ugyanolyan érték, mint bármely másik — változóba is tehető:
int eletkor = 17; bool nagykoru = eletkor >= 18; Console.WriteLine(nagykoru); // False Console.WriteLine(5 == 5); // True Console.WriteLine(nagykoru.GetType()); // System.Boolean — minden objektum!
Az = értékadás („legyen”), a
== összehasonlítás
(„egyenlő-e?”). Ha feltételbe =-t írsz
(if (szam = 5)), a C# fordítási hibát ad
(CS0029: az int nem alakítható bool-lá) — szerencsére, mert más
nyelvekben ez csendben hibás program lenne. Egy helyen viszont tényleg
csapda: bool változónál az if (kesz = true)
lefordul, és mindig igaz! Ezért bool-t így vizsgálj:
if (kesz).
Stringek összehasonlítása: C#-ban a
jelszo == "titok" pontosan azt teszi, amit
vársz — a tartalmat hasonlítja, a kis- és nagybetűket is
megkülönböztetve.
if (eletkor >= 18) { Console.WriteLine("Beléphetsz."); }
Felépítése: if + kerek zárójelben a
feltétel (a zárójel kötelező!) + kapcsos zárójelek
között az utasítások, amelyek csak igaz feltételnél futnak le.
A blokk sorait a Visual Studio automatikusan beljebb húzza
(A9) — a
behúzás mutatja, mi tartozik az if-hez.
Kétágú változat az else ággal:
if (eletkor >= 18) { Console.WriteLine("Beléphetsz."); } else { Console.WriteLine("Sajnos még nem léphetsz be."); }
A két ág közül pontosan az egyik fut le — nem futhat le mindkettő és olyan sem fordulhat elő, hogy egyik sem fut le.
A C# megengedi a { } elhagyását egyetlen
utasításnál — mi mégis mindig kiírjuk: a blokk nélküli
if a hibák melegágya (a 7. szakaszban látni fogod, miért).
if (pontszam >= 85) { Console.WriteLine("Jeles!"); } else if (pontszam >= 70) { Console.WriteLine("Jó"); } else if (pontszam >= 55) { Console.WriteLine("Közepes"); } else { Console.WriteLine("Ez most nem sikerült."); }
pontszam < 85 && pontszam >= 70:
oda csak úgy juthat a vezérlés, ha az első feltétel hamis volt.else a „minden más” ág — elhagyható,
de gyakran hasznos.>= 55
ág kerülne előre, a 90 pontos dolgozat is „Közepes” lenne.| Operátor | Neve | Igaz, ha… | Példa |
|---|---|---|---|
&& | ÉS | mindkét oldala igaz | eletkor >= 12 && eletkor < 65 |
|| | VAGY | legalább az egyik oldala igaz | nap == "szo" || nap == "vas" |
! | tagadás | az utána álló kifejezés hamis | !kesz |
Matematikaóráról ismerős a 3 < szam < 8
alak — C#-ban ez fordítási hiba! A gép egyszerre csak két
értéket hasonlít; helyesen:
szam > 3 && szam < 8.
A && ki sem értékeli a jobb oldalát,
ha a bal már hamis (a || pedig ha a bal már
igaz). Most csak érdekesség — az E blokkban még hasznot húzunk
belőle.
Adott: int szam = 10; bool kesz = false; — mit ad az if feltételébe írt kifejezés?
A B6-ban a
TryParse receptjét tanultuk, a
B7-ben
használtuk is — de a visszaadott bool-lal eddig
nem tudtunk mit kezdeni. Most már tudunk:
Console.Write("Hány éves vagy? "); bool sikerult = int.TryParse(Console.ReadLine(), out int eletkor); if (sikerult) { Konzol.Siker($"Rendben, {eletkor} éves vagy."); } else { Konzol.Hiba("Ez nem egész szám — így nem tudok számolni vele."); }
Parse FormatException-je), hanem a mi
hibaüzenetünk jelenik meg — pirossal, a
B8-as
Konzol osztállyal.sikerult változó el is hagyható, a hívás
mehet egyenesen a feltételbe:
if (int.TryParse(Console.ReadLine(), out int eletkor)).| Tünet | Mi történt? | Mit tegyél? |
|---|---|---|
CS0029: Cannot implicitly convert type 'int' to 'bool' | =-t írtál == helyett a feltételben | if (szam == 5) |
| a feltétel „mindig igaz”, pedig bool változót vizsgálsz | if (kesz = true) — értékadás történt | if (kesz) — és kész |
CS1525 a 3 < szam < 8 sorra | matematikai „hármas hasonlítás” | szam > 3 && szam < 8 |
| az if utáni blokk mindig lefut | pontosvessző került az if mögé: if (x > 5); | az if sora nem utasítás — nincs utána ; |
| a második „behúzott” sor hamis feltételnél is lefut | blokk nélküli if: csak az első sor tartozik hozzá | mindig írj { }-t |
CS0165: Use of unassigned local variable | a változó csak az egyik ágban kapott értéket | adj kezdőértéket a deklarációnál, vagy mindkét ágban |
| az else if lánc rossz kategóriát ad | a feltételek sorrendje nem szűkülő | a legszigorúbb feltétel kerüljön előre (4. szakasz) |
SzinesKonzol projektet — benne a
Konzol.cs.TryParse eredménye
mostantól döntsön: sikeres beolvasásnál
Konzol.Siker, hibásnál
Konzol.Hiba — és hibás bevitel esetén vegyél
fel egy értelmes alapértelmezett értéket, hogy a program folytatódhasson.A bot mar dont: TryParse + if.Hibás bevitelre a program nem áll le, hanem piros üzenetet ír és folytatódik; a kor szerinti ágak határai jól működnek; minden ágat kipróbáltál legalább egyszer.
⭐ alap · ⭐⭐ haladó · ⭐⭐⭐ kihívás
Páros vagy páratlan? Kérj be egy egész számot, és írasd ki, melyik.
(A % a
B2-ből —
az összehasonlítás a mai anyag.)
Jelszóellenőr: tárolj egy jelszót konstansban, kérd be a felhasználótól a jelszót, és zölddel engedd be, ha egyezik vagy pirossal utasítsd el, ha hibás jelszót gépelt be.
A nagyobbik: kérj be két számot, és írasd ki a nagyobbikat — arra az esetre is gondolj, ha egyenlők!
Öltözködési tanácsadó: kérd be a hőmérsékletet, és adj tanácsot legalább négy sávban (pl. fagy alatt / hűvös / kellemes / hőség) — ügyelj a sávhatárokra és a feltételek sorrendjére.
Okos pénzváltó: fejleszd tovább a B9.5-ös pénzváltót: hibás bevitelre piros hibaüzenet (TryParse), nulla vagy negatív összegre figyelmeztetés — és ha a kapott euró több 100 €-nál, írd ki azt is, hogy az már „komoly nyaralópénz”.
Minden kérdésnél egy válasz helyes. A végén pontszámot kapsz.
| Fogalom | Jelentés |
|---|---|
| szelekció | elágazás: a program feltételtől függően választ utat (egy-, két-, többágú) |
| feltétel | bool értékű kifejezés az if zárójelében |
| hasonlító operátor | ==, !=, <, >, <=, >= — eredményük bool |
| logikai operátor | && (és), || (vagy), ! (tagadás) |
if / else / else if | egyágú / kétágú / többágú szelekció C#-eszközei |
| blokk | { } közé zárt utasítások — együtt tartoznak az if egy ágához |
| kódútvonal | a program egy lehetséges végigfutási útja — mindet tesztelni kell |
| rövidzár | a &&/|| nem értékeli ki a jobb oldalt, ha a bal már eldöntötte az eredményt |
if), kétágú
(if–else),
többágú (else if lánc — és hamarosan a
switch).= értékadás, ==
összehasonlítás; 3 < x < 8 helyett
x > 3 && x < 8.