====== 2. Logické výrazy, cykly, podmínky, funkce ======
Cykly a podmínky představují tzv. řídící struktury (anglicky control flow statemens), které větví běh programu, či slouží k opakovanému provádění určitých příkazů
==== Porovnání ====
Operátory porovnání: ''%%==%%'', ''%%is%%'', ''%%!=%%'', ''%%<%%'', ''%%>%%'', ''%%>=%%'', ''%%<=%%'', ''%%in%%''. Negace: ''%%not%%''
Výsledek operace/porovnání je **True** (Pravda) nebo **False** (Nepravda)
Některé operace nejsou povolené pro určité typy proměnných.
a = 5
b = 7
print(a>b) # vraci False protoze a = 5 a b = 7, tedy a < 7
print(not a>b) # vraci True protoze provadime negaci False
=== Logické operátory lze spojovat ===
* a (**and**, **&**) - ''%%a>b and b>c%%'' (//logické a//), případně ''%%a>b & b>c%%'' (//bitové a//)
* nebo (**or**, **|**) - ''%%a>b or a>c%%'' (//logické nebo//), případně ''%%a>b | a>c%%'' (//bitové nebo//)
a = True
b = False
a = 14 #bitově 1110
b = 4 #bitově 0100
print(b and a)
print(b & a)
print(b or a)
print(b | a)
==== Příkazy if - elif - else ====
=== Podmínka if ===
> Proběhne daný blok kódu při splnění podmínky (logický_výraz==True)
if logický_výraz:
a = 9.0
if type(a) == type(0):
print('Proměnná a je celé číslo!')
# místo type(a) == type(0) lze použít type(a) == int nebo funkci isinstance(a, int)
=== Podmínka if - else ===
> Proběhne první blok příkazů při splnění podmínky (logický_výraz==True) a druhý blok příkazů při jejím nesplnění (logický_výraz==False).
if logický_výraz:
else:
a = 5
b = 7
if a > b:
print('a > b')
else:
print('a <= b')
==== Úloha 1 - Dělitelnost ====
Napište podmínku, díky které zjistíte zda je číslo //N// dělitelné čísly //x// a //y//.
N = int(input('Zadejte cislo N:'))
x = int(input('Zadejte x:'))
y = int(input('Zadejte y:'))
# Napište podmínku níže
> Proběhne první blok příkazů při splnění podmínky 1 (logický_výraz_1==True), druhý blok příkazů při splnění podmínky 2 (logický_výraz_2==True) a třetí blok příkazů při nesplnění žádné z podmínek (logický_výraz_1==False and logický_výraz_2==False). Možné přídávat libovoné množství větví //elif//
if logický_výraz_1:
elif logický_výraz_2:
...
else:
a = 5
b = 7
if a > b:
print('a > b')
elif a == b:
print('a = b')
else:
print('a < b')
==== Úloha 2 - sudé, liché nebo nula ====
Dostanete od uživatele celé číslo na vstupu. Napište podmínku, která napíše **Nula** (když bude n rovné 0), **Sudé** (pokud bude číslo sudé a nebude 0), případně **Liché** (když bude liché a nebude 0).
n = int(input('Napiš celé číslo: '))
# Napište podmínku níže
==== Úloha 3 - Lze sestrojit trojúhelník ====
Dopište správně podmínku do programu níže.
# Program, ktery zjisti jestli lze sestrojit trojuhelnik
'''
a = 3
b = 4
c = 4
'''
a = int(input('zadej stranu a:'))
b = int(input('zadej stranu b:'))
c = int(input('zadej stranu c:'))
if :
print('Trojuhelnik lze sestrojit')
else:
print('Trojuhelnik nelze sestrojit')
===== Cykly =====
* umožňují opakovaní určitého bloku kódu
==== Cyklus for ====
* Umožňuje provést daný počet opakování
* Obsahuje výraz což je buď jedna proměnná nebo n-tice (tuple)
for in :
Případně:
for in :
else:
* Blok else proběhne po skončení cyklu, pokud neskončí
veta = 'Zaklady programovani.'
for pismeno in veta:
print(pismeno, end=' ')
# funkce range(), slouží k výpisu posloupnosti/řady čísel
range(10) # posloupnost 0-9
range(5,10) # posloupnost 5-9
range(1,10,2) # posloupnost 1-9 po 2 (1,3,5,7,9)
for x in range(5,10):
print(x, end = ' ')
=== Úloha 4 - 7 trpaslíků ===
Dopište program tak, aby se postupně vypsala čísla jednotlivých trpaslíku.
:
==== Úloha 5 - Výpočet faktoriálu pomocí cyklu for ====
Vypočtěte [[https://cs.wikipedia.org/wiki/Faktori%C3%A1l|faktoriál]] čísla s pomocí cyklu for a funkce range.
cislo = 9
print('Faktorial cisla {0:d} je {1:d}'.format(cislo, faktorial))
==== Cyklus while ====
* Cyklus, který probíhá dokud platí podmínka
while :
Případně:
while :
else:
* Probíhaní cyklu lze ukončit příkazem ''%%break%%''.
* Probíhaní daného bloku pro konkrétní iteraci ukončí příkaz ''%%continue%%'' a program skočí opět na začátek bloku (jakoby začínala další iterace, cyklus)
# Výpis čísla od 1 do 10 s využitím cyklu while
==== Úloha 6 - Výpočet faktoriálu pomocí cyklu while ====
Vypočtěte [[https://cs.wikipedia.org/wiki/Faktori%C3%A1l|faktoriál]] čísla s pomocí cyklu while.
cislo = 2
# Zde doplňte cyklus pro výpočet faktoriálu
print('Faktorial cisla {0:d} je {1:d}'.format(cislo, faktorial))
==== Úloha 7 - Napište program, který umožní výpočet Ludolfova čísla pomocí součtu Leibnizovi řady ====
Využijte jeden z cyklů a příslušné matematické operace ([[http://mech.fsv.cvut.cz/~anicka/teaching/ypv1/priklady/pi.pdf|odkaz na vzorec]])
print('pi: ' + str(pi))
===== Funkce =====
* Pro opakování nějaké části kódu
* Prostředky pro zabalení a parametrizování funkčnosti
* Python nabízí globální funkce, lokální funkce, lambda funkce a metody
def ():
Případně s výstupní proměnnou:
def ():
return
# Pocet samohlasek ve vete
def pocet_samohlasek(veta):
#
veta = 'S funkcemi se budete potkavat casto.'
print(pocet_samohlasek(veta))
==== Úloha 8 - Bez samohlásek ====
Napište funkci, která odstraní písmena **q,w,x,y** z věty.
def bez_pismen(veta):
print(vystupni_veta)
veta = 'ywqGqratxulqwwujwxiy.xywq xwqwFquyxnqkwcxxyiywyw xxwqsqwewyx wqtxxiyw pxyqowvyyexdwlqowqqx xxnqxapwyrqoqgyxramxoqvyqaxtqx sqpwrxxaqvnwqewwxy!'
bez_pismen(veta)
==== Výchozí hodnoty parametrů ====
* Přiřazení výchozí hodnoty při definici funkce
* Možnost volat funkci **bez explicitního zadání jednotlivých hodnot parametrů**
def f(a=5, b=0):
print((a**2)+b)
a = f()
b = f(9)
type(a)
=== Parametr nebo argument ===
* **Parametr** je //proměnná//, s kterou pracuje definice funkce
* **Argument** je //hodnota proměnné//, s kterou bude funkce dále pracovat
=== Argumenty vs. keyword argumenty ===
* Funkce je možné volat i s explicitním vyjádřením jednotlivých parametrů
* Výhody:
* Možnost //měnit pořadí// parametrů
* Přehlednost (v případě, že má daná funkce velké množství vstupních parametrů)
a = f(b=2,a=9)
===== Úlohy na doma =====
Níže je uvedeno několik příkladů, které si vyřešte sami v rámci domácí práce
===== Matice na standardním výstupu =====
==== a) celá matice ====
Vykreselte čtvercovou matici celých kladných čísel čísel rostoucích od 0 do $N-1$, kde $N = n\cdot n$ a $n$ je počet řádků a sloupců matice
Uvažujte $2 \leq n \leq 10$
Pro $n=10$ bude matice vypadat takto
0 1 2 3 4 5 6 7 8 9
10 11 12 13 14 15 16 17 18 19
20 21 22 23 24 25 26 27 28 29
30 31 32 33 34 35 36 37 38 39
40 41 42 43 44 45 46 47 48 49
50 51 52 53 54 55 56 57 58 59
60 61 62 63 64 65 66 67 68 69
70 71 72 73 74 75 76 77 78 79
80 81 82 83 84 85 86 87 88 89
90 91 92 93 94 95 96 97 98 99
Zkuste úlohu vyřešit pomocí jednoho for cyklu nebo pomocí dvou for cyklů vnořených do sebe
# reseni pomoci jednoho for cyklu
# reseni pomoci dvou for cyklu
==== b) první diagonála ====
Vykreselte pouze první diagonálu matice z předchozího úkolu
Pro $n=10$ bude matice vypadat takto
0
11
22
33
44
55
66
77
88
99
Opět se zamyslete nad řešením pomocí jednoho nebo dvou vnořených cyklů
N = 10 # pocet radku a sloupcu matice
# reseni pomoci jednoho for cyklu
# reseni pomoci dvou for cyklu
==== c) druhá diagonála ====
Vykreselte pouze druhou diagonálu matice z před předchozího úkolu
Pro $n=10$ bude matice vypadat takto
9
18
27
36
45
54
63
72
81
90
Opět se zamyslete nad řešením pomocí jednoho nebo dvou vnořených cyklů
# reseni pomoci jednoho for cyklu
# reseni pomoci dvou for cyklu
==== d) obě diagonály ====
Vykreselte obě diagonály matice
Pro $n=10$ bude matice vypadat takto
1 9
11 18
22 27
33 36
44 45
54 55
63 66
72 77
81 88
90 99
Opět se zamyslete nad řešením pomocí jednoho nebo dvou vnořených cyklů
# reseni pomoci jednoho for cyklu
# reseni pomoci dvou for cyklu
===== Prvočísla =====
Napište funkci isprime(), která bude vracet True pokud bude argumet funkce prvočíslo, jinak vrátí False
def isprime(n):
'''
isprime(n) vraci True pokud je n prvocislo, jinak vrati False
funkce nekontroluje, jestli je n cele cislo
funkce postupne prochazi vsechny cisla od 2 az do hodnoty argumentu a zjistuje, jestli je zbytek po deleni roven nule
'''
# vypise navratovou hodnotu funkce na standardni vystup
print(isprime(17))
===== Domácí úkol =====
Domácí úkol najdete na [[https://cw.fel.cvut.cz/b221/courses/bab37zpr/hw/hw01|webu]] předmětu.