Mikuláš je tu! Získaj 90 % extra kreditov ZADARMO s promo kódom CERTIK90 pri nákupe od 1 199 kreditov. Len do nedele 7. 12. 2025! Zisti viac:
NOVINKA: Najžiadanejšie rekvalifikačné kurzy teraz s 50% zľavou + kurz AI ZADARMO. Nečakaj, táto ponuka dlho nevydrží! Zisti viac:

4. diel - Viacrozmerné polia v C# .NET

V predchádzajúcej lekcii, Spojkový zoznam v C#, sme sa venovali spojkovým zoznamom.

V dnešnom dieli kurzu C# .NET si povieme o tzv. viacrozmerných poliach.

Jednorozmerné pole

Už vieme pracovať s jednorozmerným poľom, ktoré si môžeme predstaviť ako riadok priehradiek v pamäti počítača.

Štruktúra poľa - Kolekcie a LINQ v C# .NET

(Na obrázku je vidieť pole ôsmich čísel)

Dvojrozmerné pole

Hoci to nie je tak časté, v programovaní sa občas stretávame aj s viacrozmernými poľami a to najmä ak programujeme nejakú simuláciu (napr. hru).

Dvojrozmerné pole si môžeme v pamäti predstaviť ako tabuľku a mohli by sme takto reprezentovať napr. rozohranú partiu piškvoriek. Ak by sme sa chceli držať reálnych aplikácií, ktoré budete neskôr v zamestnaní tvoriť, môžeme si predstaviť, že do 2D poľa budeme ukladať informácie o obsadenostiach sedadiel v kinosále. Situáciu by sme si mohli graficky znázorniť napr. takto:

Štruktúra dvojrozmerného poľa - Kolekcie a LINQ v C# .NET

(Na obrázku je vidieť 2D poľa reprezentujúce obsadenosť kinosály)

Kinosála by bola v praxi samozrejme väčšia, ale ako ukážka nám toto pole bude stačiť. 0 znamená voľno, 1 obsadené. Neskôr by sme mohli doplniť aj 2 – rezervované a podobne. Pre tieto stavy by bolo správnejšie vytvoriť si vlastný dátový typ, tzv. výpočtový typ (enum), ale s ním sa stretneme až neskôr, takže si teraz musíme vystačiť iba s číslami.

2D pole deklarujeme v C# .NET nasledujúcim spôsobom:

int[,] cinema = new int [5, 5];

Prvá číslica udáva počet stĺpcov, druhá počet riadkov (samozrejme si to môžeme určiť aj obrátene, napr. matice sa v matematike zapisujú opačne).

Všetky číselné polia sú v C#.NET po deklarácii automaticky inicializované samými nulami, môžeme sa na to spoľahnúť. Vytvorili sme si teda v pamäti tabuľku plnú núl.

Naplnenie dátami

Teraz kinosálu naplníme jednotkami tak, ako je to na obrázku vyššie. Pretože budeme ako správni programátori leniví, využijeme na vytvorenie riadku jednotiek for cykly :) Na prístup k prvku 2D poľa musíme samozrejme zadať 2 súradnice:

cinema[2, 2] = 1; // middle point
for (int i = 1; i < 4; i++) // 4th row
{
    cinema[i, 3] = 1;
}
for (int i = 0; i < 5; i++) // last row
{
    cinema[i, 4] = 1;
}

Výpis

Výpis poľa opäť vykonáme pomocou cyklu, na 2D pole budeme potrebovať 2 cykly (jeden nám preiteruje stĺpce a druhý riadky). Ako správni programátori nevložíme počet riadkov a stĺpcov do cyklov napevno, pretože sa môžu zmeniť. C# .NET poskytuje na 2D poli vlastnosť Length ako to bolo pri 1D poli, ale tá vracia celkový počet prvkov v poli, v našom prípade teda 25. Nás bude zaujímať metóda GetLength(), ktorá prijíma ako parameter dimenziu (0 pre stĺpce, 1 pre riadky) a vráti nám počet prvkov v tejto dimenzii. Prvou dimenziou je počet stĺpcov, druhou počet riadkov.

Cykly zanoríme do seba tak, aby nám vonkajší cyklus prechádzal riadkami a vnútornými stĺpcami v aktuálnom riadku. Po výpise riadku je nutné odriadkovať. Oba cykly musia mať samozrejme inú riadiacu premennú:

for (int j = 0; j < cinema.GetLength(1); j++)
{
    for (int i = 0; i < cinema.GetLength(0); i++)
    {
        Console.Write(cinema[i, j]);
    }
    Console.WriteLine();
}

Výsledok:

Konzolová aplikácia
00000
00000
00100
01110
11111

N-rozmerné polia

Niekedy môže byť vhodné vytvoriť si pole s viacerými dimenziami. My všetci si určite dokážeme predstaviť minimálne 3D polia. V príklade s kinosálou môžeme uvažovať tak, že budova bude mať viac poschodí (alebo všeobecne viac kinosál). Vizualizácia by vyzerala asi nejako takto:

3D poľa v C# .NET - Kolekcie a LINQ v C# .NET

3D pole môžeme vytvoriť tým istým spôsobom, ako 2D pole:

int[, ,] cinemas = new int [4, 4, 3];

Kód vyššie vytvorí 3D pole ako na obrázku. Pristupovať k nemu budeme opäť cez indexer (hranaté zátvorky) ako predtým, len už musíme zadať 3 súradnice:

cinema[3, 2, 1] = 1; // the second-floor cinema, the third row, the fourth seat

Pokiaľ metóde GetLength() zadáme parameter s hodnotou 2, získavame počet "poschodí" (kinosál).

Pole polí

Mnoho programovacích jazykov vlastne viacrozmerné polia nepodporuje, C# je skôr výnimkou. Môžeme si v nich ale rovnako vytvoriť koľkorozmerné pole chceme, pretože 2D pole nie je vnútorne nič iné ako pole polí. Situáciu si môžeme predstaviť tak, že si vytvoríme pole s piatimi prvkami (1. riadok) a každá bunka v tomto riadku v sebe bude obsahovať ďalšie pole, reprezentujúce stĺpček.

Takéto 2D pole deklarujeme nasledujúcim spôsobom:

int[][] cinema = new int[5][];

Výhodou takto deklarovaného 2D poľa je fakt, že si do každého riadku/stĺpca môžeme uložiť aké veľké pole chceme. V niektorých prípadoch teda nemusíme "plytvať" pamäťou na celú tabuľku a môžeme vytvoriť "zubaté" pole (anglicky jagged):

Polia polí v C# .NET - Kolekcie a LINQ v C# .NET

Nevýhodou tohto prístupu je, že musíme pole nepríjemne inicializovať sami. Pôvodný riadok s piatimi bunkami síce existuje, ale jednotlivé stĺpčeky si do neho musíme navkladať sami (zatiaľ si vložme všetky stĺpčeky s 5timi prvkami):

for (int i = 0; i < cinema.Length; i++)
{
    cinema[i] = new int[5];
}

C# taktiež ďalej neposkytuje žiadny komfort vo forme získania počtu stĺpcov a riadkov poľa polí. Veľkosť poľa musíme získať takto:

int columns = cinema.Length;
int rows = 0;
if (columns != 0)
    rows = cinema[0].Length;

Všimnite si, že je nutné pýtať sa na počet stĺpcov, pretože ak je to 0, nemôžeme sa dostať k 1. stĺpcu, aby sme zistili jeho dĺžku (počet riadkov v stĺpci).

K hodnotám v poli potom pristupujeme pomocou 2 indexerov:

cinema[4][2] = 1; // We occupy the seat in the 5th column and the 3rd row

Použitie jediného indexera nám vráti celý stĺpček na danom indexe.

Skrátená inicializácia viacrozmerných polí

Ešte si ukážeme, že aj viacrozmerné polia je možné rovno inicializovať hodnotami (kód vytvorí rovno zaplnenú kinosálu ako na obrázku):

int[,] cinema = new int[,] {
    { 0, 0, 0, 0, 1 },
    { 0, 0, 0, 1, 1 },
    { 0, 0, 1, 1, 1 },
    { 0, 0, 0, 1, 1 },
    { 0, 0, 0, 0, 1 }
};

Pole je v tomto zápise otočené, pretože definujeme stĺpce, ktoré tu zapisujeme ako riadky.

Podobnú inicializáciu môžeme použiť dokonca aj pri poliach zubatých (kód nižšie vytvorí zubaté pole ako na obrázku):

int[][] jaggedArray = new int[][] {
    new int[] {15, 2, 8, 5, 3},
    new int[] {3, 3, 7},
    new int[] {9, 1, 16, 13},
    new int[] {},
    new int[] {5}
};

Na záver by som rád dodal, že niektorí ľudia, ktorí nevedia správne používať objekty, využívajú 2D polia na ukladanie viacerých údajov s jedinou entitou. Napr. budeme chcieť uložiť výšku, šírku a dĺžku piatich mobilných telefónov. Hoci sa vám teraz môže zdať, že sa jedná o úlohu na 3D pole, v skutočnosti sa jedná o úlohu na obyčajné 1D pole (presnejšie zoznam) objektov typu Telephone. Pole si určite vyskúšajte ešte v cvičení v tomto kurze.

V nasledujúcom kvíze, Kvíz - Genericita, List, N-rozmerné pole v C# .NET Kolekcia, si vyskúšame nadobudnuté skúsenosti z predchádzajúcich lekcií.


 

Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.

Stiahnuť

Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami

Stiahnuté 6x (231.26 kB)
Aplikácia je vrátane zdrojových kódov v jazyku C#

 

Predchádzajúci článok
Spojkový zoznam v C#
Všetky články v sekcii
Kolekcie a LINQ v C# .NET
Preskočiť článok
(neodporúčame)
Kvíz - Genericita, List, N-rozmerné pole v C# .NET Kolekcia
Článok pre vás napísal David Hartinger
Avatar
Užívateľské hodnotenie:
18 hlasov
David je zakladatelem ITnetwork a programování se profesionálně věnuje 15 let. Má rád Nirvanu, nemovitosti a svobodu podnikání.
Unicorn university David sa informačné technológie naučil na Unicorn University - prestížnej súkromnej vysokej škole IT a ekonómie.
Aktivity