Výsledky za pololetí
Vítejte v poslední lekci kurzu C! V ní spojíte všechno, co jste se naučili, a krok za krokem napíšete jeden užitečný program: výsledky z matematiky za celé pololetí. Třída během pololetí psala tři písemky a učitelka teď na vysvědčení potřebuje u každého žáka průměr a známku. Až budete hotovi, program vypíše výsledky v této podobě:
Marek ve třídě není.
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 35 40 41 38.7 2
Nejlepší: Filip (průměr 50.0)
Průměr třídy: 37.3Program vypíše tabulku s body, průměrem a známkou každého žáka, najde nejlepšího žáka, přidá body navíc a jednomu žákovi opraví chybu v bodech. Použijete proměnné, podmínky, cykly, pole, řetězce, funkce, ukazatele i struktury: všechno z kurzu. Každé cvičení navazuje na to předchozí (editor začíná jeho hotovým kódem) a přidá jeden kousek.
Data. Každý žák je struktura typu Zak se jménem a polem bodů ze tří písemek (z každé šlo získat nejvýš 50 bodů). Žáci jsou v poli zaci na začátku funkce main(). Každý žák v něm má dvě dvojice složených závorek: vnější patří celému žákovi, vnitřní poli body. Čárka za posledním žákem není chyba: jazyk C ji dovolí a přidat dalšího žáka je pak snazší. zaci[0].jmeno je tedy "Adam" a zaci[0].body[2] jsou jeho body ze třetí písemky, 45. V proměnné pocet je počet žáků. Počítá se pomocí sizeof, takže bude odpovídat, i když nějakého žáka přidáte. Ve skutečné škole by data přišla z elektronické třídní knihy. Programy tady dostávají data z proměnných.
Plán. Program je rozdělený na funkce a každá má jeden úkol. Teď je tu jen jedna: vypis_vysledky(), která dostane pole žáků a jejich počet. Zatím vypíše jen nadpis. Je nad main(), protože funkce musí být deklarovaná dřív, než ji zavoláte. Takhle program v C obvykle vypadá: nahoře struktura, pod ní funkce a dole funkce main(), která je používá.
Parametr const Zak zaci[] je adresa pole z main() (znamená totéž co const Zak *zaci), takže se nic nekopíruje. Díky const funkce žáky jen čte, a to pro výpis stačí.
Každého žáka vypíšete na jeden řádek po kouscích: jméno, pak body vnořeným cyklem a nakonec \n. Sloupce pod sebe srovnají šířky: %-10s doplní jméno mezerami na 10 znaků (znaménko - zarovná jméno doleva) a %4d vypíše číslo zarovnané doprava na 4 znaky. Například hráči a jejich góly ve třech zápasech:
#include <stdio.h>
typedef struct {
char jmeno[20];
int goly[3];
} Hrac;
int main(void) {
Hrac tym[] = {
{"Petr", {2, 0, 1}},
{"Jana", {1, 3, 0}},
};
for (int i = 0; i < 2; i++) {
printf("%-6s", tym[i].jmeno);
for (int j = 0; j < 3; j++) {
printf("%3d", tym[i].goly[j]);
}
printf("\n");
}
return 0;
}Petr 2 0 1
Jana 1 3 0Podmínka je i < pocet, ne <=. Poslední index je pocet - 1, takže s <= by cyklus sáhl i na žáka, který v poli není, a program by se zastavil s chybou RuntimeError: unreachable.
Jak psát:
Pokyny
Ve funkci vypis_vysledky() pod řádek, který vypisuje nadpis, napište cyklus for s proměnnou i od 0, dokud je i menší než pocet. V cyklu vypište jméno každého žáka příkazem printf("%-10s", zaci[i].jmeno); a pod ním ukončete řádek příkazem printf("\n");. Jména se vypíšou každé na samostatný řádek.
Mezi tyto dva příkazy printf vložte vnořený cyklus for s proměnnou j od 0, dokud je j menší než 3 (tři písemky). V něm vypište body žáka zaci[i].body[j] pomocí %4d, bez \n. Program vypíše:
VÝSLEDKY Z MATEMATIKY
Adam 42 38 45
Ema 36 33 38
Filip 48 50 47
Jakub 14 22 17
Lenka 27 40 41Začněte programovat zdarma
1/7