PB071: Principy nízkoúrovňového programování - Jaro 2017

Rozcestník

Konzultační hodiny

  • Nebojte se v hojné míře konzultovat problémy s domácími úkoly nebo probíranou látkou s učiteli|/cvičícími předmětu.
  • Využijte primárně možnost konzultace problémů přímo na hodině nebo od studentských poradců (viz níže).
  • Konzultační hodiny přednášejícího:
    • Petr Švenda: Úterý 13:00-13:50 místnost A406
  • Konzultační hodiny studentských poradců:

Nástroje a jejich manuály

Všechny tutorialy naleznete na stránce: https://www.fi.muni.cz/pb071/tutorials/.

Tutorialy jsou v pořadí, v jakém byste je měli absolvovat

  1. Git - jako první doporučujeme seznámení s nástrojem git, vytvoření repozitáře ve službě gitlab a odeslání úlohy do repozitáře.
  2. Qt Creator - je zvolené IDE v rámci tohoto předmětu. Měli byste zvládnout vytvořit, sestavit a odladit projekt. V případě, že již máte zkušenosti, nebo preferujete nativní IDE vašeho operačního systému, potom můžete rovou přeskočit na Visual Studio tutoriál pro Windows, anebo Xcode tutoriál pro macOs.
  3. Valgrind a Dr. Memory - Kontr spouští vaše úlohy s nástrojem Valgrind pro detekci chyb při práci s pamětí. Tento tutorial vám poskytne základní návod pro práci s Valgrind. Pro uživatele Windows a macOs, na kterých nelze Valgrind nainstalovat, je tutorial rozšířen o instalaci a použití Dr. Memory, který poskytuje obdobné funkce.
  4. Doxygen - tento tutorial vám poskytne úvod k nástroji Doxygen, který budete používat pro dokumentování vašich zdrojových kódů
  5. SSH a AISA - úkoly budete odevzdávat na stroji AISA, který je dostupný pouze pomocí protokolu SSH
Pokud se rozhodnete používat svůj počítač nebo jiné IDE než QtCreator, nemusíme být schopni vám pomoci s případnými problémy.

Shrnutí rozdílů C vs Python

Pravidla pro cvičení z PB071

Verze platná pro jarní semestr 2017 (20.2.2017)

Shrnutí nejdůležitějších bodů:

  • Cvičení jsou povinná, povoleny jsou dvě neomluvené (na studijním oddělení) neúčasti.
  • Základní domácí úkoly je možné odevzdávat opakovaně, ale max. 3x a max. do času deadline zadání daného úkolu.
  • Odevzdání úkolu je nutné oznámit vyučujícímu spuštěním speciálního skriptu (detaily viz pravidla odevzdávání, odevzdání naostro).
  • Úkoly lze odevzdávat definovaným způsobem „nanečisto“. Student získá automaticky výsledky některých hodnotících testů, aniž by přišel o body.
  • Zhruba ve třetině semestru proběhne bodovaný průběžný test (namísto přednášky v D1, odpovědní testové archy).
  • Na začátku většiny cvičení proběhne krátký 5 min testík z látky probírané na přednášce (celkem 10x).
  • Zápočet je udělen za docházku a souhrnný zisk alespoň 65 bodů za domácí úkoly (alespoň 4 příklady nenulové), průběžný test, testíky na cvičení a úspěšné vypracování zápočtového příkladu na hodině.
  • Pro připuštění ke zkoušce je nutné získat zápočet.
  • Zkoušku lze získat po získání zápočtu a za souhrnný zisk alespoň 95 bodů získaných pro zápočet + body za zkouškový test.
  • Na cvičeních bude pro psaní programů jako základní IDE využíván QT Creator. Student může využívat jiné IDE (např. CLion, Code::Blocks, Visual Studio, Eclipse…), pokud jej preferuje. Domácí úlohy se ale odevzdávají a kontrolují na Aise s využitím překladače gcc (viz způsob odevzdávání).

Průběh cvičení

  • Detaily k jednotlivým cvičením včetně zadání domácích úkolů jsou dostupné zde.
  • V prvním týdnu se mají studenti seznámit s překladačem jazyka C pod operačním systémem Unix na příkazové řádce, v dalších pak překladem s využitím prostředí QT Creator, způsob zadávání a odevzdávání domácích úkolů a detaily hodnocení.
  • Na cvičeních je vyžadována aktivní práce na zadaných příkladech, které se vztahují k probrané látce a řešeném domácím úkolu. Cvičící aktivně poskytuje pomoc při řešení případných problémů a upozorňuje na použití dobrých programovacích návyků. Využijte přítomnost cvičícího pro konzultaci problémů!
  • Na cvičeních se pracuje primárně ve vývojovém prostředí QT Creator s využitím překladače gcc. Součástí výuky je i používání debuggeru a dalších vývojových nástrojů - jejich aktivní použití na cvičeních bude vyžadováno. Studenti ovládající dobře jiné vývojové IDE jej mohou použít s tím, že odevdávané domácí úkoly musí jít kompilovat pomocí gcc na aise (viz Odevzdávání).

Náhrada odpovědníku

  • pokud má student omluvenou neúčast na cvičení (na stud. odd.), může si odpovědník nahradit na některém z dalších cvičení nebo po domluvě s cvičícím
  • odpovědník ze cvičení s neomluvenou neúčastí nelze nahradit
    • student může nahradit celé cvičení (včetně odpovědníku) v jiné skupině, ale pouze ve stejném týdnu, ve kterém na cvičení chybí

Domácí úkoly

  • Během semestru bude zadáno 5 domácích úkolů + 1 bonusový.
  • Od 2. týdne studenti samostatně vytvářejí zadané programy (domácí úkoly). Program se obvykle nepodaří beze zbytku dokončit během cvičení; je proto nutno program odevzdat do data uvedeného na začátku zadání domácího úkolu (položka 'Absolutní konec odevzdávání:').
  • Součástí tvorby programu je také jeho důkladné otestování. Doporučujeme nechat si program otestovat jinou osobou (kolegou), kterého posadíte do role uživatele. V cizím programu se snáze odhalí chyba, než když ho testujete sám - při testování vlastního programu myslíme stejně jako při jeho vytváření.
  • Programy se píší zásadně v jazyce ISO/IEC ISO/IEC 9899:1999 (C99) bez nenormalizovaných rozšíření.
  • Programy musí zachovávat požadovaný způsob komunikace s uživatelem (formu vstupu a výstupu, názvy souborů, parametry funkcí včetně main apod.) Program nesmí vyžadovat jiná vstupní data nebo parametry příkazového řádku, než je uvedeno v zadání.

Bodování domácích úkolů

Body za konkrétní domácí úkol se skládají z následujících částí:

  • Míra funkčnosti programu po konci odevzdávání [0 … 9 bodů] (počítá se dosažené maximum ze všech pokusů)
  • Bonus za kompletně funkční program po konci odevzdávání [0 … 3 bodů]. Pokud je program napoprvé odevzdán plně funkční a dodržuje konvence o vhodném způsobu programování v jazyku C/C++, tak student získává 3 body. Za každé další odevzdání naostro je z tohoto bonusu stržen 1 bod. Pokud není program ani po konci odevzdávání plně funkční, není tento bonus vůbec udělen.
    • OD HW04: Pokud student odevzdá plně funkční řešení bez bonusu, může odevzdat jednu verzi s bonusem bez stráty bonusu za kompletně funkční program.
  • Body za korektní vypracování bonusového rozšíření příkladu [0 … 4 body]. Tento bonus se uděluje pouze pokud je program plně funkční.
  • Body za včasné odevzdání alespoň 3 dny předem (72 hodin), [0 … 2 body]
    • za odevzdání nanečisto s hodnocením 3 bodů se udělí 1 bonusový bod,
    • za odevzdání naostro, pokud prošly všechny testy nanečisto, s hodnocením alespoň 6 bodů dohromady se udělí 2 bonusové body
  • Výjimečný bonus za velmi vtipné, originální, zvlášť efektivní nebo formou zpracování vzorné řešení [max. 2 body za příklad]

Příklad 1: Student odevzdá úkol napoprvé kompletně funkční program bez bonusového rozšíření. Získává 9 + 3 = 12 bodů.

Příklad 2: Student odevzdá program s chybou, opraví ji a při druhém odevzdání je program plně funkční. Získává 9 + (3 - 1) = 11 bodů.

Příklad 3: Student odevzdá program s chybou, opraví ji, ale i při druhém odevzdání je v programu přítomná chyba. Další opravu již z důvodu konce odevzdávání nestihne. Program tak není plně funkční (řekněme že nefunguje jeden ze tří testů). Získává (9 - 1×3) + 0 = 6 body.

Příklad 4: Student odevzdá program s chybou těsně před koncem odevzdávací periody. Cvičící vyhodnotí a v programu je chyba. Další opravu student již odevzdávat nemůže. Program tak není plně funkční (řekněme že nefungují dva ze tří testů). Získává (9 - 2×3) + 0 = 3 body.

Příklad 5: Student odevzdá program s chybou. Cvičící vyhodnotí a student chybu při dalším odevzdání opraví. Opravený program je plně funkční. Získává 9 + (3 - 1) = 11 bodů. Student ale riskoval výrazně méně bodů, viz příklad 4.

Příklad 6: Student odevzdá úkol napoprvé kompletně funkční program, pouze v bonusu za 2 body je chyba. Oprava se mu vyplatí, protože odevzdaním napodruhé ztrácí pouze jeden bod. Získává 9 + (3 - 1) + 2 = 13 bodů (z 14 maximálně možných). I kdyby bonus neopravil, tak získává 11 bodů, korektnost bonusu se do korektnosti celého příkladu nepočítá).

Příklad 7: Student odevzdá kompletně funkční program bez bonusu (i na několikátý pokus). Může se pokusit dodatečně odevzdat jednou verzi s bonusem. Pokud odevzdá bonus s chybou, může odevzdat znovu, ale přijde o jeden bonusový bod za počet odevzdání.

Odevzdáním úkolu včas ze dále myslí alespoň 72 hodin před koncem odevzdávání, pozdě méňe než 72 hodin.

Příklad 8: Student odevzdá úkol nanečisto za 3 body pozdě. Nedostane žádné bonusové body za včasné odevzání.

Příklad 9: Student odevzdá úkol nanečisto za 3 body včas, naostro pozdě. K odevzdání naostro dostane 1 bonusový bod za včasné odevzdání.

Příklad 10: Student odevzdá úkol naostro pouze za 5 bodů včas (a testy nanečisto prošly). Dostane 1 bonusový bod za včasné odevzdání. Pokud stihne odevzdat včas ještě jednou za alespoň 6 bodů, může získat 2 bonusové body.

Příklad 11: Student odevzdá úkol naostro za alespoň 6 bodů včas (a testy nanečisto prošly). Dostane 2 bonusové body za včasné odevzdání.

Odevzdání domácích úkolů

Pravidla odevzdání

  • Počínaje 1. úkolem se domácí úkoly odevzdávají.
  • Termín nejzazšího odevzdání úkolu je uveden vždy na stránce se zadáním úkolu.
  • Každý program má v zadání uvedeno, jak se má jmenovat; tyto názvy je třeba dodržovat – vyučujícím to umožňuje kontrolu, včetně automatického odevzdání nanečisto. Speciálně si zkontrolujte velká a malá písmenka všech odevzdávaných souborů.
  • Odevzdáním se rozumí uložení zdrojového programu do GIT repozitáře a spuštění skriptu (viz dále), který informuje vás i cvičícího o výsledku automatické kontroly. Pouhé uložení programu do repozitáře nestačí – vyučující neví, zda je to již konečný tvar programu a nemůže dost dobře pořád kontrolovat, zda už byl program odevzdán.
  • Zdrojový program nesmí při překladu výše uvedeným překladačem a parametry hlásit chyby ani varování. Pokud jsou při překladu nalezeny chyby nebo varování (používáme na překlad -Werror), testy se vůbec nespouští a student přichází o jeden odevzdávací pokus.
  • Celý program musí být uložen v souborech se jmény výslovně požadovanými v zadání. Pokud je v zadání požadováno pouze vytvoření určité části programu, musíte pro ni sestavit svůj testovací program main pro vlastní odzkoušení, i když cvičící použije jiný testovací main.
  • Nespoléhejte na úkony prováděné s vašimi funkcemi/proměnnými ve vámi dodaném mainu (např. inicializace proměnných apod.). Při opravě bude typicky použit jiný main a tyto úkony se neprovedou!
  • Odpadne-li cvičení (např. pro státem uznaný svátek), studenti zpracují příklad na ně plánovaný samostatně v termínu, jako kdyby cvičení neodpadlo. Příklady, které měly být do dne odpadlého cvičení odevzdány, je třeba odevzdat nejpozději následující pracovní den.

Pracujte samostatně!

  • Příklady musí student zpracovat samostatně. Tento požadavek nevylučuje možnost společného posouzení metody řešení (algoritmu) s jinými studenty, ale samotné naprogramování musí být vlastní prací. Bude-li zjištěno okopírování zdrojového textu (byť jenom částečné) od jiného studenta nebo z jiného zdroje, bude (u obou studentů) oceněno až 10 trestnými body, resp. projednáním u disciplinární komise, program bude považován za chybný a vrácen k novému naprogramování. Podobně bude postiženo odevzdání programu vytvořeného zcela nebo zčásti další osobou (třeba získanou z internetu). Vyučující mají k dispozici prostředky, jak zjistit, zda program není nadměrně podobný programu jiného studenta (včetně programů odevzdaných v předchozích semestrech)!
  • Nad odevzdanými domácími úlohami probíhá automatická kontrola opisu (se zpožděním, každý úkol s každým). Pokud dojde k nalezení příliš podobného programu, budou potrestání oba autoři odevzdaných úkolů udělením 5 záporných bodů navíc k anulování bodů za řešení. Vážnější případy budou předány disciplinární komisi.
  • Neposkytujte své programy „jako inspiraci“ jiným studentům – mnohokrát se stalo, že student takto získaný program (s mírnými změnami) opsal a odevzdal a za podvod byl postižen i původní autor!

Pracujte zavčas!

  • Obtížnost úkolů se postupně zvyšuje, počítejte i s malými desítkami hodin na vypracování pokročilejších úkolů.
  • Nenechávejte si vypracování úkolů na poslední chvíli – častým důvodem neudělání předmětu je postupný skluz při vypracování úkolů, který vede k neodevzdání úkolů.

Založení odevzdávacího Git repozitáře

  • založte si Git repozitář na GitLab FI
    • Počítačová síť → GitLab
    • přihlašte se fakultním loginem (xněco) a fakultním heslem (typicky stejné jako sekundární heslo do IS MU)
    • klikněte na New Project
    • zadejte název pb071
    • Visibility ponechte na private a toto nastavení nikdy neměnte, jinak lze takové nastavení považovat za opisování!
    • klikněte na Create project
  • povolte přistup k projektu uživateli kontr
    • klikněte na ozubené kolečko v pravém horním rohu a vyberte Members
    • do pole Search for members to update or invite vpište kontr a změnte právo z Guest (výchozí) na Reporter
    • klikněte na Add to project
    • můžete přidat právo svému cvičícímu a poradcům
    • dalším osobám přístup nepřidávejte, takové nastavení lze považovat za opisování!
  • základy používání repozitáře viz Git Tutoriál
  • vytvořený repozitář nikdy nemažte
    • pokud potřebujete odstranit nějaký soubor, smažte jej v lokálním adresáři a proveďte commit a push
    • smazání repozitáře v GitLabu bude penalizováno -5 body

Způsob odevzdání

Vypracovaný úkol lze odevzdat „nanečisto“ (pokusně, není bodováno) a „naostro“ (v případě nalezení chyb může dojít ke stržení bodů). Nanečisto lze zkoušet odevzdávat příklad bez omezení. Naostro lze příklad odevzdávat pouze v omezenou dobu a s omezeným počtem pokusů (viz níže). Zde předpokládáme, že máte korektně vytvořen SVN repozitář, nastavenu cestu k němu atp. (viz založení odevzdávacího repozitáře)

  • Odevzdání nanečisto:
    • Vypracovaný domácí úkol lze odevzdat „nanečisto“ a v případě zjištění problémů dopracovat.
    • Při odevdávání nanečisto nepíšete svému cvičícímu žádný mail ani mu jinak neoznamujete odevzdání.
    • Odevzdání nanečisto provedete tímto způsobem:
      • Nahrajte odevzdávané soubory do vašeho repozitáře.
      • Spusťte skript /home/kontr/odevzdavam pb071 hw0X nanecisto (např. '/home/kontr/odevzdavam pb071 hw01 nanecisto')
      • Za cca 15 minut obdržíte na univerzitní email vyhodnocení vašeho programu.
    • Důležité: Fakt, že vám odevzdání nanečisto neukazuje žádnou chybu neznamená, že ji váš program neobsahuje. Tato chyba může být zachycena rozšířenou sadou testů při odevzdání naostro a může vést ke stržení bodů. Odevzdání nanečisto slouží jako pomocná doplňková služba a nenahrazuje dostatečné otestování odevzdávaného programu. Speciálně nelze uplatňovat argument, že odevzdání nanečisto chybu nenalezlo a tak by body neměly být strženy.
  • Odevzdání naostro:
    • Všechny odevzdávané programy musí být přeloženy a zkontrolovány na počítači Aisa, neboť na něm je bude kontrolovat i vyučující.
    • Pro překlad se používá překladač gcc -std=c99 -pedantic -Wall -Wextra -Werror.
    • Odevzdání naostro - spuštění skriptu:
      • Nakopírujte odevzdávané soubory do vašeho SVN repozitáře (viz výše)
      • Spusťte skript /home/kontr/odevzdavam pb071 hw0X naostro (např. '/home/kontr/odevzdavam pb071 hw01 naostro')
      • Za cca 15 minut obdržíte na IS email vyhodnocení vašeho programu. Další mail obdrží i váš cvičíci a na jeho základě vám budou přiděleny body do poznámkového bloku.
    • Vypracovaný nebo opravený úkol lze odevzdat maximálně 3x.
    • Cvičící má na opravu nahlášeného odevzdaného řešení úkolu 1 týden (typicky ale bude opraveno dříve) a zapisuje výsledek pokusu do poznámkového bloku na ISu. Může studentovi poskytnout dodatečnou informaci o povaze problému, pokud se nějaký vyskytl.
    • Student po obdržení automatického mailu s vyhodnocením nemusí čekat na opravu od cvičího a může provést další odevzdání opraveného příkladu (oprava na základě informací z přijatého mailu) dříve než bude předchozí odevzdání opraveno cvičícím.
    • Pokud je cvičícím úkol shledán zcela v pořádku, jsou uděleny do poznámkového bloku zapsány body. Pokud není úkol do uplynutí konce odevzdávání v pořádku, přidělí cvičící pouze část bodů odpovídající míře fungování aktuálního stavu programu.
    • Po cca 5 týdnech od zadání úkolu dochází ke zveřejnění ukázkového řešení příkladu.
  • Pokud vyučující nalezne v opravovaném programu chyby, oznámí je studentovi (obvykle mailem a zápisem do poznámkových bloků). Do poznámkového bloku zapíše stav odevzdání příkladu včetně krátkého popisu zjištěného problému. Např. „při záporných datech havaruje na výpočtu odmocniny.“
  • K některým složitějším cvičením mají studenti k dispozici testovací data, u všech cvičení si mohou na vzorovém řešení ověřit, jak by měl program pracovat. Vzorová řešení jsou u některých úkolů studentům k dispozici v přeloženém tvaru, po uplynutí doby na odevzdávání bude zveřejněno i ukázkové řešení úkolu.

Ukázkový případ

  1. Student vypracuje příklad a odevzdá „nanečisto“.
  2. Výsledky odevzdání nanečisto ukazují na chybu. Student chybu opraví, ale zatím neztrácí žádné body. Další odevzdání nanečisto již neukazuje na žádnou další chybu.
  3. Student odevzdává „naostro“ a spouští skript informující cvičícího.
  4. Cvičící nalezne rozšířenou sadou testů další chybu, vyplní studentovi do poznámkového bloku snížení získatelných bodů a pošle studentovi popis nalezené chyby.
  5. Student chybu opraví a znovu odevzdává „naostro“ (předtím může využít pro kontrolu opět odevzdání nanečisto).
  6. Cvičící nenalezne další chybu a zapisuje studentovi do poznámkového bloku záznam se získanými body.

Zápočet

Na základě absolvování cvičení dostává student od svého vyučujícího zápočet. Podmínkou pro bezproblémové získání zápočtu je splnění následujících kritérií:

  1. Maximálně 2 absence ve cvičení (více pouze na základě lékařského potvrzení atp; toto potvrzení musí být v požadovaném termínu odevzdáno na studijní oddělení FI).
  2. Celkové bodové skóre z domácích úkolů, průběžného testu a testíků na cvičení ne horší než 65 bodů. Toto skóre ovlivňuje i známku ze zkoušky.
  3. Alespoň 4 domácí úkoly s kladným hodnocením odevzdání naostro (tj. více než 0 bodů). Do podmínky se počítá i bonusový úkol.
  4. Uspěšné vypracování praktického zápočtového příkladu v rámci zápočtového týdne přímo na hodině v navštěvované seminární skupině.
  • Jestliže student uvedené požadavky nesplní - zejména, pokud byl uvedený limit téměř dosažen - může mu vyučující umožnit získání zápočtu po splnění dodatečných požadavků (například vypracování dalšího příkladu, dodatečné vypracování nepovinného příkladu nebo přepracování některého odevzdaného a odsouhlaseného příkladu znovu jiným způsobem).
  • Práci studenta ve cvičení kontroluje a zápočty uděluje výhradně vyučující jeho seminární skupiny. Proti jeho rozhodnutí se lze odvolat k přednášejícímu.
  • Zápočet se de facto dává i studentům, kteří předmět končí zkouškou; v tomto případě se však nezapisuje běžným způsobem do IS, ale pouze se provede zápis do poznámkového bloku.

Bodové rozložení předmětu

Tento semestr je zavedeno následující bodování předmětu. Tabulka představuje přehled bodového rozložení:

Způsob získání bodů Celkový počet bodů
Povinné domácí úkoly 5*12 = 60
Extra body za rozšířené varianty zadání 10+
Extra body za aktivitu na hodině 10+
Další extra body za aktivitu, nalezení chyby v zadaní, etc… neomezeno
- -
Průběžný test 20
Krátké testíky na cvičení 10 * 3
- -
Závěrečný zkouškový test 80

Zápočet je udělen za zisk alespoň 65 bodů (součet Domácí úkoly + Průběžný test + testíky na cvičení + bonusy) a úspěšného vypracování zápočtového příkladu na hodině.

Počet získaných bodů Hodnocení
>= 170 bodů A
>= 150 bodů B
>= 130 bodů C
>= 110 bodů D
>= 95 bodů E
< 95 bodů F
>= 65 bodů Započteno
QR Code
QR Code public:pb071 (generated for current page)