Anglická verze
logolink

< Zpět na seznam lekcí

Funkce

AlgortimyObsah lekce:

  • Co je to funkce
  • Syntaxe funkce
  • Použití funkcí
  • Použití funkcí s parametry
  • Použití funkcí pro podmínky
  • Předání parametru hodnotou a odkazem
  • Samostatná práce

Co je to funkce

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:

  1. chceme-li program zpřehlednit rozložením jeho celého kódu na části (funkce),
  2. opakuje-li se v programu jeden složitější příkaz či posloupnost příkazů,
  3. nějakou část kódu si přejeme používat i v dalších programech.

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 funkce

Syntaxe každé funkce musí vypadat následovně:

Obecná syntaxe funkce
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.

Použití funkcí

Ukažme si tedy na úvod nějakou hodně jednoduchou funkci pro pochopení principu návratové hodnoty.

Funkce pro zobrazení hodnoty čísla PI
#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.

Funkce pro výpočet fiktivního vzorce
#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.

Použití funkcí s parametry

Příklad můžeme dále vylepšit přidáním parametrů pro funkci.

Vylepšení funkce o parametry
#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.

Použití funkcí pro podmínku

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.

Použití funkcí pro podmínku
#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.

Předání parametru ukazatelem

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.

Program na součet ceny zboží

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 %).

Funkce pro součet ceny zboží
#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.

Samostatná práce

Vše podstatné u funkcích již víte, proto se můžete pustit do tvorby vlastních funkcí.

Funkce JeVetsi

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.

Funkce Maximum

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.

Funkce Minimum

Obdoba předchozí funkce, ovšem bude vracet nejnižší nalezenou hodnotu.
Pozn.: pole inicializujte náhodnými čísly 1 až 50.

Funkce Prumer

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.

Otázky

  1. Jaká je základní syntaxe funkce?
  2. Lze funkci použít uvnitř podmínky? Uveďte příklad s využitím logických spojek.
webdesign, xhtml, css, php - Mgr. Michal Mikláš