Úlohy na procvičení

Funkce

Napište následující funkce. Zkuste doplnit i typové anotace parametrů a návratové hodnoty.

  • Napište funkci compare(a, b), která vrací 1 pro a > b, 0 pro a == b a -1 pro a < b.

  • Napište funkci is_even(number), která přijme celé číslo jako argument a vrací True, je-li číslo sudé, a False, je-li liché.

  • Nyní napište funkci is_odd(number), která vrací True, je-li číslo liché a False, je-li sudé. Využijte funkci is_even.

  • Napište funkci, která počítá ciferný součet čísla. Například ciferný součet čísla \(1234\) je \(10\) (protože \(1 + 2 + 3 + 4 = 10\)).

Funkce pro textové řetězce

  1. Napište funkci contains, která pro zadaný text text a znak char zjistí, jestli text obsahuje znak char.
    Ručně napište cyklus, který bude procházet přes znaky textu, nepoužívejte operátor in (pokud ho znáte).

    >>> contains("banana", "n")
    True
    >>> contains("banana", "z")
    False
  2. Napište funkci count, která pro zadaný text text a znak char spočítá, kolikrát se znak char vyskytuje v textu.
    Nepoužívejte metodu str.count ze standardní knihovny.

    >>> count("banana", "n")
    2
  3. Napište funkci find, která pro zadaný text text a znak char zjistí, na jaké pozici se znak char poprvé vyskytuje v textu. Pokud se char v textu nevyskytuje, vraťte -1.
    Nepoužívejte metodu str.find ani str.index ze standardní knihovny.

    >>> find("banana", "b")
    0
    >>> find("banana", "n")
    2
    >>> find("banana", "z")
    -1

Odhad \(\pi\) Metodou Monte Carlo

Vytvořte program, který odhadne hodnotu \(\pi\) pomocí metody Monte Carlo.

Mějme čtverec s vrcholy \((0, 0), (0, 1), (1, 1), (1, 0)\) a v něm čtvrt kruhu se středem \((0, 0)\) a poloměrem \(1\). Obsah čtvrtkruhu je \(S_1 = \frac{\pi \cdot 1^2}{4} = \frac{\pi}{4}\), obsah čtverce je \(S_2 = 1^2 = 1\). Z poměru obsahů vyjádříme \(\pi = 4 \cdot \frac{S_1}{S_2}\).

Nyní využijeme metodu Monte Carlo k odhadu obsahů. Budeme náhodně generovat body ve čtverci a počítat, kolik z nich padne dovnitř čtvrtkruhu. Počet bodů ve čtvrtkruhu dělený celkovým počtem vygenerovaných bodů nám dá odhad poměru obsahů \(\frac{S_1}{S_2}\).

Na přednášce se mluvilo také o dekompozici (rozklad na podúlohy). Zkuste se tedy také zamyslet, jaké podúlohy je potřeba vyřešit a každou z nich implementujte jako samostatnou funkci.

Nápovědy:

  • Pro vygenerování náhodného čísla z rozsahu \([0, 1]\) použijte random.uniform(0, 1) (na začátek souboru musíte napsat import random, abyste knihovnu random mohli používat).
  • Pro výpočet vygenerujte \(100\,000\) bodů.
  • Pro zjištění, jestli je bod uvnitř kruhu, můžete pomocí Pythagorovy věty spočítat jeho vzdálenost od středu kruhu a porovnat ji s poloměrem.

Více o metodě Monte Carlo najdete třeba na Wikipedii (je tam i řešení v Pythonu, tak na něj zkuste nekoukat a psát kód sami).

Učební výstupy

Učební výstupy podávají zhuštěný souhrn základních konceptů a dovedností, které byste měli umět vysvětlit a/nebo použít po každém cvičení. Hvězdičkou (⭐) je označena látka nad rámec předmětu Programování 1, kterou tedy teď nemusíte umět, ale někdy v budoucnu se vám může hodit.

  • chápat funkci jako transformaci dat (vstupy -> výstupy)
  • umět definovat funkci a její argumenty, umět zavolat funkci s konkrétními hodnotami argumentů
  • umět zdokumentovat funkci (co dělá, význam argumentů, ideálně i typy argumentů a návratové hodnoty)
    • ⭐ zapsat dokumentaci funkce jako dokumentační komentář (docstring)
  • chápat, že funkce může mít vedlejší efekty (např. výpis na obrazovku)
  • umět spustit program v ladícím režimu (debug) a krokovat ho (nastavit breakpoint)