NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!
NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.

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.

Ukázka pole - Základní konstrukce jazyka C

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

Použití dvourozměrného pole pro místa v kině - Základní konstrukce jazyka C

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

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

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:

Ilustrace 3D pole - Základní konstrukce jazyka C

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:

Ukázka nezarovnaného pole v jazyce C - Základní konstrukce jazyka C

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

 

Předchozí článek
Podmínky v C podruhé - Ternární výraz a propadávací switch
Všechny články v sekci
Základní konstrukce jazyka C
Přeskočit článek
(nedoporučujeme)
Matematické funkce v jazyce C
Článek pro vás napsal Patrik Valkovič
Avatar
Uživatelské hodnocení:
32 hlasů
Věnuji se programování v C++ a C#. Kromě toho také programuji v PHP (Nette) a JavaScriptu (NodeJS).
Aktivity