Cvičení NPRG030 – Programování 1 (ZS 2023/24)

Úterý 9:50, N8

Cvičení probíhá v jednom bloku s cvičením z Algoritmizace od 9:00. Předměty Algoritmizace a Programování 1 jsou úzce spojené, takže je reálně budeme chápat jako jedno dlouhé cvičení. Další podrobnosti najdete také na stránce Cvičení NPRG062 – Algoritmizace.

Zápočtový test proběhl 19. 12. Pokud máte zájem o další termín, napište mi mail.

Obsah stránky

Co jsme dělali

3. 10. (1. cvičení)

Algoritmizace: úložky – Kuličky, Hra s mincemi, Známky.

Programování: základy – operátory, proměnné, vstup, výstup, podmínky (programy ze cvičení), úlohy na procvičení.

10. 10. (2. cvičení)

Algoritmizace: úložky – Nejtěžší mince, Cesty věží na šachovnici, Vážení kuliček.

Programování: seznamy, textové řetězce, cykly (programy ze cvičení), úlohy na procvičení.

17. 10. (3. cvičení)

Algoritmizace: O\mathcal{O} (složitost).

Programování: funkce (programy ze cvičení), úlohy na procvičení – funkce, Odhad π\pi Metodou Monte Carlo.

24. 10. (4. cvičení)

Algoritmizace: pokračování O\mathcal{O} (složitost).

Programování: DRY (Don't Repeat Yourself), refaktorování, list comprehensions (programy ze cvičení), úlohy na procvičení – refaktorování, funkce pro textové řetězce, bludiště.

31. 10. (5. cvičení)

Algoritmizace: algoritmy teorie čísel – rychlejší Eratosthenovo síto, číselné soustavy.

Programování: slovník (dict), práce se soubory (programy ze cvičení), úlohy na procvičení – frekvenční analýza, soubory.

7. 11. (6. cvičení)

Algoritmizace: binární vyhledávání (Házení vajíček z mrakodrapu).

Programování: přehled knihoven v Pythonu (sys, os, enum, logging, random, argparse, json, csv), Keř a Strom (programy ze cvičení).

14. 11. (7. cvičení)

Algoritmizace: spojové seznamy.

Programování: objekty, spojové seznamy, linting (programy ze cvičení), úlohy na procvičení.

21. 11. CVIČENÍ NEBUDE

Cvičení nebude z důvodu konání Dne otevřených dveří.

28. 11. (8. cvičení)

Algoritmizace: zásobník, fronta, halda – cyklická fronta v poli, operace nad haldou.

Programování: podrobnosti k zápočtovým programům (též níže), Git (tahák) a MFF GitLab, dědičnost a kompozice (programy ze cvičení).

5. 12. (9. cvičení)

Algoritmizace: rekurze – Fibonacciho posloupnost, Hanojské věže, Generování permutací, Generování podmnožin.

Programování: rekurze, generátory (programy ze cvičení).

12. 12. (10. cvičení)

19. 12. (11. cvičení)

Programování: zápočtový test.

9. 1. (12. cvičení)

Algoritmizace + programování: základní grafové algoritmy – BFS, DFS (pokud bude čas, tak navíc i Dijkstrův algoritmus a A*), úlohy na procvičení – Cesta králem na šachovnici, Nejkratší cesta v ohodnoceném grafu, Bipartitní grafy (programy ze cvičení).

Přednáška

Cvičení je vypsáno k přednášce Martina Pergela (středa 14:00).

Podmínky na zápočet

Pro získání zápočtu z programování je potřeba

Zkouška bude až v letním semestru, takže zápočet je to jediné, co musíte získat.

Domácí úkoly

Plánuji zadat celkem 10 úkolů po 10 bodech. Celkem tedy za domácí úkoly budete moct získat až 100 bodů, takže na zápočet bude potřeba 75 bodů.

Za aktivní účast na cvičeních můžete získat bonusové body, konkrétně až 2 bod za každé cvičení. V průběhu semestru bude 11 cvičení (a jedno navíc na zápočtový test), takže můžete získat až 22 bonusových bodů. Účast na cvičeních tedy není povinná, ale je silně doporučená.

U domácích úkolů se bude hodnotit jak funkčnost (jestli program dělá to, co má), tak kvalita kódu (čitelnost, atd.). Zpravidla bude 6 bodů za funkčnost a 4 body za kvalitu, ale u některých úloh může být poměr bodů jiný.

Na každý úkol budete mít dva týdny a v tomto čase ho můžete odevzdat víckrát. Pokud stihnete úkol odevzdat během prvního týdne od zadání, dám vám zpětnou vazbu ohledně kvality kódu a vy budete mít šanci váš program během druhého týdne vylepšit a odevzdat znovu. Pokud úkol v prvním týdnu odevzdat nestihnete, ničemu to nevadí, akorát se tím připravíte o moji zpětnou vazbu a možnost kvalitu kódu vylepšit. Pro odevzdávání budeme používat systém ReCodEx.

Jako řešení domácích úkolů odevzdávejte pouze vaše výtvory, nikoli kód napsaný někým jiným (opsaný od spolužáka/spolužačky, zkopírovaný z internetu, vygenerovaný pomocí ChatGPT, …). Rozhodně není zakázáno hledat na internetu nebo konzultovat se spolužáky, jak se naprogramuje nějaká dílčí část úkolu, ale je zakázáno kopírovat řešení celé úlohy. Podobně pro LLMs (ChatGPT a další) – můžete se ptát, jak se udělá nějaká konkrétní věc v Pythonu, ale nevydávejte vygenerovaný kód za své řešení (v tomto kontextu bych zmínil Stanovisko MFF UK k využívání umělé inteligence ve výuce, zejména bod Buďte transparentní).

Zápočtový test

Test se bude psát nejspíš na cvičení 19. 12. Test je praktický – vaším úkolem bude naprogramovat a odladit řešení úlohy – a bude zadán přes ReCodEx (takže ho budete řešit jako domácí úkoly, akorát s časem omezeným délkou cvičení). Další termíny budou vypsány podle potřeby během zkouškového období – celkem máte na test tři pokusy.

Zápočtový program

Zápočtový program je větší kus software, který budete programovat doma během semestru (případně během zkouškového období).

Shrnutí požadavků

  • Specifikaci (téma) mi pošlete mailem do 12. 1. 2024.
  • Program se odevzdává přes MFF GitLab do 18. 2. 2024.
  • Součástí programu je dokumentace, ukázky použití a README.md.
  • Vytvořte rozumnou strukturu projektu (složky pro zdrojové kódy a dokumentaci).

Výběr tématu

Téma zápočtového programu navrhujete vy. Nejpozději do konce výuky v ZS (12. 1. 2024) si vyberte téma a zašlete mi mailem specifikaci programu (zhruba jeden odstavec popisu toho, co program bude dělat). Já se s vámi domluvím, jestli je téma vhodné a případně ho společně upravíme. Doporučuji vybrat si téma už před Vánoci, protože vánoční prázdniny můžou být dobrý termín, kdy na programu pracovat. Pokud vás žádné téma nenapadá, podívejte se níže.

Zápočtový program může a nemusí být napsaný v Pythonu – použijte jazyk, který umíte nebo který nejlépe sedí na doménu problému. Na druhou stranu, já bych měl být schopný kód vašeho programu přečíst a pochopit, takže pokud chcete použít nějaký jiný jazyk než Python, domluvte se na tom se mnou už ve specifikaci programu.

Odevzdání

Zápočtový program byste měli odevzdat nejpozději do konce zkouškového (18. 2. 2024), poté už za něj zápočet neudělím. Program se odevzdává prostřednictvím MFF GitLabu. Repozitář pro odevzdávání vám bude vytvořen (/teaching/nprg030/2024-winter/student-LOGIN_DO_SISU). Naklonujte si ho do svého počítače a vyvíjejte program v něm za použití Gitu (jak jsme si ukázali během cvičení). Až budete mít hotovo (včetně uživatelské a programátorské dokumentace), pošlete mi mail s odkazem na váš repozitář a já program ohodnotím.

V repozitáři si vytvořte vhodnou strukturu projektu – minimálně vytvořte složky pro zdrojové kódy programu a pro dokumentaci. Je lepší, když zdrojové kódy nejsou přímo v kořenovém adresáři projektu, ale jsou ve vlastní složce (aby se nemíchaly s testy, dokumentací, konfiguračními soubory, ...). V Pythonu bývá zvykem pojmenovat složku se zdrojovými soubory podle názvu vašeho programu (v jiných jazycích dost často uvidíte složku pojmenovanou src). Taky upravte soubor README.md, aby obsahoval základní informace o vašem programu a odkaz na dokumentaci.

Odevzdávaný program by měl být rozumně odladěný. Především by měl jít spustit bez chyb. Když program budu normálně používat, tak by neměl spadnout. Pokud například program očekává vstup v souboru, tak by neměl spadnout, pokud soubor neexistuje. Měl by místo toho vypsat rozumnou chybovou hlášku pro uživatele.

Použití Gitu

Během vývoje programu používejte Git (jak jsme si ukázali během cvičení). Snažte se dělat commity průběžně (např. vždy když dokončíte nějakou ucelenou část práce), ať si u toho i vyzkoušíte, jak s Gitem pracovat. Nezapomeňte, že některé soubory do Gitu nepatří (třeba .exe soubory a další produkty build systému), používejte proto vhodný soubor .gitignore (např. pro Python je vhodný tento – uložte si ho do kořenového adresáře repozitáře a přejmenujte na .gitignore). Pokud si potřebujete Git připomenout, můžete využít třeba tenhle návod, Git ve 100 sekundách, ale nám stačí prvních 60, nebo to samé, ale detailněji.

Dokumentace

K zápočtovému programu napište jeho dokumentaci. Ta by měla mít tři hlavní části:

Povinnou součástí uživatelské dokumentace je informace o tom, jak program spustit (pokud má víc .py souborů, tak který se má spouštět), jak specifikovat jeho parametry, vstupní soubory, atd. a jak program ovládat (např. pokud programujete hru, tak jaké klávesy slouží k čemu). Pokud váš program pracuje s nějakými vstupními soubory, popište jejich formát. Pokud je pro spuštění programu potřeba nainstalovat nějaké knihovny nebo nástroje (např. programujete hru v Pygame), napište jaké a v jaké verzi (a ideálně doplňte i jak je nainstalovat).

V programátorské části dokumentace byste měli vysvětlit hlavní strukturu a koncepty vašeho programu. Když si projekt otevřu já nebo váš spolužák, měli bychom být podle dokumentace schopní program rozšířit a případně vědět, kde v kódu hledat, kdybychom měli opravovat nějakou chybu. Je vhodné jako součást programátorské dokumentace mít popis abstraktního návrhu programu (rozdělení do tříd a co má která třída za úkol) a stručné shrnutí zdrojových souborů (hlavně když jich bude hodně a budou strukturované složek). Taky je fajn psát dokumentační komentáře k funkcím a třídám (aspoň k těm nejdůležitějším).

Součástí dokumentace by také měly být příklady použití. Když program vyžaduje nějaké netriviální vstupy k tomu, aby šel spustit, přidejte příklady takových vstupů do dokumentace. Například pokud váš program kreslí graf na základě dat ze vstupního souboru, dejte do dokumentace ukázkový soubor s daty. Pokud programujete hru nebo jiný interaktivní program, pak nejspíš příklady použití nejsou potřeba.

Doporučuji dokumentaci psát anglicky, ale pokud si na to nevěříte, můžete ji napsat česky (příp. slovensky).

Dobrým způsobem, jak psát dokumentaci, je pořídit si složku documentation (nebo docs) ve vašem repozitáři a v ní mít několik Markdown (.md) souborů a rozcestník README.md s odkazy na ostatní soubory. Markdown je jednoduchý jazyk na formátování dokumentů. Pokud ho neznáte, rychlý přehled základních příkazů najdete tady, podrobnější návod pak tady nebo tady.

Další informace a nápady na témata

Spoustu užitečných informací o zápočťácích už sepsali jiní, tak nemá smysl je znovu psát. Tady je pár odkazů: Martin Mareš má na webu svého cvičení hezky sepsané informace o zápočťácích. Navíc poskytuje i seznam témat pro inspiraci (pro ZS je vhodná obtížnost 3 a vyšší), takže doporučuji přečíst. Detailní informace včetně nápadů na témata sepsal taky Jirka Mayer. Nakonec, Rudolf Kryl má na webu návod na psaní dokumentace k zápočťáku, také doporučuji přečíst.

Užitečné informace

Dotazy a konzultace

Pokud vám něco, co říkám, nebude jasné, ptejte se. Ideálně hned, dokud je to aktuální. Je velmi pravděpodobné, že v učebně sedí několik dalších lidí s úplně stejným dotazem, ale bojí se zeptat. Nebojte se. Cvičení je pro vás. Cílem je, abyste látku pochopili, ne abych ji já jen zbytečně odvykládal.

Pokud se stydíte zeptat, nebo je váš dotaz moc dlouhý či kontroverzní, můžete se zeptat po skončení cvičení. V tomto čase většina ostatních studentů už odejde a zůstanou jen ti, kteří se mnou chtějí něco řešit.

Pokud by někdo chtěl něco dovysvětlit nebo se mu nedařilo a chtěl by probrat cokoliv jiného, napište mi email a domluvíme se na termínu konzultace.

V čem budeme programovat a jak to nainstaluju

Na první přednášce bude ukázka použití interpretu Pythonu z příkazové řádky, potom jednoduché prostředí IDLE, které se instaluje společně s Pythonem a nakonec Visual Studio, ve kterém bude probíhat zbytek přednášek. Já budu na cvičení používat Visual Studio Code, což je textový editor inspirovaný Visual Studiem, ale podstatně menší a hlavně běží i na Linuxu a macOS. Taky si nejspíš ukážeme PyCharm od JetBrains, který můžete jako studenti používat zdarma. Pokud už máte nainstalovaný nebo oblíbený jiný editor (Atom, Sublime, ...), problém s tím nemám.

Na počítačích v učebně jsou všechny potřebné nástroje už nainstalované.

Instalace VS Code

  1. Nainstalujte si Python 3.
  2. Nainstalujte si Visual Studio Code.
  3. Přidejte si do VS Code rozšíření pro Python (rozšíření se do VS Code přidávají v levém panelu v ikoně Extensions nebo přes odkaz z webového prohlížeče).

Stejné pokyny v angličtině najdete taky v dokumentaci VS Code.

ReCodEx

Domácí úkoly z obou cvičení budou zadávány a odevzdávány pomocí systému ReCodEx.

Jak rozchodit ReCodEx:

Chci se procvičovat doma a nevím jak

Středoškolská soutěž Kasiopea má archiv domácích kol, kde se obtížnost úloh stupňuje od velmi lehkých k velmi náročným.

Korespondenční seminář z programování má online k dispozici nejen úlohy, ale i kuchařky vysvětlující nejrůznější oblasti algoritmizace, diskrétní matematiky a spousty dalších užitečných oblastí. Lehčí úlohy najdete v začátečnické kategorii.

Průvodce labyrintem algoritmů je kniha (dostupná online) shrnující látku předmětů Algoritmizace, Algoritmy a datové struktury I a Algoritmy a datové struktury II. Její úvodní kapitoly rozebírají paměťovou a časovou složitost, binární vyhledávání, Euklidův algoritmus, třídění, haldy apod.

Přístup k souborům na školních počítačích

Pokud pracujete na školních počítačích a chtěli byste k vytvořeným souborům mít přístup i z domova, jde to poměrně snadno – stačí je uložit na AFS:

Z domova pak k AFS můžete přistupovat pomocí vzdáleného přístupu k počítačům v laboratoři Rotunda (co dalšího s nimi můžete dělat se dozvíte zde):

Cvičení pro pokročilé

Pokud jste už zdatnější a myslíte si, že by vás cvičení nebavilo (například pokud jste řešili KSPčko), můžete se zapsat na cvičení Martina Mareše pro pokročilé. Můžete také chodit i na obě cvičení současně (v takovém případě si v SISu nechte zapsané moje cvičení).

Část textu na této stránce jsem opsal od Jirky Mayera. Díky, Jirko!