Programování 1 pro matematiky

Ve školním roce 2024/2025 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 v N11.

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 konzultaci. Také jsem k zastižení na Matrixu jako @mj:matrix.ucw.cz a na Telegramu jako @golluxino.

Zápočet se uděluje za domácí úkoly odevzdávané v ReCodExu. Úkoly se testují automaticky, cvičící pak může body korigovat (odměnit zvláště elegantní řešení, penalizovat nefunkční řešení, které náhodou prošlo testy apod.). Na zápočet je potřeba získat aspoň 70 bodů. Úkoly budou vypsané za alespoň 100 bodů. Ve výjimečných případech (např. dlohodobá nemoc) se lze domluvit na individuálních podmínkách.

Co jsme dělali

datum téma
1. 10.
8. 10.
15. 10.
22. 10.
29. 10.
  • Výklad: Funkce
  • 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í
5. 11. Necvičíme, protože cvičíme: Děkanský sportovní den
12. 11.
  • Výklad: Seznamy, řezy a řetězce
  • 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ů
19. 11.
  • Výklad: List comprehensions
  • 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ů
26. 11.
  • Výklad: Množiny a slovníky
  • Příklady: robůtek, kontakty
  • Napište funkci, která:
    • Vrátí True nebo False podle toho, zda jsou dané dva seznamy řetězců stejné až na pořadí prvků. Co když se mohou řetězce v seznamech opakovat?
    • Vrátí True nebo False podle toho, zda jsou všechny prvky daného seznamu navzájem různé.
  • 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í.
3. 12.
  • Výklad: Třídy a objekty
  • 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čí.
10. 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 Rect(0,0,0,0), 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.
  • Naučte metodu __eq__, aby vracela False, pokud porovnává s něčím, co není Rect, případně RoundRect. Může se hodit isinstance.
17. 12. Plán:
  • Výklad: Triky s funkcemi
  • 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.
    • 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ů:
    • 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.

Odkazy

Stránku spravuje Martin Mareš