Vezérlőpult
E1. Egydimenziós tömb · Tömbök, listák, Dictionary

E blokk · Tömbök, listák, Dictionary · 1. tananyag

Egydimenziós tömb: definiálás, inicializálás

Egy dolgozat pontszáma egy int. Egy osztály harminc pontszáma harminc változó? A pont1…pont30 sor ciklussal nem járható be, metódusnak nem adható át egyben, és egy új diáknál a kódot is át kell írni. A megoldás a tömb: azonos típusú értékek sorozata egyetlen név alatt, sorszámmal elérve. Ma a D4-es string[] args kérdése is választ kap.

2 tanóraint[] · new · { }index · Length

Tanulási célok

1Egy név, sok érték

int[] jegyek = { 5, 4, 3, 5, 2 };
jegyek jegyek.Length = 5 5 4 3 5 2 [0] [1] [2] [3] [4] az index 0-tól indul — az utolsó elem indexe Length − 1 = 4

Miért 0-tól? Az index azt mondja meg, hány elemnyit kell ugrani a tömb elejétől: az első elemhez nullát, a másodikhoz egyet. A C4-ben ezért szoktunk rá az i = 0; i < N ciklusfejre — a tömbök pontosan ilyen ciklussal járhatók be (E2).

2Deklaráció és alapértékek

Ha a méret ismert, de a tartalom még nem:

int[] pontok = new int[30];              // 30 elem, mindegyik 0
double[] homersekletek = new double[7];  // 7 elem, mindegyik 0.0
bool[] jelenlet = new bool[25];          // 25 elem, mindegyik false
string[] nevek = new string[25];         // 25 elem, mindegyik null

3Inicializálás kezdőértékekkel

Ha a tartalom is ismert, a deklarációval együtt megadhatod:

int[] jegyek = { 5, 4, 3, 5, 2 };
string[] napok = { "hétfő", "kedd", "szerda", "csütörtök", "péntek" };
char[] maganhangzok = { 'a', 'e', 'i', 'o', 'u' };

A méretet ilyenkor a fordító számolja ki az elemek számából. Ugyanez hosszabb alakban is írható: int[] jegyek = new int[] { 5, 4, 3, 5, 2 }; — ezt akkor kell használni, ha a tömböt később kapja meg a változó (a rövid, kapcsos zárójeles alak csak a deklarációban működik).

ℹ️ MODERN ÍRÁSMÓD

C# 12 óta a szögletes zárójeles alak is használható: int[] jegyek = [5, 4, 3, 5, 2];. Ugyanazt jelenti; a tananyagban a kapcsos zárójeles formát használjuk, mert a régebbi kódokban és példákban is ez szerepel.

4Az elemek elérése: az index

int[] jegyek = { 5, 4, 3, 5, 2 };

Console.WriteLine(jegyek[0]);                  // 5 — az első elem
Console.WriteLine(jegyek[4]);                  // 2 — az utolsó elem
Console.WriteLine(jegyek.Length);              // 5 — az elemek száma
Console.WriteLine(jegyek[jegyek.Length - 1]);  // 2 — az utolsó, bármekkora tömbnél

jegyek[2] = 4;                                 // a harmadik elem felülírása
⚠️ A TARTOMÁNYON KÍVÜL

Ha az index kívül esik a 0 … Length - 1 tartományon (jegyek[5], jegyek[-1]), a program futás közben kivétellel leáll. A fordító ezt nem veszi észre, mert az index sokszor csak futás közben derül ki. Ennek a hibának szenteljük az E3 fejezetet.

Helyes, fordítási hiba vagy kivétel?

Döntsd el a kódrészletről: lefut, a fordító elutasítja, vagy futás közben kivétellel leáll?

1 / 8Pontszám: 0
…

5Tömb kiírása — és a tömb is objektum

int[] jegyek = { 5, 4, 3, 5, 2 };

Console.WriteLine(jegyek);                     // System.Int32[]  ← nem ezt akartuk
Console.WriteLine(string.Join(", ", jegyek));  // 5, 4, 3, 5, 2
Console.WriteLine(jegyek.GetType());           // System.Int32[]

A WriteLine minden objektumnak a ToString()-jét írja ki (B5), a tömb pedig nem a tartalmát adja vissza, hanem a típusa nevét. A tartalmat a string.Join fűzi össze egyetlen szöveggé: az első paramétere az elválasztó, a második a tömb.

A GetType() válasza a „C#-ban minden objektum” szál újabb darabja: a tömb típusa System.Int32[] — az int teljes nevéhez (B1) jön a szögletes zárójel.

6Két beváltott ígéret

A string[] args (D4): a Main paramétere egy string-tömb, benne a programnak induláskor átadott szavakkal. Ha a programot parancssorból így indítod: SzamKitalalo.exe konnyu 50, akkor args[0] értéke "konnyu", args[1] értéke "50", az args.Length pedig 2. Visual Studióban a projekt indítási beállításainál (Debug → General → Open debug launch profiles UI → Command line arguments) adhatsz meg ilyet.

A kisebb egész típusok (B2): egyetlen változónál nem érdemes spórolni. Egy egymillió elemű tömbnél viszont már számít: az int[] kb. 4 MB, a byte[] kb. 1 MB memóriát foglal. Ha az értékek elférnek (pl. képpontok színösszetevői, 0–255), a byte[] a jobb választás.

7Gyakori hibák

TünetMi történt?Mit tegyél?
a kiírásban System.Int32[] jelenik mega tömböt adtad a WriteLine-nakstring.Join(", ", tomb) — vagy ciklus (E2)
CS0650: Bad array declaratorC-stílusú deklaráció: int jegyek[]a [] a típus után áll: int[] jegyek
CS0623: Array initializers can only be used in a variable or field initializera rövid, kapcsos zárójeles alakot nem a deklarációban használtadkésőbb a hosszú alak kell: jegyek = new int[] { 1, 2 };
CS0847: An array initializer of length '3' is expecteda méret és az elemek száma nem egyezik: new int[3] { 1, 2 }hagyd el a méretet, vagy adj meg pontosan annyi elemet
az utolsó elem helyett kivételtomb[tomb.Length] — a Length már túlmutataz utolsó index Length - 1
a sorszám szerinti elem „eggyel mellé” megya felhasználó 1-től számol, a tömb 0-tóla beolvasott sorszámból vonj le egyet: tomb[sorszam - 1]
NullReferenceException string-tömb eleména new string[5] elemei null-okadj értéket az elemnek, mielőtt használnád

8Gyakorlat — heti időjárás

  1. Új projekt: Console App, név: HetiIdojaras, .NET 10 + Konzol.cs.
  2. Hozz létre egy string[] napok tömböt a hét napjaival, és egy int[] homersekletek tömböt hét, általad kitalált napi maximum-hőmérséklettel.
  3. Írd ki mindkét tömböt egy-egy sorban a string.Join-nal.
  4. Kérd be a nap sorszámát (1–7) a Konzol.SzamotKer(…, 1, 7) hívással, és írd ki mondatszerűen: „Szerdán 18 fok volt.” Figyelj az indexre!
  5. Írd ki a hét első és utolsó napjának hőmérsékletét úgy, hogy az utolsó elemet Length-szel éred el.
  6. Commit: Heti idojaras: elso tombjeink.
✅ ELLENŐRZŐ PONT

Mind a hét sorszámra a helyes nap és hőmérséklet jelenik meg (az 1-es a hétfő, a 7-es a vasárnap); a program 0-ra és 8-ra újrakérdez.

9Feladatok

Gyakorló feladatok

⭐ alap · ⭐⭐ haladó · ⭐⭐⭐ kihívás

E1.1⭐

Hozz létre egy tömböt az öt kedvenc számoddal, és írd ki az első, a középső és az utolsó elemet.

E1.2⭐

Hozz létre egy new double[4] tömböt, írd ki a string.Join-nal, majd adj értéket a második elemének, és írd ki újra. Mit látsz az első kiírásnál, és miért?

E1.3⭐⭐

A hónapok nevét tárold tömbben. Kérd be a hónap sorszámát, és írd ki a nevét — hibás sorszámra kérdezz újra.

E1.4⭐⭐

Egy tömbben öt termék ára van, egy másikban a nevük (azonos sorrendben). Kérd be egy termék sorszámát, és írd ki a nevét és az árát egy mondatban.

E1.5⭐⭐⭐

Írj programot, amely kiírja a kapott parancssori argumentumok számát, és — ha van legalább egy — az elsőt és az utolsót. Próbáld ki argumentumok nélkül és hárommal is (a VS indítási beállításaiban).

10Önellenőrző kvíz

Ellenőrizd magad!

Minden kérdésnél egy válasz helyes. A végén pontszámot kapsz.

11Fogalomtár

FogalomJelentés
tömbazonos típusú elemek rögzített méretű sorozata, egyetlen név alatt
elema tömb egy értéke — pl. jegyek[2]
indexaz elem sorszáma a tömbben, 0-tól Length - 1-ig
Lengtha tömb elemeinek száma
alapértékamit a new a még meg nem adott elemekbe tesz: 0, false, '\0' vagy null
inicializáláskezdőértékek megadása a deklarációban: { 5, 4, 3 }
string.Joina tömb elemeit egy szöveggé fűzi, a megadott elválasztóval
string[] argsa programnak induláskor átadott parancssori szavak tömbje

12Összegzés

  1. A tömb azonos típusú elemek sorozata egyetlen név alatt; a típusa int[], string[], …
  2. new int[n] — n elem alapértékkel; { … } — kezdőértékekkel, a méretet a fordító számolja.
  3. Az index 0-tól indul, az utolsó elem Length - 1; a méret létrehozás után nem változik.
  4. A WriteLine(tomb) csak a típust írja ki — a tartalomhoz string.Join (vagy ciklus) kell.
  5. A string[] args a parancssori argumentumok tömbje — a D4-es kérdés ezzel megválaszolva.
  6. Következik: a tömb bejárása ciklussal, és az elemekkel végzett számítások (összeg, átlag, legnagyobb elem).