Home >> C++ návod >> Funkce - 1.část

Funkce - 1.část

V této lekci se zaměříme na další velmí důležitou kapitolu jazyka C++. Máme tím na mysly funkce, které jsou základem snad každého programu. Hlavním účelem funkcí je ulehčovat život programátorovi. Funkce totiž umožňují vytvořit část kódu, která je umístěna jakoby "bokem" a lze ji kdykoli použít (přivolat) i opakovaně. Syntaxe funkce je následující:

datový_typ jméno_funkce ( parametr1, parametr2, ...) { příkazy }

V tomto případě se jedná o syntaxi funkce, která bude vracet nějakou hodnotu. Proto je nutné definovat typ této hodnoty. Dále je třeba funkci nějakou pojmenovat, tedy přidělit ji nějaký identifikátor. Nyní se dostáváme k parametrům funkce. Funkce může obsahovat libovolný počet parametrů, ale také žádný. Každý parametr je opět nějakého typu, ale platí, že musí být stejný jako typ návratové hodnoty funkce. Například pokud bude návratová hodnota funkce typu int, musí být i parametry této funkce typu int. Nakonec se dostáváme k tělu funkce. Zde se nachází všehny příkazy, které má funkce provést.

Příklad funkce:

#include <iostream>
using namespace std;

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


int main ()
{
int vysledek;
vysledek = secti(3,4);
cout << "Vysledek souctu je: " << vysledek << endl;
return 0;
}

První věcí, která by měla upoutat Vaši pozornost, je umístění funkce ve zdrojovém kódu. Jelikož int main() je rovněž funkcí, musíme ostatní funkce umístit ještě před hlavní funkci programu.

Nyní k samotné funkci. V příkladu jsme vytvořili funkci secti, která vrací celočíselnou hodnotu - int. Funkce má dva parametry (a,b), které musí být rovněž typu int. Tělo funkce tvoří pouze jeden příkaz a to: return a + b;. Příkaz return znamená vrať, v tomto případě tedy bude funkce vracet hodnotu, která je rovna součtu parametrů a,b.

Výstup programu bude následující:

Vysledek souctu je: 7

Podívejme se na další příklad:

#include <iostream>
using namespace std;

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

int main ()
{
int vysledek;
int x = 2;
int y = 5;
vysledek = secti(3,4);
cout << "1. vysledek je: " << vysledek << endl;
cout << "2. vysledek je: " << secti(5,y) << endl;
vysledek = 2 * secti (x,y);
cout << "3. vysledek je: " << vysledek << endl;
return 0;
}

Tento příklad je velmi podobný tomu prvnímu. Měl by posloužit jako ukázka toho, jak je možné funkce využít. Určitě jste si všimli, že parametrem nemusí být pouze konkrétní hodnota, ale i proměnná. Funkce si od této proměnné převezme hodnotu a dále pracuje pouze s touto hodnotou. Hodnota proměnné se nijak nezmění. Výstup programu bude následující:

1. vysledek je: 7
2. vysledek je: 10
3. vysledek je: 14

Funkce typu void

Už víme, že každá funkce musí být nějakého typu. Například pokud je funkce typu int, pak vrací hodnotu tohoto typu. Ovšem co když budeme chtít funkci, která nevrací žádnou hodnotu? Příkladem může být primitivní funkce, která vypíše pouze text na obrazovku. V takovém případě není nutné vracet žádnou hodnotu. Jak ale takovou funkci zapsat?

Zápis funkce, která nebude nic vracet, je prakticky úplně stejný jako u funkcí, které vracet budou. Rozdíl je pouze v typu. V takovém případě nepoužijeme žádný datový typ, ale speciální typ void. Syntaxe funkce bude tedy:

void jméno_funkce ( parametr1, parametr2, ...) { příkazy }

Například:

#include <iostream>
using namespace std;

void vypis_zpravu()
{
cout << "Toto je funkce, ktera nevraci zadnou hodnotu!" << endl;
}

int main ()
{
vypis_zpravu();
return 0;
}

V příkladě je vytvořena beznávratová funkce vypis_zpravu. Tato funkce nemá žádný parametr a provádí pouze výpis krátke zprávy. V hlavní funkci programu, je tato funkce zavolána pomocí:

vypis_zpravu();
Pozor! Závorky je nutné uvádět i v případě, že funkce nemá žádný parametr! Tím se odlišují funkce od proměnných.

Výstup programu:

Toto je funkce, ktera nevraci zadnou hodnotu!

Lokální a globální proměnné

Na závěr se ještě krátce vrátíme k proměnným. Vzhledem k tomu, že se v programech, které píšeme začalo díky funkcím vyskytovat více tzv. bloků, je potřeba znát rozdíl mezi lokální a globální proměnnou.

Rozdíl mezi těmito typy proměných je patrný již z názvů. Lokální proměnná je deklarována uvnitř nějakého bloku, například v těle funkce a pracovat s ní lze pouze uvniř tohoto bloku. Naopak globální proměnná není deklarována uvnitř žádného bloku a lze s ní pracovat všude.

Dále platí, že lokalní proměnná má vyšší prioritu než globalní. To si pokusíme vysvětlit na následujícím prříkladu:

#include <iostream>
using namespace std;

int a = 7; //globální proměnná

void funkce_F() //lokální proměnná
{
int a = 10;
cout << "Vypis funkce_F: " << a << endl;
}

int main ()
{
cout << "Vypis hlavni funkce: " << a << endl;
funkce_F();
return 0;
}

V příkladě se nachází 2 stejné proměnné int a s tím rozdílem, že jedna je globální a druhá lokální. Podívejme se na výstup programu:

Vypis hlavni funkce: 7
Vypis funkce_F: 10

V obou případech vypisujeme hodnotu proměnné a. Na začátku programu byla deklarována globální proměnná a = 7. Tuto hodnotu jsme dostali při prvním výpisu. Ve druhém výpisu jsme však dostali hodnotu 10. To je způsobeno tím, že příkaz pro tento výpis se nachází uvnitř funkce funkce_F. Jelikož má lokalní proměnná vyšší prioritu než globální a hodnota lokální proměnné je zde nastavena na 10, dostaneme toto číslo i na výstupu.

Další příklad tentokrát však z jiného soudku:

#include <iostream>
using namespace std;

void funkce_F()
{
int a = 10; //lokální proměnná
int b = 5; //lokální proměnná
cout << a << ", " << b << endl;
}

int main ()
{
cout << b << endl;
return 0;
}

Tento program se vůbec nepřeloží, jelikož hlásí následující chybu:

error: 'b' was not declared in this scope

Pokud si tuto hlášku přeložíme do češtiny, dostaneme něco jako:

chyba: proměnná b není v této oblasti deklarována

Vysvětlení je prosté. V příkladě se nachází pouze 2 lokální proměnné. A jak je známo, lokální proměnná platí pouze uvnitř bloku, ve kterém je deklarována. V našem případě je tím blokem funkce funkce_F. Pokud se tedy budeme snažit tuto proměnnou použít jinde než v tomto bloku, dostaneme již zmiňovanou chybovou hlášku.

Pro úplnost si ještě ukážeme správné řešení:

#include <iostream>
using namespace std;

int b = 55; //globální proměnná

void funkce_F()
{
int a = 10; //lokální proměnná
int b = 5; //lokální proměnná
cout << a << ", " << b << endl;
}

int main ()
{
cout << b << endl;
return 0;
}

Nyní bude program již v pořádku přeložen, jelikož jsme deklarovali globální proměnnou a tu můžeme použít kdekoliv.

55

Vzhledem k tomu, že znalost funkcí je opravdu důležitá a v této lekci je již dost nových informací, dovolíme si rozdělit tuto problematiku na 2 části. Pokud stále něčemu nerozumíte, rozhodně nepokračujte do další lekce. Raději si tuto lekci ještě jednou projděte. Teprve ve chvíli, kdy všemu porozumíte pokračujte dále.

C++ Návod
Úvod do C++
Volba programu
Struktura programu
Proměnné
Konstanty
Operátory
Vstup a výstup
Řídící struktury
Funkce - 1.část
Funkce - 2.část
Pole
Práce s textovými řetězci
Ukazatele - 1.část
Ukazatele - 2.část
Dynamické proměnné
Datové struktury
©2008 - 2011 Klikzone.cz
Ráj aut - inzerce nových i ojetých aut