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
.
- Kompilace:
mcs program.cs
- vypadne z toho
program.exe
, ten spustíte buď přímo./program.exe
, nebo pokud nemátebinfmt_misc
, takmono program.exe
- časování běhu, použití připraveného vstupu a uložení výstupu:
time ./program.exe <vstup.in >vystup.out
- 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ší).