12. Funkce II
  1. Pokuste se vytvo°it aplikaci GUI, ve kterΘ do editaΦnφho ovladaΦe budete zadßvat p°irozenΘ Φφslo a po stisku tlaΦφtka bude vypsßna informace, zda zadanΘ Φφslo je nebo nenφ prvoΦφslo.
  2. Nßsledujφcφ konzolovß aplikace obsahuje rekurzivnφ funkci (funkce, kterß je volßna ze sebe sama) provßd∞jφcφ v²poΦet n-tΘ mocniny reßlnΘho Φφsla.

  3. long double mocnina(int exponent, long double zaklad);
    int main(int argc, char **argv)
    {
      int n;
      long double x;
      cout << "Zadej exponent a zßklad mocniny: ";
      cin >> n >> x;
      cout << x << " na " << n << " = " << mocnina(n, x);
      getch();
      return 0;
    }
    long double mocnina(int exponent, long double zaklad)
    {
      return (exponent < 1) ? 1 : zaklad * mocnina(exponent-1, zaklad);
    }
    Vytvo°te program provßd∞jφcφ obdobn∞ v²poΦet faktorißlu. U obou program∙ urΦete jak bude probφhat v²poΦet pomocφ rekurzivnφ funkce.
  4. Vytvo°te konzolovou aplikaci pracujφcφ obdobn∞ jako p°φkaz type operaΦnφho systΘmu DOS. P°i vytvß°enφ programu se m∙╛ete inspirovat vzorov²m p°φkladem k funkci fopen. JmΘno vypisovanΘho souboru zadßvejte jako parametr z p°φkazovΘ °ßdky (pokud je zadßn jin² poΦet parametr∙ ne╛ jeden, vypi╣te signalizaci chyby). UrΦen² soubor otev°ete (funkce fopen) v textovΘm re╛imu, Φtete jej po znacφch (funkcφ fgetc) a╛ do konce souboru (zjistφme jej funkcφ feof) a vypisujte jednotlivΘ znaky na obrazovku (funkcφ putchar nebo datov²m proudem cout). Na zßv∞r je pot°eba soubor uzav°φt funkcφ fclose.
  5. Upravte p°edchozφ program tak, aby p°i del╣φm souboru byl v²pis na obrazovku provßd∞n po Φßstech. Vypi╣te v╛dy n∞kolik °ßdk∙ nap°. 22 a Φekejte na stisk libovolnΘ klßvesy.
  6. Vytvo°te konzolovou aplikaci, kopφrujφcφ obsah jednoho textovΘho souboru do druhΘho. V novΘm souboru vynechte v╣echny znaky mezer. JmΘna obou soubor∙ zadßvejte jako parametry. Na zßv∞r vypi╣te celkov² poΦet p°ekopφrovan²ch znak∙.
  7. Termφn rozsah urΦuje viditelnost prom∞nn²ch v r∙zn²ch Φßstech na╣eho programu. Mnoho prom∞nn²ch mß lokßlnφ rozsah. Tzn. prom∞nnß je viditelnß pouze v bloku k≤du, ve kterΘm je deklarovßna. Podφvejte se na nßsledujφcφ program.

  8. #pragma hdrstop
    #include <iostream.h>
    #include <conio.h>
    //---------------------------------------------------------------------------
    #pragma argsused
    int x = 20;
    void citacCyklu(int);
    int main(int argc, char **argv)
    {
      int x = 40;
      int i = 0;
      cout << "V hlavnφm programu x = " << x << endl;
      bool hotovo = false;
      while (!hotovo) {
        int x;
        cout << "Zadej Φφslo (-1 je konec): ";
        cin >> x;
        if (x != -1) {
          cout << "V cyklu x = " << x << endl;
          citacCyklu(++i);
        }
        else hotovo = true;
      }
      cout << "Globßlnφ x = " << ::x << endl;
      getch();
    }
    void citacCyklu(int x)
    {
      cout << "Cyklus byl proveden " << x << " krßt." << endl;
    }
    Prvnφ v∞cφ, kterΘ si pov╣imneme je to, ╛e prom∞nnß x je zde deklarovßna 4x. Nejprve je deklarovßna p°ed funkcφ main, dßle na zaΦßtku funkce main, na zaΦßtku cyklu while a nakonec jako parametr funkce citacCyklu. Pokud deklarujeme prom∞nnou vφce ne╛ jednou, pak p°ekladaΦ generuje chybu "Multiple declaration for 'x'" (vφcenßsobnß deklarace x). Tento program je ale p°elo╛en bez chyby. Je to tφm, ╛e ka╛dß prom∞nnß je v jinΘm rozsahu.
    Deklarace x uvnit° cyklu while je lokßlnφ v bloku k≤du tohoto cyklu. Neexistuje mimo tento blok. Tato prom∞nnß mß lokßlnφ platnost. Podobn∞ deklarace parametru funkce je lokßlnφ ve funkci citacCyklu a neexistuje mimo tuto funkci. V tomto p°φpad∞ se jednß o Φßst seznamu parametr∙, ale je to takΘ deklarace prom∞nnΘ.
    Dßle se podφvßme na prom∞nnΘ x a i deklarovanΘ na zaΦßtku funkce main. Tyto prom∞nnΘ jsou lokßlnφ v bloku, ve kterΘm jsou deklarovßny. Jin²mi slovy, prom∞nnΘ x a i jsou v rozsahu funkce main a v rozsahu cyklu while. U prom∞nnΘ i je to jasnΘ. Jak je to ale s x? Uvnit° cyklu while jsou dv∞ prom∞nnΘ x a ob∞ jsou v rozsahu. Kterß z nich bude pou╛φvßna? Odpov∞∩ je jasnß. Bude to x deklarovanΘ v cyklu, proto╛e mß nejbezprost°edn∞j╣φ rozsah.
    Nakonec se budeme zab²vat deklaracφ x, kterß je umφst∞na p°ed funkcφ main. Proto╛e je deklarovßna mimo funkci, je to globßlnφ prom∞nnß a mß globßlnφ rozsah. Globßlnφ prom∞nnß x je dostupnß kdekoliv v programu: uvnit° funkce main, uvnit° bloku while i uvnit° funkce citacCyklu.
    Jak je uvedeno v²╣e, lokßlnφ prom∞nnΘ majφ p°ednost p°ed globßlnφmi prom∞nn²mi. Jak ale lze p°istoupit ke globßlnφ prom∞nnΘ uvnit° funkce main? Pou╛ijeme operßtor rozsahu ::. V na╣em programu se vyskytuje °ßdek:
    cout << "Globßlnφ x = " << ::x << endl;
    Operßtor rozsahu :: °φkß p°ekladaΦi: "Pou╛ij globßlnφ prom∞nnou x a ne lokßlnφ prom∞nou x".
    Podφvejte se je╣t∞ na nßsledujφcφ p°φklad:
    for (int i = 0; i < 10; i++) {
      if (pole[i] == 40) break;
    }
    index = i;        // chyba
    Tento k≤d generuje chybu, proto╛e prom∞nnß i je viditelnß pouze v bloku cyklu for. Prom∞nnou i v tomto p°φpad∞ je  nutno deklarovat p°ed cyklem. Nßsledujφcφ °e╣enφ je ji╛ sprßvnΘ:
    int i;
    for (i = 0; i < 10; i++) {
      if (pole[i] == 40) break;
    }
    index = i;
  9. ReßlnΘ aplikace se obvykle sklßdajφ z n∞kolika soubor∙ zdrojovΘho k≤du. Globßlnφ prom∞nnΘ deklarovanΘ v jednom zdrojovΘm souboru jsou globßlnφ v tomto souboru, ale nejsou viditelnΘ z ostatnφch zdrojov²ch soubor∙. Namφsto pojmu globßlnφ prom∞nnß by bylo lΘpe pou╛φvat termφn prom∞nnß s rozsahem souboru. Jsou ale p°φpady, kdy pot°ebujeme n∞kterΘ prom∞nnΘ vid∞t i z ostatnφch zdrojov²ch soubor∙ programu. Vytvo°enφ t∞chto "skuteΦn²ch globßlnφch prom∞nn²ch" je dvoukrokov² proces. Nejprve deklarujeme prom∞nnou v jednom zdrojovΘm souboru jako prom∞nnou s rozsahem souboru. Potom v ostatnφch zdrojov²ch souborech, ve kter²ch budeme pot°ebovat p°istupovat k tΘto prom∞nnΘ, deklarujeme tuto prom∞nnou znova, ale tuto deklaraci musφ p°edchßzet klφΦovΘ slovo extern. Nap°.

  10. extern int x;
    KlφΦovΘ slovo extern °φkß p°ekladaΦi: "Tento zdrojov² soubor bude pou╛φvat prom∞nnou, jejφ╛ deklarace bude nalezena v jinΘm zdrojovΘm souboru". Jak poznßme pozd∞ji (v souvislosti s objektov∞ orientovan²m programovßnφm) je vhodnΘ pou╛φvßnφ globßlnφch prom∞nn²ch omezit na minimum.

Hlavnφ pravidla pro funkce:


 
12. Funkce II