13. Pole I
  1. Deklarace

  2. typ deklarátor[konstantní_výraz]
    deklaruje pole složené z prvků typu typ. Pole zaujímá spojitou oblast paměti a má přesně takovou velikost, aby obsáhlo všechny své prvky. Výsledkem konstantního výrazu musí být celé kladné číslo (určuje počet prvků pole). Prvky pole mají indexy od 0 do "počet prvků pole - 1".
    Např. můžeme deklarovat pole s prvky typu int, které bude obsahovat pět celočíselných hodnot. Deklarace tohoto pole může vypadat takto:
    int mojePole[5];
    V tomto případě překladač alokuje pole podle následujícího obrázku (každý prvek typu int vyžaduje pro uložení 4 slabiky; celé pole zabírá 20 slabik):
     
    mojePole[0] mojePole[1] mojePole[2] mojePole[3] mojePole[4]
    adresaPočátku adresaPočatku+4 adresaPočátku+8 adresaPočátku+12 adresaPočátku+16

    Nyní, když již máme pole deklarované, můžeme jej zaplnit hodnotami:
    mojePole[0] = -200;
    mojePole[1] = -100;
    mojePole[2] = 0;
    mojePole[3] = 100;
    mojePole[4] = 200;
    Jak vidíme v předchozí ukázce, jednotlivé prvky pole jsou zpřístupňováné operátorem indexace. Můžeme tedy použít i tento příkaz:
    int vysledek = mojePole[3] + mojePole[4];        // výsledek bude 300
    Inicializaci pole lze provádět současně s deklarací. Provedeme to např. příkazem:
    int mojePole[5] = { -200, -100, 0, 100, 200};
    Toto použijeme, pokud známe počet prvků pole. Velikost ale lze také vynechat. Když použijeme příkaz:
    int mojePole[] = { -200, -100, 0, 100, 200};
    pak překladač spočítá uvedené prvky pole a informaci o velikosti si doplní sám.
    Vícerozměrná pole se deklarují jako pole polí, tedy např. dvourozměrné pole s pěti řádky a sedmi sloupci se jménem alfa a typem int deklarujeme takto:
    int alfa[5][7]
    Za jistých podmínek nemusí být uvnitř prvních hranatých závorek žádný výraz. Takovéto pole má potom neurčenou velikost a nazýváme je otevřené. Jeho deklarace je možná tam, kde není potřeba znát velikost pole pro rezervování paměťového prostoru (např. při deklaraci parametru funkce).
    Výraz typu pole je převeden na konstantní ukazatel, který ukazuje na nultý prvek tohoto pole.
    Je zapotřebí dávat pozor, abychom nepřekročili konec pole (jazyk C++ nekontroluje překročení hranic pole). Pokud použijeme následující kód:
    int pole[5];
    pole[5] = 10;
    pak to pravděpodobně způsobí zhroucení našeho programu. Přepíšeme totiž nějakou informaci, která je v paměti uložena za koncem pole.


  3. S používáním polí se seznámíme v následující konzolové aplikaci. Máme vytvořit program, který přečte z klávesnice hodnotu přirozeného čísla N a posloupnost reálných hodnot a1, a2, ..., an a určí, který prvek se nejvíce přibližuje průměrné hodnotě vstupní posloupnosti. Je-li takových prvků více, zajímá nás ten, který má nejnižší index. Bude zřejmě nutné projít celou posloupnost vstupních hodnot dvakrát. Při prvním průchodu budeme prvky sčítat, abychom mohli určit jejich průměrnou hodnotu, ve druhém průchodu hledáme prvek nejbližší zjištěnému průměru. Tento dvojí průchod nelze zajistit přímo při čtení údajů a je tedy třeba údaje uložit do paměti (použijeme k tomu typ pole). Neznáme ale předem požadovaný počet prvků pole, a tak volíme jako horní mez indexu nějakou hodnotu o které budeme předpokládat, že ji při výpočtu nepřekročíme. Hrubý popis řešení má tvar:

  4. čtení a ukládání prvků pole
    sečtení prvků pole a výpočet průměrné hodnoty
    zjištění prvku s minimální odchylkou od průměru
    výpis výsledků
    Výpočet průměrné hodnoty a zjištění prvku s minimální odchylkou budeme provádět pomocí funkcí. Výsledný program má tvar:
    float prumer(int n, float x[]);
    int minodch(int n, float x[], float prum);
    int i, n, im;
    float pole[100], prum;
    int main(int argc, char **argv)
    {
      cout << "Zadej počet prvků pole: ";
      cin >> n;
      cout << "Zadávej jednotlivé prvky pole: ";
      for (i = 0; i < n; i++) cin >> pole[i];
      prum = prumer(n, pole);
      im = minodch(n, pole, prum);
      cout << "Index prvku " << im << " hodnota prvku " << pole[im];
      return 0;
    }
    float prumer(int n, float x[])
    {
      float s = 0;
      int i;
      for (i = 0; i < n; i++) s += x[i];
      return s/n;
    }
    int minodch(int n, float x[], float prum)
    {
      float rozd, min;
      int i, index = 0;
      min = fabs(prum - x[0]);
      for (i = 0; i < n; i++) {
        rozd = fabs(prum - x[i]);
        if (rozd < min) {
          min = rozd;
          index = i;
        }
      }
      return index;
    }
    Pokuste se pochopit, jak uvedená aplikace používá pole. Vyzkoušejte. Funkce fabs počítá absolutní hodnotu z typu float (je v hlavičkovém souboru math.h).
  5. Vytvořte konzolovou aplikaci, která z klávesnice přečte N (kde N<= 100) reálných čísel a uloží je do pole. Z těchto čísel dále určete minimální a maximální hodnotu, jejich součet a průměrnou hodnotu.
  6. Je dána posloupnost N celých čísel z intervalu <1, 5> (např. známek). Vytvořte konzolovou aplikaci zjišťující četnosti výskytu jednotlivých číslic v této posloupnosti. Využijte toho, že hodnoty prvků jsou ze zmíněného intervalu (hodnota čísla může tvořit index v poli četností jednotlivých čísel).
  7. Následující konzolová aplikace počítá na základě počtů jednotlivých druhů mincí a bankovek celkovou částku.

  8. int main(int argc, char **argv)
    {
      int i, p;
      int s = 0, h[15] = {10, 20, 50, 100, 200, 500, 1000, 2000, 5000,
                          10000, 20000, 50000, 100000, 200000, 500000};
      for (i = 0; i < 15; i++) {
        if (h[i] < 100) cout << "Zadej počet " << h[i] << " haléřů: ";
                   else cout << "Zadej počet " << h[i]/100 << " korun: ";
        cin >> p;
        s += (p * h[i]);
      }
      cout << "Celková částka je " << s/100 << " a " << s%100 << " haléřů." << endl;
    }
    V této aplikaci je provedena inicializace prvků pole (červená část programu). Program vyzkoušejte a pokuste se pochopit jak pracuje.
  9. Vytvořte konzolovou aplikaci řešící opačnou úlohu: pro zadanou částku (zadanou v haléřích, dělitelnou 10) sestavte program, který určí její vyjádření s použitím co nejmenšího počtu platidel.

Hlavní pravidla pro pole:


 
13. Pole I