Skip to content

cviceni02

malja edited this page Dec 15, 2016 · 1 revision

Úkoly v hodině

Řešení všech úkolů ze cvičení 2 je ve složce cviceni02.

Úkol 1

Napište program, který načte celé číslo udávající časový interval ve vteřinách a výpíše kolik je to dní, hodin, minut a vteřin.

  • Tedy pokud bude vstup 100000 pak vypíše: den 1 hodin 3 minut 46 vterin 40

Úkol 2 - Nejmenší dělitel

Napište program, který načte číslo n a najde jeho nejmenšího dělitele většího než 1.

  • Je vhodné použít konstrukci break, cyklus můžete použít while i for.
  • Otestujte svůj program na čísle 999962000357

Úkol 3 - Tisk šachovnice

Napište program, který vytiskne čtvercovou šachovnici ze znaků 'O' a '*' o velikosti zadané uživatelem, jako vstup Vašeho programu.

Pro tisk znaku bez konce řádky použijte následující konstrukci (end definuje zakončení řetězce a je standardně nastaveno na nový řádek):

print('.', end="")

Úkol 4 - Odlaďte syntaktické chyby v programu

Zkopírujte si následující kód do souboru, v programu odstraňte syntaktické chyby. Program spusťte a zjistěte co dělá

step = 0.1
sum = 0
for is in range(1,11):
    sum += step
    if (suma == is/10):
        print("Plati",sum,"rovno", is/10)
     else:
       print("Neplati",sum,"nerovno", is/10)

Úkol 5 - Výpočet třetí odmocniny přičítáním

Vypočtěte třetí odmocninu kladného čísla y, zadaného jako vstup Vašeho programu následujícím postupem:

  • Přičítejte k proměnné value číslo 1 dokud je třetí mocnina této proměnné menší než y
  • Přičítejte k proměnné value číslo 0.1 dokud je třetí mocnina této proměnné menší než y
  • Přičítejte k proměnné value číslo 0.01 dokud je třetí mocnina této proměnné menší než y
  • Proměnná value obsahuje odmocninu čísla y s přesností na dvě desetinná čísla

Úkol 6 - Výpočet třetí odmocniny přičítáním se zadanou přesností

Upravte program z úkolu 5, aby pracoval se zadanou přesností

Program načte číslo y a n a nalezne třetí odmocninu z čísla y na n desetinných míst

Upravte algoritmus, aby uměl spočítat i třetí odmocniny ze záporných čísel

Úkol 7 - Půlení intervalu

Metoda půlení intervalu hledá řešení obecné rovnice f(x)=0, kdy známe dva body x1 a x2 takové, že f(x1)<0 a f(x2)>0.

Algoritmus rozpůlí interval mezi body x1 a x2, tedy nalezne bod x′=(x1+x2)/2 a pokud je f(x′)<0 pak nahradí bod x1 bodem x′, jinak nahradí bod x2 bodem x′. Výše uvedený krok se opakuje dokud není |x1−x2|<presnost.

V případě hledání třetí odmocniny z čísla y je f(x)=x^3−y, pokud f(x)=0, tak to znamená, že x^3−y=0 což lze zapsat jako x^3=y a tedy x=sqrt(y,3).

Napište program, který nalezne třetí odmocninu zadaného čísla y na 8 desetinných míst (výpočet ukončíte pokud |x1−x2|<0.000000001). Na počátku zvolte x1=0 a x2=y pro kladná y>1 a x1=y a x2=0 pro záporná y←1 a x1=−1 a x2=1 v ostatních případech.

Úkol 8 - Výpočet třetí odmocniny Newtonovou metodou

Newtonova (Babylónská) metoda tečen x_(i+1) = f(x_i)/f′(x_i) pro třetí odmocninu z čísla y dostáváme x_(i+1)=1/3(2x_i+y/x_i^2)

Řada x_i konverguje k třetí odmocnině z čísla y

x0 můžete nastavit na libovolnou hodnotu různou od 0, např x0=1, případně na lepší odhad (Čím lepší odhad nalezneme, tím rychleji řada konverguje)

Výpočet lze ukončit podle rozdílu |x_(i+1)−x_i|<presnost ( lze také testovat |x_i^3−n|<presnost )

Domácí úkol

Lehká varianta

Program načte kladné reálné číslo (označme ho x) a poté načte další kladné reálné číslo (označme ho y). Program vypočte logaritmus čísla x o základu y metodou půlení intervalu.

Výsledek nalezněte s přesností na 8 desetinných míst (výpočet ukončíte pokud |x1−x2|<0.000000001).

Použití nějaké knihovní funkce (např. math.log) není dovoleno. Program volající cizí funkce nebude hodnocen. Uložte jako log.py.

Pro nastavení krajních mezí platí následující pomůcky:

  • pokud je y>1,x>1 pak levá mez může být 0
  • pokud je y>e,x>1 pak víme, že y^k>k+1 tedy pravá mez může být x
  • pokud je e>y>1,x>1 pak víme, že y^k>k*ln(y)+1 (derivace v bodě 0 je ln(y)), tedy pravá mez může být x/ln(y) a pro e>y>1 můžeme použít ln(y)>(y−1)/(e−1)
  • pokud je x<1 pak víme, že 1/x>1 a 1/y^k=y^(−k), tím pádem můžeme použít záporné hodnoty mezí zjištěné pro hodnotu 1/x, tedy pro výše uvedené případy pravá mez rovna 0 a levá mez rovna −1/x, resp. −1/x*( (e−1)/(y−1) )
  • pokud je y<1, pak (1/y)^k=y^(−k). Tedy zjistíme meze pro základ 1/y (což jsme uvedli výše) a tyto meze vynásobíme −1.

Těžší varianta

Vytvořte program base.py, která ze standardního vstupu přečte řádku, která obsahuje desetinné číslo a druhou řádku, která obsahuje základ soustavy čísla z první řádky. Základ soustavy je v rozmezí 2 .. 36 Pro soustavy o základu menším nebo rovno 10, obsahuje desetinné číslo pouze čísla od 0 .. základ soustavy - 1 a znak . Pro soustavy o základu větším než 10, obsahuje desetinné číslo čísla 0,..,9 a písmena 'a', .. , 'z', ale hodnota

ord(znak)−odr(′a′)<zaklad_soustavy−10.

Desetinné binární číslo

101.0101=1∗2^2+0∗2^1+1∗2^0+0∗2^(−1)+1∗2^(−2)+0∗2^(−3)+1∗2^(−4)=5.3125

Výstupem programu je zadané číslo převedené do desítkové soustavy (tedy pro vstup 101.0101 bude výstup 5.3125)

Pokud je na vstupu špatně zadané číslo (obsahuje jiné znaky než povolené cifry a znak '.', případně obsahuje znak '.' vícekrát), pak vytiskne na výstup slovo “ERROR”

Správnost vstupu základu soustavy nemusíte testovat.