10. diel - Viacrozmerné polia v jazyku C
V predchádzajúcom cvičení, Riešené úlohy k 8.-9. lekciu Céčka, sme si precvičili získané skúsenosti z predchádzajúcich lekcií.
V minulej lekcii, Riešené úlohy k 8.-9. lekciu Céčka , sme pracovali s jednotlivými znakmi
textových reťazcov, teda s prvkami v poli typu char
. Reťazce
dnes už opustíme. Doteraz sme 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 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ť 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]; int i, j; // Naplnenie nulami for (j = 0; j < 5; j++) for (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 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 = 1; i < 4; i++) // 4. radek { kinosal[i][3] = 1; } for (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ú:
{C_CONSOLE}
int kinosal[5][5];
int i, j;
// Naplnenie nulami
for (j = 0; j < 5; j++)
for (i = 0; i < 5; i++)
kinosal[j][i] = 0;
kinosal[2][2] = 1; // Prostriedok
for (i = 1; i < 4; i++) // 4. radek
{
kinosal[i][3] = 1;
}
for (i = 0; i < 5; i++) // Posledni radek
{
kinosal[i][4] = 1;
}
for (j = 0; j < 5; j++)
{
for (i = 0; i < 5; i++)
printf("%d", kinosal[i][j]);
printf("\n");
}
{/C_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 obdĺžnikové. Céčko nám nedovolí staticky vytvoriť pole, ktoré by malo v jednotlivých dimenziách rozdielny počet prvkov (anglicky zvané jagged array). 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éčka, 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) štruktúr typu TELEFON
. Štruktúry sa
naučíme používať ešte na konci tohto kurzu. Pole si môžete vyskúšať
ešte v cvičení k tejto sekcii.
V budúcej lekcii, Matematické funkcie v jazyku C , sa pozrieme na matematickú knižnicu
math.h
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é 120x (62.37 kB)
Aplikácia je vrátane zdrojových kódov v jazyku C