====== Datový typ pole ======
Pole představuje jeden ze strukturovaných datových typů - **ukládá** pod jedním identifikátorem **více hodnot**. Hodnoty jsou v poli uloženy v řadě za sebou a jsou očíslované od 0 pomocí tzv. indexu. Všechny honoty v rámci jednoho pole mají jeden stejný datový typ.
===== Jednorozměrné pole =====
Nejzákladnější verze pole je tzv. jednorozměré pole, které si můžeme představit jako jednořádkovou tabulku v následující ukázce:
+----+----+----+----+----+----+----+
| 13 | 41 | 5 | 17 | 8 | 6 | 14 | Hodnoty v poli
+----+----+----+----+----+----+----+
0 1 2 3 4 5 6 Indexy
==== Deklarace ====
Syntaxe deklarace pole vypadá následovně: ''datovy_typ identifikator[pocet_prvku];'', kde **//pocet_prvku// musí být konstanta** (být znám během překladu). Pole je po deklaraci neinicializované stejně jako v případě proměnných jednoduchých datových typů.
=== Příklad ===
int pole1[3]; // Pole tří celých čísel
double pole2[5]; // Pole pěti čísel s plovoucí čárkou
char pole3[10]; // Pole deseti znaků
==== Inicializace ====
Pole lze v rámci deklarace rovnou inicializovat seznamem hodnot. Pokud je zadáno méně hodnot, než je velikost pole, je zbytek doplněn nulami. Pokud je pole v rámci deklarace inicializováno, nemusí být uveden počet prvků - odvodí se z hodnot.
=== Příklad ===
int pole[4] = {1, 2, 3, 4}; // inicializace pole hodnotami 1, 2, 3, 4.
char pole2[] = {'a', 'b', 'c', 'd', 'e', 'f'}; // inicializace bez uvedení počtu prvků
short pole3[100] = {10, 20, 30}; // Prvni 3 položky maji dané hodnoty, zbytek je doplněn hodnotou 0
==== Práce s jednotlivými prvky pole ====
Pokud chceme z pole získat konkrétní hodnotu, musíme k tomu využít její index ve formátu ''identifikator[index]''. Prvky v poli můžeme číst i přepisovat (pokud není celé pole nastavené pouze pro čtení klíčovým slovem ''const''). **Položky jsou indexované od 0.**
=== Příklad ===
const int POCET = 3;
int arr[POCET] = {1, 2, 3};
arr[0] = 42;
arr[2] = 13;
printf("Prvky pole jsou: %d, %d, %d.\n", arr[0], arr[1], arr[2]);
===== Vícerozměrná pole =====
Pole může mít i více rozměrů jak jeden. V případě dvou rozměrů si lze pole představit jako tabulku s buňkami (řádky, sloupce) u tří rozměrů jako krychli jejíž části se adresují pomocí souřadnic (např. //X//, //Y//, //Z//). Počet rozměrů není striktně omezen a může značně přesahovat naši fantazii.
==== Deklarace ====
Vícerozměrné pole deklarujeme uvedením více hranatých závorek za sebou: ''datovy_typ identifikator[rozmer1][rozmer2][rozmer3]...;'', kde ''rozměr#'' představuje velikost pole v daném rozměru.
=== Příklady deklarací vícerozměrných polí ===
// tabulka obsahující 3 řádky a 5 sloupců
int tabulka[3][5];
// krychle o velikosti 5 obsahující čísla s plovoucí čárkou
cont int velikost = 5;
float krychle[velikost][velikost][velikost]
// pole o 5 rozměrech alokující pro každou sekundu z století jeden bajt s možností adresace na rok:den:hodinu:minutu:sekundu
char stoleti[100][365][24][60][60];
Zkuste spočítat jak by bylo veliké pole ''stoleti'', za předpokladu, že velikost se s každým dalším rozměrem násobí. (počítáme tedy zprava doleva)
==== Incializace ====
Prvky pole můžeme opět v rámci deklarace rovnou inicializovat. Opět pomocí složených závorek, které se ale tentokrát do sebe zanořují podle rozměrů. Je třeba uvažovat nad celou věcí jako nad "polem polí".
=== Příklad dvourozměrného pole ===
Matice identity ([[https://en.wikipedia.org/wiki/Identity_matrix|Identity matrix]]) o velikosti 3 uložená po řádcích.
float identity[3][3] = { {1.0f, 0.0f, 0.0f}, {0.0f, 1.0f, 0.0f}, {0.0f, 0.0f, 1.0f} };
^ ^
| |
První rozměr (řádky) - obsahuje 3 další pole |
Druhý rozměr (3. sloupec) - obsahuje 3 položky typu float
==== Přístup k položkám vícerozměrného pole ====
Pro přístup ke konkrétním položkám opět využíváme indexů zapsaných v hranatých závorkách. Avšak musíme uvést index pro každý rozměr.
=== Příklad přístupu k položkám v rámci výpisu matice ===
const int ROWS = 3;
const int COLS = 3;
float identity[ROWS][COLS] = { {1.0f, 0.0f, 0.0f}, {0.0f, 1.0f, 0.0f}, {0.0f, 0.0f, 1.0f} };
for (int row = 0; row < ROWS; ++row)
{
putchar('(');
for (int col = 0; col < COLS; ++col)
{
printf("%f%s", identity[row][col], col < COLS - 1 ? ", " : "");
}
putchar(')');
putchar('\n');
}