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: 5Př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 *zakfunkce žá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é.
Jak psát:
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 4Pokud 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
5/7