Sú situácie, kde si jednoducho neporadíme s obmedzeným množstvom premenných. (Vedeli by ste načítať $n$ čísel zo vstupu a následne ich vypísať v opačnom poradí?) To sa s obmedzeným množstvom číselných premenných nedá, pretože ak je na vstupe viac čísel ako máme premenných, tak si ich nedokážeme zapamätať na neskorší výpis.
Aj keby sme mali napríklad na vstupe $20$ čísel, tak je veľmi nepraktické vyrobiť
si premenné a0 až a19, do ktorých si vstup načítame.
Preto existujú polia. Pole je ako keby skupina premenných rovnakého typu
naukladaných za sebou. V súvislosti s nimi používame hranaté zátvorky
[]. Pole intov dĺžky $20$ vyrobíme napríklad takto int pole[20];
Tento príkaz nám vyrobí $20$ intových premenných, ku ktorým vieme pristupovať
pole[0], pole[1], pole[2], ..., pole[19].
Pozrite si príklad použitia v nasledovnom programe:
#include <cstdio>
int main() {
int a[47];
a[0] = 0;
a[1] = 1;
for (int i = 2; i < 30; ++i){
a[i] = a[i - 1] + a[i - 2];
}
for (int i = 0; i < 30; ++i)
printf("%d ", a[i]);
printf("\n");
}
Na čo si treba dávať pozor?
Keď pristupujeme mimo poľa, napríklad int b[40]; b[53] = 7;
b[-1] = 3; int a = b[40]; ... dejú sa zlé veci. Niekedy program
hneď spadne a vyhlási chybu, inokedy pokračuje ďalej a robí čudné veci,
premenným sa záhadne zmení hodnota vykonávajú sa ify, ktoré by nemali
atď. Preto si vždy dávajte veľký pozor, keď používate polia, aby ste
nepristupovali mimo nich. Pozor treba dávať aj na to, že int b[40];
tvoria premenné b[0] až b[39] (teda ich je 40, ale premenná
b[40] tam nie je).
Pri deklarácii poľa musí byť v [] konštanta. Nesmiete spraviť
int a = 7; int b[a]; hoci vám to kompilátor pravdepodobne dovolí, môžu
sa diať zlé a nepredvídateľné veci. Pokiaľ chcete pole so závislou veľkosťou,
použite int *b = new b[a]; ale reálne toto nebudete potrebovať. V
drvivej väčšine úloh máte zadané obmedzenia, napríklad "na vstupe je číslo $n$,
$1\leq n\leq 1000$". Vtedy, keď budete potrebovať pole veľkosti $n$, tak si
môžete natvrdo vyrobiť pole veľkosti 1000 a netrápiť sa.
Odporúčame však vyrábať troška väčšie polia, napríklad keď $n<10000$ tak pole by mohlo mať veľkosť 10047. Menej ako 1% nárast nič nepokazí, a trocha pomôže, ak náhodou siahame o pár políčok ďalej, ako by sme čakali.
Pamäť počítača má prekvapivo obmedzenú veľkosť. Jeden int zaberá 4 bajty, takže
pole int velkepole[1000000]; zaberá približne 1MB. Bežne na sútažiach
máte pamäťový limit obmedzený na 64 MB, 256 MB, alebo 1024MB, tak na to treba
myslieť.
Navyše na bežných počítačoch je limitovaná veľkosť lokálnych premenných (tie sú
vo vnútri main() alebo iných funkcií) na 8MB, takže to tiež môže robiť
problémy, keď si doma budete spúšťať programy s veľkými pamäťovými nárokmi (na
našom testovači by tento limit nemal byť).
Pole je v podstate zase len premenná a z premenných vieme robiť polia, takže aj
z polí vieme robiť polia. Pole polí (dvojrozmerné pole) vieme vyrobiť napríklad
takto int A[1000][1000]; Takto vieme ísť aj ďalej, len treba zasa dávať
pozor na pamäť int A[100][100][100][10][10]; zaberá cca 400MB.
Ak chceme, tak môžeme polia vyplniť už pri deklarácii, napríklad
int a[5] = {1, 2, 3, 4, 5}; Dokonca vtedy si kompilátor dokáže sám
pozrieť počet prvkov, takže stačí napísať. int a[] = {1, 2, 3, 4, 5};
Pri viacrozmerných poliach môžeme nenapísať len prvé číslo, napr.
int a[][2][1] = {{{1}, {2}}, {{3}, {4}}, {{5}, {6}}};
Toto vieme robiť len pri deklarácii, takže int a[2]; a = {1, 2};
nefunguje.