====== 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())) f.close() * 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'' * po dokončení čtení je správné soubor uzavřít - funkce ''close'' proměnné soubor pole=[] f=open('pole.txt','r') for line in f: pole.append(int(line)) f.close() * 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. ===== Témata k procvičení ===== * 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 ==== * Napište program **symmetric.py**, který načte jednu řádku pole celých čísel ze standardního vstupu. * Pole na vstupu obsahuje vždy alespoň jedno číslo * Program najde v zadaném poli nejdelší souvislou symetrickou posloupnost čísel * Posloupnost je symetrická, když první prvek se rovná poslednímu prvku, druhý prvek se rovná předposlednímu prvku, atd. až do středu posloupnosti * Tedy posloupnost ''10 5 -4 20 -4 5 10'' i posloupnost ''3 6 6 3'' je symetrická, posloupnost ''10 8 2 5 8 10'' není symetrická, 2 se nerovná 5 * Výstupem programu je index prvního prvku posloupnosti a její délka * index prvního prvku se počítá od 0 * délka je počet prvků posloupnosti * pokud je v poli více symetrických posloupností stejné délky, najděte mezi nimi posloupnost s největším součtem prvků posloupnosti * symetrická posloupnost je i posloupnost s jedním prvkem, pokud neexistuje symetrická posloupnost delší než 1, tak je vlastně výsledkem maximum * Program v souboru **symmetric.py** odevzdejte pomocí odevzdávacího systému (úloha HW04). * Příklad: Vstup programu je: 12 -16 -7 -18 -5 -3 2 8 9 -14 -18 -9 11 -7 -3 4 -10 4 -3 -7 11 -12 -14 5 -11 -7 7 13 2 19 12 11 Výstup programu bude: 12 9 Vstup programu je: -14 -8 -9 2 -18 12 1 -1 -14 -14 13 -2 15 Výstup programu bude: 8 2 Vstup programu je: -4 -12 17 18 -8 7 Výstup programu bude: 3 1 Vstup programu je: 2 2 2 2 2 2 2 2 Výstup programu bude: 0 8 ==== Těžká varianta ==== * Napište program **solve.py**, který vyřeší rovnice jako například na následujícím obrázku: {{ :courses:b3b33alp:cviceni:rovnice.png?direct&400 |}} * Vstup: * 2-8 řádek rovnic * jedna rovnice v sobě obsahuje znaky ''+ ='', celá čísla a malá písmena * proměnná v rovnici je vždy jedno malé písmeno * celá čísla před písmenem znamenají, kolik daného ovoce se v rovnici vyskytuje * Příklad z obrázku bude převeden na tyto rovnice: * ''5j=3s+h'' * ''s=j+h'' * ''2h+3j=2s+2'' * Výstup: * hodnoty proměnných v abecedním pořadí * V našem případě ''h j s'' tedy ''1 2 3'' * Poznámka: * Rovnice jsou zadány na standardním vstupu, tedy pro testování je zadávejte buď z klávesnice a na konec zadejte ctrl+D, nebo je načtěte ze souboru * Příští cvičení budeme dělat Gausovu eliminační metodu, třeba by to mohlo pomoci * Výsledky jsou vždy celočíselné hodnoty, pokud použijete fractions, tak se nemusíte starat o přesnost výpočtů * Číst standardní vstup do konce lze takto: import sys for line in sys.stdin: print(line) * Příklady Vstup: 2g+12=4v 3v=g+10 výstup programu bude: 2 4 protože $g=2$ a $v=4$, a tedy $2*2+12=4*4$ a $3*4=2+10$ Vstup: 4x+3t=5q+o+j+40 4x+4z+2j=3q+4e+4t+2o+20 2t+9=5q+e+z+4o+3j x+2e+2t+3z+o+4j=51 4q+73=5x+2e+3t+4o+3j q+3z+2o+3j+19=5x+2e+t 2z+3j+1=3x+3q+2e+5o výstup programu bude: 1 6 0 0 6 7 2