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í.
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 případně finally a else 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 případně finally a else 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 případně finally a else 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.