Jak na pro­jek­ty v ja­zy­ce C

© Damig, 2004 – 2023
Koncept

Datumy – vzorový projektík

Úvod

Pokud právě studujete předmět Programování na střední nebo vysoké škole, existuje nenulová pravděpodobnost, že po vás budou učitelé chtít vyřešit nějaký projekt. Dále je možné, že vás vyučující překvapí požadavkem, že máte odevzdat nejenom naprogramované řešení zadané úlohy, ale budou po vás dokonce chtít odevzdat vysázenou dokumentaci k vašemu řešení. Dokonce je pravděpodobné, že se nespokojí jen s jednou stránkou s vágním popisem, ale budou chtít třeba 10-20 stránek. A budou to chtít vysázet alespoň ve Wordu nebo dokonce v LaTeXu.

Proč by po vás učitelé programování měli chtít něco takového? Vyřešit projekt a ještě dvacet stránek textu!? To přece nechtějí ani učitelé češtiny jako slohovku! Učitelé programování totiž předpokládají, že takovou znalost a zkušenost budete potřebovat. Na vysoké škole budete takto psát bakalářkou či diplomovou práci a existují i firmy, které po vás takové zprávy budou čas od času vyžadovat, aby měli materiál pro nové členy týmů, kteří budou na vaši práci navazovat.

Abyste si mohli prohlédnout, jak takový školní projek může vypadat, vytvořil jsem pro vás vzorové řešení jednoduché úlohy, včetně dokumentace jejího řešení.

Zadání - Rozdíl kalendářních dat

Vytvoř program, který vypočte počet dnů mezi dvěma kalendářními daty. Program musí zohlednit přestupné roky. Standardní systémové funkce pro práci s kalendářními daty lze použít pouze pro ověření správnosti výsledku.

Přestupné roky

Přestupný rok je každý rok, jehož letopočet je násobkem čísla 4, s výjimkou celých století, která přestupná nejsou. I zde ale platí ještě jedna výjimka: roky, které jsou násobkem čísla 400 přestupné jsou, ačkoliv to jsou také celá století.

Příklad

  • přestupné roky: 1200, 1904, 2000
  • nepřestupné roky: 1900, 1953, 2003

Formát vstupních dat

Program přečte ze standardního vstupu jeden řádek, na kterém bude textový řetězec ve formátu dd.mm.rrrr-dd.mm.rrrr, například 12.01.0823-06.09.1981.

Formát výstupních dat

Program na výstup vytiskne jediný řádek obsahující počet dnů mezi zadanými daty, například 423188.

Testování

Navrhni vhodnou množinu testovacích dat, která otestují všechny možnosti, při nichž by se mohla projevit chyba. Zkoušej dávat na vstup syntakticky chybný vstup (15.dubna.1758), logicky chybný vstup (30.2.2001), dále otestujte data, která obsahují a neobsahují přestupný rok atd.

Testovací data mohou být v souboru a do programu je lze přesměrovat. Bude to fungovat stejně, jako kdybyste je na standardní vstup psali ručně.

./datumy < data.txt
Ukázka spouštění programu se zadáním připraveným v souboru.
./datumy <<< 12.01.0823-06.09.1981
V Linuxovém shellu Bash to jde i takto.

Vzorové řešení

Toto je vzorově vyřešená úloha s obtížností odpovídající menšímu středoškolskému projektu. Je to ukázka poměrně jednoduchého reálného programu. Pokud s programováním začínáte, může být zkoumání tohoto kódu pro vás užitečným cvičením. Věřím, že prozkoumáním této úlohy získáte více, než ztrácením času u trivialit typu Hello world, kterých ostatně na internetu najdete obrovská kvanta.

Čeho byste si měli na tomto projektu všímat:

  • Řešení využívá podprogramů a datových struktur. Funkce main je velmi malá.
  • Soubor datumy.cbp je projektový soubor pro Code::Blocks. Přiložený Makefile ale umožňuje překládat program i bez IDE (např. v replit.com).
  • Makefile má vytvořena pravidla nejenom pro překlad, ale i pro generování dokumentace, vytváření zip archivu a jiné.
  • Dokumentační komentáře jsou psány tak, aby je šlo zpracovat programem Doxygen. Použij make doc.
  • Testovací skript test.sh spouští hotový program s různými testovacími hodnotami a kontroluje je oproti správným hodnotám připraveným v souborech ideal.test1ideal.test2. Také testuje, jak se program chová při zadání chybných hodnot. Takový testovací skript lze spouštět rutinně při každé změně v programu a jde si tak ověřit, že program funguje stále správně.

Vzorová dokumentace

Zde najdete vzorově vypracovanou dokumentaci řešení tohoto projektu. Je vysázena v LaTeXu, ale v podobném formátu jde sázet i v Libre Office Writeru nebo třeba MS Wordu.

Jde o dokumentaci řešení úlohy, nikoli o dokumentaci programátorskou -- tu si můžete vygenerovat ze zdroje pomocí programu Doxygen. Cílem této dokumentace je popsat proces analýzy zadaného problému a následného návrhu řešení, z něhož vyplyne popis skutečné implementace.

Čeho byste si měli všímat na této dokumentaci:

  • Je to strukturovaný dokument. Má titulní stranu, obsah, kapitoly a seznam použité literatury.
  • Je v něm patrný záznam postupu přemýšlení nad řešením.
  • Během analýzy byly identifikovány různé problémy, které je třeba vyřešit.
  • Poté je předveden návrh řešení identifikovaných problémů. U závažnějších problémů je nabídnuto více možných řešení a je zde zdůvodnění, proč bylo implementováno právě jedno z nich.
  • Popis skutečné implementace tvoří jen zlomek celého dokumentu. Nejdůležitější problémy již byly vysvětleny v jiných kapitolách.
  • Při řešení jsem vycházel z literatury, která je zde také citována.
  • Protože se to hodí k tématu, je zde něco jako historické okénko, které má za cíl vysvětlit některé řešené problémy. To ale neznamená, že historická okénka musí být v každé dokumentaci.
  • Všimněte si, že i pro řešení takto jednoduchého projektu jde vytvořit smysluplnou dokumentaci o cca 10 stranách. Pokud to u svého projektu nezvládnete, buďto ten projekt nestojí za nic nebo jste ho neřešili vy (nebo obojí).