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

  1. 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 a min, 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í jsou int n (délka pole) a float* pole (adresa prvního prvku pole).

  2. 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 z pole do pole2 v opačném pořadí, a funkci prerovnat, která přerovná hodnoty přímo v zadaném poli.

  3. (pro pokročilé) Seřazení prvků pole od největšího po nejmenší pomocí jednoduchého algoritmu dle vlastní volby.