Hledání žáka

Lenka si přišla stěžovat: učitelka jí špatně sečetla body. Místo 27 jich má mít 35. Program potřebuje funkci, která žákovi opraví body podle jména. Nejdřív ale musí žáka najít ve vektoru jmena, tedy zjistit jeho index.

Hledání je vzor z lekce o cyklech: cyklus prochází prvky, a když najde ten správný, zapamatuje si jeho index a příkaz break cyklus ukončí, protože dál hledat nemusí. Proměnná s indexem začíná na -1. Takový index ve vektoru není. Když cyklus nic nenajde, zůstane v ní -1 a to znamená, že hledaný prvek ve vektoru není:

#include <iostream>
#include <string>
#include <vector>

int najdiPredmet(const std::vector<std::string>& predmety, std::string hledany) {
    int index = -1;
    for (int i = 0; i < predmety.size(); i++) {
        if (predmety[i] == hledany) {
            index = i;
            break;
        }
    }
    return index;
}

int main() {
    std::vector<std::string> rozvrh = {"Matematika", "Fyzika", "Dějepis"};
    std::cout << najdiPredmet(rozvrh, "Fyzika") << std::endl;
    std::cout << najdiPredmet(rozvrh, "Chemie") << std::endl;
    return 0;
}
1
-1

Texty porovnáváte pomocí == a porovnání je přesné: "lenka" není totéž co "Lenka".

Funkce opravBody() dostane oba vektory. jmena jen čte, a proto je dostane jako const referenci. body mění, a proto je dostane jako referenci bez const.

Na pořadí volání v main() záleží. Lenka napsala test na 35 bodů a 3 body za chybnou úlohu dostane jako všichni ostatní. Oprava proto patří před volání pridejBody(body, 3). Za ním by oprava Lence bonus přepsala a Lenka by měla jen 35 bodů.

A co když učitelka napíše jméno, které ve vektoru není? Třeba Marek chodí do vedlejší třídy. najdiZaka() vrátí -1 a body[-1] je mimo vektor. Z lekce o vektorech víte, že index mimo rozsah je chyba: program může spadnout nebo potichu přepsat paměť, která k vektoru nepatří. Proto opravBody() index nejdřív zkontroluje.

Pokyny

Pod funkci pridejBody() napište funkci int najdiZaka(const std::vector<std::string>& jmena, std::string jmeno), která vrátí index žáka se jménem jmeno, nebo -1, když ve vektoru není. Když žáka najde, ukončete cyklus příkazem break.

Pod ni napište funkci void opravBody(const std::vector<std::string>& jmena, std::vector<int>& body, std::string jmeno, int noveBody), která pomocí najdiZaka() zjistí index žáka a nastaví jeho body na noveBody.

V main() nad volání pridejBody() opravte Lence body: opravBody(jmena, body, "Lenka", 35);. Lenka má teď 35 + 3 = 38 bodů a výsledky končí takto:

Lenka: 38 bodů, známka 2
Průměr bodů: 38.2
Nejlepší: Filip (50 bodů)

Pokud má Lenka 35 bodů, voláte opravu až za pridejBody().

Do funkce opravBody() přidejte kontrolu: když najdiZaka() vrátí -1, vypište Marek ve třídě není. se jménem, které funkce dostala, místo Marek, a body neměňte. Pak to vyzkoušejte: pod opravu Lenky přidejte opravBody(jmena, body, "Marek", 40);. Nad výsledky se objeví:

Marek ve třídě není.

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/7