Stránky cvičení k NPRG031 (Programování Ⅱ), kruh 42; letní semestr 2018/19.

O cvičení

Toto cvičení z Programování Ⅱ patří k přednáškám Tomáše Holana, je primárně určeno pro kruh 42 a probíhá každé pondělí od 15.40 do 17.10 v učebně SW2. Cvičím ho já, tzn. Jonáš Vidra. Kontaktovat mě můžete e-mailem na adrese příjmení@ufal.mff.cuni.cz. Nezdráhejte se mi napsat, pokud máte jakýkoliv problém – nestíháte úkol? Zapomněli jste heslo do ReCodExu? Nemůžete přijít na písemku nebo na hodinu? Objevili jste chybu v mém výkladu? Něco jste nepochopili? Máte málo bodů? To vše se dá vyřešit, ale musím o tom vědět.

Ujistěte se, že jste do této paralelky zapsáni v SISu a že jste v ReCodExu přiřazeni do příslušné skupiny. Pokud vás totiž budu chtít kontaktovat, budu používat právě tyto kanály a nezapíšete-li se, nebudete informováni o změnách. Přiřazování do ReCodExových skupin by se mělo nějak dít automaticky; v SISu se zapisujte sami, pokud vám to jde, nebo mi řekněte.

Také je potřeba, abyste se dokázali v laboratoři SW2 dostat k funkčnímu počítači s Visual Studiem. To znamená, že potřebujete login do malostranské sítě nebo vlastní laptop.

Plán semestru

Co se probralo

  1. Úvodní hodina. Podmínky zápočtu, povídání o vašich znalostech ze zimního semestru. Úloha na vracení mincí. Rozbor úlohy na načítání čísel, ve které přetékaly integery a upozornění na vlastnost dvojkového doplňku, kdy INT_MIN nemá kladný protějšek.
  2. Základy C♯. Přehled syntaxe, metoda Main(), třídy s výhradně statickými členy, základní typy int, float, char a bool, System.Console.{Read,ReadLine,Write,WriteLine}(), podmíněný příkaz if-else, cyklus while.
  3. Dokončení základní syntaxe C♯. Pole a práce s nimi, včetně vícerozměrných; procházení for-cyklem. Stringy a základní práce s nimi, upozornění na neměnnost (immutability) stringů.
  4. Objektový návrh – úloha na určení pozice a orientace objektu ve 3D prostoru. Přetěžování operátorů (a kdy se nemá používat), přetížený + pro string (a na co dát pozor), interpolace ve WriteLine().
  5. Diskrétní simulace. Probírali jsme návrh simulátoru pošty pomocí kalendáře i bez něj. Generické typy, kolekce List, Queue a další.
  6. Windows Forms. Ukazovali jsme si vytvoření jednoho okna, hrátky s designerem, základní obsluhu událostí. Práci s WF bez použití designeru (layouts, konkrétně TableLayoutPanel). Popupy pomocí MessageBox (a zmínili jsme – bez ukázky – jak by se to samé udělalo pomocí vaší vlastní Form). Základní načtení obrázku ze souboru a jeho zobrazení.
    Za domácí úkol je vytvoření aplikace pro sólovou hru pexesa, kterou budu hodnotit ručně. Bodování je následující:
    • 3 body za základní funkcionalitu, tedy program funguje, kartičky se správně odhalují, po dohrání se člověk dozví, že dohrál.
    • 3 body za možnost nastavení velikosti hrací plochy.
    • 3 body za možnost výběru obrázků na kartičkách uživatelem (načítání ze souborového systému jsme neprobírali, prostudujte dokumentaci).
    • 1 bod za pěknou výchozí sadu obrázků.
  7. Dynamické programování. Levenshteinova vzdálenost a její složitost časová i prostorová. Psaní na klávesnici a jeho složitost v různých případech.
    Za domácí úkol kromě úlohy v ReCodExu také vytvořte co možná nejlepší klávesnici pro tuto úlohu, vzhledem k textu, který jsem vám zaslal e-mailem. Řešení (tabulku znaků, počet potřebných úhozů a popis, jak jste danou tabulku vygenerovali) mi posílejte e-mailem do pondělního rána. Bodování je následující:
    ÚhozůBodů
    <6800012
    68000–6999911
    70000–7199910
    72000–739999
    74000–759998
    76000–779997
    78000–799996
    ≥800000
  8. Dynamické programování Ⅱ: Sokoban a Théseus, docela do podrobna. K tomu jsme si v rozboru domácího úkolu ukazovali m.j. (letem světem; jenom, že to existuje) lambda funkce, funkce vyššího řádu (Where a Select), Dictionary a tuples.
  9. Spojitá simulace. Kreslení do okna pomocí PictureBoxu, ve kterém se najde Graphics, na kterou kreslíme pomocí {Draw, Fill}{String, Ellipse, Rectangle, …} perem (Pen) nebo štětcem (Brush). Periodická aktualizace simulace pomocí Timeru nebo pomocí System.Diagnostics.Stopwatch. Jednoduché řešení kolizí pomocí bounding boxů a na co si dát pozor.
    Kromě toho jsme si ukázali, jak se ve Visual Studiu používají dynamické knihovny přidáváním referencí na assemblies.
    Naopak jsme si neukázali, jak se řeší vstup. Na čtení klávesnice můžete použít handler KeyPress, nebo ve složitějších případech (kdy vás zajímá nejen stisk, ale i doba držení, což ve hrách bývá) KeyDown a KeyUp. Pokud chcete zjistit, kam uživatel kliká a řešit zároveň i tahání myši po kliknutí, můžete použít handlery mouseDown a mouseUp (třeba na okně nebo na PictureBoxu) a v mezičase mezi těmito dvěma eventy číst globální Cursor.Position. Pozor na to, že tato pozice udává souřadnice vůči obrazovce. Pokud chcete vědět souřadnice uvnitř okna, převedete je do lokálních uvnitř Control (třeba PictureBoxu) pb pomocí pb.PointToClient(Cursor.Position).
    Kód programu ze cvičení je zde.
    K zápočtovým programům vizte odkazy níže.
  10. Velikonoční pondělí – cvičení odpadá.
  11. Test-driven development.
  12. Test-driven development.
  13. Rozbor „těžkého problému“ a vysokoúrovňový návrh architektury programu.

Co bude

  1. Zápočtový test.

Podmínky získání zápočtu

Abyste získali zápočet, musíte

odevzdávat úkoly
Úlohy se dělí na běžné a bonusové a řeší se v ReCodExu, který už znáte a máte tam účet. Na každé hodině zadám jeden běžný. Termín jeho odevzdání je do začátku příštího cvičení, na kterém si úlohu společně rozebereme. Je potřeba získat alespoň 75 % všech bodů z běžných úloh. Bonusové úlohy mají delší časový limit a nepočítají se do potřebných 75 %.
vypracovat zápočtový program
Vizte sekci Zápočtové programy.
aktivně se účastnit cvičení
Účast je povinná, můžete chybět nejvýše na třech cvičeních. Vyšší absenci si však můžete nahradit – kontaktujte mne.
úspěšně napsat zápočtový test
Test bude spočívat v naprogramování jednodušší úlohy v C♯ během necelých 90 minut. Testuje se tím vaše schopnost psát kód a ovládat Visual Studio, nikoliv znalosti algoritmů. Řádný termín proběhne na posledním cvičení, opakování pak ve zkouškovém.

Jednotlivé kategorie se vzájemně ovlivňují – pokud vám bude chybět pár bodů z úkolů, ale poctivě jste chodili a byli jste při hodinách aktivní, zápočet dostanete. A naopak.

Co dělat, když máte málo bodů

Vypracujte úlohy, které vám chybí nebo které jste nezvládli dostatečně dobře. ReCodEx vám za ně nedá body, ale procentuální úspěšnost řešení spočítá. Poté mě kontaktujte. Dbejte na přehlednost a kvalitu kódu, nejen na správnost jeho běhu.

Zápočtové programy

Nutnou podmínkou k získání zápočtu je napsání a obhájení zápočtového programu. Zápočtový program začíná výběrem tématu, kdy je iniciativa na vaší straně. Doporučuji vám výběr neodkládat. Po jeho schválení a vypracování samotného programu po vás budu žádat jeho předvedení (obhajobu) v malostranské počítačové laboratoři.

Téma

Téma programu si musíte sami vymyslet a předložit mi ho ke schválení. Na rozdíl od zimního semestru musí být program interaktivní real-time simulace, dobrým námětem jsou proto počítačové hry. Nemusíte vymýšlet vlastní, herní systém můžete okopírovat třeba z nějaké arkády z osmibitových počítačů – i když iniciativě se meze nekladou.

Vhodné jsou klony her třeba ze ZX Spectra, Atari 800XL, Commodore 64 nebo arkádových počítačů ze začátku 80. let. Příliš jednoduchý je Arkanoid, Tetris nebo Pong. Mezi jednoduché, ale už přijatelné patří Asteroids nebo Space Invaders, složitější jsou třeba Manic Miner, Boulder Dash, Atic Atac, 1942, Spy Hunter, Knight Lore, Jet Set Willy nebo Sabre Wulf. Nenechte se ale omezovat předvýběrem – je vás 20, takže očekávám rozmanitost. Pokud přijdete s originálním nápadem, chci podrobnější zadání, aby bylo na konci jasné, jestli jste udělali, co jste slíbili.

Zadání

Jakmile máte téma, je potřeba sepsat detailnější zadání, tedy seznam vlastností, které má výsledný program mít. Pokud se inspirujete existující hrou, stačí poslat odkaz na video zachycující průběh hry a popsat případné odchylky od originálu. Někdy je potřeba se rozepsat, ale většinou jako zadání stačí odrážkový seznam nebo dva-tři odstavce textu. Ze zadání by mělo být zjevné, jak bude vypadat uživatelské rozhraní, tedy jaký bude výstup a způsob ovládání. V tuhle chvíli už byste měli mít rozmyšlené hrubé rysy implementace. Zadání si opět nechte schválit, předejdete tak nepříjemnostem.

Vypracování

Pak přichází na řadu vypracování programu, testovacích vstupů a dokumentace, které je zcela ve vaší režii.

Jazykem zápočtových úloh je C♯ + čeština / slovenština / angličtina. Jiné jazyky je možné použít po předchozí domluvě – bez problémů je připustím, bude-li váš zápočťák úloha z praxe a jazykem nebude Pascal.

Doporučuji vám vyzkoušet, že se program dá zkompilovat a spustit na počítačích v labu – prostředí mého, vašich a školních počítačů mohou být odlišná a dobře napsaný program by sice měl běžet všude, ale v případě problémů budu programy testovat ve škole.

Odevzdání

Zdrojové kódy a všechna potřebná data odevzdávejte v archivu e-mailem, dokumentaci dodejte v nějakém rozumném formátu, nejlépe jako PDF nebo archiv s prolinkovanými HTML soubory. Prosím, nepoužívejte .doc a podobné formáty – pokud budete dokumentaci psát ve Wordu, vyexportujte mi ji do PDF. Pokud jsou soubory velké (více než jednotky megabajtů), vystavte je na web a pošlete mi odkaz. Neposílejte EXE soubory a zbytečný obsah – před odesláním projektu ve Visual Studiu proveďte Clean Solution.

Po odevzdání se můžou stát tři věci: buď program rovnou schválím (v případě, že skutečně nebudu mít žádné připomínky), nebo vám ho rovnou vrátím k dopracování (pokud budou mé výhrady velké), nebo si vás pozvu na schůzku, na které mi program předvedete a obhájíte (většinový případ).

Obhajoba a hodnocení

Na přečtení a ohodnocení programu potřebuji alespoň týden a pak si musíme domluvit společný termín schůzky. Termín odevzdání proto stanovuji na 14. července. Neznamená to, že při odevzdání 1. srpna už nedostanete zápočet, ale po uplynutí termínu vám negarantuji ohodnocení – čím pozdější odevzdání, tím menší máte šanci, že se k vašemu programu dostanu včas. Naopak velmi doporučuji odevzdat program co nejdříve – nejenže vás budu mít rád, ale hlavně dostanete možnost opravit případné nedostatky..

Zápočtový program je hodnocený podle následujících kritérií, v pořadí podle klesající důležitosti:

  1. Stabilita programu (zda nepadá, nezasekává se, neleakuje paměť …).
  2. Čitelnost kódu a komentářů.
  3. Použitelnost a funkčnost programu (zda dělá něco užitečného a zda se dá dobře ovládat).
  4. Splněnost zadání.
  5. Rozsah programu.
  6. Množství vložené práce.

Totální selhání v libovolném bodu automaticky znamená neúspěch, ale první čtyři body jsou posuzovány přísněji než zbylé dva. Jak tedy vidíte, je lepší odevzdat dobře dokumentovaný stabilní program se dvěma funkcemi, než padající zmetek s deseti funkcemi bez návodu.

Konzultace a kontakt

Potřebujete-li cokoliv, obraťte se na mě po hodině nebo e-mailem. Osobní konzultace jsou možné po domluvě v kanceláři S409.

Programy se předvádějí v malostranském labu, v SW2 nebo někde poblíž – podle toho, kde bude volno.