Obsah lekce:
V předchozí lekci jsme si vysvětlili, co jsou to procedury a k čemu je lze použít, u funkcí platí víceméně to samé s pár změnami, které si v této lekci ukážeme.
Funkce je samostatná část programu řešící určitý úkol. Funkce se používají zejména v těchto případech:
Bez funkcí se rozhodně neobejdeme, pokud budeme tvořit složitější projekty, protože není rozumné a mnohdy ani možné napsat všechen zdrojový kód do bloku begin..end v hlavním programu.
Syntaxe každé funkce musí vypadat následovně:
návratová hodnota název (parametry funkce) //parametry jsou volitelné { proměnné //volitelná deklarace proměnných pro funkci programový kód funkce return návratová hodnota }
Každá funkce musí začínat datovým typem návratové hodnoty (např. int nebo float), za kterým následuje její název, případně lze uvést parametry do závorky za funkcí. Návratová hodnota musí být na konci funkce vrácena příkazem return zpět tak, aby mohla být použita nadřazenou částí programu, která tuto funkci zavolala.
Následuje programová část funkce, která je umístěna do složených závorek. Tato část obsahuje všechny příkazy a výpočty.
Další novinkou je předposlední řádek, kdy určujeme, jaká hodnota má být vrácena. Zde přiřadíme funkci její
návratovou hodnotu (použijeme příkaz return). Návratová hodnota může být přiřazena přímo například číslem nebo textem, nebo ji lze přiřadit z proměnné. Ovšem je nutné dodržet typ, který jsme zvolili v prvním řádku, jinak dojde k chybě.
Pozn: přiřazení návratové hodnoty funkci nemusí být poslední provedený příkaz, lze přidat příkazy i za tento řádek.
Ukažme si tedy na úvod nějakou hodně jednoduchou funkci pro pochopení principu návratové hodnoty.
#include "stdafx.h" float vratPI() { float pi; pi = 3.14; return pi; } int _tmain(int argc, _TCHAR* argv[]) { printf("%f",vratPI()); fflush(stdin); getchar(); return 0; }
Vidíme, že byla definována funkce s názvem vratPI, která nedělá nic kromě toho, že vrátí hodnotu 3.14 (tedy konstantu PI). Následně tuto funkci použijeme v hlavní části programu a necháme vrácenou hodnotu přímo vypsat do konzole. Příkaz printf("%f",vratPI()); tedy udělá to samé jako bychom napsali printf("3.14");. Celý program do konzole vypíše hodnotu a poté počká na stisknutí libovolné klávesy, aby se ukončil (pokud bychom nepřidali řádek getchar();, tak bychom si pozdrav ani nepřečetli, protože by se program ihned po jeho vypsání ukončil).
Nyní si můžeme ukázat rozšířený příklad, kde použijeme lokální proměnnou například pro uchování výsledku nějakého výpočtu a tuto proměnnou vrátíme.
#include "stdafx.h" int spocitej() { int soucet; soucet=45+54*2; return soucet; } int _tmain(int argc, _TCHAR* argv[]) { printf("%d",soucet()); fflush(stdin); getchar(); return 0; }
V tomo příkladu jsme vytvořili funkci spocitej, která uloží výsledek fiktivního výpočtu do proměnné soucet a ta je poté vrácena. V hlavní části programu je výsledek funkce vypsán do konzole.
Příklad můžeme dále vylepšit přidáním parametrů pro funkci.
#include "stdafx.h" int spocitej(int a, int b); { int soucet; soucet=a+b; return soucet; } int _tmain(int argc, _TCHAR* argv[]) { int a, b; a=40; b=50; printf("%d",spocitej(a,b)); fflush(stdin); getchar(); return 0; }
Nyní vidíme, že funkce spocitej vyžaduje dva parametry – celá čísla, která sečte a vrátí výsledek. Byly vytvořeny dvě globální proměnné a a b, které jsou předávány jako parametry.
Tyto příklady byly pouze ilustrační, neřešily žádný konkrétní úkol. V další části lekce se podíváme na příklady, které již lze použít v reálných programech.
Návratová hodnota je velikou výhodou hlavně v okamžiku, kdy potřebujeme ověřit jistou podmínku výsledku, ale zároveň potřebujeme teprve tento výsledek spočítat. Díky funkcím pro tento účel nepotřebujeme žádné další proměnné, protože lze funkci přímo vložit do podmínky, pokud vrací odpovídající hodnoty int.
Nyní se podíváme na příklad, který sečte a vynásobí dvě čísla a pokud budou oba výsledky menší než 100, tak vypíše určitou hlášku.
#include "stdafx.h" int vynasob(int x, int y); { int v; if (x*y<100) v:=1 else v:=0; return v; } function Secti(var x,y:integer):boolean; { int s; if (x+y<100) s:=1 else s:=0; return s; } int _tmain(int argc, _TCHAR* argv[]) { int a, b; a=8; b=11; if (secti(a,b) AND vynasob(a,b)) printf"Soucet i soucin jsou mensi nez 100."); fflush(stdin); getchar(); return 0; }
V tomto příkladu byly definovány dvě funkce vynasob a secti, které vrací hodnoty typu int. Funkce vrátí hodnotu 1 v případě, že součin a součet zadaných parametrů jsou menší než 100. V hlavní části programu nejprve inicializujeme proměnné a poté použijeme podmínku na ověření, zdali jsou součet i součin menší než 100. V případě, že jsou, je vypsána hláška – pokud použijeme hodnoty 8 a 11, hláška bude vypsána.
Vidíme tedy, že funkce lze libovolně používat místo boolean proměnných a spojovat je logickými spojkami. Toto je jejich hlavní rozdíl oproti procedurám a také jejich největší výhoda.
V tomto textu využíváme předávání parametru hodnotou. Druhou možností je předání parametru ukazatelem, kdy přistupujeme ke konkrétní adrese v paměti. Tato metoda je však nad rámec tohoto kurzu, proto zde nebude rozebírána.
Představme si, že budeme psát program pro nějaký obchod. Budeme mít zadány ceny určitých výrobků (pro zjednodušení například 3 výrobků) bez DPH a budeme potřebovat prvně sečíst všechny ceny bez DPH a poté teprve všechny ceny s DPH (budeme počítat s daní 20 %).
#include "stdafx.h" float sectibezdph(float a, float b, float c) { float soucet; soucet = a + b + c; return soucet; } float sectisdph(float a, float b, float c) { float soucet; a=a*1.2; b=b*1.2; c=c*1.2; soucet = a + b + c; return soucet; } int _tmain(int argc, _TCHAR* argv[]) { float a, b, c; a=100; b=200; c=300; printf("Soucet nezdanenych polozek: %.0f\n", sectibezdph(a,b,c)); printf("Soucet zdanenych polozek: %.0f\n", sectisdph(a,b,c)); fflush(stdin); getchar(); return 0; }
V programu bylo nutno použít veškeré proměnné typu float, protože ve funkci sectiazdan probíhá násobení číslem 1,2. Ve výpisu hodnot do konzole jsme za hodnotu funkce přidali ještě zápis .0, který znamená, že číslo má být vypsáno s nulovým počtem desetinných míst.
Vše podstatné u funkcích již víte, proto se můžete pustit do tvorby vlastních funkcí.
Napište funkci JeVetsi, která bude mít za úkol porovnat čísla zadané v parametru a vrátí hodnotu 1 v případě, že bude první zadané číslo větší. V případě, že bude větší druhé číslo, vrátí hodnotu 0.
Napište funkci Maximum, která bude požadovat desetiprvkové pole celých čísel jako parametr a bude vracet celočíselnou hodnotu. Tato funkce projde pole a vrátí nejvyšší nalezenou hodnotu.
Pozn.: pole inicializujte náhodnými čísly 1 až 50.
Obdoba předchozí funkce, ovšem bude vracet nejnižší nalezenou hodnotu.
Pozn.: pole inicializujte náhodnými čísly 1 až 50.
Napište funkci Prumer, která bude požadovat desetiprvkové pole celých čísel jako parametr. Tato funkce projde pole a spočítá průměr všech položek. Nezapomeňte, že průměr nemusí být celočíselný a neměl by být příliš nepřesný (ideálně zaokrouhlen na 2 desetinná místa).
Pozn.: pole inicializujte náhodnými čísly 1 až 50.