Cvičení NPRG031 – Programování 2 (LS 2022/23)
Pondělí 9:00, N8
Termín odevzdání zápočtového programu je 31. 8. 2023.
Obsah stránky
Co jsme dělali
13. 2. (1. cvičení)
Základy C#: proměnné, podmínky, cykly – úlohy na procvičení (programy ze cvičení).
20. 2. (2. cvičení) – suploval Jirka Mayer
Základní datové struktury v C# (List
, Dictionary
, tuple
, ...), ReCodEx Reader – úlohy na procvičení (programy ze cvičení).
27. 2. (3. cvičení)
Třídy (class
) a rozhraní (interface
) (programy ze cvičení – Counter
, Temperature
, IGameObject
).
6. 3. (4. cvičení)
Třídy a rozhraní – IEquitable
, IComparable
(programy ze cvičení – ).
13. 3. (5. cvičení) – suploval Jirka Mayer
Soubory, dědičnost (programy ze cvičení – Strom aritmetických výrazů).
20. 3. (6. cvičení) – suploval David Šosvald
Diskrétní simulace (programy ze cvičení – Pošta).
27. 3. (7. cvičení)
Generické programování (typové parametry), funkcionální programování, enumerátory – úlohy na procvičení (programy ze cvičení).
3. 4. (8. cvičení)
Dynamické programování (programy ze cvičení).
- Počet cest v DAGu
- Nejdelší rostoucí podposloupnost
- Lampy na ulici
10. 4. CVIČENÍ NEBUDE
Cvičení nebude, protože je státní svátek.
17. 4. (9. cvičení)
WinForms (programy ze cvičení).
24. 4. (10. cvičení)
Unit testy (programy ze cvičení – List<T>
).
Jak založit projekt s testy:
- Vytvořit solution:
dotnet new sln
- Vytvořit projekt s implementací:
dotnet new classlib -o MyList
- Přidat implementaci do solution:
dotnet sln add MyList/MyList.csproj
- Vytvořit projekt s testy:
dotnet new xunit -o MyList.Tests
- Přidat testy do solution:
dotnet sln add MyList.Tests/MyList.Tests.csproj
- Přidat implementaci jako reference k testům:
dotnet add MyList.Tests/MyList.Tests.csproj reference MyList/MyList.csproj
- Přidat
using MyList;
do testů - Spustit testy:
dotnet test
1. 5. CVIČENÍ NEBUDE
Cvičení nebude, protože je státní svátek.
8. 5. CVIČENÍ NEBUDE
Cvičení nebude, protože je státní svátek.
15. 5. (11. cvičení) – suploval Jirka Mayer
Zápočtový test.
22. 5. (12. cvičení)
Ukázková zkoušková úloha Koncerty.
Přednáška
Cvičení je vypsáno k přednášce Martina Pergela (čtvrtek 12:20).
Podmínky na zápočet
Podmínky na zápočet jsou prakticky stejné jako v ZS. Téma zápočtového programu si vyberte do konce výuky v LS (22. 5. 2023). Termín odevzdání zápočtového programu je 31. 8. 2023.
Na zápočet je potřeba
- získat alespoň 67 bodů za domácí úkoly (2/3 z maxima),
- napsat zápočtový test (bude 15. 5.),
- naprogramovat zápočtový program (viz níže).
Domácí úkoly
Plánuji zadat domácí úkoly za celkem alespoň 100 bodů. Na zápočet potřebujete aspoň 67 bodů (tedy dvě třetiny z maxima). Na každý úkol budete mít dva týdny na odevzdání a v tomto čase můžete úkol odevzdat i víckrát. Pro odevzdávání budeme používat systém ReCodEx.
Zápočtový test
Test se bude psát na předposledním cvičení (15. 5.) 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. Nejpozději do konce výuky v LS (22. 5. 2023) si vyberete téma a zašlete mi ho ke kontrole.
Zápočtový program může a nemusí být napsaný v C# – 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ž C#, domluvte se na tom se mnou už ve specifikaci programu.
Zápočtový program vyvíjejte v připraveném repozitáři na fakultním GitLabu (/teaching/nprg031/2023-summer/student-LOGIN_DO_SISU
), případně na podobné službě a pak ho na GitLab nahrajte (návod). S Gitem jste pracovali už na Úvodu do Linuxu (NSWI177), znalosti získané tam by pro tento účel měly stačit. Pokud si chcete Git připomenout, můžete využít Git ve 100 sekundách, ale nám stačí prvních 60 a to samé, ale detailněji. 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 C# je vhodný tento – uložte si ho do kořenového adresáře repozitáře a přejmenujte na .gitignore
).
Zápočtový program odevzdávejte nejpozději do 31. 8. 2023, abych měl dost času se na něj podívat a vy jste případně měli možnost program doplnit nebo opravit podle mých připomínek před koncem akademického roku (30. 9. 2023 – po tomto datu už nejde udělovat zápočty v SISu). Součástí odevzdání je i osobní předvedení programu. Až budete mít program hotový (včetně dokumentace), pošlete mi mailem odkaz na repozitář a domluvíme se na termínu předvedení. Předvedení programu bude spočívat v tom, že mi ukážete, že program jde spustit a že dělá to, na čem jsme se domluvili ve specifikaci. Kromě toho od vás budu chtít shrnutí návrhu programu – high-level rozdělení do tříd/funkcí a jejich účet, prostě takové rychlé shrnutí toho, co dělá která část zdrojového kódu. Pokud chcete, můžete si na předvedení připravit krátkou prezentaci.
K zápočtovému programu napište jeho dokumentaci. Ta by měla mít tři hlavní části:
- uživatelská dokumentace (jak se program používá),
- programátorská dokumentace (jak program funguje uvnitř),
- ukázky použití.
Povinnou součástí uživatelské dokumentace je soubor README.md
, který by měl obsahovat informace o tom, jak program spustit (v případě C# to nejspíš bude příkaz dotnet run
), 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 v README.md
jejich formát (nebo, pokud by takový popis byl příliš dlouhý, odkažte z README.md
na soubory s popisem formátu). Pokud je pro spuštění programu potřeba nainstalovat nějaké knihovny nebo nástroje (např. programujete hru v Unity), napište jaké a v jaké verzi (a ideálně doplňte i jak je nainstalovat). Soubor README.md
už ve vašem předpřipraveném repozitáři existuje, upravte ho do vhodné podoby.
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).
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.
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 rezcestník README.md
s odkazy na ostatní soubory. Výrazně doporučuji dokumentaci psát anglicky, ale pokud si na to nevěříte, můžete ji napsat česky (příp. slovensky).
Program by měl být rozumně odladěný. Především by měl jít zkompilovat bez chyb a spustit. 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.
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, 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.
Jak snadno nahrát program na GitLab
Pokud už program máte jako Gitový repozitář (třeba na GitHubu), je poměrně snadné nahrát ho na GitLab. Stačí si v naklonovaném repozitáři na vašem počítači přidat další remote
a pak na něj pomocí push
kód nahrát. Přidání remote pojmenovaného gitlab
se dá udělat takto (více zde): git remote add gitlab https://gitlab.mff.cuni.cz/teaching/nprg031/2023-summer/student-LOGIN_DO_SISU.git
. A pak můžete pomocí git push gitlab master
nahrát kód z větve master
(výchozí jméno větve) na remote jménem gitlab
.
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.
MFF Discord
Kanál pro tohle cvičení: #alg-prg-cv-mtopfer. Není povinné tam být, ale je to další místo, kde se můžete ptát na otázky a bavit se se mnou i se spolužáky.
V čem budeme programovat a jak to nainstaluju
Já budu na cvičení používat Visual Studio Code, které jsme používali v zimním semestru (a na rozdíl od Visual Studia, které se používá na přednáškách, jde spustit i na jiných platformách než Windows). Taky nesmím zapomenout na prostředí Rider od JetBrains, které můžete jako studenti používat zdarma, nicméně není v labu nainstalované. 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é.
API reference C#
V dokumentaci k C# najdete popis tříd a metod ze standardní knihovny, které se vám při programování můžou hodit.
Instalace VS Code
- Nainstalujte si Visual Studio Code.
- Přidejte si do VS Code rozšíření pro C# (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. Pro vývoj budeme používat .NET Core, postup vytvoření nového projektu si ukážeme na cvičení nebo ho najdete v dokumentaci VS Code.
Vytvoření nového projektu
Ve Visual Studiu je to snadné, stačí kliknout na File → New → Project... a vybrat Console App. Pak už se jen nastaví jméno a umístění projektu a je to. Pro naše projekty doporučuji zaškrtnout Place solution and project in the same directory, protože budeme pracovat vždy jen s jedním projektem současně, takže nepotřebujeme vytvářet pro projekt podsložku. Existuje také rozšíření Recodex Template, které vám dovolí místo Console App vybrat Recodex, čímž se automaticky nastaví některé vlastnosti zmíněné dále v textu, aby se řešení u vás chovalo stejně jako v ReCodExu.
Ve VS Code ovšem tlačítko pro vytvoření nového projektu není. Pomůžeme si příkazem dotnet
na příkazové řádce.
- Vytvořte složku, ve které chcete projekt mít a přejděte do ní v terminálu.
- Spusťte
dotnet new console
. To vám vyrobíProgram.cs
, který můžete editovat a spustit.- Pokud máte .NET 6 a novější, vyrobí se program s tzv. top-level statements (tedy bez
Main
metody), což nebude fungovat v ReCodExu. Projekt bez top-level statements se dá vyrobit pomocídotnet new console --use-program-main
(více zde). - Ještě jedna poznámka k .NET 6: ve výchozím nastavení používá implicitní importy (takže na začátku programu nemusíte mít napsané
using System;
a některé další), které v ReCodExu nejsou zapnuté. Může se vám stát, že vám kód lokálně půjde zkompilovat, ale v ReCodExu to neprojde. Řešení je vypnout si implicitní importy i u sebe – z.csproj
souboru odstraňte řádek<ImplicitUsings>enable</ImplicitUsings>
.
- Pokud máte .NET 6 a novější, vyrobí se program s tzv. top-level statements (tedy bez
- Hodí se mít VS Code otevřený ve složce projektu, to se udělá snadno spuštěním
code .
(což otevře VS Code v aktuální složce).
Když je VS Code otevřený přímo ve složce projektu, umí sám vygenerovat soubory potřebné pro spuštění projektu. Stačí na Run and Debug kartě kliknout na .NET: Generate Assets for Build and Debug. Aby ve VS Code správně fungovalo čtení vstupu, je potřeba ve vygenerovaném souboru .vscode/launch.json
změnit řádek console na "console": "integratedTerminal",
. Z příkazové řádky se projekt dá spustit pomocí dotnet run
.
ReCodEx
Domácí úkoly budou zadávány a odevzdávány pomocí systému ReCodEx.
Jak rozchodit ReCodEx:
- Jděte na https://recodex.mff.cuni.cz/login.
- V sekci Přihlásit se pomocí externí služby klikněte na Ověřit uživatele.
- Přihlaste se pomocí Centrální Autentizační Služby (CAS CUNI). Jméno a heslo jsou stejné jako do SISu.
- V menu vlevo dole je položka SIS Integrace. Tam se přidejte do skupiny Programování 2.
Řešil jsem KSPčko
Pokud jste už zdatnější a myslíte si, že by vás cvičení nebavilo, 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í).
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.
Část textu na této stránce jsem opsal od Jirky Mayera. Díky, Jirko!