Domácí úkoly

Zadání
Zadání domácích úkolů naleznete na stránce Domácí úkoly.

Během semestru bude zadáno šest domácích úkolů, pět základních a jeden bonusový. Cílem těchto úkolů je procvičení probíraných témat na větším příkladu.

Součástí hodnocení úkolu je automatické testování funkcionality a pak hodnocení kvality kódu opravujícím.

Pravidla

  • Pracujte samostatně!

    Opisování bude na obou stranách přísně potrestáno penalizací nebo projednáním u disciplinární komise.

  • Na úspěšné vypracování úkolu jsou celkem 3 pokusy.

  • Termín odevzdání uvedený v zadaní je striktní.

    Odevzdání po tomto termínu může být odevzdávacím systémem akceptováno, ale hodnocení nebude uznáno.

  • Odevzdání úkolu není závislé na cvičení.

    Absence na cvičení nebo jeho nekonání (např. kvůli státnímu svátku) není důvod pro individuální posun termínu odevzdání.

  • Řešení pište pouze do zdrojových souborů uvedených v zadání.

    Tyto názvy musíte dodržet přesně a žádný soubor nesmí chybět. Jiné soubory odevzdávací systém ignoruje.

  • Program nesmí při překladu hlásit chyby ani varování. + Způsob kompilace je popsaný níže v části Jak Kontr kompiluje. V případe chyby se testy dané sekce automaticky vyhodnotí na 0.

Zdrojový kód

  • Programy musí splňovat standard ISO/IEC 9899:1999 (C99).

    Rozšíření a nestandardní knihovny lze použít, pouze pokud je zadání explicitně povolí.

  • Programy musí dodržovat požadované rozhraní a formát výstupu.

    Protože se výstup testuje automaticky, musí program dodržovat formát přesně a nesmí vypisovat navíc nic, co není zadáním požadováno.

  • Programy smí otevírat pouze soubory v zadání nebo uvedené v argumentech.

    Není povoleno vytvářet, číst nebo přepisovat jiné soubory.

  • Zdrojový kód musí dodržovat konzistentní formátování a zásady vhodného způsobu programování.

  • Zdrojový kód musí vhodným způsobem dokumentovat netriviální části kódu.

    Menší části kódu komentujte. Pro dokumentaci funkcí, struktur atd. můžete použít Doxygen.

Zadání může podle potřeby některé požadavky změnit.

Nepovolené extenze

Pokud není v zadání uvedeno jinak, je zakázáno používat rozšíření jazyka mimo standard C99 a externí knihovny.

Pokud nevíte, o co jde, extenze se obvykle zapínají makry, např. nastavením -D_GNU_SOURCE při překladu nebo #define _GNU_SOURCE v kódu. Knihovny se k překladu přidávají přepínačem -lKNIHOVNA.

Pokud tohle někde uvidíte, nepoužívejte to.

Předběžné termíny pro úkoly

Tyto termíny se mohou během semestru měnit podle okolností. O změnách budou organizátoři předmětu informovat v relevantních vláknech v diskusním fóru v IS MU.
úkol zadání pokus navíc konec odevzdání

HW01

2024-02-26

2024-03-06 24:00

2024-03-13 24:00

HW02

2024-03-11

2024-03-20 24:00

2024-03-27 24:00

HW03

2024-03-25

2024-04-10 24:00

2024-04-17 24:00

HW04

2024-04-15

2024-04-24 24:00

2024-05-01 24:00

HW05

2024-04-29

2024-05-08 24:00

2024-05-15 24:00

HW06

2024-05-13

není

2024-06-16 24:00

Vlastní testování

Očekává se, že studenti si svoje řešení důkladně otestují. Toto testování nelze nahradit odevzdáním nanečisto, protože to pokrývá pouze triviální vstupní případy. Je skutečně potřebné věnovat čas pochopení zadání, zkoušení různých platných či neplatných vstupů a validace chování řešení.

V rámci tohoto testování si můžete s kamarády nebo kolegy vyměnit svoje zkompilovaná řešení a hledat v nich chyby.

Nesmíte však sdílet ani si navzájem ukazovat zdrojový kód!

Časová náročnost

Programování se lze naučit pouze programováním. Proto jsou úkoly v tomto předmětu náročné a jejich obtížnost se postupně zvyšuje. U posledních úkolů počítejte s desítkami hodin času.

Proto jsou na každý úkol alespoň dva týdny času, nenechávejte si vypracování na poslední chvíli. Úkol odevzdaný třeba jen sekundu po konci odevzdání nebude hodnocen.

Zadání si přečtěte ihned po zveřejnění. Pokud netušíte, jak začít, zkuste si vypracovat miniúkoly.

Odevzdávání

Odevzdání úkolu probíhá na počítači aisa.fi.muni.cz v systému Kontr. Řešení musí být uložené v Git repozitáři ve správném adresáři a ve větvi podle úkolu. Při odevzdání se berou v potaz pouze soubory požadované zadáním. Ostatní soubory odevzdávací systém ignoruje.

Postup pro založení repozitáře, vytvoření větve atd. naleznete v návodu pro GitLab repozitář.

Řešení lze odevzdat ve dvou režimech, nanečisto a naostro.

Struktura repozitáře

Každý úkol má v repozitáři vlastní adresář a větev, ve kterém jsou uložené soubory. Název adresáře je hwNN kde NN je číslo úkolu, např. hw01, hw03 atd. Speciální úkoly (např. testovací úkol hello) můžou požadovat jiné adresáře.

Pro jednoduchost má větev stejný název, jako adresář. Tj. na úkolu hw03 pracujete ve složce hw03 ve větvi hw03.

Příklad:

[gitlab.fi.muni.cz/LOGIN/]pb071.git
├── hello/
│   └── hello.c
├── hw01/
│   ├── CMakeLists.txt
│   ├── main.c
│   └── tests.c
├── hw02/
...

Nanečisto

Odevzdání nanečisto slouží pouze pro ověření velmi jednoduchých vstupních případů, které mohou odhalit nepochopení části zadání.

  • Tato odevzdání nejsou hodnocená.

  • Dejte si pozor na limity popsané níže.

Svoje řešení důkladně testujte!
Fakt, že při odevzdání nanečisto nebyla nalezená žádná chyba, negarantuje, že testy naostro projdou bezchybně.
  1. Ověřte si, že jste řešení nahráli do repozitáře správně!

  2. Přihlaste se na stroj aisa.fi.muni.cz.

  3. Spusťte následující skript (za UKOL dosaďte kód úkolu, např. hw03):

    login@aisa:~$ /home/kontr/odevzdavam pb071 UKOL nanecisto
  4. Výsledek obdržíte e-mailem za 10-30 minut podle vytížení serveru.

Naostro

Testy naostro jsou hodnocené a pokrývají mnohem větší vstupní množinu než testy nanečisto. Zejména kontrolují i okrajové případy a mohou selhat, i když testy nanečisto prošly bez chyby.

  • Před odevzdáním naostro vždy vyzkoušejte kompilaci na Aise.

  • Hodnotí se pouze první tři pokusy.

  • Testy naostro požadují plnou funkčnost řešení v testech nanečisto, a to zejména bez chyb při práci s pamětí (valgrind).

    Pokud testy nanečisto neprojdou, testy naostro se přeskočí.

  • Před odevzdáním naostro musíte mít v GitLab FI Merge Request pro větev s úlohou.

    Viz taky manuál pro GitLab.

Kompilace na Aise
Podle pravidel výše si před každým odevzdáním kompilaci vyzkoušejte pomocí příkazů z části Jak kontr kompiluje. Toto pravidlo se nekontroluje, ale na argumenty „doma se mi to zkompiluje“ se nebude brát žádný ohled.
  1. Ověřte si, že jste řešení nahráli do repozitáře správně!

  2. Přihlaste se na stroj aisa.fi.muni.cz.

  3. Spusťte následující skript (za UKOL dosaďte kód úkolu, např. hw03):

    login@aisa:~$ /home/kontr/odevzdavam pb071 UKOL naostro
  4. Zkontrolujte vypsané informace, zda odevzdáváte správný úkol a jeho správnou verzi.

  5. Výsledek obdržíte e-mailem za 10-30 minut podle vytížení serveru. Body budou zapsané v poznámkovém bloku.

Omezení

Kontr má jako uživatel na Aise omezený diskový prostor. Aby nedošlo k jeho zaplnění nadměrným počtem odevzdání, a naopak abychom motivovali studenty k důkladnějšímu testování, uplatňují se na odevzdání následující limity.

  • Po vyhodnocení lze stejný úkol ve stejném režimu odevzdat nejdříve po 10 minutách.

    Mezi režimy tento limit neplatí, tzn. můžete po vyhodnocení nanečisto ihned odevzdat naostro.

  • Před prvním odevzdáním úkolu naostro můžete použít nanejvýš 10 odevzdání nanečisto.

  • Před dalším odevzdáním naostro můžete použít nanejvýš 5 odevzdání nanečisto.

  • Překročení limitu na počet odevzdání nanečisto bude penalizováno -5 body za každé odevzdání navíc.

Pozor na počet odevzdání
Rozhraní Kontru neinformuje o možném překročení limitu, to si musíte pohlídat sami. Pokud neumíte počítat do deseti, dělejte si čárky na papír.

Hodnocení

Hodnotí se pouze odevzdání naostro.

Testy

Automatické testy udělí bodové hodnocení, které se zapíše i do poznámkového bloku. Konečné slovo má však opravující, který výjimečně a v odůvodněných případech může hodnocení upravit. Příkladem může být udělení nulového bodového zisku za odevzdání, jež neimplementují žádnou ze zásadních částí zadání, a snaží se pouze obejít testy nanečisto.

  • max. 0 b za úspěšné testy nanečisto.

    Testy se hodnotí pouze v režimu odevzdání naostro.

  • max. 100 b za úspěšné testy naostro.

    Platí pouze pokud testy nanečisto prošly kompletně správně, včetně kontroly nástrojem valgrind.

  • 50 % z každého úspěšného testovacího případu naostro, na kterém kontrola nástrojem valgrind nalezne chybu.

  • Některé úlohy mohou mít nepovinná rozšíření za další body. Viz podrobnosti níže.

  • Ze všech pokusů se počítá nejlepší dosažené hodnocení.

Kvalita kódu

Hodnocení automatickými testy je nutno potvrdit kontrolou kvality kódu. Tuto provádí opravující obvykle do týdne po konci odevzdání.

Opravující jsou náhodně přiřazeni ve druhém týdnu semestru a změní se pouze ve velmi výjimečných případech. Přiřazené opravující naleznete ve výstupu skriptu opravujici (nebo při odevzdání ze skriptu odevzdavam):

login@aisa:~$ /home/kontr/opravujici pb071 UKOL

Kontrolu kvality kódu provádí opravující v Merge Request, který musí existovat již při prvním odevzdání naostro.

Opravující obvykle řešení kontrolují automaticky po ukončení odevzdávání. Pokud úkol vypracujete dříve, můžete je požádat o recenzi napsáním poznámky v MR. Nelze však garantovat, že budou mít na vypracování recenze čas před koncem odevzdávání úkolu.
Návod pro vytvoření MR naleznete v návodu pro GitLab repozitář.

Opravující odevzdání opraví a zpětnou vazbu zapíše do poznámek v GitLabu. Pokud řešení splňuje požadavky na kvalitu kódu, opravující potvrdí hodnocení schválením MR (Approve v GitLabu).

  • Nevytvářejte pro úkol víc než jeden MR. Zejména zavření MR, Merge bez Approve od opravujících nebo vytvoření dalších MR pro stejný úkol může způsobit, že opravující nebudou odevzdání hodnotit vůbec.

  • Bez kontroly kvality kódu nebudou body z testů uznány a započítány do celkového hodnocení.

  • Řešení, které nebylo ani jednou odevzdáno naostro, může být opravujícími vyhodnoceno, ale nebude uděleno žádné hodnocení.

  • Pokud do řešení zavedete nové chyby, mohou opravující požadovat jejich nápravu.

Opravné odevzdání

Pokud je řešení funkční, ale s výraznými nedostatky v kvalitě kódu, může opravující požadovat nápravu. Poznámky popisující, co vyžaduje opravit, vyznačí na začátku textem FIX:.

  • Pokud cvičící nestanoví jinak, na opravu je jeden pokus nejpozději týden od zadání poznámek do GitLabu.

  • Oprava se odevzdává skriptem odevzdavam v režimu naostro stejně, jako řádné odevzdání. Poté je nutno vyžádat ještě jednou o kontrolu kvality.

  • Při opravě lze používat i odevzdání nanečisto.

    Pozor, limity pro počet těchto odevzdání včetně penalizace stále platí.

  • Body získané navíc oproti řádnému odevzdání se nepočítají.

  • Opravující může nedostatečnou opravu penalizovat.

    Typicky pokud řešení obsahuje nové chyby, nejsou opravené všechny nalezené nedostatky nebo byla oprava odevzdána pozdě.

Bonusy

Pro lepší pochopení uvedených pravidel se podívejte i na Příklady hodnocení.

Odevzdání navíc

Pokud odevzdáte řešení úkolu naostro nejpozději týden před koncem odevzdávání, získáte další (čtvrtý) hodnocený pokus naostro navíc.

  • Nejpozdější termín pro možnost získání tohoto bonusu bude vždy uveden v zadání.

  • Bonus se nevztahuje na šestý bonusový domácí úkol.

Nepovinné rozšíření

Některé úkoly mohou mít nepovinná rozšíření, jejichž vypracování může být hodnoceno různým počtem bonusových bodů.

  • Hodnoceno pouze pokud testy naostro prošly kompletně správně, včetně kontroly nástrojem valgrind.

  • Pokud má zadání více rozšíření, studenti si mohou vybrat libovolné z nich nebo i všechna, pokud zadání nestanoví podmínky jinak.

Speciální bonusy

Cvičící může výjimečně udělit maximálně 5 bodů za vtipné, originální, zvlášť efektivní nebo formou zpracování vzorné řešení.

Samostatná práce a opisování

Domácí úkoly musí studenti vypracovat samostatně. Jakákoliv činnost, která vede k přepsání nebo kopírování zdrojového kódu jiné osoby do řešení se bude chápat jako opisování. Toto se netýká částí kódu, které jsou dodávané v kostře úkolu.

Co tedy není povoleno:

  • Sdílení zdrojového kódu nebo jeho částí, fotografie nebo snímky obrazovky.

  • Sdílení podrobného popisu fungování řešení.

  • Opsání řešení problému ze Stack Overflow (nebo podobných stránek), vzorových řešení úkolů atd.

Je však povoleno (a doporučováno) následující:

  • Vysvětlení a posouzení teoretické metody řešení, např. diskuse zvoleného algoritmu.

    Popis algoritmu však nesmí být příliš podrobný. Například přiřaď do proměnné y odmocninu z x, pak pokud y je větší než 0, tak zavolej funkci foo(), pak v cyklu od 1 po x …​ se bude chápat jako popis fungování řešení, což není v pořádku.

  • Vysvětlení části řešení ve skupině, např. na tabuli. Řešení však musíte přepsat z vlastní hlavy do kódu sami.

  • Sdílení a testování sestaveného řešení jinými studenty.

Při závažném a opodstatněném podezření z opsání celého nebo i jenom částečného řešení bude hodnocení domácího úkolu dočasně anulováno oběma stranám a  případ bude projednán u disciplinární komise FI MU (DK).

  • Pokud DK přestupek potvrdí, anulace zůstane permanentní a navíc se udělí penalizace -50 bodů.

  • Pokud naopak DK vyhodnotí, že k porušení Disciplinárního řádu FI nedošlo, anulace se zruší.