Ú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.
-
Zkuste si program spustit pro film dlouhý 135 minut, který začíná ve 20:30. Co je špatně?
-
Dejte breakpoint na řádek 5 (
hours = ...) a spusťte ladění (F5). Znovu zadejte vstup135,20,30. -
Krokujte (
F10) a do tabulky si zapište hodnoty a typy z panelu Variables:Proměnná Hodnota Typ lengthhoursminutesend_hour -
Do panelu Watch přidejte výrazy
length / 60alength // 60. Jaký je mezi nimi rozdíl? -
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.
-
Jaký výstup byste očekávali? Co program vypíše?
-
Najděte cyklus, který počítá největší výdaj a dejte si breakpoint na první řádek uvnitř cyklu.
-
Jaká je hodnota
expenses[i], když se ladění poprvé zastaví? Použijte Watch, abyste to zjistili. A jaký je indexi?
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č.
-
Dejte breakpoint na řádek 3 (výpočet ve funkci
apply_discount) a spusťte ladění. Jaké hodnoty majípriceapercent? -
Pomocí panelu Call Stack přejděte do funkce
price_after_coupona pak doprint_item. Jaké hodnoty jsou tam? Kde přesně chyba vzniká? -
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íF11vstupujte 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.
-
Dejte breakpoint na řádek 30 (
board[row][col] = player) a spusťte ladění. -
V panelu Variables rozbalte
boardi 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