5. seminář - Pole

TEACHINGZPC1

Pole

Pole se řadí mezi kolekce, které sdružují více hodnot stejného typu. Hodnoty v poli jsou v paměti řazeny za sebou. V tuto chvíli budeme vnímat pole jako hodnotu. Podrobnosti se dozvíte v dalším semestru.

Nebudeme pracovat s celým polem ale jen s jednotlivými prvky. K jednotlivým prvkům pole budem přistupovat pomocí indexů. Prvku jsou indexovány (očíslovány) od 0.

Pole numbers délky n

Array Scheme

Deklarace pole

Pole budeme deklarovat podobně jako proměnnou s tím že kromě datového typu musíme definovat i velikost pole. Tedy počet prvků ketré může pole obsahovat. Velikost pole může být jen číslo. Nelze tedy definovat pole o velikosti která je uložená v proměnné nebo výsledkem aritmetického výrazu.


    typ jmeno[velikost]

Pole můžeme deklarovat i s konkrétními hodnotami. Pokud chceme aby velikost pole byla rovna počtu prvků ve výčtu, tak můžeme hodnotu velikost vynechat.


    typ jmeno[velikost] = {p1, p2, p3, ..., pn}

Příklady


    // Neinicializované pole o velikosti 10
    int numbers[10];

    // Pole o velikosti 10 se 3 inicializovanými prvky
    double double_numbers[10] = {1.0, 1.3, 1.4};

    // Pole o velikosti odpovídající
    int salaries[] = {12000, 30000, 155000};

Přístup k prvkům pole

K prvkům pole přistupujeme přes název proměnné a index prvku v hranatých závorkách.


    pole[index]

Hodnota index musí být větší nebo rovna 0 a menší než je délka pole.

Naplnění a výpis hodnot pole


    /* program vytvori pole nasobku cisla 3 a pote vypise jeho obsah*/
    int i;
    int array[20];

    /* prvek pole[i] bude roven 3*i */
    for(i = 0; i < 20; i += 1) {
        array[i] = 3 * i;
    }

    /* vypisu prvky pole*/
    for(i = 0; i < 20; i += 1) {
        printf("%i ", array[i]);
    }

Ve výše uvedém příkladu je patrné, že index nepřekročí hodnotu 19, což by vedlo k chybě v programu která se ale neprojeví při kompilaci, ale až pri běhu programu. Program se může zhroutit a nebo se chovat neočekávaně. Cyklus for je pro procházení pole výhodný, jednak víme kolik prvků pole obsahuje a za druhé podmínkou zajistíme, že proměnná i nepřekročí požadovanou hodnotu.

Hledání prvku v poli


    int array[10];
    int wanted;
    int index;
    int i;

    /* tady pole naplnime cisly a priradime hodnotu promenne wanted */

    /* v následucím kódu do promenne index vlozime index, na kterem se nachazi
       hledany, pripadne tam vlozime -1, pokud se prvek nenajde */

    index = -1;

    for(i = 0; i < 10; i += 1) {
        if(array[i] == wanted) {
            index = i;
            break;
        }
    }

Úkoly

Napište program, který vypočte průměr pole desetinných čísel.

Upravte program pro nalezení prvku v poli (řešený příklad nahoře), pokud můžeme předpokládat, že prvky jsou v poli setřízeny od nejmenšího.

Napište program, který rozhodne,jestli jsou dvě pole stejná (tj.mají na všech indexech stejné prvky). Můžete předpokládat, že pole mají stejný počet prvků.

Napište program, který otočí pořadí prvků v poli. Tj. po provedení programu bude původně první prvek poslední, puvodně druhý prvek předposlední atd.

Napište program, který sečte všechna lichá čísla z pole.

V jazyku C vytvořte program, který pomocí algoritmu Eratosthenova síta určí a vypíše všechna prvočísla menší než číslo 100.

Algoritmus

  1. Vytvoříme pole všech čísel od 2 do požadovaného maximálního zkoumaného čísla.
  2. Procházíme pole od začátku, dokud nenajdeme nevyškrtnuté číslo. Toto číslo je prvočíslem, můžeme jej proto vypsat na obrazovku.
  3. Vyškrtáme z pole všechny násobky právě nalezeného prvočísla (např. změnou hodnoty na 0).
  4. Pokračujeme krokem 2, dokud zbývají nějaká nevyškrtnutá čísla.