Úlohy na procvičení

Účtenka (z minulého cvičení)

Řešte úlohu Účtenka v ReCodExu (středa, čtvrtek). Jejím cílem je vytvořit program, který načte seznam nakoupených položek a vypíše k nim přehlednou účtenku.

Debugger

Na následujících úlohách si můžete vyzkoušet použití debuggeru. V každé úloze dostanete program s chybou a vaším cílem je chybu najít a opravit. Využijte breakpointy, krokování a další nástroje, které jsme si ukázali. Některé úlohy mají nápovědu a otázky, které vás mohou navést k řešení.

Klávesa Co dělá
F9 přidá breakpoint na aktuální řádek (nebo klik vlevo od čísla řádku)
F5 spustí ladění / pokud už ladění běží, pokračuje do dalšího breakpointu
F10 přejde na další řádek (step over)
F11 vstoupí do volané funkce (step into)
Shift+F11 dokončí funkci a vrátit se z ní (step out)

1. Délka filmu – film_length.py

Program má vypsat délku filmu v hodinách a minutách a čas konce.

  1. Zkuste si program spustit pro film dlouhý 135 minut, který začíná ve 20:30. Co je špatně?

  2. Dejte breakpoint na řádek 5 (hours = ...) a spusťte ladění (F5). Znovu zadejte vstup 135, 20, 30.

  3. Krokujte (F10) a do tabulky si zapište hodnoty a typy z panelu Variables:

    Proměnná Hodnota Typ
    length
    hours
    minutes
    end_hour
  4. Do panelu Watch přidejte výrazy length / 60 a length // 60. Jaký je mezi nimi rozdíl?

  5. Opravte chybu a ověřte, že film skončí ve 22:45.

2. Největší výdaj – biggest_expense.py

Program má najít největší měsíční výdaj. Výdaje jsou zadané jako seznam čísel na řádku 2.

  1. Jaký výstup byste očekávali? Co program vypíše?

  2. Najděte cyklus, který počítá největší výdaj a dejte si breakpoint na první řádek uvnitř cyklu.

  3. Jaká je hodnota expenses[i], když se ladění poprvé zastaví? Použijte Watch, abyste to zjistili. A jaký je index i?

3. Sleva – discount.py

E-shop počítá ceny po uplatnění slevového kupónu. Sluchátka za 1500 Kč s kupónem na 10 % by měla stát 1350 Kč, program ale vypíše 0 Kč.

  1. Dejte breakpoint na řádek 3 (výpočet ve funkci apply_discount) a spusťte ladění. Jaké hodnoty mají price a percent?

  2. Pomocí panelu Call Stack přejděte do funkce price_after_coupon a pak do print_item. Jaké hodnoty jsou tam? Kde přesně chyba vzniká?

  3. Opravte chybu. Pro ověření můžete zkusit ladění ještě jednou jinak: breakpoint dejte na řádek print_item("Sluchátka", 1500, 10) a pomocí F11 vstupujte do volaných funkcí.

4. Piškvorky – tic_tac_toe.py

Program přehraje připravené tahy piškvorek 3×3 a po každém tahu vypíše hrací plochu. Hráč X by měl vyhrát až pátým tahem (celý horní řádek), program ale vyhlásí vítěze hned po prvním tahu.

  1. Dejte breakpoint na řádek 30 (board[row][col] = player) a spusťte ladění.

  2. V panelu Variables rozbalte board i jednotlivé řádky. Proveďte řádek (F10). Které buňky se změnily?

Nápověda: Podívejte se, jak se hrací plocha vytváří ve funkci create_board. Ve Watch můžete použít operátor is pro zjištění, jestli jsou dvě proměnné ten samý seznam, např. board[0] is board[1].

5. Vstupenky do kina – cinema_tickets.py

Program počítá cenu vstupenek do kina pro skupinu. Vstupy jsou na řádcích 68-70. Pro tuto skupinu je cena příliš vysoká, nějaká sleva se neaplikuje správně.

Najděte a opravte chybu v programu. Začněte tím, že se podíváte, jestli jsou správně vypsané počty vstupenek pro každou kategorii.

Nápověda: Aby nebylo nutné mačkat F5 u každého návštěvníka, nastavte podmíněný breakpoint: pravým tlačítkem klikněte na breakpoint -> Edit Breakpoint a nastavte vhodnou podmínku.

Refaktoring

Soubor refaktoring.py obsahuje kód funkce, která provádí několik operací. Vaším úkolem je refaktorovat (upravit) tento kód tak, aby byl lépe čitelný a organizovaný.

  • Vhodně pojmenujte proměnné.
  • Rozdělte program na funkce, abyste dodrželi princip jedné odpovědnosti (funkce by měla dělat jen jednu věc).
  • Doplňte typové anotace (type hints).
  • Doplňte vhodný dokumentační komentář.

Dále zobecněte kód tak, aby pracoval s libovolnou velikostí vstupního argumentu.

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 nástroj pro pojmenování části výpočtu (dekompozici kódu)
  • umět nahradit opakující se části kódu funkcí
  • umět spustit program v ladícím režimu (debug) a krokovat ho (nastavit breakpoint)
  • umět pracovat s kódem, který napsal někdo jiný (případně umělá inteligence)
    • spustit ho,
    • ⭐ ladit ho, hledat v něm chyby