Funkcie alebo "rozdeľuj a panuj".

Programy, ktoré majú robiť niečo čo len trochu komplikovanejšie, majú jednu zákernú vlastnosť -- zvyknú pomerne rýchlo narastať. Nie je vzácnosť, ak má zdrojový kód programu niekoľko megabytov kódu. Skúste si na chvíľu predstaviť, že by bol celý ten program obsiahnutý v jedinej funkcii (konkrétne v main). Bol by to jeden neuveriteľný chaos. Hľadať logickú chybu v takej spúste textu by bola práca pre masového samovraha. Keby sa mala tá istá postupnosť príkazov vykonať na sto rôznych miestach programu, musel by ju programátor napísať stokrát. A vôbec, taký program by bol ako jeden obrovský dinosaurus. Dinosauri majú sklon vymierať a veľké funkcie majú sklon nefungovať. A tak ľudia vymysleli funkcie.

Hlavný dôvod pre použitie funkcií je ono rímske príslovia "divide et impera". Ak si celý problém rozdelím na viacero menších častí, môžem si každú zvlášť naprogramovať a odladiť a v hlavnom programe budem volať už iba funkcie, ktoré som si urobil a o ktorých viem, že fungujú.

Funkcie môžu (a nemusia) mať parametre a môžu (a nemusia) vyrobiť nejaký výsledok. Ich použitie si môžete pozrieť na nasledujúcom príklade:

    #include <stdio.h>
    
    /* Toto je uradnik, ktory rata obsah kruhu */
    float uradnik(float r)
    {
        float s;
        s = 3.1415926 * r * r;
        return( s );
    }
    
    /* Toto je sef. */
    void sef(float p)
    {
        printf("Obsah kruhu s polomerom %f je %f\n",p,uradnik(p));
        printf("Vypocital sef.\n");
    }
    
    /* Toto je hlavna funkcia. */
    int main()
    {
        sef(2.71);
        return(0);
    }

Ako prvá je definovaná funkcia uradnik, ktorá vie vyrátať obsah kruhu s daným polomerom (podľa vzorca $S=\pi r^2$). Nadpis float pred jej menom znamená, že táto funkcia vyrobí nejaký výsledok a že tento výsledok bude typu float. Tesne za menom funkcie musia nasledovať zátvorky. V nich má funkcia uradnik napísané, že vyžaduje jeden vstupný parameter a že tento parameter musí byť typu float. Teda funkcia uradnik sa používa napríklad takto: uradnik(5.5).

Funkcia uradnik má jednu súkromnú premennú (ktorú žiadna iná funkcia nevidí) menom s. Úradník vyráta obsah a hodi ho do s. Príkaz return funkciu ukončí a vráti ako výsledok to, čo je v premennej s.

Druhá funkcia -- sef je typu void. Znamená to, že žiaden výsledok nevracia. (Keby sme ju potrebovali predčasne ukončiť, použili by sme return();) Vstupný parameter je zase typu float. Šéf pre zadaný vstup zavolá služby úradníka, vypíše výsledok a pochváli sa, že to on je ten múdry.

Funkcia main nemá žiaden vstup. Prekvapivo je však deklarovaná ako funkcia typu int. Doteraz sme do programov nepísali, akého je typu. Ak sa ale tento údaj vynechá, kompilátor automaticky predpokladá, že funkcia bude typu int. Podľa návratovej hodnoty funkcie main sa zvykne rozoznávať, či program dobehol v poriadku alebo s chybou. Nula znamená, že je všetko O.K. Nenulové hodnoty znamenajú chyby.

Ak chcete použiť nejakú funkciu, máte dve možnosti. Buďto ju zadefinujete pred miestom použitia, alebo až potom. V druhom prípade ale musíte povedať dopredu, ako tá funkcia vyzerá -- musíte ju deklarovať aby kompilátor pri použití vedel, že je tá funkcia v poriadku. To znamená, že napíšete typ, meno a formát vstupných parametrov a za to všetko dáte bodkočiarku. V praxi to vyzerá napríklad takto (nezabudnite pridať include):

    void strasidlo(int i);  /* tu je deklaracia */
    
    main()
    {
        strasidlo(5);
    }
    
    void strasidlo(int i)   /* tu je definicia */
    {
        int j;
        for(j = 0; j < i; j++)
            printf("Bubu.\n");
    }

Úloha č.1 Pochopte, napíšte a odlaďte obidva uvedené príklady

Úloha č.2 Napíšte funkciu, ktorá vyráta druhú mocninu daného čísla. (Druhá mocnina čísla 5 je 5 x 5 = 25.) S pomocou tejto funkcie vypíšte druhé mocniny čísel od 1 do 20.

Úloha č.3 Napíšte funkciu s jedným vstupným parametrom typu int, ktorá vypíše do riadku patričný počet hviezdičiek a prejde na nový riadok. S pomocou tejto funkcie potom nakreslite hviezdičkový trojuholník so stranou 5.

Úloha č.4 Napíšte funkciu existuje() typu int, ktorá vráti hodnotu 1, ak existuje súbor POKUS.TXT a inak vráti 0. (Pokúste sa otvoriť súbor na čítanie. Ak funkcia fopen vráti hodnotu NULL, tak súbor neexistuje, inak existuje. Ak súbor úspešne otvorite, nezabudnite ho vo funkcii potom aj zavrieť.)

Anino Belan 2003-10-26