11. diel - Viacrozmerné polia v jazyku C ++
V predchádzajúcom cvičení, Riešené úlohy k 9.-10. lekciu C ++, sme si precvičili získané skúsenosti z predchádzajúcich lekcií.
V minulej lekcii, Riešené úlohy k 9.-10. lekciu C ++ , sme sa venovali práci s jednotlivými znakmi textových reťazcov. Tie už v kurze opustíme. Doteraz sme v C ++ tutoriáloch pracovali iba s jednorozmernými poli. Jednorozmerné pole 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íklad v hrách môže dvojrozmerné pole simulovať hraciu plochu, v matematike treba matici.
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 obsadenosti 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ť nejaké
konštanty, ale s tým sa stretneme až neskôr, takže si teraz musíme
vystačiť iba s číslami.
2D polia deklarujeme v C ++ nasledujúcim spôsobom:
int kinosal[5][5]; // Naplnenie nulami for (int j = 0; j < 5; j++) for (int i = 0; i < 5; i++) kinosal[j][i] = 0;
Nesmieme zabudnúť pole vyplniť nulami, pretože u C ++ nevieme aké hodnoty môžu byť v poli aktuálne uložené. Tiež si treba uvedomiť (a ideálne aj niekam do komentára zapísať) aké je poradie súradníc. V našom prípade bude prvá číslica indexovať stĺpec, druhá riadky.
Modifikácie
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 riadkov jednotiek for
cykly Pre prístup k prvku 2D poľa
musíme samozrejme zadať 2 súradnice.
kinosal[2][2] = 1; // Prostriedok for (int i = 1; i < 4; i++) // 4. radek { kinosal[i][3] = 1; } for (int i = 0; i < 5; i++) // Posledni radek { kinosal[i][4] = 1; }
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). 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ú:
{CPP_CONSOLE}
int kinosal[5][5];
// Naplnenie nulami
for (int j = 0; j < 5; j++)
for (int i = 0; i < 5; i++)
kinosal[j][i] = 0;
// Modifikácie
kinosal[2][2] = 1; // Prostriedok
for (int i = 1; i < 4; i++) // 4. radek
{
kinosal[i][3] = 1;
}
for (int i = 0; i < 5; i++) // Posledni radek
{
kinosal[i][4] = 1;
}
// Výpis
for (int j = 0; j < 5; j++)
{
for (int i = 0; i < 5; i++)
cout << kinosal[i][j];
cout << endl;
}
{/CPP_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:
int kinosaly[5][5][3];
Kód vyššie vytvorí 3D poľa 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.
kinosaly[3][2][1] = 1; // Druhý kinosála, tretí rad, štvrtý stĺpec
Skrátená inicializácia
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):
int kinosal[5][5] = { { 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).
Nezarovnané pole
Doteraz sme hovorili len o tzv. Pravouhlých poliach. U takého poľa vieme, že je vždy štvorcové. C ++ nám nedovolí staticky vytvoriť pole, ktoré by malo v jednotlivých dimenziách rozdielny počet prvkov. Takéto pole by vyzeralo nejako takto:
Takáto pole samozrejme vytvoriť možno, ale musíme si pre každú dimenziu pamätať počet členov, pretože na rozdiel od ostatných jazykov, C ++ si veľkosť poľa nepamätá. Tiež je potrebné využiť dynamickej alokácie pamäti, a preto túto tému necháme až na kurz ďalších konštrukcií C ++, kedy sa k nemu vrátime.
Na záver by som rád dodal, že niektorí ľudia, ktorí nevie správne
používať štruktúry, využívajú 2D polí na ukladanie viac údajov o
jedinej štruktúre. 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 alebo štruktúr typu Telefon
.
Štruktúry sa naučíme používať ešte na konci tohto kurzu, objekty vás
čakajú až ďalej. Pole si môžete vyskúšať ešte v cvičení k tejto
sekcii.
V budúcej lekcii, Matematické funkcie v C ++ , sa pozrieme na matematickú knižnicu
cmath
a na celočíselné delenie.
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é 84x (11.33 kB)
Aplikácia je vrátane zdrojových kódov v jazyku C++