Cvičení č. 5 a č. 6 rozšířené o poznámky ze cvičení a řešení některých příkladů (ZS 2024/25)¶

V minulém díle jste viděli...¶

Data, se kterými pracuje počítač, jsou vždy zakódována v binární soustavě, bez ohledu na to, v jaké soustavě nebo multimediální reprezentaci jsou zobrazena uživateli na výstupu nebo vstupu.

Základní aritmetické typů v jazyku Python jsou bool, int, float a complex. Kromě booleovských konstant True a False existuje také speciální hodnota None, která má svůj vlastní typ. Čísla můžeme zadávat v desítkové, dvojkové, osmičkové nebo šestnáctkové soustavě:

In [8]:
print(11)
print(0o11)
print(0x11)
print(0b11)
11
9
17
3

S číselnými hodnotami můžeme provádět běžné aritmetické operace pomocí operátorů +, -, *, /, //, % a **. Také jsou k dispozici funkce abs, min, max a můžeme importovat modul math pro zpřístupnění matematických konstant a funkcí:

In [9]:
import math

print("Číslo π je přibližně", math.pi)
print("Hodnota cos(π) je ", math.cos(math.pi))
Číslo π je přibližně 3.141592653589793
Hodnota cos(π) je  -1.0
In [ ]:
# vyzkoušejte si debugeer (ikonka s broukem) a dívejte se, jak se hodnota proměnné mění, 
# podívejte se, jak se změní obsah paměti při volání import (předchozí buňka)

x = 0
In [ ]:
x += 4

Komentáře v jazyku Python¶

Důležitým prvkem programovacích jazyků, který však nemá vliv na vykonávání kódu, jsou komentáře. Komentáře ve zdrojovém kódu programu slouží programátorům k bližšímu vysvětlení příkazu nebo bloku příkazů, které se v programu vyskytují, a umožňují tak program učinit pro lidi pochopitelnějším. Na rozdíl od ostatních prvků jazyka Python nejsou komentáře vázány žádnými syntaktickými pravidly – interpret je zcela ignoruje, pro něj je komentář ekvivalentem mezery: kam se smí vložit mezera, tam se smí vložit komentář.

V jazyku Python komentáře začínají znakem # a končí na konci řádku:

In [3]:
# první komentář
a = 1
b = 2 # druhý komentář
c = 3 # třetí komentář

Pokud je komentář delší, typicky pokud komentuje několik příkazů společně, můžeme jej rozdělit na několik řádků. Takové blokové komentáře je běžné psát před kód, který komentují:

In [6]:
# Zde nastavíme poloměr kruhu, spočítáme jeho obvod,
# a výslednou hodnotu vypíšeme pomocí funkce print.
r = 1.5
obvod = 2 * math.pi * r
print("Obvod kruhu je", obvod)
Obvod kruhu je 9.42477796076938
In [7]:
"""
Komentář pomocí víceřádkového
textového řetězce
"""
r = 1.5
obvod = 2 * math.pi * r
print("Obvod kruhu je", obvod)
Obvod kruhu je 9.42477796076938

Strukturování programu: podmínky a cykly¶

Potřebujeme-li se v programu rozhodnout, jak dále řešit zadanou úlohu, používáme podmíněný příkaz, který vyhodnotí zadanou podmínku a na základě obdrženého výsledku se rozhodne, které příkazy bude provádět dál. Dalším velmi častým prvkem pro strukturování programu jsou cykly, které umožňují provádět určité příkazy opakovaně.

Podmíněný příkaz¶

Podmíněný příkaz začíná klíčovým slovem if, za nímž následuje podmínka a dvojtečka (znak :). Podmínku podmíněného příkazu může tvořit libovolný booleovský výraz (resp. libovolný výraz, který lze převést na typ bool) a tělo podmíněného příkazu je tvořeno blokem příkazů, které se mají provést v případě, je-li podmínka splněna:

In [25]:
a = -1

if a > 0:
    print("číslo je kladné")
    print("číslo se rovná", a)
print("vždy")
vždy
In [26]:
# Podmíněný příkaz
vek = 20

cena = 200
kategorie = "plna cena"
if vek < 18:
    kategorie = "sleva"
    cena = 100
print("Cena vstupenky", cena, "Kč. Kategorie: ", kategorie)
Cena vstupenky 200 Kč. Kategorie:  plna cena
In [27]:
# Větev else
vek = 40
skupinova_sleva = False

if vek < 18:
    kategorie = "sleva"
    cena = 100
else:
    cena = 200
    kategorie = "plna cena"
print("Cena vstupenky", cena, " Kč. Kategorie: ", kategorie)
Cena vstupenky 200  Kč. Kategorie:  plna cena
In [28]:
# Podmínka může být složitější: použijeme operátory and, or, not
# Operátory pro porovnávání: ==, !=, >, <, >=, <=
vek = 40
skupinova_sleva = False

if vek < 18 or vek >= 65 or skupinova_sleva:
    kategorie = "sleva"
    cena = 100
else:
    cena = 200
    kategorie = "plna cena"
print("Cena vstupenky", cena, "Kč. Kategorie: ", kategorie)
Cena vstupenky 200 Kč. Kategorie:  plna cena
In [29]:
# Podmínky můžeme vnořovat do sebe:
vek = 40
skupinova_sleva = True

if vek < 18 or vek >= 65:
    kategorie = "sleva"
    cena = 100
else:
    cena = 200
    kategorie = "plna cena"
    if skupinova_sleva:
        cena *= 0.9
        kategorie = "skupinova sleva"

print("Cena vstupenky", cena, "Kč. Kategorie: ", kategorie)
Cena vstupenky 180.0 Kč. Kategorie:  skupinova sleva
In [46]:
# větve elif - výpočet spadne do první větve, kde podmínka platí
vek = 2
skupinova_sleva = True

if vek < 3:
    kategorie = "dite"
    cena = 0
elif vek < 18:
    kategorie = "junior"
    cena = 100
elif vek > 65:
    kategorie = "senior"
    cena = 50    
else:
    cena = 200
    kategorie = "plna cena"
    if skupinova_sleva:
        cena *= 0.9
        kategorie = "skupinova sleva"


print("Cena vstupenky", cena, " Kč. Kategorie: ", kategorie)
Cena vstupenky 0  Kč. Kategorie:  dite
In [31]:
# jako podmínka může sloužit i výraz, jehož hodnota lze implicitně převést na bool:
if 67.6-7:
    print("ano")
else:
    print("ne")
ano
In [32]:
if 0.0:
    print("ano")
else:
    print("ne")
ne
In [47]:
if "h":
    print("ano")
else:
    print("ne")
ano
In [33]:
# čísla typu float neporovnáváme pomocí == a !=, ale lépe pomocí přibližného porovnání:
a = 0.3
b = 0.2 + 0.1

if a == b:
    print("ano")
else:
    print("ne")
ne
In [34]:
a = 0.3
b = 0.2 + 0.1

if abs(a - b) < 1e-9:
    print("ano")
else:
    print("ne")
ano
In [35]:
import math
a = 0.3
b = 0.2 + 0.1

if math.isclose(a,b):
    print("ano")
else:
    print("ne")
ano
In [50]:
# zřetězené porovnání:
x = 5
y = 3
if 2 < x < 10:           # if 2 < x and x < 10:
    print("ano")
ano
In [37]:
x = 5
y = 3
if x > 2 and x < 10 and 10 > y:
    print("ano")
ano
In [48]:
# tatéž podmínka:
x = 5
y = 3
if 2 < x < 10 > y:
    print("ano")
ano

Univerzální syntaktické pravidlo:

Ve všech případech, kde znak : uvozuje nějaký blok příkazů, ať už jde o podmíněný příkaz, cyklus nebo definici nějakého objektu, musí být všechny příkazy, které do daného bloku patří, odsazeny stejným počtem mezer.

Běžně se používá konvence odsazování pomocí 4 mezer. Přesný počet mezer sice není určen syntaktickými pravidly jazyka, ale všichni se této konvence budeme držet. Také pozor na míchání znaků "mezera" (" ", číslo 40 v ASCII) a "tabulátor" (" ", reprezentován symbolem "\t", číslo 9 v ASCII).

Za jednoduchým podmíněným příkazem může následovat příkaz else, který uvozuje blok příkazů, které se mají provést, pokud podmínka v předchozím příkazu if není splněna:

In [39]:
a = 0
if a > 0:
    print("číslo je kladné")
    print("číslo se rovná", a)
else:
    print("číslo není kladné")
    print("číslo se rovná", a)
číslo není kladné
číslo se rovná 0

Podmíněné příkazy lze samozřejmě vnořovat, přičemž je nutné dbát na správnou úroveň odsazení vnořených příkazů:

In [40]:
a = 0
if a > 0:
    print("číslo je kladné")
    print("číslo se rovná", a)
else:
    if a == 0:
        print("číslo se rovná 0")
    else:
        print("číslo není kladné")
        print("číslo se rovná", a)
číslo se rovná 0

Mezi příkazy if a else spolu s jejich bloky příkazů může ještě vystupovat libovolný počet příkazů elif (zkratka pro else-if), které umožňují provádět ověření dodatečné podmínky v případě, že žádná z předchozích podmínek nebyla splněna. Předchozí příklad tedy můžeme zjednodušit takto:

In [41]:
a = 0
if a > 0:
    print("číslo je kladné")
    print("číslo se rovná", a)
elif a == 0:
    print("číslo se rovná 0")
else:
    print("číslo není kladné")
    print("číslo se rovná", a)
číslo se rovná 0

Porovnávací operátory¶

V jazyku Python jsou k dispozici následující operátory pro porovnávání hodnot výrazů:

Operátor Význam
== Rovnost dvou hodnot. Pozor: neplést s přiřazovacím operátorem =.
!= Nerovnost dvou hodnot ($a \ne b$).
< Ostře menší.
> Ostře větší.
<= Menší nebo rovno ($\le$).
>= Větší nebo rovno ($\ge$).

Jazyk Python dále umožňuje provádět zřetězené porovnávání. Např. výraz x < y <= z > a je ekvivalentní výrazu x < y and y <= z and z > a.

Všechny operátory jsou k dispozici pro datové typy, kde uvedený význam má smysl (např. operátory <, >, <=, >= nejsou k dispozici pro komplexní čísla, kombinace číslo a textový řetězec, apod.) a jejich výsledek je booleovská hodnota True nebo False.

V podmíněných příkazech, kde je očekávána booleovská hodnota, je možné použít libovolný výraz, jehož hodnotu lze implicitně převést na typ bool. Převod se řídí těmito pravidly: None → False, 0 → False, 0.0 → False, complex(0, 0) → False, všechny ostatní číselné hodnoty → True.

Příklady¶

  1. Sudé-liché. Napište program, který zjistí a vypíše, zda je zadané číslo sudé nebo liché.
In [ ]:
# řešení příkladů je na konci dokumentu :)
  1. Je větší. Napište program, který zjistí a vypíše, které ze dvou zadaných čísel je větší.
In [ ]:
 
  1. Je největší. Napište program, který zjistí a vypíše, které ze tří zadaných čísel je největší.
In [ ]:
 
  1. Seřaď. Napište program, který vypíše tři zadaná čísla v pořadí od největšího po nejmenší.
In [ ]:
 
  1. Trojúhelník. Napište program, který zjistí a vypíše, zda lze sestrojit trojúhelník zadaný pomocí tří délek stran.
In [ ]:
 
  1. Test plnoletosti. Napište program, který se zeptá uživatele na věk a odpoví, zda je plnoletý.
In [ ]:
 

Příkaz while – cyklus se vstupní podmínkou¶

Příkaz while je variantou cyklu, který umožňuje ověření libovolné podmínky. Obecná syntaxe vypadá takto:

while nějaká_podmínka:
    tělo_cyklu
    ...

K ověření podmínky dochází vždy před provedením příkazů z těla cyklu. Interpretace chování příkazu while tedy je: dokud platí podmínka, prováděj příkazy.

Příklad: následující program vypíše všechna čísla od 0 do 10 včetně:

In [51]:
# program vypíše všechna čísla od 0 do 10 včetně:
n = 0
while n <= 10:
    print(n)
    n += 1
0
1
2
3
4
5
6
7
8
9
10
In [52]:
# to samé, výpis na jeden řádek:
n = 0
while n <= 10:
    print(n, end=" ")
    n += 1
0 1 2 3 4 5 6 7 8 9 10 
In [ ]:
# program vypíše mocniny dvojky 2^0 ... 2^10:
n = 0
while n <= 10:
    print(2**n, end=" ")
    n += 1
In [54]:
# cykly a podmínky můžeme vnořovat:
# program vypíše jen sudá čísla z intervalu od 0 do 10 (včetně)
n = 0
while n <= 10:
    if n % 2 == 0:
        print(n, end=" ")
    n += 1
0 2 4 6 8 10 
In [44]:
# cyklus můžeme ukončit příkazem break:
n = 0
while n <= 10:
    print(n, end=" ")
    if n == 5:
        break
    n += 1
print("pokračuj")
0 1 2 3 4 5 pokračuj
In [55]:
# while True + break
while True:
    s = input("je konec?")
    if s == "ano":
        break
print("pokračuj")
pokračuj
In [9]:
# continue:
n = 0
while n <= 5:
    if n == 1:
        n += 1
        continue
    print(n, end = " ")
    n += 1
print("pokračuj")
0 2 3 4 5 pokračuj
In [56]:
# cyklus se neprovede ani jednou:
n = 0
while n > 0:
    print(n, end=" ")
    n += 1
print("konec")
konec
In [ ]:
# program se může tzv. zacyklit (pokud podmínku neuděláme správně)
n = 0
while n >= 0:
    #print(n, end=" ")
    n += 1
# nekonečný cyklus ... CHYBA ... proces musíme ukončit
In [ ]:
# součet čísel od 0 do 10:
n = 0
soucet = 0
while n <= 10:
    #print(n, end=" ")
    soucet += n
    n += 1
print("soucet:", soucet)
In [ ]:
# počet sudých čísel mezi 0 a 10:
n = 0
pocet = 0
while n <= 10:
    if n % 2 == 0:
        #print(n, end=" ")
        pocet += 1
    n += 1
print("pocet:", pocet)

Tip: Kliknutím na tlačítko pytutor v rozhraní JupyterLab se zobrazí grafická interpretace toho, co se v programu děje.

Příkaz for – cyklus s parametrem¶

Příkaz while je sice obecný cyklus (umožňuje ověřovat libovolnou podmínku), ale často je poměrně nešikovný, protože musíme sami zajistit správný přechod na následující iteraci. Alternativní příkaz for je užitečný v případech, kdy chceme opakovat příkazy pro předem známou sadu hodnot.

Obecná syntaxe příkazu for vypadá takto:

for parametry_cyklu in zdroj:
    tělo_cyklu

Parametr cyklu bývá většinou jen jeden. Může jich být i více, ale pak potřebujeme zdroj, který v každém kroku dodává příslušně velkou sadu hodnot.

Jako zdroj hodnot pro příkaz for může sloužit mnoho různých objektů, např. kontejnery a datové struktury, se kterými se seznámíme později. Dnes si ukážeme jen základní, ale velmi častý zdroj hodnot: funkci range, která představuje posloupnost celých čísel v určitém rozmezí. Chování funkce range se liší podle počtu (celočíselných!) argumentů, které jí předáme:

  1. Zadáme-li jeden argument, zdroj představuje posloupnost celých čísel od nuly až po zadanou hodnotu, ale tu už ne. Zadáte-li proto jako argument nulu nebo nějaké záporné číslo, dostaneme prázdnou posloupnost. Následující program vypisuje čísla od 0 do 10 včetně:
In [57]:
# program vypíše všechna čísla od 0 do 10 včetně:
for n in range(11):
    print(n, end = " ")
0 1 2 3 4 5 6 7 8 9 10 
In [59]:
# udělej něco pětkrát:
for n in range(5):
    print("ahoj")
ahoj
ahoj
ahoj
ahoj
ahoj
In [61]:
# program vypíše mocniny dvojky 2^0 ... 2^10
for n in range(11):
    print(2**n, end = " ")
1 2 4 8 16 32 64 128 256 512 1024 
In [62]:
# cykly a podmínky můžeme do sebe vnořovat:
# program vypíše jen sudá čísla z intervalu od 0 do 10 (včetně)
for n in range(11):
    if n % 2 == 0:
        print(n, end = " ")
0 2 4 6 8 10 
In [64]:
# cykly a podmínky můžeme do sebe vnořovat:
# Tabulka s násobilkou
for i in range(11):
    for j in range(11):
        print(f"{i*j:3}", end = " ")
    print("")
  0   0   0   0   0   0   0   0   0   0   0 
  0   1   2   3   4   5   6   7   8   9  10 
  0   2   4   6   8  10  12  14  16  18  20 
  0   3   6   9  12  15  18  21  24  27  30 
  0   4   8  12  16  20  24  28  32  36  40 
  0   5  10  15  20  25  30  35  40  45  50 
  0   6  12  18  24  30  36  42  48  54  60 
  0   7  14  21  28  35  42  49  56  63  70 
  0   8  16  24  32  40  48  56  64  72  80 
  0   9  18  27  36  45  54  63  72  81  90 
  0  10  20  30  40  50  60  70  80  90 100 
  1. Zadáme-li dva argumenty, zdroj představuje posloupnost celých čísel od hodnoty prvního argumentu po hodnotu druhého, ale hodnotu druhého už ne. Následující program vypisuje hodnoty od 7 do 10 včetně:
In [65]:
for n in range(7, 11):
    print(n, end = " ")
7 8 9 10 
In [71]:
# cyklus se neprovede ani jednou:
for n in range(11, 0):
    print(n, end = " ")
for n in range(11, 11):
    print(n, end = " ")
print("konec")
konec
  1. Zadáme-li tři argumenty, zdroj představuje posloupnost celých čísel od hodnoty prvního argumentu až po hodnotu druhého (jeho hodnotu už ne) s krokem zadaným ve třetím argumentu. Pro kladný krok bude posloupnost rostoucí, pro záporný bude klesající.
In [74]:
for n in range(-6, 11, 3):
    print(n, end = " ")
-6 -3 0 3 6 9 
In [73]:
for n in range(10, 0, -2):
    print(n, end = " ")
10 8 6 4 2 

Příklady¶

  1. Součet čísel pomocí for cyklu. Napište program, který sečte čísla od 1 do n (pomocí for cyklu).
In [ ]:
# řešení příkladů je na konci dokumentu :)

Tip: Kliknutím na tlačítko pytutor v rozhraní JupyterLab se zobrazí grafická interpretace toho, co se v programu děje.

In [ ]:
# i while cyklus
  1. Sudé-liché podruhé. Napište program, který bude pořád dokola žádat uživatele, aby zadal celé číslo, a poté vypíše, jestli je zadané číslo sudé nebo liché. Jakmile uživatel napíše "konec", tak program skončí.
In [ ]:
 
  1. Načti a sečti čísla. Napište program, který postupně načítá čísla ze vstupu, dokud nepřijde prázdný řetězec "". Pak vypíše počet zadaných čísel a jejich součet.
In [ ]:
# i počet
  1. Chci číslo z intervalu. Program-kecálek čte čísla od uživatele, dokud uživatel nezadá číslo z požadovaného intervalu. Pak mu poděkuje a vypíše počet neúspěšných pokusů.
In [ ]:
 
  1. Posloupnost. Napište program, který vypíše prvních n členů následující posloupnosti: 1 1 2 1 2 3 1 2 3 4 1 2 3 4 5 ...
In [ ]:
 

Podmíněný výraz¶

Pokud v programu potřebujeme spočítat nějakou hodnotu, která závisí na vyhodnocení nějaké podmínky, můžeme použít buď podmíněný příkaz:

if nějaká_podmínka:
    hodnota = výraz1
else:
    hodnota = výraz2

nebo můžeme použít podmíněný výraz, což je ternární operace ve tvaru:

hodnota = výraz1 if nějaká_podmínka else výraz2

Podmíněný výraz lze samozřejmě použít všude tam, kde je očekáván nějaký výraz. Může být tedy součástí komplikovanějších aritmetických výrazů a dokonce můžete psát vnořené podmíněné výrazy, čímž se ale značně zhoršuje přehlednost kódu.

In [3]:
vek = 67
if vek < 18:
    print("nejsi plnolety")
else:
    print("jsi plnolety")
jsi plnolety
In [6]:
# to samé, ale pomocí podmíněného výrazu:
vek = 67
print("nejsi plnolety") if vek < 18 else print("jsi plnolety")
jsi plnolety
In [1]:
import math
x = -46
if x >= 0:
    o = math.sqrt(x)
else:
    o = math.sqrt(-x)
print(o)

# to samé, ale pomocí podmíněného výrazu:
o = math.sqrt(x) if x >= 0 else math.sqrt(-x)
print(o)
6.782329983125268
6.782329983125268

Příkazy break a continue¶

Příkazy break a continue slouží pro podrobnější kontrolu provádění cyklů. Zatímco příkaz break ukončí provádění celého cyklu, příkaz continue způsobí přerušení pouze aktuální iterace a přejde na vyhodnocování vstupní podmínky. Oba příkazy lze použít uvnitř cyklu while i uvnitř cyklu for.

Příklad: následující program vypisuje čísla větší než 100, která nejsou sudá a skončí, jakmile se vypíše první číslo dělitelné 7:

In [10]:
n = 100
while True:
    # pokud je číslo sudé, přejdeme na další iteraci
    if n % 2 == 0:
        n += 1
        continue

    # vypíšeme číslo
    print(n)

    # pokud jsme vypsali číslo dělitelné 7, ukončíme cyklus
    if n % 7 == 0:
        break

    n += 1
101
103
105

Tip: Kliknutím na tlačítko pytutor v rozhraní JupyterLab se zobrazí grafická interpretace toho, co se v programu děje.

In [ ]:
# řešení příkladů je na konci dokumentu :)

Řešení příkladů ze cvičení¶

  1. Sudé-liché. Napište program, který zjistí a vypíše, zda je zadané číslo sudé nebo liché.
In [1]:
x = int(input("Zadej celé číslo:"))
if x % 2 == 0:
    print(x, "je sudé.")
else:
    print(x, "je liché.")
15 je liché.
  1. Je větší. Napište program, který zjistí a vypíše, které ze dvou zadaných čísel je větší.
In [11]:
x = float(input("Zadej první číslo:"))
y = float(input("Zadej druhé číslo:"))
if x > y:
    print("x = ", x,  "je větší než y = ", y)
    # print(f"x = {x} je větší než y = {y}.")
elif x < y:
    print("y = ", y,  "je větší než x = ", x)
    # print(f"y = {y} je větší než x = {x}.")
else:
    print("Zadaná čísla jsou stejná, x = y =", x)    
y =  8.0 je větší než x =  5.0
  1. Je největší. Napište program, který zjistí a vypíše, které ze tří zadaných čísel je největší.
In [14]:
x = float(input("Zadej první číslo:"))
y = float(input("Zadej druhé číslo:"))
z = float(input("Zadej třetí číslo:"))

print("Největší je:") 
if x >= y  and x >= z:
    print("první číslo", x)
if y >= x  and y >= z:
    print("druhé číslo", y) 
if z >= x  and z >= y:
    print("třetí číslo", z) 
Největší je:
první číslo 42.0
třetí číslo 42.0
In [15]:
print("Největší je", max(x,y,z))
Největší je 42.0
  1. Seřaď. Napište program, který vypíše tři zadaná čísla v pořadí od největšího po nejmenší.
In [2]:
x = float(input("Zadej první číslo:"))
y = float(input("Zadej druhé číslo:"))
z = float(input("Zadej třetí číslo:"))

print("Pořadí čísel od největšího:", end = " ")
if x >= y >= z :
    print(x, y, z)
elif x >= z >= y :
    print(x, z, y)
elif y >= x >= z :
    print(y, x, z)
elif y >= z >= x :
    print(y, z, x)
elif z >= y >= x :
    print(z, y, x)   
else:
    print(z, x, y)
Pořadí čísel od největšího: 8.0 7.0 4.0
In [7]:
x = float(input("Zadej první číslo:"))
y = float(input("Zadej druhé číslo:"))
z = float(input("Zadej třetí číslo:"))

print("Pořadí čísel od největšího:", end = " ")
if x >= y and x >= z :
    if y >= z :
        print(x, y, z)
    else:
        print(x, z, y)
elif y >= x and y >= z :
    if x >= z :
        print(y, x, z)
    else:
        print(y, z, x)
elif (y >= x):
    print(z, y, x) 
else:
    print(z, x, y)
Pořadí čísel od největšího: 15.0 2.0 2.0
  1. Trojúhelník. Napište program, který zjistí a vypíše, zda lze sestrojit trojúhelník zadaný pomocí tří délek stran.
In [10]:
a = float(input("Zadej délku strany a:"))
b = float(input("Zadej délku strany b:"))
c = float(input("Zadej délku strany c:"))

if (a + b > c) and (a + c > b) and (b + c > a):
    print("Trojúhelník lze sestrojit")
else:
    print("Trojúhelník nelze sestrojit")
Trojúhelník nelze sestrojit
  1. Test plnoletosti. Napište program, který se zeptá uživatele na věk a odpoví, zda je plnoletý.
In [13]:
a = int(input("Kolik je ti let?"))
if a >= 18:
    print("Jsi plnoletý.")
else:
    print("Nejsi plnoletý.")

# alternativně:
print("Jsi plnoletý.") if a >= 18 else print("Nejsi plnoletý.")
Nejsi plnoletý.
Nejsi plnoletý.

Cykly¶

  1. Součet čísel pomocí for cyklu. Napište program, který sečte čísla od 1 do n (pomocí for cyklu).
In [5]:
n = int(input("Zadej číslo:"))
součet = 0
for i in range(1,n+1):
    součet += i
    
print("Součet čísel je", součet)
print("Kontrola:", (n*(n+1))//2)    
Součet čísel je 1035
Kontrola: 1035
  1. Sudé-liché podruhé. Napište program, který bude pořád dokola žádat uživatele, aby zadal celé číslo, a poté vypíše, jestli je zadané číslo sudé nebo liché. Jakmile uživatel napíše "konec", tak program skončí.
In [9]:
while True:
    s = input("Zadej celé číslo:")
    if s == "konec":
        break
    x = int(s)
    if (x % 2 == 0):
        print("x =", x, "je sudé.")
    else:
        print("x =", x, "je liché.")
            
x = 46 je sudé.
x = 13 je liché.
  1. Načti a sečti čísla. Napište program, který postupně načítá čísla ze vstupu, dokud nepřijde prázdný řetězec "". Pak vypíše počet zadaných čísel a jejich součet.
In [10]:
součet = 0
počet = 0
while True:
    s = input("Zadej číslo:")
    if s == "":
        break
    součet += float(s)
    počet += 1
print(f"Počet čísel je {počet} a jejich součet je {součet}.")
Počet čísel je 2 a jejich součet je 21
  1. Chci číslo z intervalu. Program-kecálek čte čísla od uživatele, dokud uživatel nezadá číslo z požadovaného intervalu. Pak mu poděkuje a vypíše počet neúspěšných pokusů.
In [13]:
a = 5
b = 10
počet = 0
while True:
    s = input(f"Zadej číslo z intervalu ({a},{b}):")
    x = float(s)
    if a < x < b:
        break
    počet += 1
print(f"Děkuji. Zadal jsi číslo {x}. Počet neúspěšných pokusů je {počet}")   
    
Děkuji. Zadal jsi číslo 6.0. Počet neúspěšných pokusů je 2
  1. Posloupnost. Napište program, který vypíše prvních n členů následující posloupnosti: 1 1 2 1 2 3 1 2 3 4 1 2 3 4 5 ...
In [2]:
# jednodušší varianta: až do čísla n
n = int(input("Zadej číslo:"))
for i in range(1, n+1):
    for j in range(1, i+1):
        print(j, end=" ")
1 1 2 1 2 3 1 2 3 4 1 2 3 4 5 
In [76]:
# dva forcykly:
n = int(input("Zadej číslo:"))
pocet = 0
for i in range(1,n+1):
    for j in range(1,i+1):
        print(j, end=" ")
        pocet += 1
        if (pocet == n):
            break
    if (pocet == n):
        break
1 1 2 1 2 3 1 2 3 4 1 2 3 4 5 1 2 3 4 5 

Příklady ze 6. cvičení¶

1. Kvadratická rovnice¶

Napište program pro vyřešení kvadratické rovnice $ax^2 + bx + c = 0$, kde čísla $a,b,c$ jsou reálné parametry.

In [3]:
# vstupní data - zadá uživatel
import math
a = float(input("Zadej a:"))
b = float(input("Zadej b:"))
c = float(input("Zadej c:"))
typ = None

D = b * b - 4 * a * c
x1 = (-b + D**0.5)/(2*a)
x2 = (-b - D**0.5)/(2*a)
if D < 0 :
    print("rovnice má komplexní kořeny")
elif D == 0 :
    print("rovnice má dvojnásobný reálný kořen")
else:
    print("rovnice má reálné kořeny")
print("Řešení:", x1, x2)

# hezčí výpis:
print(f"Řešení: {x1:.1f}, {x2:.1f}")
rovnice má komplexní kořeny
Řešení: (1.2246467991473532e-16+2j) (-1.2246467991473532e-16-2j)
Řešení: 0.0+2.0j, -0.0-2.0j

2. BMI podruhé¶

Napište program, který spočítá BMI uživatele a vypíše, zda má nadváhu, podváhu nebo normální váhu (normální váze odpovídá BMI mezi 18.5 a 25). Dále program napíše uživateli, jaké je jeho rozmezí optimální hmotnosti.

In [3]:
m = float(input("Jaká je tvoje hmotnost (v kg):"))
v = float(input("Jaká je tvoje výška (v cm):"))
v /= 100
bmi = m / (v ** 2)

if (bmi < 18.5):
    print ("Máš podváhu.")
elif (bmi > 25):
    print("Máš nadváhu.")
else:
    print("Tvoje váha je optimální.")

m_min = 18.5 * (v ** 2)
m_max = 25 * (v ** 2)
print(f"Vaše optimální hmotnost je od {m_min:.1f} do {m_max:.1f}.")
Tvoje váha je optimální.
Vaše optimální hmotnost je od 45.6 do 61.6.

3. Ověření prvočíselnosti¶

Napište program, který ověří, jestli je vstupní celé číslo $n$ prvočíslo nebo ne.

In [8]:
cislo = int(input("Zadejte celé kladné číslo: "))
je_prvocislo = True
if cislo <= 1:
    je_prvocislo = False
else:
    for i in range(2, int(cislo**0.5) + 1):
        if cislo % i == 0:
            je_prvocislo = False
            break
print(cislo, "je prvočíslo.") if je_prvocislo else print(cislo, "není prvočíslo.") 
45 není prvočíslo.

4. Ciferný součet¶

Napište program, který sečte jednotlivé cifry zadaného celého kladného celého čísla.

In [30]:
cislo = int(input("Zadej celé  kladné číslo:"))
vysledek = 0
while(cislo > 0):
    vysledek += cislo % 10
    cislo = cislo // 10
print(vysledek)
15

5. Collatzova posloupnost¶

Napište program, který vypíše Collatzovu posloupnost (do dosažení hodnoty 1) pro dané počáteční přirozené číslo $n$.

Collatzova posloupnost: vezmeme celé kladné číslo $n$. Pokud je $n$ sudé, vydělíme ho dvěma, pokud je $n$ liché, vynásobíme ho třemi a přičteme jedničku, postup opakujeme.

Hypotéza je, že posloupnost pro každé přirozené $n$ nakonec dojde k číslu 1.

In [ ]:
 

6. Prvočíselný rozklad¶

Napište program, který vypíše prvočíselný rozklad přirozeného čísla $n$.

In [ ]: