IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

4. diel - Viacrozmerné polia vo VB .NET

V minulej lekcii, Spájať zoznam vo VB.NET , sme sa venovali spojovým zoznamom.

Dnešný diel VB .NET tutoriálu pojednáva o tzv. Viacrozmerných poliach.

Jednorozmerné pole

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

štruktúra poľa - Kolekcie a LINQ v VB.NET

Dvojrozmerné pole

Hoci to nie je tak časté, v programovaní sa občas stretávame aj s viacrozmernými poliami 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 obsadenosť sedadiel v kinosály. Situáciu by sme si mohli graficky znázorniť napr. Nasledovne:

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

Kinosála by bol v praxi samozrejme väčší, ale ako ukážka nám toto pole postačí. 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čet, ale s ním sa stretneme až neskôr, takže si teraz musíme vystačiť iba s číslami.

2D polia deklarujeme v VB .NET nasledujúcimi spôsobmi:

Dim kinosal(,) As Integer = New Integer(4, 4) {}

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

Všetky numerické polia v VB .NET sú 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ála naplníme jednotkami tak, ako je vidieť na obrázku vyššie. Pretože budeme ako správni programátori leniví, využijeme na vytvorenie riadku jedničiek for cykly.:) Pre prístup k prvku 2D poľa musíme samozrejme zadať dve súradnice:

Dim i As Integer = Integer.MinValue
kinosal(2, 2) = 1 Prostredný riadok
i = 1
While i < 4
  kinosal(i, 3) = 1 4. riadok
    i += 1
End While
i = 0
While i < 5
  kinosal(i, 4) = 1 Posledný riadok
    i += 1
End While

Výpis

Výpis pole opäť vykonáme pomocou cyklu, na 2D pole budeme potrebovať cykly dva (jeden nám pre-iteruje stĺpce a druhý riadky). Ako správni programátori nevložíte počet riadkov a stĺpcov do cyklov napevno, pretože sa môže zmeniť. .NET poskytuje na 2D poli vlastnosť Length, ako tomu bolo u 1D pole, 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. Prvý dimenzií je počet stĺpcov, druhú počet riadkov.

Cykly ponoríme do seba tak, aby nám vonkajšie cyklus prechádzal riadky a vnútorné stĺpce v aktuálnom riadku. Po výpisu riadku je nutné odřádkovat. Obaja cykly musí mať samozrejme inú riadiacu premennú:

    ' Výpis 2D pole
    Dim j As Integer = 0
        While j < kinosal.GetLength(1) ' riadky
            i = 0
            While i < kinosal.GetLength(0) ' stĺpce
                Console.Write(kinosal(i, j))
                i += 1
            End While
            Console.WriteLine()
            j += 1
        End While

        Console.WriteLine()


výsledok:

Konzolová aplikácia
00000
00000
00100
01110
11111

N-rozmerná pole

Niekedy môže byť príhodné vytvoriť si pole o ešte viac dimenziách. My všetci si iste dokážeme predstaviť minimálne 3D poľa. S príkladom s kinosálou sa ponúka prípad použitia, kedy má budova 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 VB.NET

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

Dim kinosal3D(,,) As Integer = New Integer(4, 4, 3) {}

Kód vyššie vytvorí 3D poľa ako na obrázku. Pristupovať k nemu budeme opäť cez Indexer (okrúhle zátvorky) ako predtým, len už musíme zadať tri súradnice:

kinosal3D(3, 2, 1) = 1 ' Druhý kinosála, tretí rad, štvrtý stĺpec

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

Pole polí

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

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

Dim kinosalJag As Integer()() = New Integer(4)() {}

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

Pole polí v C# .NET - Kolekcie a LINQ v VB.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 navkládat sami (zatiaľ si vložme všetky stĺpčeky o 5tich prvkoch):

Dim i As Integer = 0
While i < kinosalJag.Length
    kinosalJag(i) = New Integer(4) {}
    i += 1
End While

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

Dim sloupcu As Integer = kinosalJag.Length
Dim radku As Integer = 0
If sloupcu <> 0 Then
    radku = kinosalJag(0).Length
End If

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

K hodnotám v poli potom pristupujeme pomocou dvoch Indexer:

kinosal(4)(2) = 1 ' Obsadzujeme sedadlo v 5. stĺpci a 3. rade

Použitie jediného Indexer 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é pole je možné rovno inicializovať hodnotami (kód vytvorí rovnú zaplnený kinosála ako na obrázku):

Dim kinosal(,) As Integer = {{0, 0, 0, 0, 0},
                             {0, 0, 0, 0, 0},
                             {0, 0, 1, 0, 0},
                             {0, 1, 1, 1, 0},
                             {1, 1, 1, 1, 1}
                            }

Stĺpce, tu zapisujeme ako obsah jednotlivých riadkov.

Podobnú inicializácii môžeme použiť dokonca aj u polí zubatých (kód nižšie vytvorí zubaté poľa ako na obrázku):

Dim zubatePole As Integer()() = New Integer()() {New Integer() {15, 2, 8, 5, 3},
                                                 New Integer() {3, 3, 7},
                                                 New Integer() {9, 1, 16, 13},
                                                 New Integer() {},
                                                 New Integer() {5}
                                                }

Na záver by som rád dodal, že niektorí ľudia, ktorí nevie správne používať objekty, využívajú 2D polí na ukladanie viac údajov o jedinej entite. 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 Telefon. Pole si určite ešte vyskúšajte ešte v cvičenie v tomto kurze.

V budúcej lekcii, Front vo VB.NET , si predstavíme kolekciu Fronta.


 

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 (295.32 kB)
Aplikácia je vrátane zdrojových kódov v jazyku VB

 

Predchádzajúci článok
Spájať zoznam vo VB.NET
Všetky články v sekcii
Kolekcie a LINQ v VB.NET
Preskočiť článok
(neodporúčame)
Front vo VB.NET
Článok pre vás napísal Přemysl Šíma
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
APSima
Aktivity