Gratulujeme!

Gratulujeme, váš program funguje a jste na konci kurzu C! Vypíše tabulku s body, průměrem a známkou každého žáka, najde nejlepšího žáka, přidá body za pomoc se soutěží a opraví body podle jména. A celý jste ho napsali sami.

Poslední vylepšení. Učitelka chce vědět i to, jak dopadla celá třída: průměr třídy. Je to zase vzor se součtem: proměnná, která začíná na 0, a cyklus, který k ní přičte prumer() každého žáka. Součet pak vydělíte počtem žáků, pocet. Potom uvidíte, že program funguje pro jakoukoli třídu: přijde nová žákyně a vám bude stačit přidat ji do pole.

Co jste se naučili. Podívejte se, jak si v programu našla místo každá část kurzu:

  • Výpis pomocí printf vytváří tabulku: %s pro jména, %4d pro body, %6.1f pro průměry a %d pro známky. Šířky srovnají sloupce.
  • Proměnné a datové typy drží součty a průměry. Průměry vyšly s desetinami, protože jste sčítali do proměnné typu double.
  • Podmínky určují známku (else if ve správném pořadí), hlídají strop 50 bodů a kontrolují, jestli se žák našel.
  • Cykly procházejí žáky i jejich body (cyklus v cyklu), sčítají, hledají nejlepšího žáka a žáka podle jména.
  • Pole drží žáky i body každého z nich. Kolik je žáků, spočítá sizeof.
  • Řetězce jsou jména žáků: pole znaků zakončená znakem '\0', která vypíšete pomocí %s a porovnáte funkcí strcmp.
  • Funkce rozdělují program na části s jasným úkolem: prumer(), znamka() a nejlepsi_zak() počítají a výsledek vracejí, pridej_body() a oprav_body() mění data, najdi_zaka() hledá a vypis_vysledky() vypisuje.
  • Ukazatele umožňují funkci pridej_body() změnit žáka přímo v poli (&zaci[2]) a najdi_zaka() díky nim vrací adresu nalezeného žáka, nebo NULL. Pole se funkcím předávají jako adresa prvního prvku, bez kopírování, a const říká, že je funkce jen čte.
  • Struktury drží pohromadě, co k sobě patří: jméno a body ze tří písemek. Ke členům se dostanete tečkou, přes ukazatel šipkou ->. Struktura jako parametr je kopie a funkce může strukturu i vrátit.
  • A když něco nefungovalo, chybové hlášky překladače vám řekly, co je špatně a na kterém řádku. Opravovat se vyplatí vždycky nejdřív tu první.

C ve vašem počítači. Tady programy překládal a spouštěl prohlížeč. Ve vlastním počítači máte několik možností:

  • Online překladač nepotřebuje žádnou instalaci. Třeba na onlinegdb.com vyberte jazyk C, vložte program a spusťte ho tlačítkem Run. Funguje tam i vstup z klávesnice.
  • Windows: nainstalujte si Code::Blocks, který je zdarma. Stáhněte instalační soubor, který má v názvu mingw: obsahuje i překladač GCC. Pak vytvořte nový projekt (File, New, Project, Console application), jako jazyk vyberte C, nahraďte ukázkový kód svým programem a spusťte ho klávesou F9 (Build and run, tedy přeložit a spustit).
  • macOS: v Terminálu nainstalujte nástroje příkazem xcode-select --install. Program uložte jako main.c, v Terminálu přejděte do jeho složky příkazem cd a přeložte ho: clang -Wall main.c -o main. Vznikne program main, který spustíte příkazem ./main.
  • Linux: překladač GCC nainstalujete třeba na Ubuntu příkazem sudo apt install gcc. Program pak přeložíte příkazem gcc -Wall main.c -o main a spustíte příkazem ./main.

Část -o main říká, jak se má hotový program jmenovat, a -Wall zapne varování. Čtěte je! Tady na webu se ta nejnebezpečnější hlásila jako chyby, ale ve vašem počítači jsou to často jen varování a program přesto vznikne. Program s takovou chybou pak může vypisovat nesmysly nebo spadnout, třeba s hláškou Segmentation fault. Po každé změně kódu program přeložte znovu, jinak spustíte starou verzi. Tady na webu to za vás dělalo tlačítko Spustit. A ve Windows se v konzoli místo písmen s háčky a čárkami mohou objevit jiné znaky. Chyba to v programu není, konzole jen čte text v jiném kódování.

Co dál. Teď znáte základy, ze kterých se skládá každý program v C. Pár nápadů, co se naučit dál:

  • Vstup od uživatele. Ve vašem počítači funguje scanf: scanf("%d", &pocet_bodu); počká, až uživatel napíše číslo a stiskne Enter, a uloží ho do proměnné. Všimněte si &: scanf dostane adresu proměnné, aby ji mohl změnit, stejně jako pridej_body(). (Tady v prohlížeči nemá kdo psát, a proto programy dostávaly data z proměnných.) Učitelka by tak mohla body zadávat sama.
  • Soubory. Pomocí funkcí fopen, fprintf a fclose ze stdio.h může program výsledky uložit do souboru a příště je zase načíst, takže nezmizí, když program skončí.
  • Paměť. Velikost pole zaci je daná už při psaní programu. Pomocí funkcí malloc a free ze stdlib.h si program může paměť vyžádat až za běhu, třeba pro tolik žáků, kolik jich je v souboru. Tam se ukazatele hodí nejvíc.
  • C++. C++ vychází z C: skoro všechno, co znáte, v něm funguje taky, a navíc přidává texty, které se samy zvětšují (std::string), vektory, třídy a mnohem víc. Kurz C++ najdete i tady na webu.
  • Vlastní projekty a soutěže. Hra na hádání čísla, kvíz, piškvorky ve dvourozměrném poli. Nejvíc se naučíte, když řešíte vlastní problémy. Jazyky C a C++ se používají i k programování malých zařízení, třeba desek Arduino, a jsou oblíbené v programátorských soutěžích. Pro středoškoláky je tu třeba Korespondenční seminář z programování nebo kategorie P Matematické olympiády.

A pokud si chcete vyzkoušet další jazyk, čekají na vás kurzy C++, Pythonu a JavaScriptu.

Pokyny

Na konci funkce vypis_vysledky(), pod řádkem s nejlepším žákem, vypište průměr třídy: v cyklu sečtěte průměry všech žáků a součet vydělte proměnnou pocet. Naše třída má:

Průměr třídy: 37.3

Do třídy přestoupila nová žákyně Eva. Přidejte ji na konec pole zaci: {"Eva", {40, 44, 47}},. Nic dalšího měnit nemusíte: pocet se počítá pomocí sizeof a funkce fungují pro jakýkoli počet žáků. Výsledky pak končí takto:

Lenka       35  40  41  38.7  2
Eva         40  44  47  43.7  2
Nejlepší: Filip (průměr 50.0)
Průměr třídy: 38.4

Pokud vyjde průměr třídy 46.1, dělíte číslem 5 napsaným přímo v kódu místo pocet. A Evu přidejte na konec: na začátku by posunula indexy ostatních žáků a body navíc by dostali Ema a Filip místo Filipa a Jakuba.

Začněte programovat zdarma

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

Nebo se registrujte pomocí:

7/7