Návratová hodnota
Funkce vypis_caru z minulého cvičení vypisuje, a tím to končí. Co když ale chcete s výsledkem dál počítat, třeba sečíst plochu všech místností v bytě? Vypsaná hodnota se jen zobrazí ve výstupu a program s ní dál pracovat nemůže.
Proto funkce mohou hodnotu vrátit. Příkaz return (vrátit) pošle hodnotu zpátky na místo, kde byla funkce zavolána. Před název funkce pak místo void napíšete datový typ hodnoty, kterou funkce vrací:
#include <stdio.h>
int secti(int a, int b) {
return a + b;
}
int main(void) {
int vysledek = secti(2, 3);
printf("%d\n", vysledek);
return 0;
}Tento program vypíše:
5Volání secti(2, 3) spustí funkci a ta vrátí 5. Můžete si představit, že se volání nahradí hodnotou, kterou funkce vrátila, takže z int vysledek = secti(2, 3); se stane int vysledek = 5;. Hodnotě, kterou funkce vrací, se říká návratová hodnota a jejímu typu, tady int, návratový typ. Funkce může vracet i double, char nebo bool:
#include <stdio.h>
double prumer(int a, int b) {
return (a + b) / 2.0;
}
int main(void) {
printf("%.2f\n", prumer(7, 8));
printf("%.2f\n", prumer(3, 4));
return 0;
}Tento program vypíše:
7.50
3.50Všimněte si 2.0: s 2 by šlo o celočíselné dělení a volání prumer(3, 4) by vrátilo 3.00.
Volání funkce můžete použít všude, kam byste napsali hodnotu: můžete ho rovnou vypsat, počítat s ním nebo ho dát do podmínky:
#include <stdio.h>
int secti(int a, int b) {
return a + b;
}
int main(void) {
printf("%d\n", secti(2, 3));
int celkem = secti(2, 3) * 2;
printf("%d\n", celkem);
if (secti(2, 3) > 4) {
printf("Víc než 4\n");
}
return 0;
}Tento program vypíše:
5
10
Víc než 4V printf("%d\n", secti(2, 3)) program nejdřív zavolá secti(2, 3) a pak vypíše číslo 5, které funkce vrátila. V secti(2, 3) * 2 se z volání stane 5 a 5 * 2 je 10.
Teď už také víte, co znamená int před main: i main vrací celé číslo. Vrací ho tomu, kdo program spustil, a hodnota 0 znamená, že program skončil v pořádku. Přesně to dělá return 0; na konci main.
Funkce, která není void, slíbila vrátit hodnotu, a tak ji vrátit musí. Zapomenutý return je častá chyba. Tato funkce součet vypíše, ale nevrátí:
#include <stdio.h>
int secti(int a, int b) {
printf("%d\n", a + b);
}
int main(void) {
int vysledek = secti(2, 3);
printf("%d\n", vysledek);
return 0;
}Program se nepřeloží:
main.c:5:1: error: non-void function does not return a value [-Werror,-Wreturn-type]
5 | }
| ^
1 error generated.Chybová hláška ukazuje na } na konci funkce a říká, že funkce, která není void (non-void function), nevrací hodnotu. Jinde na to překladače často jen upozorní varováním. Tady je to chyba, abyste ji nemohli přehlédnout. Opravou je return a + b; místo printf.
Jak psát:
Pokyny
Program se nepřeloží: chyba call to undeclared function 'obsah_obdelniku' říká, že funkce obsah_obdelniku zatím neexistuje. Napište ji místo komentáře: bude mít dva parametry typu int, sirka a vyska, a vrátí sirka * vyska. Program pak vypíše Kuchyně: 12 a Ložnice: 20.
Byt má ještě obývací pokoj o rozměrech 6 × 5 metrů. Na konci main, před return 0;, vytvořte proměnnou obyvak s jeho obsahem, který spočítáte funkcí obsah_obdelniku. Pak vypište plochu celého bytu, kuchyne + loznice + obyvak, s popiskem: Celý byt: 62.
Nová podlaha stojí 450,50 Kč za metr čtvereční. Nad main napište funkci cena_podlahy s parametrem plocha typu int, která vrátí cenu podlahy, plocha * 450.5, jako double. Na konci main vypište cenu podlahy pro celý byt na dvě desetinná místa: Podlaha: 27931.00 Kč.
Začněte programovat zdarma
5/12