5. cvičení
Pole je základní datová struktura sloužící k uložení \(N\) prvků stejného datového typu. Počet prvků \(N\) může být buď konstanta nebo hodnota nějaké proměnné. Deklarace pole se provede podobně jako deklarace proměnné, pouze za název proměnné se do hranatých závorek napíše počet prvků pole:
int pole[7];
Nebo s délkou určenou hodnotou proměnné:
int n = 7;
int pole2[n];
Jednotlivé prvky pole jsou v paměti počítače uloženy těsně za sebou,
takže pro přístup k prvkům pole stačí znát adresu prvního prvku a celkový počet
prvků. Pro přístup k prvkům pole se opět používají hranaté závorky, např.
pole[i]
představuje i
-tý prvek pole. Indexování prvků funguje tak, že od
základní adresy pole se posuneme o daný počet prvků (hodnota zadaná v hranatých
závorkách) doprava – první prvek má tedy index 0 a poslední prvek má index
n - 1
.
Stejně jako v případě normálních proměnných i prvky pole je nejprve potřeba
inicializovat. Např. pro vynulování všech prvků pole délky n
lze použít
cyklus:
for (int i = 0; i < n; i++)
pole[i] = 0;
Podobně lze přečíst hodnoty prvků z terminálu pomocí funkce scanf
:
for (int i = 0; i < n; i++)
scanf("%d", &pole[i]);
Nebo vypsat zadané hodnoty pomocí funkce printf
:
for (int i = 0; i < n; i++)
printf("%d. prvek ma hodnotu %d\n", i, pole[i]);
Probrané příklady
-
Nalezení nejmenší a největší hodnoty.
#include <stdio.h> #include <float.h> float min(int n, float* pole) { // pokud ma pole kladnou delku, muzeme hledat minimum if (n > 0) { // inicializace dosavadniho minima na prvni prvek pole float m = pole[0]; // porovnani s ostatnimi prvky pole for (int i = 1; i < n; i++) { if (pole[i] < m) m = pole[i]; } // vraceni vysledneho minima return m; } else { // minimum prazdneho pole dava nesmyslny vysledek // (nejvetsi mozna hodnota pro typ float) return FLT_MAX; } } float max(int n, float* pole) { // pokud ma pole kladnou delku, muzeme hledat maximum if (n > 0) { // inicializace dosavadniho maxima na prvni prvek pole float m = pole[0]; // porovnani s ostatnimi prvky pole for (int i = 1; i < n; i++) { if (pole[i] > m) m = pole[i]; } // vraceni vysledneho maxima return m; } else { // maximum prazdneho pole dava nesmyslny vysledek // (nejmensi mozna hodnota pro typ float) return -FLT_MAX; } } int main() { printf("Zadej delku pole: "); int n; scanf("%d", &n); printf("Zadej %d cisel:\n", n); float pole[n]; for (int i = 0; i < n; i++) scanf("%f", &pole[i]); // nalezeni nejmensiho a nejvetsiho cisla float nejmensi = min(n, pole); float nejvetsi = max(n, pole); printf("Nejmensi zadane cislo je %g a nejvetsi zadane cislo je %g.\n", nejmensi, nejvetsi); return 0; }
Program obsahuje funkce
max
amin
, které vrací největší a nejmenší prvek daného pole. Návratový typ těchto funkcí je tedy shodný s typem prvků pole (float
). Parametry těchto funkcí jsouint n
(délka pole) afloat* pole
(adresa prvního prvku pole). -
Přeuspořádání prvků v poli v opačném pořadí.
#include <stdio.h> void prerovnat2(int n, const float* pole, float* pole2) { for (int i = 0; i < n; i++) { //pole2[i] = pole[n - 1 - i]; pole2[n - 1 - i] = pole[i]; } } void prerovnat(int n, float* pole) { int i = 0; int j = n - 1; while (i < j) { // prohodim hodnoty v poli float p = pole[i]; pole[i] = pole[j]; pole[j] = p; // aktualizovat indexy i++; j--; } } int main() { printf("Zadej delku pole: "); int n; scanf("%d", &n); printf("Zadej %d cisel:\n", n); float pole[n]; for (int i = 0; i < n; i++) scanf("%f", &pole[i]); printf("Puvodni pole:\n"); for (int i = 0; i < n; i++) { printf("%f ", pole[i]); } printf("\n"); // prerovnani do noveho pole float pole2[n]; prerovnat2(n, pole, pole2); printf("pole2:\n"); for (int i = 0; i < n; i++) { printf("%f ", pole2[i]); } printf("\n"); // prerovnani v puvodnim poli prerovnat(n, pole); printf("pole (po prerovnani):\n"); for (int i = 0; i < n; i++) { printf("%f ", pole[i]); } printf("\n"); return 0; }
Program obsahuje funkci
prerovnat2
, která zkopíruje hodnoty zpole
dopole2
v opačném pořadí, a funkciprerovnat
, která přerovná hodnoty přímo v zadaném poli. -
(pro pokročilé) Seřazení prvků pole od největšího po nejmenší pomocí jednoduchého algoritmu dle vlastní volby.