E blokk · Tömbök, listák, Dictionary · 1. tananyag
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.
int[] pontok = new int[30];), és tudod,
milyen alapértéket kapnak az elemek.int[] jegyek = { 5, 4, 3 };).Length - 1-ig.Length tulajdonsággal
lekérdezed a méretet.string.Join-nal, és
tudod, miért nem elég a WriteLine(tomb).int[] jegyek = { 5, 4, 3, 5, 2 };
[]
jelzi: ez nem egy int, hanem
int-ek tömbje. Olvasd
így: „int-tömb”.jegyek[0], az ötödik a
jegyek[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).
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
new int[30] lefoglal
30 egész számnyi helyet. A méret szögletes zárójelben áll, és lehet
változó is: new int[letszam].bool-nál false,
char-nál a '\0'
(nulla kódú) karakter, string-nél
null — vagyis még nincs
benne szöveg. A null-lal a H blokkban
foglalkozunk részletesen; addig elég annyi, hogy a
null-os string elemre értéket kell adni,
mielőtt használnád.List<T>
való (E4).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).
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.
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
jegyek[i] pontosan úgy viselkedik, mint
egy közönséges int változó: olvasható,
felülírható, számolhatsz vele.Length a tömb mérete —
ismerős a B4-ből,
a stringnél is így hívták. Az utolsó elem indexe mindig
Length - 1.jegyek[i],
jegyek[sorszam - 1]. Ez teszi a tömböt
igazán hasznossá.nev[0], B4) — a string karakterek
sorozata, és sok mindenben a tömbhöz hasonlóan viselkedik.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.
Döntsd el a kódrészletről: lefut, a fordító elutasítja, vagy futás közben kivétellel leáll?
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.
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.
| Tünet | Mi történt? | Mit tegyél? |
|---|---|---|
a kiírásban System.Int32[] jelenik meg | a tömböt adtad a WriteLine-nak | string.Join(", ", tomb) — vagy ciklus (E2) |
CS0650: Bad array declarator | C-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 initializer | a rövid, kapcsos zárójeles alakot nem a deklarációban használtad | később a hosszú alak kell: jegyek = new int[] { 1, 2 }; |
CS0847: An array initializer of length '3' is expected | a 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étel | tomb[tomb.Length] — a Length már túlmutat | az utolsó index Length - 1 |
| a sorszám szerinti elem „eggyel mellé” megy | a felhasználó 1-től számol, a tömb 0-tól | a beolvasott sorszámból vonj le egyet: tomb[sorszam - 1] |
NullReferenceException string-tömb elemén | a new string[5] elemei null-ok | adj értéket az elemnek, mielőtt használnád |
HetiIdojaras, .NET 10 +
Konzol.cs.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.string.Join-nal.Konzol.SzamotKer(…, 1, 7)
hívással, és írd ki mondatszerűen: „Szerdán 18 fok volt.” Figyelj az
indexre!Length-szel éred el.Heti idojaras: elso tombjeink.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.
⭐ alap · ⭐⭐ haladó · ⭐⭐⭐ kihívás
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.
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?
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.
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.
Í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).
Minden kérdésnél egy válasz helyes. A végén pontszámot kapsz.
| Fogalom | Jelentés |
|---|---|
| tömb | azonos típusú elemek rögzített méretű sorozata, egyetlen név alatt |
| elem | a tömb egy értéke — pl. jegyek[2] |
| index | az elem sorszáma a tömbben, 0-tól Length - 1-ig |
Length | a tömb elemeinek száma |
| alapérték | amit a new a még meg nem adott elemekbe tesz: 0, false, '\0' vagy null |
| inicializálás | kezdőértékek megadása a deklarációban: { 5, 4, 3 } |
string.Join | a tömb elemeit egy szöveggé fűzi, a megadott elválasztóval |
string[] args | a programnak induláskor átadott parancssori szavak tömbje |
int[],
string[], …new int[n] — n elem alapértékkel;
{ … } — kezdőértékekkel, a méretet a
fordító számolja.Length - 1; a méret létrehozás után nem
változik.WriteLine(tomb) csak a típust írja
ki — a tartalomhoz string.Join (vagy
ciklus) kell.string[] args a parancssori
argumentumok tömbje — a D4-es kérdés ezzel megválaszolva.