Hlavní strana -> Programování v C -> 05. Funkce

05. Funkce

Tentokrát mi to trvalo trochu déle (14 dní) no ale i tak jsem se dostal až k funkcím, které možná mohly být i trošičku dříve. Ale což, jsou tu teď a to je hlavní ne? A aby toho nebylo málo, tak jsem měl ještě chybu v odkaze na poslední díl, takže toho bylo ještě méně z toho mála. Dost řečiček a mrknem na ty funkce. Funkce jsou takovým základním stavebním prvkem v C-čku. Základnější už by mohl být jenom příkaz, ale to asi ne, protože každý příkaz musí být v nějaké funkci (existují výjimky). I ty naše nejjednodušší programy ve kterých byla jenom jedna funkce main (ta musí být všude) měly všechny příkazy uvnitř této funkce. Žádný příkaz není jen tak někde v prostoru. Takové malé výjimky se dočtete dále v tomto díle. Něco k funkcím jsem napsal již v úvodu, ale to zdaleka nebylo všechno.

Funkce mohou vracet hodnoty a jejich typ je určen návratovým typem, který se píše před jméno funkce. Funkce mohou přebírat parametry, které také musí mít přesně daný typ, jinak to nebude fungovat. Seznam parametrů se píše do závorek za jménem funkce. a seznamem parametrů je otevřená složená závorka, příkazy funkce a končí to všechno zase uzavírací složenou závorkou. Ještě před uzavírací závorkou na konci funkce musí být příkaz return a za ním hodnota, která se má funkcí vrátit. Pokud by byla funkce návratový typ void tak za return nemusí být žádná hodnota nebo se return nemusí vyskytovat vůbec. Funkce tedy končí naražením na konečnou složenou závorku nebo na příkaz return.

Nesmím zapomenout ani na prototypy funkcí, které kdysi nebyly zapotřebí, ale dnes se všude běžně píší a překladače je většinou vyžadují. Prototypy jsou užitečné při hledání chyb a překladač pomocí nich dokáže najít a určit chyby spojené s nesprávným voláním funkcí nebo nesprávnou vrácenou hodnotou atd. Proto pokud je po vás překladač nebude vyžadovat, tak na ně nezapomeňte a raději je pište protože zbytečné to určitě není. Prototyp funkce je informace o funkci samotné. No je to složité a raději to napíšu. Prototypy končí středníkem a píšou se na začátek programu před funkci main.

void vystraha(void);
int secti(int a, int b);
void vypis(float x);

Prvni prototyp určuje funkci vystraha(), která nevrací ani nepřebírá žádnou hodnotu. Může obsahovat například nějaké chybové hlášení.

Druhý prototyp definuje funkci secti(), která přebírá dvě celočíselné hodnoty a vrací celočíselnou hodotu. Tuto funkci později použijem.

Třetí funkce s tímto prototypem přebírá jednu hodnotu s pohyblivou řádovou čárkou a nevrací žádnou hodnotu. Může ji třeba vypsat na obrazovku.

Pokud program narazí na funkci, začne pracovat v ní a po skončení se vrátí na původní místo, odkud byla funkce vyvolána.

#include <stdio.h>

/* tady mame prototypy funkci */
void f1(void);
void f2(void);
int secti(int a, int b);
void vypis(float x);

void main(void)
{
    int x,y;
    float f;

    f2();
    scanf("%d%d",&x,&y);
    f = 15.02;
    printf("Soucet zadanych hodnot je %d\n",secti(x,y)); /* pouziti primo v printf */
    vypis(f);
    f1();

}  /* konec main */

void f1(void)
{
    printf("Tady konci program.\n");
}

void f2(void)
{
    printf("Zadejte dve cela cisla.\n");
}

int secti(int a, int b)
{
    return a+b;
}

void vypis(float x)
{
    printf("Hodnota pohyblive carky je %f.\n", x);
}

Nejdříve je volána funkce f2(), ta vybídne k zadání dvou celých čísel. Ta jsou pomocí scanf načtena do proměnných x a y. Potom je f přiřazena hodnota 15.02 vypsáno kolik je součet zadaných hodnot. V printf je místo proměnné nebo hodnoty použito jako argumentu volání funkce secti(). Poté je vyvolána funkce vypis(), ta vypíše 15.02 a po návratu z této funkce nám zbývá v main() už jenom f1() a ta vypíše konec programu. Funkci secti() a vypis() se nemusí dávat jen hodnota v proměnné, ale může to být i číslo nebo výraz. Jazyk C má v tomhle určitě navrch proti ostatním. Volání secti() může vypadat třeba takto:

secti(4, 78);
secti(x, z);
secti(x+5, z*6);

Myslím, že je to jednoduché. Jenom může dělat trochu problémy to, že se neustále hopsá tam a zase zpátky a pokud je program složitý, tak se v něm dá taky lehce ztratit. To je ale maličkost, hlavně když tomu budete rozumět. Funkce také nemusí obsahovat vůbec žádné příkazy, ale v tom případě úplně ztrácí smysl takovou funkci psát, když nic nedělá. Zatím si můžete zkoušet psát vlastní funkce a zkoušet co umí a co neumí. Dejte si pozor na to, aby funkce byla vždy volána s takovým typem dat, jaké má přijímat a aby vracela takové typy, jaké jsou určeny jejím návratovým typem. Takže zatím bye. K.

05. - Rozšíření dílu o funkcích

Zpět

Programování v C | CZ 175/477 | Mapa stránek
Bc. Petr Klimánek, student Ostravské univerzity v Ostravě