====== Cvičení 4: Pole, n-tice, vyhledávání v poli ======
==== Úkol 1 Opakování funkce a for cykly ====
* Napište program, který porovná dvě funkce ''a(x,y,z)'' a ''b(x,y,z)'' se třemi logickými proměnnými a zjistí, zda výrazy jsou ekvivalentní, případně vypíše pro jaké kombinace vstupů se výstupy liší.
* Porovnejte následující funkce:
def a(x,y,z):
return (x and y) or (not y and z)
def b(x,y,z):
return x or z
==== Úkol 2 Najdi a změň ====
* Napište funkci ''my_find(a,b)'', která v řetezci ''a'' hledá řetězec ''b'' (nepoužívejte vestavěnou funkci find).
* Pokud řetězec najde, vrátí index jeho prvního výskytu zleva.
* Pokud řetězec nenajde, vrátí -1.
* Napište funkci ''my_replace(a,b,c)'', která v řetězci ''a'' nahradí všechny výskyty řetězce ''b'' řetězcem ''c''.
* Ve funkcích používejte pouze funkce
* ''len(s)'' - délka řetězce,
* ''s[i]'' - znak na pozici ''i'',
* ''s[i:j]'' - podřetezec od ''i'' do ''j''
* ''s[:j]'', ''s[i:]'' - podřetězec od počátku do ''j'', resp. od ''i'' do konce.
==== Úkol 3 Záměna slova ====
* Napište program, který čte standardní vstup a v načteném řetězci zamění slovo ''Ahoj'' za slovo ''Cau''.
* Můžete využít vestavěné funkce find, replace, nebo Vaše funkce z předchozí úlohy.
* Pokud se ve vstupním řetězci objeví slovo ''Konec'', program skončí. V tomto řádku ale nejdříve zamění Ahoj za Cau.
==== Načítání ze souboru ====
* Načtení pole 1D ze souboru
* Pole může být v souboru uloženo dvěma způsoby:
* všechna čísla na jednom řádku oddělená mezerami, nebo jiným znakem
* pro načtení nejdřív rozdělte řádek na řetězce podle dělicího znaku - funkce ''split()''
* pak převeďte řetězce na čísla a uložte do pole
f=open('line.txt','r')
line = f.readline()
pole = list(map(int, line.split()))
* na řádku pouze jedno číslo, počet řádek udává délku pole
* otevřete soubor pro čtení - ''open''(název_souboru, "r" - read čtení)
* přečtěte celý soubor po řádcích - ''readline'', nebo cyklus ''for''
* každý řádek převeďte na číslo a připojte na konec pole - funkce ''append''
pole=[]
f=open('pole.txt','r')
for line in f:
pole.append(int(line))
* Tisk a formátování výstupu
* nejjednodušší výpis jednorozměrného pole je přímo využít vestavěnou funkci print - ''print(pole)''
* pokud chcete vypsat pole na každý řádek jednu hodnotu, pak využijte cyklus ''for''
for x in pole:
print(x)
==== Úkol 4 funkce nalezení maxima ====
* Napište funkci, která vrací největší hodnotu v poli a zároveň vrací index tohoto prvku
* Pro pole nulové délky vrací None index -1.
* Pozor: je třeba předpokládat, že v poli mohou být jakékoliv hodnoty (kladné, nuly, záporné)!
==== Úkol 5 funkce nalezení druhého největšího prvku v poli ====
* Napište funkci, která vrací druhou největší hodnotu v poli menší než maximum a zároveň vrací index tohoto prvku
* Pro pole délky méně než 2 vrací None a index -1.
* Pro pole jehož všechny prvky mají stejnou hodnotu vrací také None a -1
* Pozor: je třeba předpokládat, že v poli mohou být opět jakékoliv hodnoty (kladné, nuly, záporné)!
===== domácí příprava =====
Implementujte následující úlohy:
* Napište funkci, která vypisuje 1,-1,1,-1 ...
* Napište funkci, která vypisuje výsledek operace $(-1)^k$ pro $k=0,\ldots,100$. Zamyslete se nad rychlostem výpočtu, navrhněte alternativní postupy
* Napište funkci ''min(a,b)'', která vrací minimum ze těchto dvou prvků (proměnné jsou čísla).
* Napište funkci ''max(a,b)''
* Napište funkci ''area(radius)'', která vypočítá obsah kruhu o zadaném poloměru
* Napište funkci ''d2r(angle)'', která převede stupně na radiány "degrees to radians = d2r"
* Napište funkci ''r2d(angle)'', která převede radiány na stupně
* Napište funkci ''normalize(angle)'', která převede zadaný úhel (v radiánech) do intervalu $<0, 2\pi)$
* Napište funkci pro výpis pole:
* s využitím cyklu ''for''
* s využitím cyklu ''while''
===== domácí práce =====
==== Lehká varianta ====
* Přebíjená je hra, při které pokládají na stůl dva hráči současně kartu a ten, který má vyšší hodnotu, bere všechny vyložené karty. Pokud mají karty stejnou hodnotu, pak hráči pokračují ve vykládání karet. Pokud i na konci mají jejich karty stejnou hodnotu, zůstávají tyto karty na stole.
* Napište program **take.py**, který načte dvě řádky polí ze standardního vstupu.
* Každá řádka obsahuje pole hodnot karet v tom pořadí, jak je hráči vykládají na stůl. Karta je celé číslo.
* První řádka obsahuje karty hráče A, druhá řádka obsahuje karty hráče B.
* Pokud obsahují obě řádky stejný počet čísel, pak program vytiskne o kolik karet má hráč A více než hráč B (pokud má na konci více karet hráč B, tak se jedná o záporné číslo)
* Pokud jedna řádka obsahuje více čísel než druhá, pak se vytiskne "ERROR"
* Na začátku mají oba hráči pouze karty uvedené na jejich řádkách, na konci pouze ty karty, které vyhráli.
* Program v souboru **take.py** odevzdejte pomocí odevzdávacího systému (úloha HW04).
* Příklad:
* vstup programu je:
1 2 3 4 5 6 7 8
1 2 3 5 5 6 2 10
* výstup programu bude:
-4
==== Těžká varianta ====
* Napište program **compose.py**, který načte řetězec cifer na první řádce a celé číslo N na řádce druhé.
* Program vloží znaky +, - mezi zadané cifry tak, aby hodnota vytvořeného výrazu byla N
* Pokud má příklad více řešení, vytiskněte všechny (netiskněte ale vícekrát stejné řešení), pokud příklad řešení nemá, vytiskněte NONE
* Na pořadí vytištěných výrazů nezáleží
* POZOR: Program může být výpočetně náročnější, otestujte si nejdříve Váš program na počítači a pouze důkladně otestovaný program nahrávejte do odevzdávacího systému
* Příklad:
* Pro vstup:
123456789
200
* výstup programu bude:
123-4+5-6-7+89
123+4+5+67-8+9
1+234-5-6-7-8-9