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
f=open('line.txt','r')
line = f.readline()
pole = list(map(int, line.split()))
f.close()
pole=[]
f=open('pole.txt','r')
for line in f:
pole.append(int(line))
f.close()
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 $<a,b>$. Ř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:
Domácí úkol
Lehká varianta
Napište program symmetric.py, který načte jednu řádku pole celých čísel ze standardního vstupu.
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).
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
Vstup:
Výstup:
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)
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