Warning
This page is located in archive. Go to the latest version of this course pages. Go the latest version of this page.

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 $<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:
    • 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 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

courses/b3b33alp/cviceni/t04.txt · Last modified: 2019/10/15 20:56 by herinjan