C# programozás kezdőknek › 2.5 lecke C# tanfolyam · 2.5 lecke Nevek, üzenetek, jelszavak, kasszablokkok: a programok tele vannak szöveggel. Ebben a leckében megtanulod szétszedni, átalakítani és szépen kiírni a szövegeket, és az átlagkalkulátorod is profi kinézetet kap.Szövegek kezelése: string metódusok és formázás

A lecke végére
- eléred egy szöveg hosszát és egyes karaktereit;
- a leggyakoribb string metódusokkal átalakítod és vizsgálod a szöveget;
- megkülönbözteted az átalakítás eredményét a logikai értéktől és az indextől;
- különleges karaktereket (új sor, idézőjel) írsz a szövegbe;
- tizedesjegyre kerekítve, igazítva, ezres tagolással írsz ki számokat.
Ehhez használod
- a string és a char típust (2.1);
- az adatbekérést (2.2) és a bool típust (2.2.1);
- a mini projekt átlagkalkulátorát (2.4).
Mi a string? Karakterek sorban
A string (szöveg) karakterek sorozata, mint a gyöngyök egy fonalon. Minden karakternek van egy sorszáma, az indexe, és a számolás 0-tól indul:
string nev = "Kamilla";Console.WriteLine(nev.Length); // 7Console.WriteLine(nev[0]); // KConsole.WriteLine(nev[2]); // m🔮 Jósold meg!
Mit ír ki a nev[nev.Length - 1]? És miért nem működik a nev[nev.Length]?
Megoldás
Az első az utolsó karaktert adja: „a”. A 7 hosszú szöveg indexei 0-tól 6-ig tartanak, így a 7-es index már nem létezik: a program futás közben hibával leáll (IndexOutOfRangeException). Az egyes karakterek char típusúak, ahogy a 2.1 leckében láttad.
A legfontosabb string metódusok
A példákban: string s = " Szia Világ "; (az elején és a végén két-két szóközzel).
| Metódus | Mit csinál? | Példa és eredmény |
|---|---|---|
Trim() | Eltávolítja a fehér karaktereket (például szóköz, tabulátor) a két végéről; a belsejéből nem | s.Trim() → „Szia Világ” |
ToUpper(), ToLower() | Csupa nagy- vagy kisbetű | "Szia".ToUpper() → „SZIA” |
Contains("…") | Benne van-e a megadott rész? (bool) | s.Contains("Vil") → true |
StartsWith, EndsWith | Ezzel kezdődik, ezzel végződik? (bool) | "kep.png".EndsWith(".png") → true |
IndexOf("…") | Hányadik helyen kezdődik? (-1, ha nincs benne) | "Szia Világ".IndexOf("V") → 5 |
Substring(kezdet, hossz) | Kivág egy darabot | "Szia Világ".Substring(5, 3) → „Vil” |
Replace("mit", "mire") | Kicserél egy részt | "alma".Replace("a", "o") → „olmo” |
string.IsNullOrWhiteSpace(s) | Null, üres vagy kizárólag fehér karakterekből áll-e? (bool) | string.IsNullOrWhiteSpace(" ") → true |
✍️ Próbáld ki!
Kérd be a kedvenc filmed címét, és írd ki: a hosszát, csupa nagybetűvel, és hogy szerepel-e benne az „a” betű. A Visual Studióban ha a változó neve után pontot teszel, az IntelliSense felsorolja az összes metódust: nézz körül, mi minden van még!
Contains("a") kis- és nagybetűre érzékeny: az „A” nem ugyanaz, mint az „a”. Először jósolj, majd futtass: Avatar → 6, AVATAR, True; UP → 2, UP, False.A filmes próba megoldása
Console.Write("Kedvenc filmed címe: ");string film = Console.ReadLine();Console.WriteLine($"Hossz: {film.Length}");Console.WriteLine(film.ToUpper());bool vanKisA = film.Contains("a");Console.WriteLine($"Van benne kis a: {vanKisA}");True és False alakban írja ki a logikai értékeket.A nagy csapda: a string nem változik meg
string nev = "bence";nev.ToUpper();Console.WriteLine(nev);🔮 Jósold meg!
„BENCE” vagy „bence” jelenik meg?
Megoldás
„bence”! A string megváltoztathatatlan (angolul immutable): a ToUpper(), Trim() és más szövegátalakítások nem írják át az eredeti szöveget. Az eredményüket visszaadják. Ha meg akarod tartani, el kell tárolni: nev = nev.ToUpper();
Láncolás
A szöveget visszaadó műveleteket láncolhatod: string tiszta = beirt.Trim().ToLower(); Itt a beirt egy korábban bekért szöveg. A Trim() eredményén hajtjuk végre a ToLower() műveletet. A Contains() viszont bool, az IndexOf() pedig int értéket ad vissza. A Length tulajdonság: nem írunk utána zárójelet.
Különleges karakterek
| Jelölés | Jelentése |
|---|---|
\n | új sor |
\t | tabulátor (ugrás a következő tabulátorpozícióra; nem állandó számú szóköz) |
\" | idézőjel a szövegen belül |
\\ | egy fordított perjel |
@"C:\Mappa\fajl.txt" | szó szerinti szöveg: a fordított perjelek nem különleges jelek (fájlútvonalakhoz kényelmes) |
Console.WriteLine("Első sor\nMásodik sor");Console.WriteLine("Azt mondta: \"Szia!\"");Első sorMásodik sorAzt mondta: "Szia!"Formázott kiírás
A 2.2 leckében már használtad a $"…{valtozo}…" szövegbe illesztést (interpolációt). A kapcsos zárójelben kettőspont után formátumot is megadhatsz:
| Formátum | Jelentése | Példa (magyar beállítással) |
|---|---|---|
{x:F2} | 2 tizedesjegy | 4,666… → „4,67” |
{x:F0} | egészre kerekítve | 4,6 → „5” |
{n:N0} | ezres tagolás | 1250000 → „1 250 000” |
{r:P0} | százalék | 0,85 → „85%” vagy „85 %”, a területi beállítástól függően |
{nev,-10} | legalább 10 karakter széles mező, balra igazítva | „Anna ” |
{pont,5} | legalább 5 karakter széles mező, jobbra igazítva | „ 42” |
Tizedesvessző vagy pont?
A példák a program aktuális területi beállítását használják: magyar beállítással általában „4,67”, angollal „4.67” jelenik meg. Az alapértelmezett double.Parse is ezt követi. A C# forráskódban mindig pontot írunk: double x = 4.5;. Az F2 csak a megjelenítést kerekíti, a változó értékét nem módosítja. Az igazítás hosszabb szöveget nem vág le.
Szép átlagkalkulátor
Console.Write("Tanuló neve: ");string nev = Console.ReadLine();nev = nev.Trim();int matekJegy = 5;int magyarJegy = 4;int infJegy = 5;double atlag = (matekJegy + magyarJegy + infJegy) / 3.0;Console.WriteLine("===============================");Console.WriteLine($"{"Tanuló:",-10}{nev}");Console.WriteLine($"{"Jegyek:",-10}{matekJegy}, {magyarJegy}, {infJegy}");Console.WriteLine($"{"Átlag:",-10}{atlag:F2}");Console.WriteLine("==============================="); Kovács Anna . Magyar területi beállítással:===============================Tanuló: Kovács AnnaJegyek: 5, 4, 5Átlag: 4,67===============================Mi történik, ha csak Entert nyomsz?
Trim() ettől nem hibázik, de nem is pótolja a hiányzó nevet. A string.IsNullOrWhiteSpace(nev) eredménye true. A következő leckében az if segítségével reagálunk erre.Hibavadászat
🐞 1. Elveszett átalakítás
string valasz = Console.ReadLine();valasz.Trim().ToLower();Console.WriteLine(valasz == "igen");Mi a baj?
Az átalakított szöveg sehová nem került, a valasz változatlan. Helyesen: valasz = valasz.Trim().ToLower(); Így az „ Igen ” beírásra is true lesz az eredmény.
🐞 2. Túl hosszú darab
string szo = "Pécs";Console.WriteLine(szo.Substring(2, 5));Mi a baj?
A 2. indextől csak 2 karakter van („cs”), nem 5, ezért a program futás közben leáll (ArgumentOutOfRangeException). A Substring második száma a hossz, nem a záró index, és nem lóghat túl a szöveg végén.
🐞 3. Útvonal fordított perjellel
string ut = "C:\temp\nevsor.txt";Mi a baj?
A \t tabulátort, a \n új sort jelent, így az útvonal összezavarodik. Helyesen dupla perjellel ("C:\\temp\\nevsor.txt") vagy szó szerinti szöveggel: @"C:\temp\nevsor.txt". A fájlkezelésnél (6. fejezet) ez még jól jön!
Kihívások
🦊 1. Becenév-generáló
Kérd be külön a vezeték- és keresztnevet. A becenév legfeljebb az első három, illetve két karakterből álljon, nagybetűvel. Rövidebb névnél használd a rendelkezésre álló karaktereket.Próbák: Kovács + Anna → KOVAN; Ló + Éva → LÓÉV; üres vezetéknév + Anna → AN. A kód nem ellenőrzi, hogy valódi nevet adtak-e meg.Egy lehetséges megoldás
Console.Write("Vezetéknév: ");string vezetek = Console.ReadLine();vezetek = vezetek.Trim();Console.Write("Keresztnév: ");string kereszt = Console.ReadLine();kereszt = kereszt.Trim();int vezetekHossz = Math.Min(3, vezetek.Length);int keresztHossz = Math.Min(2, kereszt.Length);string becenev = (vezetek.Substring(0, vezetekHossz) + kereszt.Substring(0, keresztHossz)).ToUpper();Console.WriteLine($"A beceneved: {becenev}");Math.Min(a, b) a két szám közül a kisebbet adja. Így nem kérünk több karaktert, mint amennyi létezik. A Substring(0, 0) üres szöveget ad.✍️ 2. Monogram – pontosan két névrészből
Most pontosan két, nem üres névrészt adj meg, köztük egyetlen szóközzel. Például Szabó Péter → S. P.; Kiss Anna → K. A. A magyar kétjegyű betűk közül itt csak az első karaktert vesszük.Egy lehetséges megoldás
Console.Write("Teljes név (két névrész, egy szóköz): ");string nev = Console.ReadLine();nev = nev.Trim();int szokoz = nev.IndexOf(" ");char elso = nev[0];char masodik = nev[szokoz + 1];Console.WriteLine($"{elso}. {masodik}.".ToUpper());IndexOf keresés sikertelenségét és az indexhatárokat elágazással ellenőrizzük majd.🔐 3. Jelszó-ellenőrző (if nélkül!)
Kérj be egy kitalált próbaszöveget (például Kaland42), és írd ki true vagy false értékkel: legalább 8 karakter-e; van-e benne nagybetű; és hogy NEM tartalmazza-e a „jelszo” szót (kis- és nagybetűtől függetlenül).
Egy lehetséges megoldás
Console.Write("Jelszó: ");string j = Console.ReadLine();bool elegHosszu = j.Length >= 8;bool vanNagybetu = j != j.ToLower();bool nemJelszoSzo = j.ToLower().Contains("jelszo") == false;Console.WriteLine($"Legalább 8 karakter: {elegHosszu}");Console.WriteLine($"Van benne nagybetű: {vanNagybetu}");Console.WriteLine($"Nem tartalmazza a „jelszo” szót: {nemJelszoSzo}");Ügyes trükk: ha a jelszó nem egyezik a saját kisbetűs változatával, akkor volt benne nagybetű! A == false azt vizsgálja, hogy a keresés eredménye hamis-e. Próbák (hossz, nagybetű, tiltott szó hiánya): Kaland42 → True, True, True; Jelszo123 → True, True, False; alma → False, False, True. Ez három szövegtulajdonság gyakorlása, nem teljes jelszóbiztonsági vizsgálat.
🧾 4. Kasszablokk
Írj ki egy blokkot három termékkel, oszlopokba igazítva: a termék neve balra (15 karakter), az ár jobbra (8 karakter), ezres tagolással, a végén az összeggel. Például: „Pizza 3 490 Ft”.
Egy lehetséges megoldás és magyarázat
int pizza = 3490;int limonade = 790;int suti = 990;int osszeg = pizza + limonade + suti;Console.WriteLine($"{"Pizza",-15}{pizza,8:N0} Ft");Console.WriteLine($"{"Limonádé",-15}{limonade,8:N0} Ft");Console.WriteLine($"{"Süti",-15}{suti,8:N0} Ft");Console.WriteLine("--------------------------");Console.WriteLine($"{"Összesen",-15}{osszeg,8:N0} Ft");-15 balra, a 8 jobbra igazít; az N0 ezres tagolást használ tizedesjegyek nélkül. A tagolójel a területi beállítástól függ. Az árak itt próbaadatok.Plusz: mit számol a Length?
Length a UTF-16 kódegységeket számolja. A leckében használt magyar betűknél egy betű egy ilyen egység; egy emoji viszont többől is állhat. Ezért tetszőleges szövegnél nem mindig ugyanaz a Length és a látható karakterek száma.Önálló visszaidézés
A megoldások becsukása után kérj be egy játékbeli becenevet, vágd le a két végéről a szóközöket, és írd ki a hosszát meg a nagybetűs változatát. Mondd el saját szavaiddal: miért kell eltárolni a Trim eredményét, és mit jelent az F2?Összefoglalás
- A string karakterek sorozata; az indexelés 0-tól indul, a hossz a
Length. - A
Trim, aToUpper, aContains, azIndexOf, aSubstringés aReplacea leggyakoribb metódusok. - A string nem változik meg: az eredményt el kell tárolni (
s = s.Trim();). - Különleges karakterek:
\n,\t,\"; útvonalhoz@"…". - Formázás:
{x:F2},{n:N0},{s,-10}; a tizedesjel a program aktuális területi beállításától függ.
Tanároknak
Kerettantervi kapcsolódás
A lecke a 9–10. évfolyamos digitális kultúra algoritmizálási és programozási témáihoz kapcsolódik: szöveges adatok feldolgozása, program kipróbálása és hibakeresés. A C#-metódusok és a leckeszámozás a tananyag saját szervezési döntései, nem külön kerettantervi előírások.
Módszertan
Szakmai háttér: Microsoft Learn – szövegek és számformázás. Szándékosan nem használ elágazást (a 3.1 előtt áll): a feltételes viselkedés helyett logikai értékek kiírásával dolgozik, ami a 2.2.1 lecke bool-ismereteit mélyíti. A „megváltoztathatatlan string” jóslós feladat a leggyakoribb tévképzetet célozza. Az üres név kezelése előkészíti a 3.1 leckét. A példák interaktív konzolos bevitelt feltételeznek; lezárt bemeneti adatfolyamnál a ReadLine null értéket is adhat. Ennek kezelése külön, későbbi téma.
Időterv
Első 45 perc: indexelés 7 perc; metódusok és filmes próba 15 perc; változatlanság 8 perc; különleges karakterek 7 perc; önálló visszaidézés 8 perc. Második 45 perc: formázás és kalkulátor 15 perc; hibavadászat 10 perc; egy választott kihívás 15 perc; megbeszélés 5 perc. A többi kihívás differenciáló vagy otthoni gyakorlás.
Következő lecke: 3.1 Feltételek – if és else
A programod eddig minden sort végrehajtott. Most megtanítod dönteni: ha valami igaz, csináljon egyet, ha nem, mást.

