Lekce 11 - Vícerozměrná pole v jazyce C
V minulé lekci, Podmínky v C podruhé - Ternární výraz a propadávací switch, jsme se věnovali další syntaxi podmínek.
Dosud jsme 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 obsazenostech 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]; int i, j; // Naplnění nulami for (j = 0; j < 5; j++) for (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í
řádku 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 (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ě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:
{C_CONSOLE}
int kinosal[5][5];
int i, j;
// Naplnění nulami
for (j = 0; j < 5; j++)
for (i = 0; i < 5; i++)
kinosal[j][i] = 0;
kinosal[2][2] = 1; // Prostredek
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ý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 obdélníkové. Céčko nám nedovolí staticky vytvořit pole, které by mělo v jednotlivých dimenzích rozdílný počet prvků (anglicky zvané jagged array). 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éčka, 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) struktur typu TELEFON
. Struktury se naučíme
používat ještě na konci tohoto kurzu. Pole si můžete vyzkoušet ještě v
cvičení k této sekci.
V příští lekci, Matematické funkce v jazyce C, se podíváme na matematickou knihovnu
math.h
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 120x (62.37 kB)
Aplikace je včetně zdrojových kódů v jazyce C