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