C# programozás kezdőknek › 2.1 kiegészítő gyakorlólecke

C# tanfolyam · 2.1 kiegészítő gyakorlás

Bool és TryParse C#-ban – sikerült vagy nem?

Miért kell a programnak tudnia, hogy egy átalakítás sikerült-e? Ebben a leckében a bool és a TryParse() logikáját rakjuk rendbe, sok rövid próbával.

  • kb. 30 perc
  • kezdő szint
  • gyakorlólecke
Diák C# programozást gyakorol egy tanulósarokban

A lecke végére

  • el tudod magyarázni, mire való a bool;
  • érted, miért ad a TryParse() true vagy false értéket;
  • megkülönbözteted a sikeres és a sikertelen számkonverziót;
  • érted, miért nem elég csak a kapott számot nézni.

Ehhez már ismerned kell

  • a string és az int típusú változókat;
  • a Console.ReadLine() utasítást;
  • azt, hogy a beírt adat először mindig szövegként érkezik.

Ismétlés: az adatbekérés lecke →

Először értsük meg a problémát

Tegyük fel, hogy a program életkort kér:

Program.csC#
Console.WriteLine("Hány éves vagy?");
string adat = Console.ReadLine();

A felhasználó beírhatja azt, hogy 14. De beírhatja azt is, hogy alma, tizennégy vagy 14 éves.

Két kérdésre kell választ kapnunk

1. Sikerült-e a beírt szöveget egész számmá alakítani? 2. Ha sikerült, mi lett maga a szám? Mit gondolsz: melyik kérdésre lehet egyetlen szóval, igennel vagy nemmel válaszolni?

Az első kérdésre nem egy újabb szám a válasz, hanem egy egyszerű igen vagy nem. Itt jön képbe a bool.

A bool: igen vagy nem

A bool a C# logikai adattípusa. Egy bool típusú változónak csak kétféle értéke lehet: true (igaz) vagy false (hamis).

PéldaC#
bool lampaFelkapcsolva = true;
bool feladatKesz = false;

Console.WriteLine(lampaFelkapcsolva);
Console.WriteLine(feladatKesz);

Ezek a változók egy-egy kérdésre válaszolnak. Fel van kapcsolva a lámpa? Igen: true. Kész van a feladat? Nem: false. A kimenet:

KimenetKonzol
True
False

Kisbetű a kódban, nagybetű a kimenetben

A kódban kisbetűvel írjuk: true, false, mert ezek C# kulcsszavak. Kiíráskor viszont a .NET nagy kezdőbetűvel jeleníti meg őket: True, False. Most azért írjuk ki, hogy lássuk, mi történik a program belsejében. Egy kész program ezt az értéket inkább döntésekhez használja.

Te jössz! Mit ír ki ez a program?

bool jatekVege = false;
Console.WriteLine(jatekVege);

jatekVege = true;
Console.WriteLine(jatekVege);
Megoldás
False
True

A bool változó értéke ugyanúgy megváltozhat, mint egy string vagy int változóé.

Mit csinál a TryParse()?

Nézd meg ezt a két sort:

PéldaC#
string adat = "25";
bool sikerult = int.TryParse(adat, out int szam);

A második sor elsőre elég sűrűnek tűnik. Fordítsuk le magyarra:

„Próbáld meg az adat tartalmát egész számmá alakítani. Mondd meg, hogy sikerült-e, és tedd az eredményt a szam változóba.”
Az int.TryParse működésének szemléltetése: a szöveg bemenetből logikai eredmény és egész szám lesz
A TryParse két eredményt ad
Mit akarunk tudni?Hol kapjuk meg?
Sikerült az átalakítás?sikerulttrue vagy false
Mi lett a szám?szam

Mit jelent az out?

Egy művelet általában egy eredményt ad vissza. A TryParse() kettőt: a visszatérési értéke a bool, a számot pedig az out kulcsszóval megjelölt változóba teszi. Az out int szam ugyanabban a sorban létre is hozza a szam változót.

De hát a „25” szöveg!

Igen, az adat valóban string. A TryParse() azonban nem azt kérdezi, hogy szöveg-e, hanem ezt:

„Ennek a szövegnek a tartalma értelmezhető egész számként?”

"25" → true

Szövegként tároljuk, de a tartalma értelmezhető egész számként.

"alma" → false

Ez is szöveg, de a tartalma nem alakítható egész számmá.

Nézzük meg több bemenettel

A TryParse eredménye különböző bemenetekre
BemenetÁtalakítható int-té?sikerultszam
"25"igentrue25
"-8"igentrue-8
"0"igentrue0
"alma"nemfalse0
"14 éves"nemfalse0
"4,5"nem, mert nem egész számfalse0

Miért nem elég csak a számot nézni?

Nézd meg ezt a két bemenetet: a "0" eredménye true és 0, az "alma" eredménye false és 0. Mindkét esetben 0 van a szam változóban, mert sikertelen átalakításnál a TryParse() mindig 0-t tesz bele. Csak a bool eredmény mondja meg, hogy a nulla valódi bemenet volt-e.

Jósolj, mielőtt futtatod!

Mit gondolsz?

Minden példánál először gondold végig, mi lesz a sikerult és a szam értéke. Csak utána nyisd le a megoldást!

1. példa

string adat = "42";
bool sikerult = int.TryParse(adat, out int szam);
Console.WriteLine(sikerult);
Console.WriteLine(szam);
Megoldás
True
42

2. példa

string adat = "kettő";
bool sikerult = int.TryParse(adat, out int szam);
Console.WriteLine(sikerult);
Console.WriteLine(szam);
Megoldás
False
0

3. példa

string adat = "-15";
bool sikerult = int.TryParse(adat, out int szam);
Console.WriteLine(sikerult);
Console.WriteLine(szam);
Megoldás
True
-15

4. példa

string adat = "0";
bool sikerult = int.TryParse(adat, out int szam);
Console.WriteLine(sikerult);
Console.WriteLine(szam);
Megoldás
True
0

A 0 itt valódi, sikeresen átalakított szám.

Most kérjük be a felhasználótól

Program.csC#
Console.WriteLine("Írj be egy egész számot!");
string adat = Console.ReadLine();

bool sikerult = int.TryParse(adat, out int szam);

Console.WriteLine($"Sikerült az átalakítás: {sikerult}");
Console.WriteLine($"A kapott szám: {szam}");

Te jössz!

Futtasd többször a programot, és próbáld ki ezekkel a bemenetekkel: 25, alma, -7, 0, 14 éves. Előbb tippelj, utána futtasd! Próbálj olyan bemenetet is, amelyről nem vagy biztos, hogy elfogadja.

Zöld hullámvonal a ReadLine alatt?

Ez a CS8600 figyelmeztetés, nem hiba: a program lefut. Az adatbekérés leckében elmagyaráztuk, mit jelent.

Parse vagy TryParse?

A Parse és a TryParse viselkedésének összehasonlítása hibás bemenetnél

Parse()

„Alakítsd át ezt számmá.”
int kor = int.Parse(adat);

Ha az adat nem alakítható számmá, a Parse() kivételt dob (FormatException), és ha ezt nem kezeljük, a program hibaüzenettel leáll.

TryParse()

„Próbáld meg átalakítani, és mondd meg, sikerült-e.”
bool sikerult = int.TryParse(adat, out int kor);

Sikertelen átalakításnál nem áll le a program: a sikerult értéke false lesz, és mi dönthetjük el, mi történjen.

A TryParse még nem old meg mindent

Egyelőre csak azt tudjuk, hogy az átalakítás sikerült-e. A következő lépés az lesz, hogy a program a true vagy false eredmény alapján más-más dolgot csináljon. Ehhez később az if utasítást fogjuk használni.

Önálló gyakorlás

1. Adatvizsgáló

Kérj be egy adatot a felhasználótól. A program írja ki, sikerült-e egész számmá alakítani, és mi lett a szám értéke. Próbáld ki legalább három különböző bemenettel.

Segítség

Szükséged lesz egy string, egy bool és egy int típusú változóra.

Egy lehetséges megoldás
Console.WriteLine("Írj be valamit!");
string adat = Console.ReadLine();
bool sikerult = int.TryParse(adat, out int szam);
Console.WriteLine($"Sikerült: {sikerult}");
Console.WriteLine($"A szám: {szam}");

2. Életkor-próba

Kérj be egy életkort, és próbáld meg egész számmá alakítani. Minden futtatás előtt tippeld meg az eredményt! Próbáld ki ezekkel: 14, 0, tizennégy, 14 éves.

Egy lehetséges megoldás
Console.WriteLine("Hány éves vagy?");
string adat = Console.ReadLine();
bool sikerult = int.TryParse(adat, out int kor);
Console.WriteLine($"Átalakítható számként: {sikerult}");
Console.WriteLine($"A kor változó értéke: {kor}");

3. Tesztlabor

Találj ki öt saját bemenetet. Mielőtt futtatod a programot, írd fel a füzetedbe a tippedet: sikerül-e az átalakítás, és mi lesz a szám. Utána hasonlítsd össze a valódi eredménnyel! Próbálj olyan példákat is, amelyek határesetnek tűnnek.

Ötletek határesetekre, eredményekkel
Meglepő bemenetek
BemenetEredményMiért?
" 25 " (szóközökkel)true, 25Az elején és a végén álló szóközöket a TryParse figyelmen kívül hagyja.
"+25"true, 25Az előjel a szám része lehet.
"2 5"false, 0A szám közepén álló szóköz már nem megengedett.
"25.0"false, 0Az int csak egész számot fogad el, tizedesjelet nem.
"99999999999"false, 0Túl nagy: az int legnagyobb értéke 2 147 483 647.

4. Hibadetektív

Nézd meg ezt a programrészletet. Mi lehet vele a probléma?

Gyanús kódC#
int.TryParse(adat, out int kor);
Console.WriteLine($"Te {kor} éves vagy.");
Megoldás

A program nem tárolja el, hogy a TryParse() sikerült-e. Ha a felhasználó például azt írja be, hogy alma, akkor a kor értéke 0 lesz, és a program tévesen kiírja: „Te 0 éves vagy.”

5. Igaz vagy hamis?

  1. A bool csak true vagy false lehet.
  2. A "25" nem alakítható számmá, mert idézőjelek között van.
  3. A TryParse() megmondja, sikerült-e az átalakítás.
  4. A "0" lehet sikeres bemenet.
  5. Ha a szam értéke 0, biztosan hibás volt a bemenet.
Megoldás
  1. Igaz. A logikai típusnak csak ez a két értéke van.
  2. Hamis. Az idézőjel csak azt jelzi, hogy szövegről van szó; a tartalma, a 25 számként értelmezhető.
  3. Igaz. Ezt adja vissza bool értékként.
  4. Igaz. A 0 is érvényes egész szám.
  5. Hamis. A 0 lehet valódi bemenet is; ezt csak a bool eredmény dönti el.

Amit ebből biztosan vigyél tovább

  • A bool logikai típus, két értéke: true és false.
  • A TryParse() nem azt vizsgálja, hogy a bemenet szöveg-e, hanem hogy a tartalma értelmezhető-e számként.
  • Két eredményt ad: a bool megmondja, sikerült-e, az out változóba pedig a szám kerül.
  • A 0 lehet valódi szám, de sikertelen átalakítás után is megjelenik, ezért kell a bool eredmény.
  • A Parse() hibás bemenetnél leállíthatja a programot, a TryParse() nem.

Gyors önellenőrzés

Válaszolj fejben, és csak utána nyisd le a választ.

1. Mire való a bool?

Igen–nem típusú kérdésekre ad választ: az értéke true vagy false.

2. Mit jelent, ha a TryParse() eredménye true?

Hogy a szöveget sikerült számmá alakítani, és a szám bekerült az out változóba.

3. Miért lehet a "25" szöveget egész számmá alakítani?

Mert a szöveg tartalma számjegyekből álló, érvényes egész szám.

4. Miért nem elég csak a szam értékét nézni?

Mert sikertelen átalakításnál is 0 lesz benne, így a 0 önmagában nem árulja el, hogy a bemenet jó volt-e.

5. Mi a különbség a Parse() és a TryParse() között?

Hibás bemenetnél a Parse() kivételt dob, a TryParse() pedig false értéket ad, és a program fut tovább.

Mit tudsz már?

  • Tudod, mi a logikai típus, és mik az értékei.
  • Érted, mit ad vissza a TryParse(), és mi kerül az out változóba.
  • Megkülönbözteted a valódi 0-t a sikertelen átalakítástól.
  • Tudod, mikor jobb a TryParse(), mint a Parse().

Mire lesz jó mindez?

A program már meg tudja állapítani, hogy egy adat használható-e. A következő lépésben az eredmény alapján döntést is hoz majd, innen egyenes út vezet az if utasításhoz. Folytasd a fő tananyaggal!