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(), pow(), system() ... Jejich použití není složité. Potřebujeme vědět, součástí které knihovny je daná funkce, jaké má parametry a jakou návratovou hodnotu. Při použití standardní funkce nám pomůže její popis např. v nápovědě (help).
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 vytváříme tak, aby tvořily opravdu samostatný celek kódu, 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).
V programech používáme globální proměnné jedině v případech, kdy jinak nedokážeme dospět k řešení t.j. nepoužíváme je vůbec nebo co nejméně.
Deklarace funkce
Programátor vytváří své vlastní funkce. Funkce jsou "základní stavební kámen" našich programů. 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_navr_hod nazev_funkce (typ parametr1, typ parametr2,...) //hlavička funkce
{
typ vysledek; //deklarace lokálních proměnných
//příkazy
return vysledek; //použijeme pro případ odeslání hodnoty z funkce
}
Část kódu, uzavřená ve složených závorkách, tvoří tělo funkce.
Návratová hodnota
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.
Funkce vrací hodnotu nejčastěji v případech, kdy ve funkci něco vypočítáme, zjistíme nebo změníme a potřebujeme výsledek odeslat z funkce. Jsou ale taky funkce, které žádnou hodnotu nevracejí.
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.
Prametry nám tedy umožní "poslat" do funkce hodnoty.
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), t.j. funkce nám dává hodnotu. Získanou hodnotu je vhodné uložit do 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.
Funkce pro výpočet obvodu a obsahu použijeme v hlavním programu pro dva různé obdélníky.
V kódu je definována ještě funkce pro vypis "čáry". Funkce vypíše určený počet podtržítek (uvedeno jako parametr funkce), 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 a1, a2, b1, b2, O1, O2, S1, S2; //lokalni promenne pro funkci main() printf("Zadejte strany prvniho obdelnika (v cm):\n"); printf("\tstrana a: "); scanf("%f", &a1); printf("\tstrana b: "); scanf("%f", &b1); printf("Zadejte strany druheho obdelnika (v cm):\n"); printf("\tstrana a: "); scanf("%f", &a2); printf("\tstrana b: "); scanf("%f", &b2); cara(50); //volání funkce - čára s 50 podtržítky printf("\nPrvni obdelnik:\n"); O1 = obvod(a1, b1); //volání funkce pro hodnoty a1, b1 printf("\tObvod : %.2f cm\n\n", O1); S1 = obsah(a1, b1); //volání funkce pro hodnoty a1, b1 printf("\tObsah : %.2f cm^2\n", S1); cara(25); //volání funkce - čára s 25 podtržítky printf("\nDruhy obdelnik:\n"); O2 = obvod(a2, b2); //volání funkce pro hodnoty a2, b2 printf("\tObvod : %.2f cm\n\n", O2); S2 = obsah(a2, b2); //volání funkce pro hodnoty a2, b2 printf("\tObsah : %.2f cm^2\n", S2); cara(50); //volání funkce - čára s 50 podtržítky system("pause"); return 0; } //definice funkcí 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 } 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.