Programování 1 pro matematiky

Ve školním roce 2020/2021 vedu cvičení z předmětu Programování 1 [NMIN111], což je základní kurs programování pro studenty matematiky. Cvičení se koná každé úterý od 12:20 online po Zoomu; identifikátor schůzky a heslo vám měly přijít e-mailem. Každé cvičení začíná výkladem: slidy, příklady programů i videozáznam se objevují na těchto stránkách.

Zápočet se udílí za získání alespoň 70 bodů za domácí úkoly. Úkoly se odevzdávají v ReCodExu.

Budu rád, když se mi budete ozývat. Když vám cokoliv nepůjde, nestyďte se říci si o radu. Když vám něco půjde, nestyďte se pochlubit se :) Napište mi mail na mares+p1m@kam.mff.cuni.cz, případně si můžeme domluvit schůzku po Zoomu nebo osobní konzultaci. Také jsem k zastižení na Matrixu jako @mj:matrix.ucw.cz a na Telegramu jako @golluxino.

Co jsme dělali

datum téma
29. 9.
6. 10.
13. 10.
  • Výklad: Seznamy (videozáznam)
  • Výpis seznamu pozpátku
  • Fibonacciho čísla
  • Eratosthenovo síto
  • Další úkoly: Je dána posloupnost čísel...
    • zjistěte, jestli jsou všechna navzájem různá.
    • najděte dvojici s co nejmenším rozdílem.
    • vypište všechna opakující se čísla (ale každé jen jednou).
    • Umíte předchozí úkoly vyřešit efektivněji, pokud víte, ze všechna zadaná čísla leží od 1 do 100?
20. 10.
27. 10.
  • Výklad: Funkce (videozáznam)
  • Napište funkci, která:
    • vrátí nejmenší ze tří čísel: řešení
    • vrátí n-té Fibonacciho číslo: řešení
    • spočítá, kolik je v seznamu sudých čísel: řešení
    • vybere ze seznamu sudá čísla (a vrátí jejich seznam): řešení
    • dostane dva seřazené seznamy čísel a vrátí jejich průnik: řešení
    • dostane koeficienty kvadratické rovnice ax2 + bx + c = 0 a vrátí seznam jejích kořenů: řešení
3. 11.
  • Výklad: Seznamy, řezy a řetězce (videozáznam)
  • Napište funkci, která:
    • otočí řetězec (datelletad)
    • otočí číslo v desítkové soustavě (10244201; může se hodit, že int(x) převádí z řetězce na číslo a str(x) opačně)
    • spočítá, kolik zadaný řetězec obsahuje slov (oddělených mezerami)
    • … kolik různých slov
    • vyhodnotí výraz se sčítáním (12+34+147)
    • vyjádří číslo česky (123"sto dvacet tři"): řešení
  • Řešení příkladů
10. 11.
  • Výklad: List comprehensions (videozáznam)
  • Napište funkci, která:
    • vytvoří tabulku násobilky (a×b pro všechna a, b od 1 do daného čísla)
    • zjistí průnik dvou (neuspořádaných) seznamů
    • vybere z textu slova, která jsou palindromická (čtou se stejně popředu jako pozpátku)
    • spočítá skalární součin dvou vektorů
    • vynásobí dvě matice (ne nutně čtvercové)
    • seřadí slova na řádku podle jejich délky (nápověda: nejprve slova převést na dvojice (délka, slovo), ty pak setřídit a nakonec z dvojic zase udělat slova)
  • Řešení příkladů
17. 11. Cvičení se nekoná.
24. 11.
  • Výklad: Množiny a slovníky (videozáznam)
  • Příklady: robůtek, kontakty
  • Napište funkci, která:
    • Vrátí True nebo False podle toho, zda jsou dané dva seznamy stejné až na pořadí prvků. Co když se mohou prvky v seznamech opakovat?
    • Vrátí True nebo False podle toho, zda jsou všechny prvky daného seznamu navzájem různé.
    • Řešení
  • Spočítejte frekvence všech k-gramů (k-tic znaků) v textu. K-gramy vypište uspořádaně podle frekvence (řešení, jiné řešení). Můžete vyzkoušet třeba na originálu Psa baskervillského z Projektu Gutenberg. Řádky souboru můžete načítat pomocí for řádek in open('soubor', encoding='utf-8').
  • Aplikace k-gramů:
    • Pro každý k-gram zjistěte, jaká všechna písmena po něm mohou následovat. Pokud jedno písmeno opakuje, uložte ho vícekrát.
    • Předchozí tabulku využijte k náhodnému generování textu. První k-gram zvolte náhodně a pak opakovaně vybírejte náhodné následující písmeno. Pro náhodný výběr ze seznamu se může hodit random.choose(seznam) (nezapomeňte na import random).
    • Řešení.
1. 12.
  • Výklad: Třídy a objekty (videozáznam)
  • Příklad definice třídy. Dodělejte do něj:
    • Naučte každé zvíře slyšet navíc na jméno potvůrka.
    • Doplňte atribut pozice a zařiďte, aby zvíře slyšelo na jméno jenom tehdy, když pozice je doma.
    • Vytvořte odvozenou třídu Pes, jehož metoda ozvi_se na každé druhé zavolání zaštěká a jinak zavrčí.
8. 12.
  • Pokračování tříd a objektů z minula.
  • Nadefinujte třídu Rect reprezentující obdélníky v rovině: (domácí úkol)
    • atributy x1, y1, x2, y2 pro souřadnice levého dolního a pravého horního vrcholu
    • vytváření objektů voláním Rect(x1, y1, x2, y2)
    • konverze na řetězec
    • metoda perimeter pro výpočet obvodu
    • metoda area pro výpočet obsahu
    • operátor == (metoda __eq__(self, other)) pro rovnost obdélníků (vrátí True nebo False)
    • operátor in (metoda __contains__(self, other)) pro test, zda je jeden obdélník podmnožinou druhého (neostře)
    • operátor & (metoda __and__(self, other)) pro průnik obdélníků (vrátí nový obdélník nebo None, pokud průnik má nulový obsah)
  • Nadefinujte třídu RoundRect odvozenou od Rect pro obdélníky se zakulacenými rohy (s jednotkovým poloměrem; předpokládejme že délky všech stran jsou alespoň 2). Předefinujte metody, aby dávaly smysl.
15. 12.
  • Výklad: Triky s funkcemi (videozáznam)
  • 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 (řešení).
    • Najděte osobu s nejdelším příjmením.
    • Na rozmyšlení: Jak byste naložili s osobami, které mají více křestních jmen, případně více příjmení?
  • Cvičení na redukci seznamů (řešení):
    • Napište funkci red(s,f), která dostane seznam s a funkci f(x,y) a spočítá s[0] f s[1] f s[2] f ... f s[-1]. Zápisem x f y myslíme zavolání f(x,y), celý výraz se vyhodnocuje zleva doprava.
    • Zapište pomocí redukce součet prvků seznamu.
    • Zapište pomocí redukce nalezení maxima seznamu.
    • Zapište pomocí redukce nalezení prvního nenulového prvku (není-li, vraťte 0).
    • Co redukce udělá pro operátor -?
    • Co udělá red(s, lambda x, y: (x,y))?
    • (*) Zapište pomocí redukce test, zda jsou všechny prvky seznamu stejné.
    • Na rozmyšlení: Jak byste redukci definovali pro jednoprvkové seznamy? Může dávat nějaký smysl pro prázdné seznamy?
    • (mimochodem, redukci má Python zabudovanou a jmenuje se functools.reduce)
  • Napište generátor, který dostane dva seznamy a bude generovat jejich kartézský součin.
  • Napište funkci compose(f,g), která pro dvě funkce f a g (obě s jedním parametrem) vrátí funkci, jež je jejich složením.
22. 12.
  • Výklad: Soubory a výjimky (videozáznam)
  • Napište program, který dostane textový soubor a:
    • Spočítá, kolik je v něm řádků, slov a viditelných znaků (tedy bez mezer a konců řádků)
    • Zkopíruje ho do jiného souboru …
    • … tak, aby řádky šly v opačném pořadí (první se stane posledním atd.)
    • … tak, aby šla v opačném pořadí i slova na řádcích
    • Najde na každém řádku všechna čísla (oddělená mezerami) a vypíše jejich součet; slova, která nejsou čísly, ignoruje.
5. 1.
  • Výklad: Standardní knihovna (videozáznam)
  • Příklady:
    • Simulujte 1000 hodů kostkou. Spočítejte výskyty každého čísla. Kolik jich je nejméně a kolik nejvíce? (řešení)
    • Generujte náhodně body ve čtverci [-1,1] × [-1,1]. Počítejte, kolik z nich padlo do jednotkového kruhu, a tím aproximujte π. (řešení)
    • Generujte náhodně permutace slov věty "Nemám rád zbytečně použité permutace." Kolik z nich dávalo smysl? :) (řešení)
    • Vygenerujte náhodně permutaci na množině 1 až N a spočítejte, kolik má pevných bodů. Opakováním experimentu odhadněte, jaká je pravděpodobnost, že náhodná permutace nemá pevný bod. (řešení)
    • Pomocí Malé Fermatovy věty testujte, zda je nějaké velké číslo pravděpodobně prvočíslem. Hodí se tříparametrová funkce pow(a, b, c), která efektivně spočítá ab mod c.
    • Simulujte náhodnou procházku po celých číslech od 0 do N. Začínáme v 0, v každém kroku náhodně buď zvýšíme nebo snížíme o 1 (v 0 jen zvyšujeme). Po kolika krocích se dostaneme do N? Jak dopadne dvojrozměrná verze (ze středu čtverce se chceme dostat k okraji)?

Odkazy

Stránku spravuje Martin Mareš