====== 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.