Lekce 13 - Vícerozměrná pole v jazyce C++
V předchozím kvízu, Kvíz - Pokročilé podmínky a cykly v C++, jsme si ověřili nabyté zkušenosti z předchozích lekcí.
Dosud jsme v C++ tutoriálech pracovali pouze s jednorozměrnými poli. Jednorozměrné pole si můžeme představit jako řádku přihrádek v paměti počítače.

(Na obrázku je vidět pole osmi čísel)
Ačkoli to není tak časté, v programování se občas setkáváme i s vícerozměrnými poli a to zejména pokud programujeme nějakou simulaci. Například ve hrách může dvourozměrné pole simulovat hrací plochu, v matematice třeba matici.
Dvourozměrné pole
Dvourozměrné pole si můžeme v paměti představit jako tabulku a mohli bychom takto reprezentovat např. rozehranou partii piškvorek. Pokud bychom se chtěli držet reálných aplikací, které budete později v zaměstnání tvořit, můžeme si představit, že do 2D pole budeme ukládat informace o obsazenosti sedadel v kinosálu. Situaci bychom si mohli graficky znázornit např. takto:

(Na obrázku je vidět 2D pole reprezentující obsazenost kinosálu)
Kinosál by byl v praxi samozřejmě větší, ale jako ukázka nám toto
pole postačí. 0
znamená volno, 1
obsazeno. Později
bychom mohli doplnit i 2
- rezervováno a podobně. Pro tyto stavy
by bylo správnější vytvořit nějaké konstanty, ale s tím se setkáme až
později, takže si teď musíme vystačit pouze s čísly.
2D pole deklarujeme v C++ následujícím způsobem:
int kinosal[5][5]; // Naplnění nulami for (int j = 0; j < 5; j++) for (int i = 0; i < 5; i++) kinosal[j][i] = 0;
Nesmíme zapomenout pole vyplnit nulami, protože u C++ nevíme jaké hodnoty mohou být v poli aktuálně uloženy. Také si je potřeba uvědomit (a ideálně i někam do komentáře zapsat) jaké je pořadí souřadnic. V našem případě bude první číslice indexovat sloupec, druhá řádky.
Modifikace
Nyní kinosál naplníme jedničkami tak, jak je vidět na obrázku výše.
Protože budeme jako správní programátoři líní, využijeme k vytvoření
řádků jedniček for
cykly Pro přístup k prvku 2D pole
musíme samozřejmě zadat 2 souřadnice.
kinosal[2][2] = 1; // Prostredek 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ět provedeme pomocí cyklu. Na 2D pole budeme potřebovat cykly 2 (jeden nám proiteruje sloupce a druhý řádky). Cykly zanoříme do sebe tak, aby nám vnější cyklus projížděl řádky a vnitřní sloupce v aktuálním řádku. Po výpisu řádku je nutné odřádkovat. Oba cykly musí mít samozřejmě jinou řídící proměnnou:
{CPP_CONSOLE} int kinosal[5][5]; // Naplnění nulami for (int j = 0; j < 5; j++) for (int i = 0; i < 5; i++) kinosal[j][i] = 0; // Modifikace kinosal[2][2] = 1; // Prostredek 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}
Zkontroluj, zda výstupy programu odpovídají předloze. S jinými texty testy neprojdou.
Výsledek:
Konzolová aplikace
00000
00000
00100
01110
11111
N-rozměrné pole
Někdy může být příhodné vytvořit si pole o ještě více dimenzích. My všichni si jistě dokážeme představit minimálně 3D pole. S příkladem s kinosálem se nabízí případ užití, kdy má budova více pater (nebo obecně více kinosálů). Vizualizace by vypadala asi nějak takto:

3D pole můžeme vytvořit tím samým způsobem, jako 2D pole:
int kinosaly[4][4][3];
Kód výše vytvoří 3D pole jako na obrázku. Přistupovat k němu budeme opět přes indexer (hranaté závorky) jako předtím, jen již musíme zadat 3 souřadnice.
kinosaly[3][2][1] = 1; // Druhý kinosál, třetí řada, čtvrtý sloupec
Zkrácená inicializace
Ještě si ukážeme, že i vícerozměrná pole je možné rovnou inicializovat hodnotami (kód vytvoří rovnou zaplněný kinosál jako 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 tomto zápisu otočené, jelikož definujeme sloupce, které zde zapisujeme jako řádky).
Nezarovnané pole
Dosud jsme mluvili pouze o tzv. pravoúhlých polích. U takového pole víme, že je vždy čtvercové. C++ nám nedovolí staticky vytvořit pole, které by mělo v jednotlivých dimenzích rozdílný počet prvků. Takové pole by vypadalo nějak takto:

Taková pole samozřejmě vytvořit lze, ale musíme si pro každou dimenzi pamatovat počet členů, protože na rozdíl od ostatních jazyků, C++ si velikost pole nepamatuje. Také je třeba využít dynamické alokace paměti, a proto toto téma necháme až na kurz dalších konstrukcí C++, kdy se k němu vrátíme.
Na závěr bych rád dodal, že někteří lidé, kteří neumí správně
používat struktury, využívají 2D polí k ukládání více údajů o
jediné struktuře. Např. budeme chtít uložit výšku, šířku a délku
pěti mobilních telefonů. Ačkoli se vám nyní může zdát, že se jedná o
úlohu na 3D pole, ve skutečnosti se jedná o úlohu na obyčejné 1D pole
(přesněji seznam) objektů nebo struktur typu Telefon
. Struktury
se naučíme používat ještě na konci tohoto kurzu, objekty vás čekají až
dále. Pole si můžete vyzkoušet ještě v cvičení k této sekci.
V příští lekci, Matematické funkce v C++, se podíváme na matematickou knihovnu
cmath
a na celočíselné dělení.
Měl jsi s čímkoli problém? Stáhni si vzorovou aplikaci níže a porovnej ji se svým projektem, chybu tak snadno najdeš.
Stáhnout
Stažením následujícího souboru souhlasíš s licenčními podmínkami
Staženo 84x (11.33 kB)
Aplikace je včetně zdrojových kódů v jazyce C++