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.3

Program 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  0

Podmí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.

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  41

Začněte programovat zdarma

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

Nebo se registrujte pomocí:

1/7