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í
printfvytváří tabulku:%spro jména,%4dpro body,%6.1fpro průměry a%dpro 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 ifve 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í%sa porovnáte funkcístrcmp. - Funkce rozdělují program na části s jasným úkolem:
prumer(),znamka()anejlepsi_zak()počítají a výsledek vracejí,pridej_body()aoprav_body()mění data,najdi_zaka()hledá avypis_vysledky()vypisuje. - Ukazatele umožňují funkci
pridej_body()změnit žáka přímo v poli (&zaci[2]) anajdi_zaka()díky nim vrací adresu nalezeného žáka, neboNULL. Pole se funkcím předávají jako adresa prvního prvku, bez kopírování, aconstří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ávesouF9(Build and run, tedy přeložit a spustit). - macOS: v Terminálu nainstalujte nástroje příkazem
xcode-select --install. Program uložte jakomain.c, v Terminálu přejděte do jeho složky příkazemcda přeložte ho:clang -Wall main.c -o main. Vznikne programmain, 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říkazemgcc -Wall main.c -o maina 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&:scanfdostane adresu proměnné, aby ji mohl změnit, stejně jakopridej_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,fprintfafclosezestdio.hmůže program výsledky uložit do souboru a příště je zase načíst, takže nezmizí, když program skončí. - Paměť. Velikost pole
zacije daná už při psaní programu. Pomocí funkcímallocafreezestdlib.hsi 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.
Jak psát:
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.3Do 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.4Pokud 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
7/7