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.

  • kb. 45 perc
  • kezdő szint
  • 9. osztály
Nyitókép helye (16:9)

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;
  • tudod, hogy a string nem változik meg, a metódus újat ad vissza;
  • 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

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()Levágja a szóközöket az elejéről és a végérőls.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)Üres-e, vagy csak szóközből áll? (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 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 metódusok nem az eredetit írják át, hanem egy új szöveget adnak vissza. Ha meg akarod tartani, el kell tárolni: nev = nev.ToUpper();

Láncolás

Mivel minden metódus új szöveget ad vissza, egymás után is írhatod őket: string tiszta = beirt.Trim().ToLower(); Ez először levágja a szóközöket, aztán kisbetűssé alakít.

Különleges karakterek

JelölésJelentése
\núj sor
\ttabulátor (ugrás a következő oszlopra)
\"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%”
{nev,-10}10 karakter széles, balra igazítva„Anna ”
{pont,5}5 karakter széles, jobbra igazítva„ 42”

Tizedesvessző vagy pont?

A formázás a számítógép nyelvi beállításait követi: magyar Windowson tizedesvesszővel („4,67”), angolon ponttal („4.67”). Ugyanez igaz a beolvasásra: magyar gépen a double.Parse a „4,5”-öt érti. A kódban viszont mindig pontot írunk: double x = 4.5;

Szép átlagkalkulátor

Az átlagkalkulátor működik, de a kinézetén van mit csiszolni: ha a felhasználó azt írja, hogy „ kovács anna ”, a program pontosan így írja vissza. Javítsuk meg!

Program.cs – a mini projekt folytatásaC#
// A név megtisztítása: szóközök le, első betű nagy, a többi kicsinev = nev.Trim();nev = nev.Substring(0, 1).ToUpper() + nev.Substring(1).ToLower();Console.WriteLine("===============================");Console.WriteLine($"{"Tanuló:",-10}{nev}");Console.WriteLine($"{"Jegyek:",-10}{jegy1}, {jegy2}, {jegy3}");Console.WriteLine($"{"Átlag:",-10}{atlag:F2}");Console.WriteLine("===============================");
KimenetKonzol
===============================Tanuló:   Kovács annaJegyek:   5, 4, 5Átlag:    4,67===============================

🔮 Gondold végig!

A kimenetben „Kovács anna” szerepel, nem „Kovács Anna”. Miért? És mi történne, ha a felhasználó semmit nem írna be névként?

Megoldás

A kódunk csak a legelső betűt teszi naggyá, a többit kicsivé: a második szó elejét nem ismeri fel. Ehhez a szavakat szét kellene bontani, ezt a 6. fejezetben (Split) tanulod. Üres név esetén a Substring(0, 1) hibával leállna, mert nincs első karakter. A helyes reakcióhoz elágazás kell: a következő, 3.1 leckében megtanulod!

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 a vezeték- és a keresztnevet, és készíts belőlük becenevet: a vezetéknév első három betűje + a keresztnév első két betűje, csupa nagybetűvel. (Kovács Anna → KOVAN)

Egy lehetséges megoldás
Program.csC#
Console.Write("Vezetéknév: ");string vezetek = Console.ReadLine().Trim();Console.Write("Keresztnév: ");string kereszt = Console.ReadLine().Trim();string becenev = (vezetek.Substring(0, 3) + kereszt.Substring(0, 2)).ToUpper();Console.WriteLine($"A beceneved: {becenev}");

Gondold végig: mi történik egy kétbetűs vezetéknévvel (például Ló)?

✍️ 2. Monogram

Kérd be a teljes nevet egy sorban (például „Szabó Péter”), és írd ki a monogramot: „SZ. P.”. Tipp: az IndexOf(" ") megmondja, hol van a szóköz. (A „SZ” kétjegyű betű: elég, ha a te megoldásod az első karaktert veszi, „S. P.” is jó!)

🔐 3. Jelszó-ellenőrző (if nélkül!)

Kérj be egy jelszót, é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");Console.WriteLine($"Legalább 8 karakter: {elegHosszu}");Console.WriteLine($"Van benne nagybetű: {vanNagybetu}");Console.WriteLine($"Nem a „jelszo” szó: {nemJelszoSzo}");

Ügyes trükk: ha a jelszó nem egyezik a saját kisbetűs változatával, akkor volt benne nagybetű! A ! jel tagadást jelent: a 3.2 leckében részletesen megismered.

🧾 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”.

Tipp

Egy sor: Console.WriteLine($"{"Pizza",-15}{3490,8:N0} Ft");. Az igazítás és a formátum együtt is használható: először a szélesség, utána a kettőspont és a formátum.

Ö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 gép nyelvi beállításától függ.
Tanároknak

Kerettantervi kapcsolódás

NAT 2020, Digitális kultúra, 9. évfolyam, Algoritmizálás és formális programozási nyelv használata: adattípusok, szöveges adatok kezelése, adatok formázott megjelenítése. A szövegfeldolgozás az emelt szintű érettségi programozási feladatainak egyik alapja.

Módszertan

A lecke a Microsoft Learn szövegformázási és string-metódusos C#-moduljaira épül. 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 esete tudatos előrejelzés a 3.1 leckére.

Időterv

Mi a string: 7 perc. Metódusok: 12 perc. A nagy csapda: 5 perc. Különleges karakterek: 5 perc. Formázás: 8 perc. Szép kalkulátor: 8 perc. A hibavadászat és a kihívások otthoni vagy differenciáló feladatok.

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.