C# programozás kezdőknek › 3. lecke

C# tanfolyam · 3. lecke

Adatbekérés C#-ban – Console.ReadLine, Parse és TryParse

Most először a program kérdez, a felhasználó válaszol, a válasz pedig bekerül a programba. Megtanuljuk, hogyan lesz a begépelt szövegből szám, hogyan kerülnek változók egy mondatba, és mit tehetünk, ha valaki rossz adatot ír be.

  • kb. 60–75 perc
  • kezdő szint
  • adatbekérés
C# adatbekérést gyakorló diák Console.ReadLine és típuskonverziós példákkal

A lecke végére

  • adatot kérsz be a Console.ReadLine() segítségével;
  • érted, miért szövegként érkezik be a begépelt adat;
  • int.Parse() és double.Parse() segítségével számmá alakítod a megfelelő szöveget;
  • szöveginterpolációval változókat és számításokat illesztesz mondatokba;
  • felismered a FormatException okát;
  • TryParse() segítségével ellenőrzöd, sikerült-e az átalakítás.

Mielőtt elkezded

Erre a leckére akkor állsz készen, ha már ismered a változókat és a string, int, double, bool típusokat.

Változók és adattípusok C#-ban →

A program is kérdezhet

A Console.WriteLine() kiír valamit a konzolra. A Console.ReadLine() megvárja, hogy a felhasználó beírjon egy sort és megnyomja az Entert.

Program.csC#
Console.WriteLine("Mi a neved?");
string nev = Console.ReadLine();

Console.WriteLine(nev);

Te jössz!

Írd be a kódot, futtasd, majd válaszolj a program kérdésére. Figyeld meg: amit begépelsz, bekerül a nev változóba.

Zöld hullámvonal a ReadLine alatt?

Az újabb .NET-projektekben a Visual Studio ilyenkor egy CS8600 figyelmeztetést jelez. Ez nem hiba, a program lefut. Azt jelzi, hogy a Console.ReadLine() elméletben üres értéket (null) is adhat. Kezdőként nyugodtan továbbléphetsz; ha el szeretnéd tüntetni, írj string? típust: string? nev = Console.ReadLine();

A begépelt szám is először szöveg

Ha azt kérdezzük, hány éves vagy, és te 14-et írsz be, a Console.ReadLine() eredménye még nem int. A begépelt sort szövegként kapjuk meg.

KódC#
Console.WriteLine("Hány éves vagy?");
string eletkor = Console.ReadLine();

Console.WriteLine(eletkor);

7 + 1 nem mindig 8

Mi történik, ha a felhasználó 7-et ír be, de az adat még string?

string szamSzoveg = Console.ReadLine();
Console.WriteLine(szamSzoveg + 1);

Ha a bemenet 7, a kimenet 71. Itt nem számtani összeadás történik: a szöveghez hozzáfűződik az 1.

Miért 71 és nem 8?

A szamSzoveg értéke szövegként "7". A + ilyenkor szöveg-összefűzésként működik, ezért "7" + 1 eredménye "71".

Szövegből szám: int.Parse()

Ha számolni szeretnénk a begépelt adattal, megfelelő számtípussá kell alakítanunk.

Szövegből egész számC#
Console.WriteLine("Hány éves vagy?");
string eletkorSzoveg = Console.ReadLine();

int eletkor = int.Parse(eletkorSzoveg);

Console.WriteLine(eletkor + 1);
eletkorSzovegA beírt adat szöveges formában, például "14".
int.Parse(...)Megpróbálja a megfelelő szöveget egész számmá alakítani.
eletkorItt már valódi int, például 14.
eletkor + 1Most már számtani művelet, ezért az eredmény 15.

Működik!

A "14" szövegből 14 egész szám lett, így már számolhatunk vele.

Rövidebb forma

Ha már érted a két lépést, gyakran egy sorban is látod:

int eletkor = int.Parse(Console.ReadLine());

Tanuláskor a hosszabb forma sokszor átláthatóbb.

Szöveginterpoláció: változók a mondatban

A szöveg elé írt $ jel lehetővé teszi, hogy kapcsos zárójelek között változókat vagy akár számításokat illesszünk a mondatba.

InterpolációC#
string nev = "Bori";
int eletkor = 14;

Console.WriteLine($"Szia, {nev}! Jövőre {eletkor + 1} éves leszel.");
$Jelzi, hogy a szövegben helyettesítéseket használunk.
{nev}A változó aktuális értéke kerül a helyére.
{eletkor + 1}A C# előbb kiszámolja a kifejezést, majd beilleszti az eredményt.
"..."A többi szövegrész szó szerint jelenik meg.

Próbáld ki!

Kérd be a nevedet és az életkorodat, alakítsd az életkort int-té, majd írd ki interpolációval, hány éves leszel jövőre.

Tizedes szám bekérése: double.Parse()

Ha tört értéket szeretnél bekérni, például futási időt vagy testmagasságot, használhatod a double.Parse() metódust.

Console.WriteLine("Add meg a futó idejét percben!");
string idoSzoveg = Console.ReadLine();

double ido = double.Parse(idoSzoveg);

Console.WriteLine($"A futó ideje: {ido} perc.");

Pont vagy vessző?

A C# forráskódban egy tizedes literált ponttal írunk, például double x = 4.6;. A double.Parse() viszont a gép területi beállításait is figyelembe veszi. Magyar környezetben a felhasználói bemenet gyakran 4,6 formában működik, míg 4.6 hibát okozhat.

Ez gépfüggő viselkedés, ezért más beállítású számítógépen eltérhet.

Jósolj, aztán futtasd!

Minden kódnál először írd le a várható kimenetet. Ha bemenetet is kér a program, a megadott értéket írd be. Ezután futtasd le, és hasonlítsd össze a jóslatoddal. Eltérésnél keresd meg a pontos sort, ahol másra számítottál.

1. Szöveg vagy szám?

A program bemenetként 7-et kap. Mi jelenik meg két külön sorban?

string adat = Console.ReadLine();
Console.WriteLine(adat + 1);
Console.WriteLine(int.Parse(adat) + 1);
Jóslat ellenőrzése

Az első sor 71, mert az adat szöveg. A második 8, mert a Parse() után már egész számhoz adunk egyet.

2. Az átalakítás helye

Bemenet: 12. Mi lesz a két kiírt érték?

string szoveg = Console.ReadLine();
int szam = int.Parse(szoveg);
Console.WriteLine(szoveg + 2);
Console.WriteLine(szam + 2);
Jóslat ellenőrzése

122, majd 14. Az átalakítás új változóba tette a számot; a szoveg továbbra is szöveg.

3. Jövőre hány éves?

Mi lesz a teljes mondat?

string nev = "Bori";
int kor = 13;
Console.WriteLine($"Szia, {nev}! Jövőre {kor + 1} éves leszel.");
Jóslat ellenőrzése

Szia, Bori! Jövőre 14 éves leszel. A kapcsos zárójelben lévő összeadás még a kiírás előtt megtörténik.

4. Mi történik a dollárjel nélkül?

Figyeld meg a két sor közti egyetlen karakteres különbséget.

int kedvenc = 8;
Console.WriteLine("A kedvenc számom: {kedvenc}");
Console.WriteLine($"A kedvenc számom: {kedvenc}");
Jóslat ellenőrzése

Először szó szerint A kedvenc számom: {kedvenc} látszik, utána A kedvenc számom: 8. A $ kapcsolja be az interpolációt.

5. Sikerül az átalakítás?

Futtasd kétszer: először 15, utána tizenöt bemenettel. Írd le mindkét alkalommal a két sort.

string adat = Console.ReadLine();
bool sikerult = int.TryParse(adat, out int kor);
Console.WriteLine(sikerult);
Console.WriteLine(kor);
Jóslat ellenőrzése

15 esetén True és 15. tizenöt esetén False és 0 jelenik meg. A 0 itt a sikertelen TryParse() eredményváltozójának alapértéke, nem a felhasználó életkora; a sikerult értékét mindig ellenőrizni kell.

Mi történik hibás adatnál?

Az int.Parse() és a double.Parse() csak akkor működik, ha a szöveg valóban átalakítható a kért számtípussá.

Hibás bemenetC#
string adat = "Tizennégy";
int eletkor = int.Parse(adat);

Ilyenkor FormatException keletkezik, mert a "Tizennégy" szöveg nem írható át közvetlenül egész számmá.

Hibavadászat

Ha a program a Parse() soron áll meg, először nézd meg, milyen adat érkezett be. Gyakran nem a kód szintaxisa rossz, hanem a felhasználó olyan szöveget adott meg, amely nem alakítható számmá.

Biztonságosabb ellenőrzés: TryParse()

Console.WriteLine("Add meg az életkorodat!");
string adat = Console.ReadLine();

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

Console.WriteLine(sikerult);
Console.WriteLine(eletkor);
sikerulttrue, ha az átalakítás sikerült; különben false.
out int eletkorHa sikerül az átalakítás, az elkészült egész szám az eletkor változóba kerül.
14 bemenetTrue, az eletkor értéke 14.
Tizennégy bemenetFalse; a program nem dob FormatException-t.

Ez már stabilabb

A TryParse() nem dönti el helyetted, mi történjen rossz adatnál, de jelzi, hogy sikerült-e az átalakítás. A következő leckék egyikében az if segítségével már reagálni is fogunk erre.

Hibakeresés: te vagy a hibadetektív

Mielőtt lenyitod a megoldást, jósolj: fordítási hiba, futás közbeni hiba vagy rossz eredmény várható? Keresd meg a hibás sort, javítsd, majd futtasd le a kódot.

1. Hiányzó pontosvessző

Console.WriteLine("Hány éves vagy?")
string adat = Console.ReadLine();
int kor = int.Parse(adat);
Hiba és javítás

Fordítási hiba. Az első sor végére pontosvessző kell: Console.WriteLine("Hány éves vagy?");. A jelzett sor mellett az előzőt is ellenőrizd.

2. Betűkkel írt szám

string adat = "tizennégy";
int kor = int.Parse(adat);
Console.WriteLine(kor);
Hiba és javítás

Futás közbeni FormatException. Az int.Parse() számjegyekkel írt egész számot vár, például "14". Felhasználói bemenetnél a TryParse() eredményét is ellenőrizd.

3. Furcsa jövő évi életkor

string kor = "13";
Console.WriteLine("Jövőre: " + kor + 1);
Hiba és javítás

Rossz eredmény: Jövőre: 131. Javítás: int eletkor = int.Parse(kor);, majd Console.WriteLine($"Jövőre: {eletkor + 1}");.

4. A változó neve jelenik meg

string nev = "Bori";
Console.WriteLine("Szia, {nev}!");
Hiba és javítás

Rossz eredmény: szó szerint Szia, {nev}!. Javítás: Console.WriteLine($"Szia, {nev}!");.

5. Jó bemenet, rossz változó

string adat = Console.ReadLine();
int eletkor = 0;
int.Parse(adat);
Console.WriteLine(eletkor);
Hiba és javítás

A 15 bemenet után is 0 jelenik meg, mert a Parse() visszatérési értékét eldobtuk. Javítás: eletkor = int.Parse(adat);.

6. A TryParse eredménye

string adat = Console.ReadLine();
int.TryParse(adat, out int kor);
Console.WriteLine($"Te {kor} éves vagy.");
Hiba és javítás

Ha a felhasználó szám helyett például az alma szót írja be, a TryParse() sikertelen lesz, a kor értéke pedig 0 marad. Tárold a visszatérési értéket: bool sikerult = int.TryParse(adat, out int kor);. Ellenőrizd a sikerult értékét; később if-fel csak siker esetén írj életkort.

Plusz próba: az 5. és 6. kódot futtasd üres, majd szóközökkel körbevett bemenettel is. Jegyezd fel, melyik esetben hibázik a program, és melyikben kapod a várt értéket.

Mini projekt: Profilgenerátor

Készíts programot, amely bekéri a nevet, az életkort és a kedvenc számot. Az életkort és a kedvenc számot alakítsd egész számmá, majd jeleníts meg személyes üzeneteket.

Anime fiú és lány az életkorukról, a következő évről és a kedvenc számukról beszélgetnek a C# profilgenerátor feladathoz
ProfilgenerátorC#
Console.WriteLine("Mi a neved?");
string nev = Console.ReadLine();

Console.WriteLine("Hány éves vagy?");
string eletkorSzoveg = Console.ReadLine();

Console.WriteLine("Mi a kedvenc számod?");
string szamSzoveg = Console.ReadLine();

int eletkor = int.Parse(eletkorSzoveg);
int szam = int.Parse(szamSzoveg);

Console.WriteLine($"Szia, {nev}!");
Console.WriteLine($"Jövőre {eletkor + 1} éves leszel.");
Console.WriteLine($"A kedvenc számod kétszerese: {szam * 2}");

Ne csak futtasd: változtasd meg a kérdéseket, kérj be más adatot is, és alakítsd át a kimenetet a saját ötleted szerint.

Önálló gyakorlófeladatok

Először készíts saját megoldást. A lenyitható rész csak ellenőrzéshez van.

1. Játékosprofil

Kérd be a játékos nevét, életkorát és pontszámát. Az életkort és a pontszámot alakítsd int típussá. Írd ki a játékos adatait, majd azt is, mennyi pontja lenne 100 bónuszponttal.

Egy lehetséges megoldás
Console.WriteLine("Játékos neve?");
string nev = Console.ReadLine();

Console.WriteLine("Életkor?");
int eletkor = int.Parse(Console.ReadLine());

Console.WriteLine("Pontszám?");
int pont = int.Parse(Console.ReadLine());

Console.WriteLine($"{nev}, {eletkor} éves, pontszám: {pont}.");
Console.WriteLine($"Bónusszal: {pont + 100}.");

2. Futóedzés

Kérd be a futó nevét, a futott távot kilométerben és a futási időt percben. A táv és az idő legyen double. Írd ki az adatokat, majd azt is, hány kilométer lenne két ugyanilyen edzés összesen.

Egy lehetséges megoldás
Console.WriteLine("Futó neve?");
string nev = Console.ReadLine();

Console.WriteLine("Táv kilométerben?");
double tav = double.Parse(Console.ReadLine());

Console.WriteLine("Idő percben?");
double ido = double.Parse(Console.ReadLine());

Console.WriteLine($"{nev} {tav} km-t futott {ido} perc alatt.");
Console.WriteLine($"Két edzésen: {tav * 2} km.");

3. Hibadetektív

Kérd be a felhasználó nevét, életkorát és kedvenc számát. Az utóbbi kettőnél használj int.TryParse()-t. Írd ki, hogy az egyes átalakítások sikerültek-e, majd futtasd le egyszer számokkal és egyszer hibás szöveges adattal.

Egy lehetséges megoldás
Console.WriteLine("Mi a neved?");
string nev = Console.ReadLine();

Console.WriteLine("Életkor?");
bool eletkorOk = int.TryParse(Console.ReadLine(), out int eletkor);

Console.WriteLine("Kedvenc szám?");
bool szamOk = int.TryParse(Console.ReadLine(), out int szam);

Console.WriteLine($"Szia, {nev}!");
Console.WriteLine($"Életkor rendben: {eletkorOk}");
Console.WriteLine($"Kedvenc szám rendben: {szamOk}");

Gyors önellenőrzés

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

1. Milyen típusú adatot kapunk közvetlenül a Console.ReadLine() használatakor?

A begépelt sort szövegként kezeljük, ezért kezdő példáinkban string változóba tesszük.

2. Ha a szamSzoveg értéke "7", mit ír ki a szamSzoveg + 1?

71, mert szöveg-összefűzés történik.

3. Mire való az int.Parse()?

Egy megfelelő formájú szöveget egész számmá alakít.

4. Mit jelent a $ jel a $"Szia, {nev}!" előtt?

Bekapcsolja a szöveginterpolációt, így a kapcsos zárójelek között változókat és kifejezéseket használhatunk.

5. Mi történhet, ha int.Parse()-nak "Tizennégy" szöveget adunk?

FormatException keletkezik, mert a szöveg nem alakítható közvetlenül egész számmá.

6. Mit ad vissza az int.TryParse()?

Egy bool értéket, amely jelzi, sikerült-e az átalakítás; siker esetén az out változóba kerül a szám.

Mit tudsz már?

  • Adatot kérsz be a felhasználótól.
  • Megkülönbözteted a beolvasott szöveget a valódi számtól.
  • int.Parse() és double.Parse() segítségével számot készítesz a szövegből.
  • Interpolált mondatokat írsz változókkal és számításokkal.
  • Felismered a hibás formátum okozta FormatException-t.
  • TryParse() segítségével ellenőrzöd, sikerült-e a konverzió.

Gyakorolnál még? 2.1 kiegészítő lecke

Ha a TryParse és a true–false eredmény még nem teljesen világos, nézd meg a Bool és TryParse – sikerült vagy nem? gyakorlóleckét: sok rövid jóslásos feladattal és határesetekkel.

Következő lecke: Operátorok

Most már adatokat tudunk bekérni és számmá alakítani. Következőként megtanuljuk, hogyan számoljunk velük, hogyan hasonlítsuk össze őket, és hogyan módosítsuk az értéküket.