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
2V 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 prvkyFunkce 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.
Jak psát:
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
9/10