11. diel - Viacrozmerné polia vo VB.NET
V predchádzajúcom cvičení, Riešené úlohy k 10. lekcii VB.NET, sme si precvičili získané skúsenosti z predchádzajúcich lekcií.
V minulej lekcii, Riešené úlohy k 10. lekcii VB.NET , sme si uviedli metódy Split()
a
Join()
na textových reťazcoch. Dnešné Visual Basic .NET
tutoriál je v kurze základných konštrukcií VB.NET v podstate bonusový a
pojednáva o tzv. Viacrozmerných poliach. Teoreticky môžete rovno prejsť k
objektovo orientovanému programovaniu, odporúčam
však si koniec tejto sekcie ešte aspoň prejsť, aby ste mali o
zostávajúcich technikách povedomie, predsa len sa jedná o dosť základné
vedomosti.
Už vieme pracovať s jednorozmernými poľom, ktoré si môžeme predstaviť ako riadku priehradok v pamäti počítača.
(Na obrázku je vidieť pole ôsmich čísiel)
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
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:
(Na obrázku je vidieť 2d pole reprezentujúci obsadenosť kinosály)
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 vo VB.NET nasledujúcim spôsobom:
Dim kinosal(4, 4) As Integer
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 vo Visual Basic .NET sú po deklarácii automaticky inicializovaná samými nulami, ak špecifikujeme ich veľkosť, 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 jednotiek For
cykly Pre prístup k prvku 2D poľa
musíme samozrejme zadať 2 súradnice.
kinosal(2, 2) = 1 'Prostriedok For i As Integer = 1 To 3 ' 4. riadok kinosal(i, 3) = 1 Next For i As Integer = 0 to 4 ' Posledný riadok kinosal(i, 4) = 1 Next
Výpis
Výpis pole opäť vykonáme pomocou cyklu, na 2d pole budeme potrebovať
cykly 2 (jeden nám proiteruje 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ť. Visual Basic .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 dimenzii
(0
stĺpce, 1
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ú:
{VBNET_CONSOLE}
' deklarácia
Dim kinosal(4, 4) As Integer
' naplnenie dátami
kinosal(2, 2) = 1 ' Prostriedok
For i As Integer = 1 To 3 ' 4. riadok
kinosal(i, 3) = 1
Next
For i As Integer = 0 To 4 ' Posledný riadok
kinosal(i, 4) = 1
Next
For j As Integer = 0 To kinosal.GetLength(1) - 1
For i As Integer = 0 To kinosal.GetLength(0) - 1
Console.Write(kinosal(i, j))
Next
Console.WriteLine()
Next
{/VBNET_CONSOLE}
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 môžeme vytvoriť tým istým spôsobom, ako 2D pole:
Dim kinosaly(4, 4, 2) As Integer
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ť 3 súradnice.
kinosaly(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.NET 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 kinosal()() 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 polia vytvoriť "zubaté" (anglicky jagged):
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):
For i As Integer = 0 To kinosal.Length - 1 kinosal(i) = New Integer(4) {} Next
VB.NET 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 = kinosal.Length Dim radku As Integer = 0 If sloupcu <> 0 Then radku = kinosal(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 2 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 = New Integer(,) { { 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 tejto zápisnici otočené, keďže definujeme stĺpce, ktoré tu zapisujeme ako riadky).
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(4)() { 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 Telefón. Ale o tom až u objektovo orientovaného programovania. Pole si môžete vyskúšať ešte v cvičenie v tejto sekcii.
V budúcej lekcii, Cykly vo VB .NET druhýkrát - While, Do-Loop, Exit a Continue , sa pozrieme na matematické funkcie a základný kurz zakončíme.
V budúcej lekcii, Cykly vo VB .NET druhýkrát - While, Do-Loop, Exit a Continue , na nás čaká ďalší syntaxe okolo cyklov, na ktorú môžeme naraziť v cudzích zdrojových kódoch.