8. P°φkazy °φdφcφ b∞h programu III
  1. Vytvo°te konzolovou aplikaci, kterß zjistφ, zda zadanΘ p°irozenΘ Φφslo je prvoΦφslo.
  2. Vytvo°te konzolovou aplikaci, kterß Φte z klßvesnice v∞tu ukonΦenou teΦkou a kterß spoΦφtß poΦet znak∙ pφsmen (anglickΘ abecedy), poΦet znak∙ Φφslic a celkov² poΦet znak∙.
  3. Mimo ji╛ popsanΘho p°φkazu cyklu while m∙╛eme pou╛φvat dal╣φ dva p°φkazy cykl∙. Jednß se o cykly for a do-while. Cyklus for pou╛φvßme, kdy╛ znßme omezenφ cyklu (jeho inicializaΦnφ instrukci, ukonΦujφcφ kritΘrium a inkrementaΦnφ instrukci). Nap°. cyklus for je Φasto pou╛φvßn k prochßzenφ prvky pole nebo znaky °et∞zce.

  4. for (i = 0; i < delka; i++) {
        // n∞jakß Φinnost s i-t²m prvkem
    }
    Kdy╛ zapisujeme program, vφme ╛e nap°. chceme zaΦφt od zaΦßtku pole, skonΦit na konci pole a pou╛φt ka╛d² prvek pole. V tomto p°φpad∞ je vhodn² p°φkaz for. Obecn² popis p°φkazu for je tento:
    for (inicializace; ukonΦenφ; inkrementace)
      p°φkaz
    Inicializace je p°φkaz, kter² inicializuje cyklus; je proveden pouze jednou a to na zaΦßtku cyklu. UkonΦenφ je v²raz, kter² urΦuje kdy bude cyklus ukonΦen. Kdy╛ je v²raz pravdiv², cyklus pokraΦuje, nenφ-li pravdiv², cyklus skonΦφ. Inkrementace je v²raz, kter² je vyvolßn po ka╛dΘm pr∙chodu cyklem. Ka╛dß z t∞chto Φßstφ m∙╛e b²t prßzdn²m p°φkazem (samotn² st°ednφk). Inicializace a inkrementace m∙╛e b²t tvo°ena i vφce p°φkazy (odd∞lujeme je Φßrkou).
  5. Pou╛itφ p°φkazu for si ukß╛eme v nßsledujφcφ konzolovΘ aplikaci. V tΘto aplikaci jsou pou╛ity dva p°φkazy cykl∙, jeden probφhß vzestupn∞ a druh² sestupn∞.

  6. cout << endl << "ZaΦßtek programu ... " << endl << endl;
    int i;
    for (i = 0; i < 10; i++) {
      cout << "Iterace Φφslo " << i << endl;
    }
    cout << endl;
    for (i = 10; i > 0; i--) {
      cout << "Iterace Φφslo " << i << endl;
    }
    Podmφnka ukonΦenφ m∙╛e b²t libovoln² v²raz C++. Hodnota v testovacφm v²razu m∙╛e b²t Φφselnß konstanta (jak je pou╛ito v p°edchozφm p°φklad∞), prom∞nnß nebo hodnota vrßcenß volßnφm funkce. Nßsledujφ p°φklady p°φpustn²ch cykl∙:
    for (int i = 0; i < 100; i++) {...}
    for (int i = 0; i < pocetPrvku; i++) {...}
    for (int i = 0; i < ZiskejPocetPrvku(); i+=2) {...}
    V poslednφm p°φklad∞ je °φdφcφ prom∞nnß cyklu zv∞t╣ovßna po 2. Inkremntace m∙╛e b²t o libovolnou hodnotu. Nap°. o 10:
    for (int i = 0; i < 100; i+=10) {...}
  7. Poslednφm p°φkazem cyklu je cyklus do-while, kter² se podobß cyklu while, s tφm rozdφlem, ╛e podmφnka opakovßnφ cyklu je uvedena na konci cyklu.

  8. do {
      p°φkazy
    } while (v²raz)
    Tento p°φkaz je mßlo pou╛φvan²m p°φkazem, ale mß svΘ opodstatn∞nφ. P°φkaz je u╛iteΦn² v p°φpadech, kdy cyklus musφ prob∞hnout alespo≥ jednou (kdy╛ nap°. Φteme informace ze souboru a vφme, ╛e musφme p°eΦφst alespo≥ jeden znak).
  9. V p°φkazu cyklu je mo╛nΘ takΘ pou╛φvat p°φkaz break a to ve stejnΘm v²znamu jako v p°φkazu switch. Pou╛itφ p°φkazu break zp∙sobφ p°echod na p°φkaz, kter² je uveden bezprost°edn∞ za cyklem. V cyklu lze pou╛φt takΘ p°φkaz continue. Pou╛itφ tohoto p°φkazu zp∙sobφ p°echod na podmφnku ukonΦujφcφ cyklus a tato podmφnka rozhodne, zda cyklus bude je╣t∞ pokraΦovat. Je to vlastn∞ p°echod na nov² pr∙chod cyklu bez dokonΦenφ p°edchozφho pr∙chodu.

  10. Nap°. m∙╛eme mφt jistou Φßst cyklu, kterou chceme provΘst pouze v p°φpad∞ spln∞nφ jistΘ podmφnky.
    bool done = false;
    while (!done) {
      bool chyba = NejakaFunkce();
      if (chyba) continue;            // skok na konec cyklu
      // dal╣φ p°φkazy, kterΘ se majφ provΘst pouze kdy╛ chyba nevznikne
    }
    P°φkaz break lze nap°. pou╛φt p°i hledßnφ n∞jakΘ hodnoty v poli hodnot (pot°ebujeme zjistit index hledanΘho prvku).
    int index = -1;
    int hledanaHodnota = 50;
    for (int i = 0; i < pocetPrvku; i++) {
      if (mojePole[i] == hledanaHodnota) {
        index = i;
        break;
      }
    }
    if (index != -1) cout << "╚φslo nalezeno na indexu " << index << endl;
    else cout << "╚φslo se v poli nevyskytuje." << endl;
    S poli hodnot se podrobn∞ji seznßmφme pozd∞ji.
  11. Poslednφm ukonΦujφcφm p°φkazem je p°φkaz return. Tento p°φkaz je mo╛no pou╛φt k ukonΦenφ funkce a k p°echodu na nßsledujφcφ p°φkaz za volßnφm funkce. Tento p°φkaz mß dva tvary: s hodnotou a bez nφ. Tvar s hodnotou pou╛φvßme k nßvratu hodnoty funkce. V tomto p°φpad∞ za return zapφ╣eme v²raz urΦujφcφ vrßcenou hodnotu. Nap°.

  12. return ++pocet;
    Tato vrßcenß hodnota musφ b²t stejnΘho typu jako je typ opou╣t∞nΘ funkce. Jestli╛e funkci deklarujeme jako funkci typu void, pak pou╛φvßme druh² tvar p°φkazu return, kter² neobsahuje v²raz s vracenou hodnotou:
    return;
  13. Nßsledujφcφ konzolovß aplikace vypisuje hodnoty funkcφ sinus a kosinus pro ·hly 0 a╛ 90 stup≥∙ s krokem 10 stup≥∙:

  14. cout << "┌hel     Sinus        Cosinus" << endl;
    cout << "-----------------------------" << endl;
    char pom[50];
    for (int i = 0; i <= 90; i += 10) {
      sprintf(pom, "%3d   %10.6f   %10.6f",
              i, sin(i*3.14159/180), cos(i*3.14159/180));
      cout << pom << endl;
    }
    Pov╣imn∞te si, ╛e deklarace prom∞nnΘ i je uvedena v p°φkazu for (toto je mo╛nΘ v C++, ale nelze to pou╛φt v C). MatematickΘ funkce (sinus, kosinus, atd.) jsou deklarovßny v hlaviΦkovΘm souboru math.h (musφme jej vlo╛it direktivou include na zaΦßtku zdrojovΘho textu programu). P°i pou╛itφ funkcφ sinus a kosinus je nutno ·hel zadßvat v radißnech.
    Funkce sprintf vytvß°φ ve svΘm prvnφm parametru °et∞zec podle formßtovacφho °et∞zce urΦenΘho druh²m parametrem. Na mφsta oznaΦenß %d a %f ve formßtovacφm °et∞zci jsou ulo╛eny hodnoty dal╣φch parametr∙. ╚φsla v %d a %f urΦujφ poΦet znak∙ pou╛it²ch pro v²stup. %nd slou╛φ k v²stupu celoΦφselnΘ hodnoty na n mφst a %n.mf slou╛φ k v²stupu reßlnΘ hodnoty pomocφ n znak∙ s m mφsty za desetinnou teΦkou. Vytvo°en² v²stupnφ °et∞zec znak∙ je v na╣em p°φkladu vlo╛en do prom∞nnΘ pom (musφ umo╛≥ovat vlo╛enφ pot°ebnΘho poΦtu znak∙).
    Vyzkou╣ejte tuto aplikaci.
  15. Napi╣te konzolovou aplikaci, kterß vypφ╣e tabulku funkΦnφch hodnot funkce f(x) = 3x2 + 7x v intervalu <1,10> s krokem 2. Vypisujte x a f(x). Tabulku opat°ete hlaviΦkou.
  16. Vrßtφme se op∞t k aplikacφm GUI. Vytvo°φme nov² prßzdn² projekt a umφstφme na formulß° seznam °et∞zc∙ (ListBox zv∞t╣φme jeho velikost a zm∞nφme v n∞m typ pφ zv∞t╣φ ? Courier New) a dv∞ tlaΦφtka (s texty For a While). Obsluha stisku prvnφho tlaΦφtka bude tvo°ena p°φkazy:

  17. char pom[30];
    ListBox1->Items->Clear();
    for (int i = 1; i <= 20; i++){
      sprintf(pom, "╪et∞zec %3d", i);
      ListBox1->Items->Add(pom);
    }
    Pro druhΘ tlaΦφtko vytvo°φme tuto obsluhu:
    char pom[30];
    ListBox1->Items->Clear();
    randomize();
    int i = 0;
    while (i < 1000) {
      i = i + random(100);
      sprintf(pom, "NßhodnΘ Φφslo:%5d", i);
      ListBox1->Items->Add(pom);
    }
    Tato aplikace ukazuje pou╛itφ cykl∙ a generovßnφ nßhodn²ch Φφsel. V na╣em programu funkce sprintf uklßdß vytvo°en² v²stup do prom∞nnΘ pom. Prom∞nnß pom je deklarovßna jako pole o 30 prvcφch typu char (do tΘto prom∞nnΘ m∙╛eme ulo╛it °etezec o dΘlce a╛ 29 znak∙). Funkce randomize inicializuje generßtor nßhodn²ch Φφsel. Funkci random potom m∙╛eme pou╛φt pro generovßnφ nßhodn²ch Φφsel z intervalu <0, n), kde n je parametr funkce. Aplikaci vyzkou╣ejte.
  18. Vytvo°te aplikaci, ve kterΘ budete zobrazovat tabulku funkΦnφch hodnot funkcφ sinus a cosinus od 0 do 90 stup≥∙ s krokem 10. Na formulß° umφst∞te komponentu ListBox a zv∞t╣φme ji. Tabulku vypisujte ve dvou sloupcφch; prvnφ sloupec nadepi╣te ?┌hel a druh² ?Sinus, resp. ?Cosinus. Na formulß° je╣t∞ vlo╛φme tlaΦφtka ?Sinus a ?Cosinus. Vytvo°te obsluhy stisku tlaΦφtek tak, aby v╛dy p°i stisknutφ jednoho z tlaΦφtek byly zobrazeny funkΦnφ hodnoty p°φslu╣nΘ hel?

Kontrolnφ otßzky:

  1. Kolik ·rovnφ vno°enφ m∙╛e b²t u p°φkazu if?
  2. Bude cyklus automaticky ukonΦen v p°φpad∞ nekoneΦnΘho cyklu?
  3. Musφ p°φkaz switch obsahovat Φßst default?
  4. KterΘ p°φkazy jsou provedeny, kdy╛ podmφnka p°φkazu if je pravdivß?
  5. Co reprezentujφ t°i parametry p°φkazu for?
  6. ╚φm se li╣φ cykly while a do-while?
  7. Co d∞lajφ p°φkazy break a continue?
╪e╣enφ


8. P°φkazy °φdφcφ b∞h programu III