Důležité!

Pozorně si přečtěte pokyny k výuce během rektorského volna!

Domácí úkoly

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

Během semestru bude zadáno 6 domácích úkolů, 5 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 cvičí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 knihovny lze použít, 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

úkol zadání brzké odevzdání konec odevzdání

HW01

2020-02-24

2020-03-07 24:00

2020-03-10 24:00

HW02

2020-03-09

2020-03-28 24:00

2020-03-31 24:00

HW03

2020-03-30

2020-04-18 24:00

2020-04-21 24:00

HW04

2020-04-20

2020-05-02 24:00

2020-05-05 24:00

HW05

2020-05-04

2020-05-16 24:00

2020-05-17 24:00

HW06

2020-05-18

není

2020-06-16 24:00

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.

  • Podrobný popis 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 již dá 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.

  • Testování sestaveného řešení jinými studenty, viz níže.

Při zjištěném opisování může být případ projednán u disciplinární komise. Pokud ta přestupek potvrdí, obě strany (opisující i ten, kdo opisování umožnil) dostanou penalizaci ve výši získaných bodů z úkolu a navíc (nad rámec trestu komise) penalizaci až -10 bodů bez ohledu na to, zda došlo k opsání celého úkolu nebo jenom části.

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á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 v správném adresáři podle úkolu. Při odevzdání se berou v potaz pouze soubory požadované zadáním. Ostatní soubory odevzdávací systém ignoruje.

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

Struktura repozitáře

Kompletní pravidla naleznete na stránce GitLab repozitář.

Každý úkol má v repozitáři vlastní adresář, 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.

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

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 testů nanečisto.

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

  • Další pokus lze odevzdat i bez hodnocení cvičícím.

    Pokud máte další pokusy a nejste s výsledky testů spokojeni, můžete odevzdávat znovu i bez hodnocení cvičícího.

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í bude penalizováno -1 bodem 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.

Jak Kontr kompiluje

Kontr používá pro kompilaci GCC ve verzi 4.8.2. Verzi zjistíte příkazem

kontr@aisa:~$ gcc --version
gcc (GCC) 4.8.2
...

Správnou verzi na Aise můžete zapnout příkazem

kontr@aisa:~$ module add gcc-4.8.2
Před kompilací nezapomeňte aktualizovat repozitář nebo nahrát na Aisu novou verzi řešení.

Překlad pak probíhá takto:

  1. Každý SOUBOR.c se nejdříve přeloží tímto příkazem:

    kontr@aisa:~$ gcc [EXTENZE] -std=c99 -pedantic -Wall -Wextra -Werror -c -o SOUBOR.o SOUBOR.c

    kde [EXTENZE] jsou extenze povolené v zadání; kromě pátého a šestého úkolu nejsou obvykle povolené žádné.

  2. Program se pak složí do spustitelného souboru takto:

    kontr@aisa:~$ gcc -o PROGRAM *.o [KNIHOVNY]

    kde [KNIHOVNY] jsou knihovny povolené zadáním.

Program můžete přeložit stejným způsobem i v jediném příkazu takto:

kontr@aisa:~$ gcc [EXTENZE] -std=c99 -pedantic -Wall -Wextra -Werror -o PROGRAM *.c [KNIHOVNY]

Doporučujeme před odevzdáním vyzkoušet překlad na Aise včetně všech přepínačů. Argument „u mě překlad funguje“ nebude při hodnocení zohledněn.

Valgrind

Při většině testů se řešení spouští s programem valgrind. Tento nástroj kontroluje několik aspektů programu, zejména práci s pamětí, neincializovanými proměnnými atd. Kontr jej obvykle spouští takto:

kontr@aisa:~$ valgrind --leak-check=full --track-fds=yes ./PROGRAM [PARAMETRY]

Valgrind program spustí a při běhu programu vypisuje nalezené chyby na řádcích tvaru ==ČÍSLO==. Typické chyby jsou např.

  • Použití neinicializované proměnné ve výpočtu, podmínce nebo cyklu.

    ==1234== Use of uninitialized value of size NN
    ==1234== Conditional jump or move depends on uninitialized value(s)
  • Čtení nebo zápis do regionu paměti, který programu nepatří.

    ==1234== Invalid read of size NN
    ==1234== Invalid write of size NN

Celkový počet chyb lze zjistit z posledního řádku

ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)

Pokud program neuvolnil všechnu paměť nebo nezavřel všechny soubory, vypíše Valgrind před koncem odstavec LEAK CHECK.

Další informace k Valgrindu naleznete v manuálu.

Hodnocení

Hodnotí se pouze odevzdání naostro.

Testy

Automatické testy udělí odevzdání bodové hodnocení, které se zapíše i do poznámkového bloku. Konečné slovo má však cvičící, který výjimečně a v odůvodněných případech může hodnocení upravit.

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

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

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

    Platí pouze pokud testy nanečisto prošly kompletně správně.

  • -40 % z úspěšného testu, na kterém kontrola nástrojem valgrind nalezne chybu.

  • ≥ 2 b za bonusy.

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

Oprava cvičícím

Odevzdaný úkol hodnotí cvičící skupiny typicky do týdne po skončení odevzdávání. Pokud skupinu vede více lidí, lze opravujícího zjistit z výstupu skriptu odevzdavam nebo opravujici:

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

Cvičící odevzdání opraví a zpětnou vazbu zapíše do separátního poznámkového bloku nebo ji pošle e-mailem. V opravě může přidat nebo ubrat body, např. v případě speciálního bonusu, za výrazně ošklivé řešení nebo závažnou chybu, kterou testy neodhalily.

Opravné odevzdání

Pokud je řešení funkční, ale s výraznými nedostatky v kvalitě kódu, může cvičící požadovat opravu. Body z úkolu se do celkového součtu ze semestru započítají až po uznání opravy.

Pokud cvičící požaduje opravu, zapíše do bloku s hodnocením úkolu řádek OPRAVIT. V sumarizačním bloku pro úkoly se objeví informace o tom, že body z úkolu se nezapočítávají.
  • Pokud cvičící nestanoví jinak, na opravu je jeden pokus nejpozději týden od zadání hodnocení do ISu.

  • Oprava se odevzdává skriptem odevzdavam v režimu naostro stejně, jako řádné odevzdání.

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

  • Cvičí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ě.

Bonusové body

Pro lepší pochopení uvedených pravidel se podívejte i na Příklady hodnocení.
Bonus za kompletně funkční program z minulých let se od semestru Jaro 2020 již nebude udělovat.

Brzké odevzdání

Prvních pět úkolů má tzv. brzký termín odevzdání, který je stanoven na 72 hodin před řádným koncem. Odevzdání před tímto termínem nazveme brzké.

Studentům se udělí bonusové body podle prvního pravidla, které splní:

  • Brzké odevzdání naostro

    Pokud je celkové hodnocení z automatických testů alespoň 6 bodů, udělí se 2 bonusové body.

  • Brzké odevzdání nanečisto

    Pokud prošly všechny automatické testy bez hlášení valgrindu, a existuje alespoň jedno platné odevzdání naostro před koncem odevzdávání, udělí se 1 bonusový bod..

Tento bonus se uděluje automaticky po skončení odevzdávání úkolu do speciálního poznámkového bloku. Nežádejte o jeho zapsání svého cvičícího!

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

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

  • Studenti, kteří v řádném termínu odevzdají plně funkční řešení bez implementovaných rozšíření, mohou odevzdat jednu další verzi s rozšířeními.

    Tedy pokud odevzdáte funkční program bez bonusu až na třetí pokus, vždycky se můžete ještě pokusit implementovat bonusová rozšíření. O body nepřijdete, protože se do výsledku počítá maximum ze všech pokusů.

Speciální bonusy

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