e-x-a.org » NPRG031 Programování 2 2016/17

Trochu informací o cvičení z programování 2

  • ČAS: každý čtvrtek 10:40 v SU2, LS 2016/17.
  • KONTAKT: exa.exa@gmail.com, do předmětu napište NPRG031 (jinak hrozí, že zapadnete do nánosu ostatních mailů).

Zápočet

Na zápočet potřebujete splnit následující podmínky:

  • plnit domácí úkoly v CodExu (požadavek: mít aspoň polovinu bodů)
  • na cvičeních vypadat aktivně a občas přispět k obecnému pokroku aktivitou u tabule (body za tohle jsou vidět v codexu, požadavek: nemít nápadně málo bodů)
  • napsat test (termíny viz. dole)
  • vyrobit zápočťák

Pokud už umíte programovat v objektově orientovaném jazyce (tj. C#, C++, Jáva) a myslíte si, že požadavky pro vás budou triviální, dejte mi vědět na hodině nebo mailem, ať se zbytečně nenudíte docházkou.

Zápočťáky

Na zápočet si potřebujete vymyslet, navrhnout a naprogramovat zápočtový program. Mělo by jít o nějaký střední projekt (cca 500-1000 řádků smysluplného kódu) který neotřele řeší nějakou zajímavou nebo zábavnou úlohu. Cílem zápočťáku je prokázat, že umíte správně objektově navrhnout a naprogramovat netriviální kus software. Kromě C# můžete používat i C++ a rozumně i jiné objektovité jazyky.

Vhodná témata jsou miniaturní rychlé hry (obecně jakékoliv hry jsou pro objektový návrh velice vhodné), miniaturní programovací jazyky (želva/karel, virtuální/paralelní/magické CPU, forth), kreslítka (fraktální a bezkontextové obrázky ) nebo nějaké pěkné algoritmy a datové struktury.

Inspirace dále např. u Martina Mareše nebo třeba tady

Nevhodná témata jsou věci s příliš nejasným využitím nebo programy co jsou na internetu už dostupné v tisících kopií a různých variantách. Rozšíření zápočťáků z Programování 1 je možné, ale uvědomte si, že např. piškvorky mají určité rozšiřitelnostní limity.

Na zápočťáku se hodnotí:

  • kvalita kódu (čitelnost a struktura)
  • kvalita implementace (nechcípe to, nepočítá to špatně)
  • rozsah (a přiměřená obtížnost řešené úlohy)
  • dodržení termínů (za zmeškání termínu budu přidávat obtížnost)

Termíny:

  • dohodnutí tématu: 31. 3. 2017, 23:59:59.999
  • doporučené odevzdání zápočťáků: na posledním cvičení (pozor, přes červen pravděpodobně většinou nebudu k dispozici!)
  • Konečný termín konečného konce všeho: 15. 9. 2017.

Upozorňuju, že “dohodnutí tématu v termínu” neznamená, že mi 31.3. ve 23:59:59.998 přijde mail. Téma je potřeba prodiskutovat a odsouhlasit. Počítejte s tím, že první návrh většinou neprojde.

Téma a splněnost zápočťáků je evidovaná v SISu v grupíku (teď se tomu možná říká “studijní mezivýsledek”). Zkontrolujte si to, nesrovnalosti hlašte.

Testy

Testy budou praktické — v rámci posledních cvičení (bude “včasný doporučený” a “normální opravný” termín) na počítači zpracujete jednoduché zadání. Časový limit je délka cvičení, tj. 90 minut.

Průběh cvičení

23. 2. 2017

Úvod, předběžnosti, IDE C#, crash-course v C-like jazycích. Console, konvertování vstupu na integery a zpátky.

DÚ: Napište mi mail, ať vás přidám do codexu. Další úkoly už budou jen a jen tam.

2. 3. 2017

Pořádnější načítání vstupu. OOP z hlediska uživatele objektů. List, Queue, arraye. Předávání parametrů výstupem nebo referencí.

9. 3. 2017

Objekty vyrobené ze zvířat, zoo, dědičnost, polymorfismus.

16. 3. 2017

Generické funkce a třídy. Soubory.

23. 3. 2017

Ukládání obrázku do BMP. Objektový základ na Dijkstrův algoritmus.

30. 3. 2017

Slovo o Eulerovských cestách na grafech.

Dodělaný Dijkstra + ukázka jak dát ostatním objektům najevo, že vaše třída může být uvnitř SortedSet a podobných kontejnerů.

6. 4. 2017

Přetížené operátory a pěkná matematika. Slovo o skalárním součinu. Simulace střelby mimo cíl. Pozor, doplnil jsem tam správně exponenciální strhávání rámcem (tj. vítr a odpor vzduchu) nezávislé na volbě deltaT.

Řešení jednoho oblíbeného DÚ je poblíž (antigoogle, do URL dopište kanal.cs).

13. 4. 2017

Praktikum klikacích a oknovitých uživatelských interfaců. (původní demo na hraní zde, vyzkoušejte si i přepsaný program co vzniknul na cviku (ten původní jsem ztratil protože neumím poslat mail), je zajímavé pozorovat že chování je opravdu chaotické, ale jde dojít i k různým zajímavě tvarovaným metastabilním stavům)

20. 4. 2017

Praktikum herních uživatelských interfaců.

Basecode zde, případně celý projekt pro MSVC zde.

Výsledek z hodiny zde (přidal jsem pár primitivních efektů).

Pár linků navíc:

  • Kdybyste hry chtěli programovat v C#, můžete podobnou věc dostat pomocí Tao frameworku .
  • Pokud chcete hru v C++ přenositelnou na většinu známých systémů, použijte např. SFML
  • Tahle a tahle stránka popisují většinu 3D grafických technik/efektů které kdy budete potřebovat.
27. 4. 2017

Diskrétní simulace a časové rozvrhy. Příklad inspirovaný Transport Tycoonem zde (jen třída).

4. 5. 2017

ZÁPOČTOVÝ TEST BETA — příklad k vyřešení v časovém limitu na počítači (můžete používat libovolnou tištěnou nebo psanou literaturu a oficiální dokumentaci (MSDN apod.), nesmíte komunikovat). Vyzkoušet by si to měli všichni, aby věděli jak bude vypadat zápočtový test na konci roku. Motivace navíc: Kvalitní řešení (přesné podmínky budou součástí zadání) půjdou uznat jako zápočtový test.

Konzultace zápočťáků.

11. 5. 2017

Vícevláknové programování (jak použít všech 8 jader). Kód zde.

18. 5. 2017

Programátor bez vlastního programovacího jazyka není programátor.

Metodologické cvičení: AST a reprezentace bezkontextových jazyků. Výsledný top-down parser je tady.

Můžete si rozmyslet, jak:

  • zlepšit tokenizér tak, aby mezi vším nebylo potřeba dělat mezery
  • dodělat parseXXX funkce tak, aby správně oznamovaly chybu
  • nejjednodušším způsobem přidat podporu pro while cykly
  • z AST zkontrolovat, že uživatel nepoužije nepřiřazenou proměnnou
  • z AST vyprodukovat zdrojový kód v C#, který dělá to samé co program

(poslední 2 věci jsou vhodný náhradní domácí úkol)

25. 5. 2017

ZÁPOČTOVÝ TEST — příklad k vyřešení na počítači v časovém limitu (můžete používat libovolnou literaturu a oficiální dokumentaci (MSDN apod.), nesmíte komunikovat a stackově overflowovat).

Opravný termín bude někdy na konci zkouškového nebo v září (původní termín, hned v pátek ráno v 9, bohužel nepůjde), o konkrétním datu vyvolám hlasování. Bylo by ale lepší, kdyby opravný termín nebyl potřeba.

Odevzdávání zápočťáků, rozdávání zápočtů, hotovo.

Bonus!!

Na cvičeních se občas oháním argumenty typu “...ale tohle je fuj”, “...z toho není moc poznat, co to dělá”, případně občas “když budete dělat tohle, budete trpět”. O důvodech podobných pohnutků a o obrovském množství velice praktických poznatků, které vznikly při vývoji jednoho z nejrozšířenějších programovacích prostředí na světě vůbec, se můžete dočíst v knížce E. S. Raymonda The Art of UNIX Programming (online verze). Popisuje i poměrně masivní kus počítačové historie. Pokud poprvé programujete nějaký větší systém, najdete návod (a hodně vytříbených odstrašujících příkladů) o tom, jak to nezmršit. Občas trochu filozofické. Pokud se vám z nějakého důvodu nezamlouvá C#, najdete tam dost pádných argumentů, proč to tak je a proč nemá cenu to řešit.

Jak na linuxu skompilovat aplikaci se System.Windows.Forms?

Stáhněte si do mono knihovnu, která to podporuje (např. na debianu to je libmono-system-windows-forms4.0-cil), načež můžete přidávat assembly reference třeba takhle:

mcs -r:System.Drawing -r:System.Windows.Forms -r:System.Numerics gravitace.cs
Jak si program vyzkoušet ve stejném prostředí, jako CodEx?

Na předmětu Úvod do UNIXu se dozvíte, jak se přihlásit na nějaký UNIX v labu, a jak tam editovat soubory a spouštět programy atd. Program si připravte do program.cs, testovací vstup do vstup.in.

  1. Kompilace: mcs program.cs
  2. vypadne z toho program.exe, ten spustíte buď přímo ./program.exe, nebo pokud nemáte binfmt_misc, tak mono program.exe
  3. časování běhu, použití připraveného vstupu a uložení výstupu: time ./program.exe <vstup.in >vystup.out
  4. fajn kontrola co je špatně: diff -u muj_vystup.out spravny_vystup.out |less

POZOR: v CodExu z tohoto důvodu většinou nefunguje Console.ReadKey(). Ke konzoli se chovejte jako k souboru a použijte místo toho Console.Read() (pokud opravdu potřebujete jednotlivé znaky) nebo .ReadLine() (a roztrhejte si to na znaky ručně, je to většinou trochu rychlejší).

Shrnutí OOP v C-like jazycích