Body navíc

Filip a Jakub pomáhali s pořádáním školní matematické soutěže a učitelka je odmění: každý dostane ke každé písemce 3 body navíc. Víc než 50 bodů ale žádná písemka mít nemůže, protože víc se získat nedalo.

Tentokrát funkce žáka mění. Kdyby ho dostala jako Zak zak, změnila by jen svou kopii a žák v poli by zůstal stejný. Proto dostane ukazatel na žáka: Zak *zak, tedy adresu žáka v poli. Přes ni funkce mění originál. Ke členům struktury se přes ukazatel dostanete šipkou ->: zak->body[i] znamená totéž co (*zak).body[i]. Třeba ve hře, kde hráč může mít nejvýš 5 životů:

#include <stdio.h>

typedef struct {
    char jmeno[20];
    int zivoty;
} Hrac;

void pridej_zivoty(Hrac *hrac, int navic) {
    hrac->zivoty += navic;
    if (hrac->zivoty > 5) {
        hrac->zivoty = 5;
    }
}

int main(void) {
    Hrac hraci[] = {
        {"Petr", 2},
        {"Jana", 4},
    };
    pridej_zivoty(&hraci[0], 2);
    pridej_zivoty(&hraci[1], 2);
    printf("%s, životy: %d\n", hraci[0].jmeno, hraci[0].zivoty);
    printf("%s, životy: %d\n", hraci[1].jmeno, hraci[1].zivoty);
    return 0;
}
Petr, životy: 4
Jana, životy: 5

Při volání dáte funkci adresu žáka pomocí &: &zaci[3] je adresa žáka s indexem 3, tedy Jakuba. Časté chyby:

  • Bez & překladač ohlásí error: passing 'Zak' to parameter of incompatible type 'Zak *'; take the address with &. Na konci hlášky dokonce radí, co udělat: vzít adresu pomocí &.
  • S tečkou místo šipky, zak.body[i], ohlásí error: member reference type 'Zak *' is a pointer; did you mean to use '->'? (je to ukazatel, nechtěli jste použít ->?).
  • S const Zak *zak funkce žáka měnit nesmí a překladač ohlásí error: cannot assign to variable 'zak' with const-qualified type 'const Zak *'.

Volání patří do main() nad vypis_vysledky(zaci, pocet);: nejdřív se body změní, potom se vypíšou. V opačném pořadí by se vypsaly ještě ty staré.

Pokyny

Pod funkci vypis_vysledky() (nad main()) napište funkci void pridej_body(Zak *zak, int bonus), která v cyklu přičte bonus k bodům ze všech tří písemek žáka.

V main() nad volání vypis_vysledky() přidejte body Filipovi a Jakubovi: pridej_body(&zaci[2], 3); a pridej_body(&zaci[3], 3);. Jakub má teď z každé písemky o 3 body víc a s průměrem 20,7 dostane čtyřku:

Jakub       17  25  20  20.7  4

Pokud se nic nezměnilo, voláte pridej_body() až za vypis_vysledky(). Filip má ale teď 51 a 53 bodů, víc, než se dalo získat. To spravíte v dalším úkolu.

Upravte funkci pridej_body(): když má písemka po přičtení víc než 50 bodů, nastavte jí body na 50. Výsledky pak vypadají takto:

VÝSLEDKY Z MATEMATIKY
Adam        42  38  45  41.7  2
Ema         36  33  38  35.7  3
Filip       50  50  50  50.0  1
Jakub       17  25  20  20.7  4
Lenka       27  40  41  36.0  3
Nejlepší: Filip (průměr 50.0)

Začněte programovat zdarma

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

Nebo se registrujte pomocí:

5/7