Vypsat, nebo vrátit?

Začátečníkům se často plete return s std::cout, protože to vypadá, že obojí hodnotu nějak „vydá“. Dělají ale něco úplně jiného:

  • std::cout vám hodnotu jen ukáže ve výstupu. Program s tím, co se vypsalo, pracovat nemůže.
  • return hodnotu předá programu, který si ji může uložit do proměnné, počítat s ní nebo ji vypsat.

Podívejte se, co se stane, když funkce výsledek vypíše, místo aby ho vrátila, a program s ním pak chce počítat:

#include <iostream>

void vypisSoucet(int a, int b) {
    std::cout << a + b << std::endl;
}

int main() {
    int vysledek = vypisSoucet(2, 3);
    std::cout << vysledek * 2 << std::endl;
    return 0;
}

Program se nepřeloží:

main.cpp:8:9: error: cannot initialize a variable of type 'int' with an rvalue of type 'void'
    8 |     int vysledek = vypisSoucet(2, 3);
      |         ^          ~~~~~~~~~~~~~~~~~
1 error generated.

Chybová hláška říká, že proměnnou typu int nejde naplnit hodnotou typu void. Funkce vypisSoucet je void, a tak nevrací nic, co by šlo uložit. Číslo 5 by jen vypsala. Stejně dopadne i vypisSoucet(2, 3) * 2, jen s chybou invalid operands to binary expression ('void' and 'int'): s „ničím“ počítat nejde.

Oprava je změnit void na int a hodnotu místo vypsání vrátit: return a + b;.

Stává se i opak: funkce hodnotu vrátí, ale nikdo ji nepoužije. Když v main napíšete jen secti(2, 3);, program nevypíše nic. Funkce vrátila 5, ale program si hodnotu neuložil ani ji nevypsal, a tak se ztratila. Pokud ji chcete vidět, vypište ji: std::cout << secti(2, 3) << std::endl;.

Kdy má tedy funkce vypisovat a kdy vracet? Funkce, která něco počítá, má výsledek vrátit. O tom, co se s ním stane, pak rozhodne kód, který ji zavolal: vypíše ho, uloží si ho nebo s ním bude dál počítat. Uvnitř funkce vypisujte jen tehdy, když je vypisování celým jejím úkolem, jako u rekniAhoj() nebo vypisObsah().

Funkce může vracet i text. Funkce, která připraví text s číslem, ho může vrátit jako std::string a program ho pak vypíše, kde bude chtít. Číslo ale k textu pomocí + nepřipojíte. Nejdřív ho převeďte na text funkcí std::to_string() (z anglického to string, na text):

#include <iostream>
#include <string>

std::string formatujCenu(int cena) {
    return std::to_string(cena) + " Kč";
}

int main() {
    std::string text = formatujCenu(120);
    std::cout << "Cena: " << text << std::endl;
    std::cout << "Se slevou: " << formatujCenu(120 - 20) << std::endl;
    return 0;
}

Tento program vypíše:

Cena: 120 Kč
Se slevou: 100 Kč

std::to_string(120) vrátí text "120" a + k němu připojí " Kč". Kdybyste napsali jen return cena + " Kč";, program se sice přeloží, ale nebude fungovat: vypíše nesmysly nebo skončí chybou, protože C++ číslo a text v uvozovkách pomocí + nespojí. A pozor na desetinná čísla: std::to_string(2.5) vrátí "2.500000" se šesti desetinnými místy.

Pokyny

Pizza stojí 200 Kč a nápoj 50 Kč. Funkce cenaObjednavky má spočítat cenu objednávky, ale cenu jen vypíše, a tak se program nepřeloží. Opravte funkci, aby cenu místo vypsání vrátila. Program pak vypíše Dohromady: 1300.

Pod funkcí cenaObjednavky napište funkci formatujCenu s parametrem cena typu int, která vrátí cenu jako text s měnou, tedy jako std::string. Pro 1300 vrátí "1300 Kč". Číslo převeďte na text pomocí std::to_string().

Použijte ji v posledním výpisu v main: místo rodina + kamaradi vypište formatujCenu(rodina + kamaradi). Program vypíše Dohromady: 1300 Kč.

Začněte programovat zdarma

Registrací souhlasíte s provozními podmínkami a zásadami ochrany osobních údajů.

Nebo se registrujte pomocí:

6/10