Veľkonočná akcia je tu a s ňou aj extra kredity ZADARMO na náš interaktívny e-learning. Dobij si teraz kredity a posuň sa vo svojej kariére vpred!
Medzi 13:00 až cca 15:00 prebehne odstávka siete z dôvodu aktualizácie. Web bude po celú dobu nedostupný.
Zarábaj až 6 000 € mesačne! Akreditované rekvalifikačné kurzy od 0 €. Viac informácií.

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.

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 obsadenosti 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];
// 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ú:

Klikni pre editáciu
  • for (int j = 0; j < 5; j++)
    {
            for (int i = 0; i < 5; i++)
                    cout << kinosal[i][j];
            cout << endl;
    }
    
    • Skontroluj, či výstupy programu zodpovedajú predlohe. S inými textami testy neprejdú.

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

    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 ++, 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++

     

    Ako sa ti páči článok?
    Pred uložením hodnotenia, popíš prosím autorovi, čo je zleZnakov 0 z 50-500
    Predchádzajúci článok
    Riešené úlohy k 9.-10. lekciu C ++
    Všetky články v sekcii
    Základné konštrukcie jazyka C ++
    Preskočiť článok
    (neodporúčame)
    Matematické funkcie v C ++
    Článok pre vás napísal Patrik Valkovič
    Avatar
    Užívateľské hodnotenie:
    Ešte nikto nehodnotil, buď prvý!
    Věnuji se programování v C++ a C#. Kromě toho také programuji v PHP (Nette) a JavaScriptu (NodeJS).
    Aktivity