B blokk · Változók és típusok · 7. tananyag
Eddig a programjaink nem kommunikáltak a külvilággal. Mától párbeszéd lesz: a program kérdez, megáll, vár — és azzal dolgozik, amit a felhasználó válaszol neki. Az A1-ben mutatott „Hogy hívnak?” programot ma megépíted dinamikus adatbekéréssel — a B6-ban megismert konverziós lehetőségeket pedig azonnal munkára fogjuk.
Console.ReadLine()-nal —
és tudod, miért ad mindig stringet.ReadLine +
Parse/TryParse
(B6!).Console.ReadKey()-t és a
KeyChar-t.A ReadLine a Console
beolvasó metódusa: megállítja a programot, és addig vár, amíg a
felhasználó gépel valamit és Entert üt. Amit kapott, azt
stringként adja vissza:
Console.Write("Hogy hívnak? "); string nev = Console.ReadLine(); Console.WriteLine($"Szia, {nev}! Kezdjük a C#-ot!");
Ismerős? Ez az A1-ben mutatott „ilyen lesz majd” kódpélda.
Két apró, de fontos részlet:
Write, nem
WriteLine
(A6): így a
kurzor a kérdés mellett villog, nem alatta — a párbeszéd
természetesnek hat.ReadLine
üres stringet ("" —
B4) ad — a program nem áll meg,
csak üres szöveggel dolgozik tovább.A Visual Studio zöld hullámmal figyelmeztethet a
string nev = Console.ReadLine(); sorra (CS8600):
a ReadLine különleges helyzetben
null-t is adhatna. Ez figyelmeztetés, nem
hiba — a program lefordul és fut. A null
kezelését a H blokkban tanuljuk rendesen; addig ezt a figyelmeztetést nyugodtan
tudomásul veheted.
A ReadLine mindig stringet ad —
a begépelt 25 is "25".
Számoláshoz a szöveget előbb számmá kell alakítani
(B6):
Console.Write("Hány éves vagy? "); string valasz = Console.ReadLine(); int eletkor = int.Parse(valasz); Console.WriteLine($"Jövőre {eletkor + 1} leszel.");
Elgépelésre felkészülve — ugyanez
TryParse-szal:
Console.Write("Hány éves vagy? "); string valasz = Console.ReadLine(); bool sikerult = int.TryParse(valasz, out int eletkor); Console.WriteLine($"Sikeres beolvasás: {sikerult}"); Console.WriteLine($"Jövőre {eletkor + 1} leszel.");
Hibás inputnál a sikerult
False, az eletkor 0 —
a program fut tovább. Az igazi reakció („kérem újra!”) a
C blokk if-jével jön.
Néha nem egy sor kell, hanem egyetlen billentyűleütés — Enter nélkül, azonnal:
Console.Write("Nyomj meg egy billentyűt: "); ConsoleKeyInfo billentyu = Console.ReadKey(); Console.WriteLine(); Console.WriteLine($"Ezt nyomtad: {billentyu.KeyChar}");
ConsoleKeyInfo —
ebből a .KeyChar adja a karaktert
(char — B4).ReadKey(true) változat
nem írja ki a lenyomott billentyűt — jelszavakhoz vagy
„nyomj egy gombot” típusú képernyőkhöz való:Console.WriteLine("A folytatáshoz nyomj meg egy billentyűt..."); Console.ReadKey(true);
A Mastermindban (G blokk) a tippeket lehet majd így, billentyűnként is fogadni.
Döntsd el a beolvasásról szóló állításokról!
Mostantól minden interaktív programunk ezt a receptet követi:
| Lépés | Eszköz | Honnan ismered? |
|---|---|---|
| 1. Kérdezz (prompt) | Console.Write("… ") | A6, B5 |
| 2. Olvass be | Console.ReadLine() | ez a fejezet |
| 3. Konvertálj | int.TryParse(…) / Parse | B6 |
| 4. Válaszolj | Console.WriteLine($"…") | B4–B5 |
Kérdezz — olvass — konvertálj — válaszolj. Négy sor, és a program beszélget.
| Tünet | Mi történt? | Mit tegyél? |
|---|---|---|
A beolvasott „számmal” nem lehet számolni ("25" + 1 → 251) | a ReadLine stringet adott (B4 fűzés!) | konvertálj: Parse/TryParse (B6) |
FormatException beolvasás után | a felhasználó elgépelte, a Parse kivételt dobott | felhasználói inputhoz TryParse |
| A kérdés után a kurzor új sorba ugrik | a promptot WriteLine-nal írtad | prompt = Write |
A kiírásban System.ConsoleKeyInfo jelenik meg | az egész ConsoleKeyInfo-t írtad ki | a karakterhez .KeyChar kell |
Magyar gépen a 3.5 bevitel hibát ad | a kultúra tizedesvesszőt vár (B6) | a felhasználó 3,5-öt gépeljen |
Zöld hullám a ReadLine soron (CS8600) | a fordító a lehetséges null-ra figyelmeztet | figyelmeztetés, nem hiba — részletek a H blokkban |
Parbeszed, .NET 10.Console.Write("Hogy hívnak? "); string nev = Console.ReadLine(); Console.Write("Hány éves vagy? "); bool korOk = int.TryParse(Console.ReadLine(), out int eletkor); Console.Write("Milyen magas vagy méterben (pl. 1,72)? "); bool magassagOk = double.TryParse(Console.ReadLine(), out double magassag); Console.WriteLine(); Console.WriteLine($"{"Név:",-14}{nev,>0}"); Console.WriteLine($"{"Életkor:",-14}{eletkor} év (beolvasva: {korOk})"); Console.WriteLine($"{"Magasság:",-14}{magassag:F2} m (beolvasva: {magassagOk})"); Console.WriteLine(); Console.WriteLine("A kilépéshez nyomj meg egy billentyűt..."); Console.ReadKey(true);
A {nev,>0} részlet szándékos
elgépelés — javítsd sima {nev}-re,
mielőtt futtatsz! Ha a fordító hibajelzésén akadt meg először a szemed:
jól működnek az A6-os
reflexeid.
sok), vesszős és pontos magassággal. Figyeld a
korOk/magassagOk
értékét!TryParse-os sorra, és a
Locals-ban (B1)
nézd meg, mi kerül a változókba jó és rossz inputnál.Parbeszedes program ReadLine-nal).A botod végig lefut elgépelt inputtal is; a magasság vesszős gépeléssel jött be; a program billentyűnyomásra lép ki.
⭐ alap · ⭐⭐ haladó · ⭐⭐⭐ kihívás
Kérdezd meg a felhasználó nevét és városát, majd köszöntsd egy mondatban interpolációval.
Kérj be két egész számot, és írd ki az összegüket és a szorzatukat.
(Parse elég — most te vagy a felhasználó,
ne gépelj el semmit!)
Téglalap-kalkulátor: kérd be a két oldalt double-ként
(figyelem: vesszővel gépelendő!), és írd ki a kerületet és a területet
2 tizedesjegyre formázva (B5).
Írd át a B7.2-t TryParse-osra, és írasd ki mindkét
sikerult értéket is. Gépeld el szándékosan az
egyiket — mi lett az összeg, és miért?
„Jelszómező-imitáció”: olvass be 5 karaktert egyenként
ReadKey(true)-val (5 külön sorban), minden leütés
után írj ki egy *-ot
Write-tal, végül írd ki az összegyűjtött szót.
(Tipp: fűzd a karaktereket egy stringhez:
jelszo = jelszo + billentyu.KeyChar;)
Minden kérdésnél egy válasz helyes. A végén pontszámot kapsz.
| Fogalom | Jelentés |
|---|---|
| bemenet (input) | az adat, amit a program futás közben a felhasználótól kap |
| interaktív program | a felhasználóval párbeszédet folytató program |
ReadLine() | egy sor beolvasása Enterig — a visszatérés mindig string |
| prompt | a beolvasás előtt kiírt kérdés — Write-tal, hogy a kurzor mellette maradjon |
ReadKey() | egyetlen billentyű beolvasása, Enter nélkül |
ConsoleKeyInfo | a ReadKey visszatérési típusa — a .KeyChar adja a karaktert |
ReadKey(true) | mint a ReadKey, de a lenyomott billentyű nem íródik ki |
| beolvasási minta | kérdezz (Write) → olvass (ReadLine) → konvertálj (TryParse) → válaszolj ($"…") |
ReadLine megállítja a
programot, Enterig vár, és mindig stringet ad — üres
Enternél üres stringet.Write-tal készül:
a kurzor a kérdés mellett villog.TryParse
(B6), és magyar gépen a tört
vesszővel gépelendő.ReadKey egyetlen billentyűt ad
(ConsoleKeyInfo.KeyChar); a
ReadKey(true) némán — „nyomj egy gombot”
képernyőkhöz és jelszóbevitelhez.ReadLine zöld figyelmeztetése (CS8600) nem
hiba — a null kezelését a H blokkban tanuljuk
meg rendesen.