Výuka

V letním semestru 2023/24 vyučuji tyto předměty:


Programování 2 pro matematiky (NMIN112)

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

Zápočet není podmínkou ke zkoušce.

Úlohy v ReCodExu

Pro získání zápočtu je potřeba mít na konci semestru alespoň 70% z celkového počtu vypsaných bodů za praktické úlohy + za účast na praktických cvičeních (bonusové úlohy se do celkového počtu nepočítají, můžete si jimi tedy přilepšit).

Praktické úlohy budou zpravidla zadávány každý týden.

Autor řešení musí být schopen na cvičení vysvětlit svůj program.

Úkoly se budou odevzdávat pomocí systému ReCodEx https://recodex.mff.cuni.cz/

Řešení úloh je samostatná práce! Můžete se samozřejmě o úlohách bavit mezi sebou, ale řešení musí vypracovat každý sám za použití své vlastní inteligence.

Písemné (teoretické) úlohy

Pro získání zápočtu je potřeba mít na konci semestru alespoň 70% z celkového počtu vypsaných bodů za teoretické úlohy + za účast na teoretických cvičeních (bonusové úlohy se do celkového počtu nepočítají).

Teoretické úlohy budou zadávány zhruba jednou za dva týdny.

Domácí úkoly psané "na papír" spočívají většinou v návrhu a slovním popisu efektivního algoritmu.

Úkoly se budou odevzdávat pomocí systému Postal Owl https://kam.mff.cuni.cz/owl/, více na prvním cvičení.

Praktický zápočtový test u počítačů

Bude se jednat o úlohu zadanou v ReCodExu v podobném rozsahu jako úlohy zadávané v průběhu semestru. Pro úspěšné složení testu bude potřeba získat v ReCodExu plný počet bodů. Hodnotí se nejen funkčnost vytvořeného programu, ale i to, jak je program navržen a naprogramován. Není při tom vyžadována (časová) optimalizace algoritmu. Stačí, nejsou-li ani algorimus ani jeho implementace "vysloveně hloupé". Vzhledem k omezenému času se nepožaduje, aby byl program komentován (i když komentáře vytvářené současně s programemem vám mohou práci na programu podstatně zjednodušit i zrychlit).

Student musí být schopen svoje řešení vysvětlit.

Zápočtový program

Zápočtový program je rozsáhlejší než běžné úlohy v ReCodExu. Jeho účelem je, abyste si vyzkoušeli samostatně navrhnout a vytvořit větší program včetně načítání vstupů od uživatele, ošetření jejich korektnosti, odladění, napsání dokumentace. Téma pro svůj program si vybíráte sami (já ho musím schválit).

Postup, jak vypracovat zápočtový program:

  • vybrat si téma a domluvit se na něm se mnou (do 31. března)
  • poslat krátkou specifikaci (do 14. dubna)
  • napsat samotný program
  • napsat dokumentaci k programu - uživatelskou a programátorskou
  • poslat mi program, dokumentaci, případně testovací data, a domluvit si termín předvedení
  • předvést mi program při krátké prezentaci, ukázat jeho funkce na testovacích datech, popsat jak program pracuje, jaké algoritmy a datové struktury používá. Během předvedení byste měli být schopni program na požádání mírně upravit. (nejlépe do konce zkouškového období, nejpozději do poloviny září)

    Je možné, že s první verzí vašeho programu / dokumentace / testovacích dat / předvedení nebudu spokojená a budete je muset předělat. Proto nenechávejte předvedení až na poslední chvíli, abyste případné úpravy stihli ještě v termínu.

Při výběru témat pro své programy se můžete inspirovat např. na stránkách Martina Mareše: text o zápočtových programech a výběr z témat nebo zde: více témat

O dokumentaci podle Martina Mareše:

Uživatelská dokumentace. To je stručný popis toho, jak se program používá (tedy třeba v jakém formátu se mu zadává vstup a v jakém vydá výstup). Nepište od ní evidentní věci, spíš to, co by bězný uživatel nečekal. Také by tam mělo být řečeno, co vlastně program dělá :)

Uživatelská dokumentace by také měla obsahovat návod, jak program spustit (jaké knihovny je potřeba doinstalovat, atd.)

Programátorská dokumentace. V ní je stručně popsáno, jak program funguje uvnitř. Nemusíte komentovat každý řádek programu, spíš popište celkovou koncepci. Pokud používáte nějaké netriviální algoritmy, je to dobré zmínit. Pokud používáte něco, co jste nevymysleli sami, je na místě citovat zdroje.

Text o dokumentaci k (nejen) zápočtovému programu od doktora Kryla: Jak psát dokumentaci zápočtového programu

Co jsme dělali na cvičeních:

1. CVIČENÍ - teoretické:

  • podmínky zápočtu
  • složitost prakticky - procvičování na jednoduchých úlohách
  • pseudokód

2. CVIČENÍ - praktické:

  • hraní si s želvičkami

Látka ze zimního semestru (předmět NMIN111 Programování 1):

  • instalace Pythonu, IDLE, Python jako kalkulačka
  • proměnné a výrazy, operace s čísly, relace a logické spojky
  • programy – příkazy input a print, indentace, komentáře
  • příkaz if (zanořování, elif, else), cyklus while (včetně else)
  • základní použití cyklů - ciferný součet, Euklidův algoritmus, test prvočíselnosti
  • zpracování posloupnosti dat, seznamy a operace s nimi, indexování, řezy
  • generátorová notace seznamů (list comprehension)
  • formátovaný výstup
  • funkce - parametry, return, lokalita proměnných
  • znakové řetězce, N-tice (tuples)
  • množiny a slovníky
  • textové soubory
  • standardní knihovna (math, copy, array, fractions, random, ...).
  • výjimky - try-except, raise, assert
  • základní informace o třídách a objektech v Pythonu (jen princip, bez většího procvičení)
  • základní postupy při ladění programů

3. CVIČENÍ - teoretické:

Dokazování či vyvracení tvrzení typu:
  • 5n + 13 ∈ O(n)
  • n3 ∈ O(n2)
  • f ∈ O(g), g ∈ O(h) -> f ∈ O(h)
  • f ∈ O(g), h ∈ O(g) -> f+h ∈ O(g)
  • f ∈ O(g), h ∈ O(g) -> f*h ∈ O(g)
  • f ∈ O(g1), h ∈ O(g2) -> f*h ∈ O(g1*g2)
Podle definice, nalezením vhodného n0 a C, nebo vhodným protipříkladem.

4. CVIČENÍ - praktické:

5. CVIČENÍ - teoretické:

Procvičování určování složitosti různých algoritmů. Řešili jsme např. následující úlohy:

Je zadaná posloupnost:

  • najděte maximum / maximum a počet jeho výskytů
  • rozhodněte, zda je posloupnost monotónní a jak (konstantní, rostoucí, neklesající, klesající, nerostoucí)
  • určete největší číslo, které se v posloupnosti neopakuje
  • najděte souvislý úsek s maximalním součtem (v O(n3), O(n2), O(n) - viz Průvodce labyrimtem algoritmů, str. 23)

6. CVIČENÍ - praktické:

Objekty, magic methods Kód ze čtvrtečního cvičení (neupravený, nedokonalý, ...):

7. CVIČENÍ - teoretické:

Třídící algoritmy
  • select(ion) sort
  • insert(ion) sort
  • bubble sort
  • heap sort

8. CVIČENÍ - praktické:

Dekompozice

9. CVIČENÍ - teoretické:

Abstraktní datové typy fronta, zásobník, halda

10. CVIČENÍ - praktické:

Lineární spojové seznamy:

  • první pokusy

Knihovna TkInter

11. CVIČENÍ - teoretické:

Lineární spojové seznamy - procvičování základních operací

  • vypsání všech hodnot
  • nalezení posledního prvku
  • vyhledání prvku s danou hodnotou
  • přidání prvku na začátek, na konec seznamu
  • vytvoření kopie seznamu

12. CVIČENÍ - praktické:

Lineární spojové seznamy:

  • procvičování základních operací

Knihovna numpy

  • Pokus o návod na instalaci:
    • (pokud používáte jiné prostředí než IDLE, nainstalujte numpy v něm)
    • spusťte příkaz pip install numpy.

      Pokud to nevyšlo, zkuste následující kroky:

    • přesuňte se do složky, kde máte python.exe, (typicky to bývá něco jako C:\Users\Jméno\AppData\Local\Programs\Python\Python37-32)
    • vlezte ještě do podsložky Scripts
    • spusťte příkazový řádek, např. napsáním příkazu cmddo řádky s cestou
    • spusťte příkaz pip install numpy
  • Slidy Martina Mareše: numpy - slidy
  • Video Martina Mareše: numpy - video

13. CVIČENÍ - teoretické:

Lineární spojové seznamy - další procvičování

  • odebrání prvku ze začátku, z konce seznamu
  • odebrání daného prvku
  • vyhledání prvku s danou hodnotou
  • zrušení všech prvků v seznamu s danou hodnotou
  • obrácení pořadí prvků v seznamu

14. CVIČENÍ - praktické:

Hra hádání zvířátek s AI

MatPlotLib - knihovna na kreslení grafů

16. CVIČENÍ - praktické:

Příklad: jelinek2.0.py

Procvičování rekurzivního generování

  • Napište rekurzivní funkci, která vytiskne pro zadané n "šipku z hvězdiček":
        *
        **
        ***
        ****
        ***
        **
        *
  • Napište rekurzivní funkci, která vypíše všechny možné řetězce délky n nebo kratší z nul a jedniček.
  • Napište rekurzivní funkci, která vypíše všechny možné posloupnosti délky n z nul, jedniček, dvojek a trojek.
  • Napište rekurzivní funkci, která vypíše všechny možné řetězce délky n z čísel od 0 do 9.

17. CVIČENÍ - teoretické:

Procvičování binárních stromů

Operace s binárními vyhledávacími stromy

18. CVIČENÍ - praktické:

Prezentace Triky s funkcemi

Příklady:

  • Je dán seznam řetězců tvaru "jméno příjmení":
    • Setřiďte je primárně podle příjmení, sekundárně podle jména.
    • Najděte osobu s nejdelším příjmením.
  • Napište generátor, který generuje třetí mocniny do zadaného n.
  • Napište nekonečný generátor sudých čísel.
  • Napište generátor, který dostane dva seznamy a bude generovat jejich kartézský součin. Můžete použít následující seznamy:
    a = ["sedma", "osma", "devítka", "desítka",
         "spodek", "svršek", "král", "eso"]
    b = ["srdce", "listy", "kule", "žaludy"]
  • *Napište generátor, který bude generovat "šipku z hvězdiček" z minulého cvičení.
  • *Napište generátor, který dostane seznam znaků a délku řetězce a bude generovat všechny možné řetězce.

Pokračování procvičování rekurzivního generování:

  • Prohlédněte si funkce v následujícím souboru: rekurze.py
  • Naprogramujte rekurzivní funkci, která spočítá, kolik je všech posloupností 0 a 1 délky n (můžete vyjít předchozího příkladu)
  • Naprogramujte rekurzivní funkci, která vygeneruje všechny posloupnosti 0 a 1 délky n, ve kterých je právě k jedniček
  • Naprogramujte rekurzivní funkci, která vygeneruje všechny posloupnosti 0 a 1 délky n, ve kterých nejsou jedničky za sebou
  • Napište rekurzivní funkci, která vypíše všechny možné rozklady čísla n na součet.
        5 = 1+1+1+1+1
        5 = 1+1+1+2
        5 = 1+1+3
        5 = 1+2+2
        5 = 1+4
        5 = 2+3
        5 = 5
  • Napište rekurzivní funkci, která vypíše všechny možné rozklady čísla n na součet délky k.
  • Napište rekurzivní funkci, která vypíše všechna správná uzávorkování jedním typem závorek, např. pro n=3:
     
        ()()()  
        (())()  
        ()(())  
        (()())  
        ((()))
  • Mezi zadané číslice doplňte znaménka +, - a * tak, aby výsledek byl roven zadanému číslu k.
    Např:
    "123", k=6: 
    výsledek: "1+2+3", "1*2*3"
    
    "125", k=7:
    výsledek: "1*2+5", "12-5"
    
  • (Microsoft Interview Question) Given a number n, print following pattern without using any loop.
    Input: n = 16
    Output: 16, 11, 6, 1, -4, 1, 6, 11, 16
    
    Input: n = 10
    Output: 10, 5, 0, 5, 10