Funkce a vektory

Argumentem může být jakákoli hodnota, tedy i vektor. Parametr pak má typ vektoru, například std::vector<int> cisla. Funkce, která dostane vektor, ho může projít cyklem a vrátit výsledek. Tato funkce spočítá, kolik čísel ve vektoru je větších než zadaná hranice:

#include <iostream>
#include <vector>

int pocetNad(std::vector<int> cisla, int hranice) {
    int pocet = 0;
    for (int cislo : cisla) {
        if (cislo > hranice) {
            pocet++;
        }
    }
    return pocet;
}

int main() {
    std::vector<int> teploty = {18, 25, 31, 22, 28};
    std::vector<int> body = {5, 10, 15};
    std::cout << pocetNad(teploty, 24) << std::endl;
    std::cout << pocetNad(body, 7) << std::endl;
    return 0;
}

Tento program vypíše:

3
2

V parametru cisla je ten vektor, který předá volání: nejdřív teploty, potom body. Počítání znáte z lekce o cyklech, jenže teď je uvnitř funkce, takže ho pro jakýkoli vektor provedete jediným voláním. A protože je pocet lokální proměnná, každé volání začíná znovu od 0.

Všimněte si, kde je return: až za }, která ukončuje cyklus, tedy když jsou zkontrolovaná všechna čísla. Častou chybou je dát ho o řádek výš, dovnitř cyklu:

    for (int cislo : cisla) {
        if (cislo > hranice) {
            pocet++;
        }
        return pocet;
    }

Teď je return v těle cyklu. Ukončí celou funkci, a tím i cyklus, hned při prvním průchodu. Funkce zkontroluje jen první číslo, 18, a pro teploty vrátí 0.

Funkce může vektor i vrátit. Návratový typ je pak například std::vector<int>. Před cyklem vytvořte prázdný vektor, v cyklu do něj přidávejte prvky pomocí push_back() a za cyklem ho vraťte.

Pozor na jednu věc: parametr dostane kopii vektoru, stejně jako u čísel v minulém cvičení. Když funkce vektor v parametru změní, změní jen svou kopii a vektor v main zůstane stejný:

#include <iostream>
#include <vector>

void pridejBonus(std::vector<int> body) {
    body.push_back(10);
    std::cout << "Ve funkci: " << body.size() << " prvky" << std::endl;
}

int main() {
    std::vector<int> body = {5, 8, 7};
    pridejBonus(body);
    std::cout << "V main: " << body.size() << " prvky" << std::endl;
    return 0;
}

Tento program vypíše:

Ve funkci: 4 prvky
V main: 3 prvky

Funkce přidala prvek do své kopie, ne do vektoru body v main. Když tedy chcete vektor ve funkci změnit, zatím ho z funkce vraťte a v main si ho uložte. Kopírování velkého vektoru navíc chvíli trvá. V příští lekci, Reference a ukazatele, se naučíte, jak funkci předat přímo proměnnou z main, bez kopírování, aby ji funkce mohla změnit.

Pokyny

Program se nepřeloží, protože funkce prumer zatím neexistuje. Napište ji místo komentáře: bude mít parametr cisla typu std::vector<int> a vrátí průměr čísel ve vektoru jako double, tedy jejich součet vydělený jejich počtem. Pozor na celočíselné dělení: součet ukládejte do proměnné typu double. Program pak vypíše průměrné teploty dvou týdnů, 20.8 a 12.75.

Pod funkcí prumer napište funkci tepleDny se dvěma parametry: teploty typu std::vector<int> a hranice typu int. Vrátí nový vektor teplot, které jsou vyšší než hranice. Na konci main, před return 0;, uložte tepleDny(tyden1, 20) do proměnné teple a cyklem vypište každou její teplotu na samostatný řádek. Program vypíše 21, 24 a 22.

Začněte programovat zdarma

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

Nebo se registrujte pomocí:

9/10