Následující úkoly na sebe navazují. Nejlepší je proto je dělat jeden po druhém.
Během tohoto bloku úkolů budeme vylepšovat konzolovou kalkulačku,
kterou jsme implementovali již v úkolu číslo 6 v domácích projektech na cykly.
Program měl za úkol načíst od uživatele od uživatele dvě čísla a
jednoznakový řetězec – buď '+'
, '-'
, '*'
nebo '/'
. Pak provést příslušnou operaci.
Pojďme si ji připravit pro lepší rozdělení do modulů a psaní testů.
Napiš tedy znovu program, který postupně načte od uživatele dvě čísla a
jednoznakový řetězec – buď '+'
, '-'
, '*'
nebo '/'
.
Program provede na číslech příslušnou operaci.
Program bude napsán v jendom modulu kalkulacka.py
ve kterém budeme mít funkce
pro výpočetní operace sčítání, odčítání, násobení a dělení.
Můžeš vyjít z rámcového kódu, který jsme ukazovali na cvičení.
Nezapomeň také do modulu doplnit konstrukci if __name__ == '__main__':
.
Vytvoř modul operace.py
do kterého přesuň funkce na výpočty.
Z tohoto modulu je pak naimportuj v modulu kalkulacka.py
aby
se v něm daly používat.
Vytvoř testovací modul test_kalkulacka.py
. Napiš do něj testy pro
otestování, zda počítají opravdu správně. Nezapomeň otestovat i nestandardní
vstupy a ověřit, zda dělení nulou opravdy vyhodí chybu.
V modulu kalkulacka
vytvoř funkci proved_vypocet
, která bere tři argumenty.
První číslo, druhé číslo a znak, který nám definuje operaci.
Funkce s čísly provede příslušnou operaci a vrátí výsledek.
Pro matematické operace se samozřejmě použijí funkce z modulu operace
.
Do testovacího modulu doplň test, který otestuje správné chování
funkce proved_vypocet
z modulu kalkulacka
.
Pomocí try
, except
ošetři program pro následující případ.
Uživatel je vyzván, aby zadal číslo, ale zadá něco, co nelze na číslo převést.
Program zachytí příslušnou výjimku, vypíše informaci o špatně zadaném vstupu a ukončí se, aniž by prováděl nějaké výpočty.
Pomocí try
, except
ošetři program pro následující případ.
Uživatel chce dělit nulou.
Program zachytí příslušnou výjimku, vypíše informaci o špatně zadaném vstupu a ukončí se, aniž by prováděl nějaké výpočty.
Pomocí try
, except
ošetři program pro následující případ.
Uživatel zadá neplatný operand.
Program zachytí příslušnou výjimku, vypíše informaci o špatně zadaném vstupu a ukončí se, aniž by prováděl nějaké výpočty.
Následující úkoly slouží pouze pro lepší seznámení se s modulem logging. Pro připomenutí, rychlé nastavení logovacího modulu vypadá takto:
logging.basicConfig(filename='muj_log.log',level=logging.DEBUG)
Modul logging
musí být samozřejmě naimportován.
Dokážeš popsat, co nám v nastavení logování dělá parametr level
?
V modulu kalkulacka.py
nastav logování. Ty části kódu, ve kterých zachycuješ
výjimky (to jsou ty hned za except:
) doplň o logovací zprávu s důležitostí error
.
Doplň další vhodná místa v kódu o informační a debugovací zprávy. Rozhodnutí, co to jsou vhodná místa, je zcela na tobě. Pokud cheš o logy doplnit i další moduly, konfigurovat logging modul v nich už nemusíš.
Následující projekty jsou součástí projektu 1D Piškvorky. Pokud na ně máš ještě chuť, doporučuji je dělat jeden po druhém.
Rozděl 1D Piškvorky na čtyři moduly:
ai.py
, kde bude funkce tah_pocitace
,piskvorky.py
, kde budou ostatní funkce,hra.py
, kde bude import a volání hlavní funkce z piskvorky.py
(a nic jiného),test_piskvorky.py
, kde budou testy.Jak se do importů nezamotat? Podívej se do materiálů na sekci cyklické importy.
Napiš aspoň dva testy na každou funkci z Piškvorek, ke které testy napsat umíš.
Testy pravděpodobně neumíš napsat na funkci input
a všechny funkce, které ji (byť nepřímo) volají.
A taky asi neumíš otestovat účinek funkce print
.
Zkus program přepsat tak, aby část, která není pokrytá automatickými testy, byla co nejmenší.
Místo volání print
můžeš často vrátit řetězec
a print
zavolat až na návratovou hodnotu.
Podobně input
můžeš zavolat před zavoláním funkce,
která pak může příkaz od uživatele brát jako argument.
Doplň funkci tah_pocitace
tak, aby brala jako argument symbol, za který má počítač hrát – buď 'x'
, nebo 'o'
.
Dopiš testy.
Ověř, že se funkce tah_pocitace
se umí vyrovnat s jinou délkou hracího pole než 20.
„Ověření” znamená napsání příslušného testu.
Ověř si, že se tah_pocitace
chová rozumně když dostane plné hrací pole, nebo pole s délkou 0.
Rozumné chování v tomto případě znamená vyvolání rozumné výjimky.
Podle toho, jak jste se na sraze domluvili, pošli
soubor ai.py
(s funkcí tah_pocitace
)
e-mailem (např. organizátorům, koučovi, nebo vůbec).
Posílej ho jako přílohu, nekopíruj ho do textu e-mailu.
Jestli procházíš kurz sama a můžeš programování konzultovat s někým
zkušenějším, je tento úkol na takovou konzultaci ideální téma.
Dozvíš se, jak si tvá strategie stojí proti ostatním – a proti testům, které napíše organizátor. :) Strategii je možné i vylepšovat a poslat několik různých verzí. Neboj se poslat i první nástřel! Stejně tak se neboj funkci poslat, i kdyby ještě nebyla úplně dodělaná.
Na některém dalším srazu bude turnaj o ceny!
Máš-li Piškvorky hotové, můžeš si naprogramovat ještě jednu hru! Jestli na to tedy máš čas a chuť.
Vytvoř hru sibenice
podle následujícího popisu.
Snaž se projekt rozdělit do funkcí a modulů s hezkými jmény,
piš testy a dokumentační řetězce, funkční kousky dávej postupně do Gitu.
index_
a funkce zamen
z piškvorek.+---. | | | O | --|-- | / | ~~~~~~~ p_t__n
Funguje-li ti předchozí hra, můžeš ji vylepšit.
ABC
nebo !
), nepovažuj to za tah.