IB001 – Seminární skupiny 6, 7 a 24

Týden 8

Funkce

Funkce umožňují zapsat mimo hlavní tělo programu opakující se logické celky kódu nebo např. často užívané jednoduché operace. Ústřední funkcí v programu v jazyce C je main a ostatní funkce se zapíší obdobně:

  • zapíšeme návratový typ funkce
  • poté její identifikátor (jméno)
  • poté do kulatých závorek typy a jména parametrů
  • a nakonec zapíšeme do složených závorek tělo funkce
  • funkce běžně vrací hodnotu příkazem return, není-li typu void

Zápis i užití můžeme vidět např. na funkci pro výpočet maxima ze dvou celých čísel:

// definice funkce pro vypocet maxima ze dvou cisel
int maximum(int a, int b)
{
    int max = a;
    if (b > a) {
        max = b;
    }
    return max;
}

Místo kam můžeme zapsat funkci a jak ji zavolat je vidět z následujícího kódu:

#include <stdio.h>

// Definice funkce add pred main, aby jeji jmeno bylo v main videt
// Argumenty a, b jsou jmena lokalnich promennych (v add), pri volani jsou do nich ulozeny hodnoty opravdovych argumentu
int add(int a, int b)
{
    return a + b;
}

int main(void)
{
    // Promenne a, b jsou viditelne pouze v tele funkce main
    // Jsou to tedy jine opravdove promenne nez stejnojmenne a, b z definice funkce add!
    int a, b;
    printf("Zadejte 2 cela cisla: ");
    scanf("%d %d", &a, &b);
    // Funkci zavolame zapisem jmena, za kterym nasleduji skutecne argumenty v kulatych zavorkach oddelene carkou
    int sum = add(a, b);
    printf("Soucet cisel a + b = %d", sum);
    // Funkce main vraci 0, pokud program neskoncil s chybou
    return 0;
}

Rekurze

Rekurze je volání funkce sebe samou. Pomocí rekurze je, podobně jako pomocí cyklů, provádět výpočty, které vyžadují více stejných kroků.
Rekurzivní volání umožňuje snadno zapisovat některé matematické definice, např. definici faktoriálu:

0! = 1
n! = n * (n - 1)!

Rekurzivní funkce pro faktoriál by mohla vypadat takto:

int fact(int n)
{
    if (n == 0) {
        return 1;
    } else {
        return n * fact(n - 1);
    }
}