====== Reversi III ======
[[courses:b4b33rph:internal:cviceni:program_po_tydnech:tyden_07|Učitelská verze stránky]]
===== Výsledky učení =====
Po tomto cvičení student
* ví, jakými strategiemi chce vybavit svého Reversi hráče, a má dobrou představu, jak je implementovat;
* umí v Pythonu vytvořit textový soubor a zapsat do něj data, resp. otevřít existující soubor a data z něj načíst;
* ovládá základní techniku pro parsování dat z textů pomocí ''str.split()''.
===== Program =====
* Diskuze kódu hráče reversi
* Práce se soubory
* Programovací úlohy: metody ''save'' a ''load'' u třídy ''MyMatrix'', počítání znaků v řetězci a souboru
* Hádanka
===== Textové soubory =====
Seznamte se s tématem {{:courses:b4b33rph:prednasky:files.pdf|Práce se soubory}}. Popisovaný způsob se hodně podobá práci se soubory třeba v jazyku C.
Existuje i objektové rozhraní pro práci s cestami, adresáři a soubory, modul [[https://docs.python.org/3/library/pathlib.html|pathlib]]. Zkuste se podívat na [[https://calmcode.io/pathlib/do-not-hardcode.html|několik krátkých videí o modulu pathlib]].
V Pythonu 3 jsou všechny řetězce implicitně v unicode v kódování UTF-8. (Chcete-li používat jen sekvenci bytů, musí se použít datový typ ''bytes''.) To také znamená, že při načítání textů z textových souborů je třeba specifikovat kódování, v němž je textový soubor uložen:
with open('soubor.txt', 'rt', encoding='utf-8') as f:
retezec = f.read()
Argument ''encoding="utf-8"'' používejte vždy, a to při čtení i při zápise. Neuvedete-li ho, Python použije implicitní kódování, které je ale závislé na operačním systému. Totožný program se pak může chovat jinak na různých systémech.
Více např. zde: [[http://www.diveintopython3.net/files.html]]
===== Programovací úlohy =====
Programujte samostatně a ptejte se cvičícího. Snažte se o eleganci. Rozmyslete si trochu řešení předem, třeba na papír.
==== Práce se soubory ====
* Vytvořte třídu ''MyMatrix'', která dostává jeden nepovinný vstupní argument reprezentující matici (2D list).
* Vybavte vaši třídu ''MyMatrix'' metodami ''save(self, filename)'' a ''load(self, filename)'':
* Metoda ''save'' uloží prvky matice do textového souboru se zadaným jménem; na každém řádku bude jeden řádek matice a jeho prvky budou oddělené mezerou.
* Metoda ''load'' načte z textového souboru se zadaným jménem uložená čísla a udělá z nich prvky matice.
* Zvažte, jak obě metody vhodně dekomponovat, aby ony samy nedělaly úplně všechno.
* Příklad použití:
>>> a = MyMatrix([[1, 2, 3], [2, 3, 4]])
>>> a.save('matrix.txt')
>>> b = MyMatrix()
>>> b.load('matrix.txt')
>>> a.get_matrix() == b.get_matrix()
True
Nápověda:
* K rozdělení řetězce podle určitého znaku můžete použít metodu ''split''.
>>> s = '1,2,3,4'
>>> l = s.split(',')
>>> print(l)
['1', '2', '3', '4']
* K odstranění bílých znaků ze začátku a konce řetězce můžete použít metodu ''strip''.
>>> s = '\t1,2,3,4 \n'
>>> l = s.strip()
>>> print(l)
'1,2,3,4'
==== Slovníky ====
* Práce s dictionary: Vytvořte funkci ''count_chars_in_string(s)'', která:
* jako svůj argument přijme textový řetězec a
* na výstupu poskytne slovník (dictionary) s četností jednotlivých znaků v daném řetězci.
* Mohla by vám pomoci třeba metoda ''[[https://docs.python.org/3/library/stdtypes.html#dict.get|get]]''.
* Vytvořte funkci ''count_chars_in_file(filepath)'', která
* jako svůj argument přijme jméno textového souboru (cestu k textovému souboru),
* otevře jej, načte jeho obsah jako řetězec,
* vytvoří dictionary s četností znaků v tomto řetězci a
* vytvoří textový soubor se stejným názvem, jako měl původní text, ale s příponou ''.freq'', do něhož
* uloží četnost znaků tak, že na každém řádku bude vždy znak a jeho četnost oddělené mezerou.
===== Hádanka =====
Zadání hádanky se dozvíte na cvičení.
===== Domácí úkol =====
==== Odevzdání ====
Některou z příštích nedělí je třeba odevzdat Reversi hráče pro turnaj. Platný termín je v BRUTE!
[[courses:b4b33rph:cviceni:reversi:specifikace|Specifikace]]
==== Programování ====
* Pokuste se naprogramovat funkce ''read_classification_from_file()'' a ''write_classification_to_file()'' pro čtení a zápis dat potřebných pro úlohu SPAM, viz [[..:spam:krok1|krok 1]]. Nepotřebujete k tomu znát nic víc než to, co jsme na tomto cvičení procvičili. Příště si ukážeme a vysvětlíme testy, které jsou k dispozici, a ověříme si, že vaše implementace testy splňuje.