C# programozás kezdőknek › 2.5 lecke

C# tanfolyam · 2.5 lecke

Szövegek kezelése: string metódusok és formázás

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.

  • 2 × 45 perc
  • kezdő szint
  • 9. osztály
Két fiatal kis- és nagybetűs betűlapokat rendez egy varázslatos betűműhelyben.
Szövegek átalakítása a betűműhelyben. MI-vel készült illusztráció.

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

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:

Program.csC#
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

Egyszerre csak egy műveletet gyakorolj: először Trim, aztán ToUpper, végül Contains. A táblázat visszakereshető segítség, nem egyszerre megtanulandó lista. A programrészleteket a Main metódusba írd, vagy egy új projekt Program.cs fájljába felső szintű utasításként; ugyanazon példát csak egyszer másold be.

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ódusMit 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 nems.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, EndsWithEzzel 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!

A 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}");
A konzol True és False alakban írja ki a logikai értékeket.

A nagy csapda: a string nem változik meg

Program.csC#
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ésJelentése
\núj sor
\ttabulá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)
Program.csC#
Console.WriteLine("Első sor\nMásodik sor");Console.WriteLine("Azt mondta: \"Szia!\"");
KimenetKonzol
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átumJelentésePélda (magyar beállítással)
{x:F2}2 tizedesjegy4,666… → „4,67”
{x:F0}egészre kerekítve4,6 → „5”
{n:N0}ezres tagolás1250000 → „1 250 000”
{r:P0}százalék0,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

Először külön programban próbáld ki ezt a teljes példát. A név két végéről eltávolítjuk a felesleges szóközöket, de a beírt kis- és nagybetűket megőrizzük. Utána a kiírásokat átviheted a 2.4-es mini projektedbe, a saját változóneveiddel.
Program.cs – a Main metódusba
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("===============================");
A jegyek itt rögzített próbaadatok: most a szövegkezelést és a kiírást gyakoroljuk. Bemenet: 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?
Üres szöveget kapunk. A 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

Hibás kódC#
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

Hibás kódC#
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

Hibás kódC#
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}");
A 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());
Ez a gyakorlóváltozat a megadott bemeneti feltételt feltételezi. Üres, egyszavas vagy több szóközt tartalmazó névre még nem általános megoldás. Az 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
Program.csC#
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");
Az összeg 5270 Ft. A -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?
A 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, a ToUpper, a Contains, az IndexOf, a Substring és a Replace a 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.