Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
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í.

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.

ukážka pole - Základné konštrukcie jazyka C

(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:

Použitie dvojrozmerného poľa pre miesta v kine - Základné konštrukcie jazyka C

(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ú:

for (j = 0; j < 5; j++)
{
        for (i = 0; i < 5; i++)
                printf("%d", kinosal[i][j]);
        printf("\n");
}

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:

Ilustrácie 3D pole - Základné konštrukcie jazyka C

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:

Ukážka nezarovnaného polia v jazyku C - Základné konštrukcie jazyka C

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é 118x (62.37 kB)
Aplikácia je vrátane zdrojových kódov v jazyku C

 

Predchádzajúci článok
Riešené úlohy k 8.-9. lekciu Céčka
Všetky články v sekcii
Základné konštrukcie jazyka C
Preskočiť článok
(neodporúčame)
Matematické funkcie v jazyku C
Článok pre vás napísal Patrik Valkovič
Avatar
Užívateľské hodnotenie:
1 hlasov
Věnuji se programování v C++ a C#. Kromě toho také programuji v PHP (Nette) a JavaScriptu (NodeJS).
Aktivity