====== Cvičení 4: 1D pole ======
==== Ú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í 1D pole 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í 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 a zároveň vrací index tohoto prvku
* Pro pole délky méně než 2 vrací index -1.
* Pozor: je třeba předpokládat, že v poli mohou být opět jakékoliv hodnoty (kladné, nuly, záporné)!
==== Polynomy ====
* Polynom $a_0 + a_1 x + a_2 x^2 + \ldots + a_n x^n$ můžeme reprezentovat polem koeficientů ''[ a_0, a_1, a_2, ... , a_n ]''
* Příklad:
* polynomu $1 + x - 2x^2$ odpovídá pole ''[1, 1, -2 ]''
* polynomu $x - x^3$ odpovídá pole ''[0, 1, 0,-1 ]''
* Nulové koeficienty lze vynechat u nejvyšších mocnin, ale ne u nejnižších.
* Příklad:
* ''[0,1,2]'' vyjadřuje polynom $x + 2x^2$
* ''[0,1,2,0]'' vyjadřuje taktéž polynom $x + 2x^2$
* ale ''[1,2,0]'' vyjadřuje polynom $1 + 2x$
==== Úkol 6 hezký výpis polynomu ====
* Napište funkci ''printPoly'',která vypíše polynom, přičemž mocniny bude tisknout znakem '^'.
* Pokud je nějaký koeficient nulový, příslušný člen se nevypíše.
* Příklad:
* ''printPoly( [ 1, 1, 0, -2] )'' vytiskne ''1 + x - 2x^3''
* ''printPoly( [ -2, 0, 0, -2, 0, 0, 0] )'' vytiskne ''-2 -2x^3''
==== Úkol 7 výpočet hodnoty polynomu ====
* Napište funkci ''polyValue'' , která pro zadaný polynom a hodnotu x vypočte jeho hodnotu v zadaném bodě $x$
* Tedy ''polyValue([1,0,2], 4)'' má hodnotu ''33'', protože $1 + 2x^2$ pro $x=4$ je 33.
===== Domácí práce =====
* Napište funkci, která pro zadaný polynom najde je maximum/minimum v zadaném intervalu $$. Řešte numericky, např. s krokem $\delta=0.1$. Nápověda: použijte funkci pro výpočet hodnoty polynomu.
* Napište funkci pro výpočet první derivace polynomu:
* Příklad: derivace ''[0,2,-3]'' je ''[2,-6]'' neboť derivace $2x - 3x^2$ je $2 - 6x$
===== Domácí úkol =====
==== Lehká varianta (max 1.5 bodu) ====
* Napište program pro dělení dvou polynomů
* **Vstup**:
* Jméno souboru na příkazové řádce
* Soubor obsahuje dvě řádky, na každé řádce jsou koeficienty polynomu (zadané ve stejném formátu jako v tomto cvičení), tedy polynom $a_0 + a_1 x + a_2 x^2 + \ldots + a_n x^n$ je reprezentován polem $a_0\ a_1\ a_2\ ...\ a_n$.
* Koeficienty polynomu jsou celá čísla oddělená mezerou.
* Vstupní polynomy mohou být různého stupně.
* Je zaručeno, že je vždy zadán alespoň nultý-koeficient $a_0$.
* **Výstup**:
* Na standardní výstup vypište koeficienty polynomu, který vznikne vydělením prvního vstupního polynomu druhým vstupním polynomem.
* Na druhou řádku standardního vstupu vypište zbytek po dělení prvního vstupního polynomu druhým vstupním polynomem.
* Koeficienty jsou vypsány od nejmenšího (tj. $a_0$, $a_1$, atd.) a jsou odděleny mezerou.
* Poslední vypsaný koeficient $a_i$ nesmí být roven nule pokud $i > 0$
* Tedy například: polynom $1 + 2x$ je vypsán jako '1 2', nikoliv jako '1 2 0' nebo '1 2 0 0'.
* Polynom $0$ (tj. $a_0=0$) musí být vypsán jako '0'.
* Polynom $0 + 3x^3$ je vypsán jako '0 0 0 3'. Výpisy typu '0 0 0 3 0 0' nebo '0 0 0 3 0 0 0 0 0' nejsou správné.
* Výstupní koeficienty jsou opět celá čísla.
* Program odevzdejte do úlohy HW04 pod jménem **poly.py**
* Předpokládejte, že
* je zaručeno, že program bude volán se jménem existujícího souboru.
* je zaručeno, že vstupní soubor obsahuje správně zadané polynomy (tj. dvě řádky, na každé řádce řada celých čísel oddělená mezerou). Na každé řádce je zadáno alespoň jedno číslo.
* Tipy:
* výsledek je celočíselný polynom. Aby Vám výpočet vyšel, použijte vnitřní typ Fraction:
from fractions import Fraction
f = open(sys.argv[1],"r");
line = f.readline()
p1 = list(map(Fraction, line.split()))
line = f.readline()
p2 = list(map(Fraction, line.split()))
f.close()
* Argument příkazové řádky předáte v terminálu (na Linuxových systémech) takto:
python3 polynom.py soubor.txt
* Pokud používáte jiný operační systém, případně takové vývojové prostředí, kde nelze argument příkazové řádky nastavit, použijte (pro ladění) pevné jméno souboru a před odevzdáním do Bruta použijte hodnotu z sys.argv takto:
filename = sys.argv[1] # tuto radku zakomentovat pro domácí ladeni
filename = "soubor.txt" # tuto radku zakomentovat pro Bruta
f = open(filename, "r")
V následujících příkladech předpokládejte, že se program volá s argumentem, který definuje jméno vstupního souboru, např.:
python3 polynom.py soubor.txt
Pokud ''soubor.txt'' obsahuje:
0 12 -2 -4
3 -2
Výstup (stdout):
0 4 2
0
Komentář: neboť $(0 + 4x + 2x^2)(3-2x) = 0+ 12x -2x^2 -4x^3$.
----
Pokud ''soubor.txt'' obsahuje:
5 -3 6 2 -8
2 0 3 4
Výstup (stdout):
2 -2
1 1
Komentář: neboť $(2 - 2x)(2 +3x^2+4x^3)+(1+x) = 5 -3x +6x^2 +2x^3 -8x^4$, nebo $(2 - 2x)(2 +3x^2+4x^3) = (5 -3x +6x^2 +2x^3 -8x^4) - (1+x)$
==== Těžká varianta (3 body)====
* Napište program **fillword.py**, který doplní zadanou osmisměrku jedním slovem ze zadaného slovníku.
* Cílem je najít jedno slovo ze slovníku, které nahradí všechny výskyty znaku '0' písmenem z nalezeného slova.
* **Vstup**
* Názvy dvou souborů
* První soubor obsahuje matice písmen, která může obsahovat i znak '0'.
* Druhý soubor obsahuje všechna povolená slova pro osmisměrku
* **Výstup **
* Pozice prvního písmene (řádek, sloupec, směr) a nalezené slovo.
* řádek i sloupec začínají 0 a mají počátek v levém horním rohu matice (při výpisu první řádek nejvýše)
* směr 0 je vzhůru, 1 digonálně vlevo nahoru, 2 doleva, 3 diagonálně vlevo dolů, 4 dolů, pět diagonálně vpravo dolů, 6 doprava, 7 diagonálně vpravo nahoru
* Pokud řešení neexistuje, bude výstupem slovo NONEXIST
.
----
V následujících příkladech předpokládejte, že se program volá s argumenty, které definují jméno vstupních souborů, např.:
python3 fillword.py osm.txt czech.txt
Soubor {{courses:b3b33alp:cviceni:czech.txt|czech.txt}} si můžete stáhnout na uvedém odkazu.
Předpokládejte, že soubor ''osm.txt'' obsahuje:
xxxxtbnxxxx
xnadgpenmen
xuebaturekt
ncnkbendx0x
apadzrzolxm
kalilabubxa
rlxxxxrebar
yseakirejcg
skok0soxneo
xosrozsevsr
xxxxkwexsnp
Výstup:
2 10 3 telurid
----
Pokud soubor ''osm.txt'' obsahuje:
xxisvachtaprrilidals
gstuonheldopennstcix
tnoxuovoliam0dxaxzzx
xreapokxxxxxjablkoux
reljablkoxxnurxxxbux
ebnisjalxxuotirgetni
peixpodaxgxdefmwxiix
ozlxxdudtsoxnxtcixgx
llpixcxuinkx0pulxxnx
aaetjehatzoraxiuxxex
rplaxovxueajmtxddixx
iykteluovdnxxsxavatx
zsdxnnxzaexeazorzizx
aeoazeberntnxiahnxax
csegxpantritubxexxdb
eenxtxaxxlxxaxlnnxpx
unobaxxkorunynxaleax
xavuxxbxaxxxexexxnxx
xdakacabonovalyzxsxx
kontrovanouxxxxxoxxx
pak je výstup:
10 12 0 magnetuje