Pole
Potřebujeme-li uložit více hodnot stejného charakteru, nemusíme si vytvářet desítky a desítky proměnných. Například potřebujeme-li si uložit známky z předmětu, mohli bychom to udělat následovně:
int pva1, pva2, pva3, pva4, pva5, pva6, pva7, pva8, pva9, pva10;
int mat1, mat2, mat3, mat4, mat5, mat6, mat7, mat8, mat9, mat10;
int cjl1, cjl2, cjl3, cjl4, cjl5, cjl6, cjl7, cjl8, cjl9, cjl10;
int dej1, dej2, dej3, dej4, dej5, dej6, dej7, dej8, dej9, dej10;
int aps1, aps2, aps3, aps4, aps5, aps6, aps7, aps8, aps9, aps10;
Na příkladu výše vidíme, že to není úplně nejlepší přístup a navíc bude-li v některém z předmětů více známek, bude potřeba vytvářet proměnné nové.
Proto v tomto případě přistupujeme k využití tzv. pole (array), které má pouze jeden název, ale může obsahovat více hodnot. Příklad uvedený nahoře bychom tedy řešili následovně:
int pva[10];
int mat[10];
int cjl[10];
int dej[10];
int aps[10];
Působí to čistěji, že?
Abychom mohli pole správně deklarovat, v programovacím jazyce C budeme potřebovat znát jeho velikost, tj. maximální počet hodnot. Ten při deklaraci uvádíme do hranatých závorek (zde tedy říkáme, že pro každý předmět bude maximálně 10 známek).
Do pole pak přistupujeme pomocí tzv. indexu – představme si celou proměnnou jako jednorozměrnou tabulku, kdy při zapisování či čtení konkrétní proměnné je potřeba říct, který sloupec máme na mysli:
| pva | 2 | 3 | 1 | 2 | 1 | 1 | 3 | 2 | 1 | 1 |
| index | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
Zde vidíme, že v poli pva je již uloženo všech 10 známek. Pozor! index začíná od nuly, tj. první známka má index 0, druhá známka má index 1, třetí známka má index 2, atd.
Jednotlivé hodnoty pole pva pak čteme pomocí hranatých závorek, například čtvrtou známku (zde je dvojka) bychom přečetli jako
pva[3]
Přiřazení hodnot do pole můžeme udělat dvěma způsoby, buďto pomocí využití indexů:
int pva[0] = 2;
int pva[1] = 3;
int pva[2] = 1;
int pva[3] = 2;
int pva[4] = 1;
int pva[5] = 1;
int pva[6] = 3;
int pva[7] = 2;
int pva[8] = 1;
int pva[9] = 1;
Nebo již rovnou na začátku:
int pva[] = {2, 3, 1, 2, 1, 1, 3, 2, 1, 1};
Práce s polem
Při práci s polem často využíváme smyčky. Kdybychom smyčku nepoužívali, museli bychom například výpis všech známek z pva realizovat takto:
void main(){
int pva[] = {2, 3, 1, 2, 1, 1, 3, 2, 1, 1};
printf("1. známka z PVA je: %d\n", pva[0]);
printf("2. známka z PVA je: %d\n", pva[1]);
printf("3. známka z PVA je: %d\n", pva[2]);
printf("4. známka z PVA je: %d\n", pva[3]);
printf("5. známka z PVA je: %d\n", pva[4]);
printf("6. známka z PVA je: %d\n", pva[5]);
printf("7. známka z PVA je: %d\n", pva[6]);
printf("8. známka z PVA je: %d\n", pva[7]);
printf("9. známka z PVA je: %d\n", pva[8]);
printf("10. známka z PVA je: %d\n", pva[9]);
}
Pomocí smyčky si situaci značně zjednodušíme – výpis hodnot pole pva může vypadat například takto:

void main(){
int pva[] = {2, 3, 1, 2, 1, 1, 3, 2, 1, 1};
for (int i = 0; i < 10; i++){
printf("%d. známka z PVA je: %d\n", i, pva[i]);
}
}
Generovaný podcast na téma Pole si můžete pustit zde:
Podcast byl generován na základě této stránky a https://www.geeksforgeeks.org/c/c-arrays/
Příklady
Příklady na webu w3resource si můžete zobrazit zde.
Řetězce
Protože v jazyce C se datový typ řetězec nenachází, ve skutečnosti jde o pole znaků (characters array). Deklarujeme tedy následovně:
char retezec[10];
V tomto případě jsme nadeklarovali proměnnou retezec o maximální délce 10 znaků. Deklaraci můžeme (v případě, že víme, co do proměnné chceme na začátku uložit) spojit i s inicializací:
char retezec[] = "Hello world!";
Nyní máme v proměnné retezec také konkrétní hodnotu. V jazyce C však nelze přiřazovat řetězec do řetězce (protože pole jako celek není možné přiřadit do pole jako celku). Následující příkaz tudíž bude vracet chybu:
retezec = "Hello world!";
//error: assignment to expression with array type
Hodnotu do řetězce ale můžeme načíst z klávesnice pomocí funkce scanf():
scanf("%s", retezec);
Všimněte si, že zástupný znak je %s (string, řetězec) a před názvem proměnné retezec zde nezadáváme znak & (ampersand), protože v proměnné retezec je vlastně adresa prvního prvku pole (array) a tudíž správně zapisujeme na adresu.
Řetězec budeme procházet písmeno po písmenu pomocí smyčky. Posledním znakem řetězce je znak ‚\0‘. Takto by vypadalo projití řetězce pomocí smyčky while():
int i = 0;
while (retezec[i] != '\0'){
printf("%d. znak je: %c\n", retezec[i]);
i++;
}
Takto by vypadalo projití řetězce pomocí smyčky for():
for (int i = 0; retezec[i] != '\0'; i++){
printf("%d. znak je: %c\n", retezec[i]);
}
Drill – práce s polem
// Do prvního prvku pole cisla vložte hodnotu 10. // Do pátého prvku pole cisla vložte hodnotu 37. // Vypište první prvek pole cisla. // Vypište poslední prvek pole numbers, které má 10 prvků. // Do proměnné x uložte třetí prvek pole numbers. // Nastavte hodnotu proměnné min na první prvek pole cisla. // Snižte hodnotu čtvrtého prvku pole numbers o 5. // Zdvojnásobte hodnotu druhého prvku pole cisla. // Prohoďte hodnoty prvního a druhého prvku pole nums (pomocí pomocné proměnné temp). // Zvyšte hodnotu proměnné soucet o prvek pole cisla s indexem i. // Do třetího prvku pole cisla vložte součet prvních dvou prvků téhož pole. // Změňte první znak řetězce jmeno na A. // Vypište druhý znak řetězce mesto. // Namísto znaku na pozici i v řetězci firma vložte hvězdičku.
Dril – práce s polem pomocí smyčky
// --- PRÁCE S POLEM CELÝCH ČÍSEL --- // Pro následující úlohy předpokládejte pole: int cisla[10]; // V cyklech používejte řídicí proměnnou i. // Vypište všechny prvky pole cisla. // Do všech prvků pole cisla uložte hodnotu 0. // Do všech prvků pole cisla uložte jejich index. // Do všech prvků pole cisla uložte dvojnásobek jejich indexu. // Zvyšte hodnotu všech prvků pole cisla o 1. // Spočítejte součet všech prvků pole cisla. (Předpokládejte připravenou proměnnou: int soucet = 0;) // Nastavte všechny záporné hodnoty prvků pole cisla na nulu. // Vypište pouze sudé prvky (tj. prvky na sudých indexech 0, 2, 4...) pole cisla. // Vypište pouze sudé hodnoty (nikoliv pouze sudé indexy) pole cisla. // Spočítejte počet kladných prvků pole cisla. (Předpokládejte připravenou proměnnou: int pocet = 0;) // Spočítejte součet všech kladných prvků pole cisla. (Předpokládejte připravenou proměnnou: int soucet = 0;) // Zjistěte, zda-li pole obsahuje prvek s hodnotou 6. Jestli ano, vypište "ANO" – jestli ne, vypište "NE". // (Předpokládejte připravenou proměnnou: int nalez = 0;) // Vypište první prvek, jehož hodnota přesahuje 100. (Nezapomeňte cyklus po nalezení ukončit). // Najděte a vypište prvek pole s nejnižší hodnotou (min). (Předpokládejte: int min = cisla[0];) // Najděte a vypište prvek pole s nejvyšší hodnotou (max). (Předpokládejte: int max = cisla[0];) // --- PRÁCE S ŘETĚZCI --- // Pro následující úlohy předpokládejte řetězec deklarovaný jako pole znaků: char jmeno[16]; // Vypište znaky řetězce tak, aby jednotlivé znaky mezi sebou měly mezeru. (Cyklus končí na '\0') // Vypište pouze liché znaky řetězce (znaky na lichých indexech 1, 3, 5...). // Spočítejte počet hvězdiček v řetězci. (Předpokládejte připravenou proměnnou: int pocet = 0;) // Nastavte každý sudý znak v řetězci (indexy 0, 2, 4...) na hvězdičku. // Vypište z řetězce pouze malá písmena. (Pomocí rozmezí znaků v ASCII tabulce).