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

courses/b3b33alp/cviceni/t04.txt · Last modified: 2017/10/27 09:10 by stepan