Funkce
Každý program v jazyce C se skládá z jedné nebo více funkcí. Spustitelný kód musí obsahovat funkci main(). Provádění programu se řídí posloupností příkazů, zapsaných v hlavní funkci main(). V samotném programu můžeme použít knihovní funkce, které jsou součástí jazyka C nebo taky funkce vlastní. V předchozích kapitolách jsme už použili hodně knihovních funkcí - např. printf(), scanf(), getchar(), sqrt(), strlen(), strcpy() ... Jejich použití není složité. Potřebujeme vědět, součástí které knihovny je daná funkce, jaké má parametry a návratovou hodnotu.
Funkce jsou základním nástrojem pro strukturování programu. Využíváme je, když se nějaká činnost v programu opakuje, když chceme složitý program rozdělit na dílčí úkoly nebo když potřebujeme opakovat nějakou činnost ve více programech. Je to ucelená část programu, která řeší dílčí úkol a je opětovně použitelná přes svůj název. Za názvem každé funkce musíme uvést kulaté závorky.
Funkce se snažíme vytvářet tak, aby tvořily opravdu samostatný celek kódu, pokud možno nezávislý na programu, ve kterém je používáme. Dobře napsané funkce můžeme bez problému použít i v jiných programech. Programátor si často vytváří knihovny vlastních funkcí, o tom se zmíníme až v dalších kapitolách.
Lokální a globální proměnné
V souvislosti s použitím funkcí rozdělujeme proměnné na lokální a globální. Lokální proměnné jsou deklarovány ve funkci a jsou použitelné jenom ve funkci, ve které byly deklarovány.
Globální proměnné jsou deklarovány mimo jakoukoliv funkci a jsou použitelné v celém programu (od místa deklarace do konce programu).
Deklarace funkce (prototyp funkce)
Programátor často vytváří své vlastní funkce. V programu je vhodné uvést deklaraci i definici funkce. Deklarace funkce (prototyp funkce) musí obsahovat název funkce, typ návratové hodnoty a typy parametrů. Je ukončena středníkem a uvádí se před funkcí main(). Můžeme ji zapsat jako hlavičku funkce ukončenou středníkem.
Definice funkce
Definice funkce obsahuje kompletní zápis funkce, t.j. hlavičku i tělo funkce. Uvádí se za funkcí main(). Pro název funkce platí stejná pravidla jako pro název proměnné.
Obecná definice funkce:
typ nazev_fce(typ parametr1, typ parametr2,...) //hlavicka funkce
{
typ prom; //deklarace lokalnich promennych
prikazy
return hodnota; //pouzijeme pro pripad vraceni hodnoty
}
Část kódu, uzavřená ve složených závorkách, tvoří tělo funkce.
Návratová hodnota
Funkce může vrátit hodnotu, jsou ale i funkce, které žádnou hodnotu nevracejí. Typ návratové hodnoty uvádíme před názvem funkce v její deklaraci a definici. Jedná se o datový typ hodnoty, kterou daná funkce vypočítá nebo jiným způsobem určí a vrací potom z funkce pomocí příkazu return.
Příkaz return tedy zabezpečuje "výstup" z funkce, je možné ho v těle funkce uvést i vícekrát (např. pokud jsou za určitých podmínek jiné výsledky). Pokud funkce nemá návratovou hodnotu (např. nic nepočítá, jenom něco vypisuje), uvádíme jako typ návratové hodnoty void.
Parametry funkce
Za názvem funkce uvádíme v kulatých závorkách parametry funkce. Parametry umožňují předávání hodnot mezi funkcí a ostatními částmi programu. Všechny parametry jsou v jazyce C předávány hodnotou. Funkce nemusí mít žádné parametry, potom uvádíme za názvem funkce jen prázdné kulaté závorky. Parametry uvedené v definici funkce nazýváme formální parametry. Parametry uvedené při volání (použití) funkce v programu nazýváme skutečné parametry.
Volání funkce
Použití funkce v programu říkáme volání funkce. Volání funkce může být výrazem (v případě použití návratové hodnoty), získanou hodnotu je vhodné uložit do nějaké proměnné, abychom ji mohli dále v programu využít. Když funkce nevrací hodnotu, je volání funkce příkazem.
Jako příklad použijeme jednoduchou funkci, která vypočítá obvod obdélníka. Parametry funkce určujeme podle toho, jaké hodnoty potřebuje funkce pro svoji činnost. Když počítáme obvod obdélníka, potřebujeme znát velikost jeho stran. Funkce bude mít proto 2 parametry typu float (strana je reálná hodnota). Výsledkem je obvod - tedy taky reálná hodnota.
Podobně definujeme a použijeme i funkci pro výpočet obsahu.
V kódu je definována ještě funkce pro vypis "čáry". Funkce vypíše určený počet podtržítek (parametr funkce) jako čáru, před i za čárou vložíme prázdný řádek. Funkce nemá návratovou hodnotu, bude tedy typu void.
#include <stdio.h> #include <stdlib.h> float obvod(float a, float b); //deklarace funkce obvod float obsah(float a, float b); //deklarace funkce obsah void cara(int pocet); //deklarace funkce cara int main() { float strana1, strana2, O, S; //lokalni promenne pro funkci main() printf("Zadejte strany obdelnika:\n"); printf("\tstrana a: "); scanf("%f", &strana1); printf("\tstrana b: "); scanf("%f", &strana2); cara(25); //volání funkce - čára s 25 podtržítky O = obvod(strana1, strana2); //volání funkce pro hodnoty strana1, strana2 printf("Obvod obdelnika : %.2f\n\n", O); cara(25); S = obsah(strana1, strana2); //volání funkce pro hodnoty strana1, strana2 printf("Obsah obdelnika : %.2f\n\n", S); cara(25); system("pause"); return 0; } //definice funkce float obvod(float a, float b) //hlavicka funkce { float obv; //lokalni promenna pro funkci obvod obv = 2*(a + b); return obv; //funkce vraci hodnotu obv } //definice funkce float obsah(float a, float b) //hlavicka funkce { return (a*b); //funkce vraci hodnotu vyrazu } void cara(int pocet) { int i; //lokalni promenna printf("\n"); for(i = 0; i < pocet; i++) { printf("_"); } printf("\n"); }
Poznámky k provádění programu:
- deklaraci funkce používá kompilátor ke kontrole datových typů parametrů a návratové hodnoty. Kontroluje taky počet parametrů funkce.
- po spuštění programu se postupně vykonávají příkazy z funkce main(). Deklarují se lokální proměnné strana1, strana2, O, S. Program načte z klávesnice reálné hodnoty do proměnných strana1 a strana2.
- následuje volání funkce obvod() se skutečnými parametry strana1 a strana2. Program dosadí hodnoty skutečných parametrů do formálních parametrů a, b v definici funkce, která je umístěná za funkcí main(). Hodnota proměnné strana1 se vloží do parametru a, hodnota proměnné strana2 se vloží do parametru b, ty se potom použijí pro výpočet. Dále se vykonávají příkazy funkce obvod(). Vypočítaná hodnota obv se prostřednictvím příkazu return obv přenese zpět do hlavního programu a přiřadí se proměnné O. Její hodnotu vypíše funkce printf() v main().
- podobně se postupuje při volání funkce obsah(). Hodnota proměnné strana1 se ve funkci dosadí do parametru a, hodnota proměnné strana2 se dosadí do parametru b. Vypočítanou hodnotu vrátíme příkazem return z funkce obsah() zpět do funkce main() a přiřadíme proměnné S.
Volání funkce cara() je příkazem, protože nevrací žádnou hodnotu. Funkce vykoná příkazy, napsané v těle funkce a potom se ukončí. Nic nepočítá, nemusí nic vracet. Funkce má jeden parametr a to počet podtržítek. Zkuste funkci vylepšit přidáním dalšího parametru - tím bude znak, který použijeme pro "vykreslení" čáry (nemusí to být jenom podtržítko).
- při volání funkce si tedy hlavní program "odskočí" do funkce. Po její ukončení se vracíme zpátky do hlavní funkce main() a pokračuje se v provádění příkazů následujících za voláním funkce.