====== Den 3 ====== ===== Opakování for-cyklu ===== === Úkol 1 === Aritmetická posloupnost je posloupnost čísel, která má stálý rozdíl sousední členů. Tomuto rozdílu říkáme diference. Například posloupnost 0 5 10 15 20 25 30 ... má diferenci 5. * Napište program, který vypíše prvních dvacet členů této posloupnosti. * Rozšiřte program tak, aby nejprve načetl požadovanou diferenci a následně vypsal dvacet členů odpovídající posloupnosti. Příklad: Zadejte diferenci: 7 0 7 14 21 28 35 42 49 56 63 70 77 84 91 98 105 112 119 126 133 * Rozšiřte program tak, aby nejprve načetl první člen posloupnosti a diferenci a následně vypsal prvních dvacet členů odpovídající posloupnosti. Příklad: Zadejte prvni clen posloupnosti: 14 Zadejte diferenci: 7 14 21 28 35 42 49 56 63 70 77 84 91 98 105 112 119 126 133 140 147 == Řešení == /* //Bude zveřejněno na konci třetího dne.// */ # Vasek a = int(input("Zadejte diferenci: ")) b = int(input("Zadejte prvni clen: ")) for i in range(b,a*20,a): print(i) === Úkol 2 === Jednou z možností, jak můžeme odhadnout hodnotu čísla pi, je následující rovnice: {{:courses:pri-bootcamp:pi_vzorec.png?400|}} Napište program, který podle této rovnice odhadne hodnotu pi (zkuste co nejpřesněji). Jako referenční hodnotu //Pi// můžete použít knihovnu //math//: import math refPi = math.pi == Řešení == /* //Bude zveřejněno na konci třetího dne.// */ # Jirka suma = 0 # vnitrek zavorky z rovnice # 10000 iteraci cyklu dava pomerne hezke reseni # s vetsim poctem opakovani je hodnota pi presnejsi for i in range(0,1000): clen = 1/(2*i+1) # aktualni clen posloupnosti v zavorce # rozhodovani o znamenku if(i%2 == 0): suma = suma + clen else: suma = suma - clen pi = 4*suma print(pi) ===== Opakování vnořeného for-cyklu ===== === Úkol 1 === Vykreslete následující matice: 1 1 1 1 1 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 1 1 1 1 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 == Řešení == /* //Bude zveřejněno na konci třetího dne.// */ # Cvicici (Jirka) size = 5 # VOLITELNE, velikost matice # prvni matice for i in range(0, size): for j in range(0, size): # kdyz ke radek sudy, tak na nem jsou jednicky, jinak nuly if(i%2==0): print("1 ", end="") else: print("0 ", end="") # zalomeni radku print("") # prazdny radek mezi maticemi print("") # druha matice for i in range(0, size): for j in range(0, size): # kdyz je soucet indexu (i+j) sudym vypis jednicku, jinak nulu if((i+j)%2==0): print("1 ", end="") else: print("0 ", end="") # zalomeni radku print("") === Úkol 2 === Napište program, který vykreslí tabulku malé násobilky, tj. tabulku všech vzájemných násobků čísel 1 až 10 (dodržte zarovnání v jednotlivých sloupcích): 1 2 3 4 5 6 7 8 9 2 4 6 8 10 12 14 16 18 3 6 9 12 15 18 21 24 27 4 8 12 16 20 24 28 32 36 5 10 15 20 25 30 35 40 45 6 12 18 24 30 36 42 48 54 7 14 21 28 35 42 49 56 63 8 16 24 32 40 48 56 64 72 9 18 27 36 45 54 63 72 81 K naformátování výpisu čísla **a** zabírající například **5** míst je možné použít příkaz: print("%5d" % a) Další informace o formátování výpisu v [[https://docs.python.org/2/tutorial/inputoutput.html|dokumentaci]]. == Řešení == /* //Bude zveřejněno na konci třetího dne.// */ #Lukas Halaska for i in range(1, 11): for j in range(1, 11): x = i*j if j==1: if (len(str(x))==2): print(end=str(x)) else: print(" ", end=str(x)) elif j==10: if (len(str(x))==3): print(" ", x, sep="") elif (len(str(x))==2): print(" ", x, sep="") else: print(" ", x, sep="") else: if (len(str(x))==2): print(" ", end=str(x)) else: print(" ", end=str(x)) #Vojta J. for k in range (1,10): for l in range (1,10): print("%2d" % (k*l), end=" ") print(" ") === Úkol 3 === Vykreslete následující obrazce: X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X == Řešení == /* //Bude zveřejněno na konci třetího dne.// */ # Cvicici (Jirka) size = 5 # VOLITELNE, velikost matice # prvni obrazec for i in range(0, size): # vypis tolik "X", kolikaty mam radek # (nejhornejsi radek je prvni) # | # V for j in range(0, i+1): print("X ", end="") # VOLITELNE, zbytek radku vypln mezerami for j in range(0,size-i): print(" ", end="") # zalomeni radku print("") # volny radek mezi obrazci print("") # druhy obrazec for i in range(0, size): # vypis tolik mezer, kolikaty mame radek # (nejhornejsi radek je nulty) for j in range(0, i): print(" ", end="") # zbytek radku vypln "X" for j in range(0,size-i): print("X ", end="") print("") # volny radek mezi obrazci print("") # treti obrazec for i in range(0, size): for j in range(0, size): # "X" jsou v prvnim a poslednim radku a take v prvnim a poslednim sloupci # plati-li alespon jedno, vypis "X" if(i==0) or (i==size-1) or (j==0) or (j==size-1): print("X ", end="") else: print(" ", end="") print("") ===== While cyklus ===== Dalším typem cyklu je while cyklus. Ten opakuje vnitřní příkazy do té doby, dokud platí jeho podmínka. V následujícím příkladě se vypisuje text "Hello world!" do té doby, dokud se hodnota i nesníží na nulu. V každé iteraci se hodnota i sníží o jedna, a tak se tento text vypíše právě 10-krát. i = 10 while i > 0: print("Hello world!") i = i - 1 Všechny programy zapsané pomocí for cyklu je možné přepsat i pomocí while cyklu. ===== Úkoly na while cyklus ===== === Úkol 1 === Napište program, který bude číst čísla ze vstupu, dokud uživatel nezadá nulu. Poté vypíše jejich součet. Upravete tento program tak, aby také vypsal: - délku posloupnosti a počet lichých čísel v posloupnosti - největší číslo - druhé největší číslo == Řešení == /* //Bude zveřejněno na konci třetího dne.// */ # Jan Tosner y = 0 x = 1 z = 0 l = 0 n = 0 s = 0 while x != 0: x = int(float(input("Zadejte číslo: "))) y = y+x z = z+1 if x%2 != 0: l = l+1 if x > n: s = n n = x elif (x > s): s = x print("Součet je "+str(y)+".") print("Délka posloupnosti je "+str(z-1)+".") print("Lichých čísel je "+str(l)+".") print("Největší číslo je "+str(n)+".") print("Druhé největší číslo je "+str(s)+".") === Úkol 2 === Přečtěte čísla A a B. Vypište nejmenší číslo, které je dělitelné B a je větší než A. == Řešení == /* //Bude zveřejněno na konci třetího dne.// */ # Jan Tosner A = float(input("Zadejte číslo A: ")) B = float(input("Zadejte číslo B: ")) x = 1 while x != 0: A = A+1 x = A%B print("Nejmenší číslo dělitelné číslem B a je větší než číslo A je: "+str(A)+".") === Úkol 3 === Přečtěte na vstupu jedno celé číslo a vypište jeho binární zápis. Hodnotu posledního bitu můžete určit podle toho, zda-li je zadaté číslo liché. Vzorový vstup: 21 Vzorový výstup: 10101 == Řešení == /* //Bude zveřejněno na konci třetího dne.// */ #Lucka cislo=int(input("Zadej cislo v desitkove soustave: ")) retezec="" while cislo>0: if cislo%2==0: retezec=retezec+"0" else: retezec=retezec+"1" cislo=cislo//2 retezec2="" for i in range(len(retezec)): retezec2=retezec2+retezec[len(retezec)-1-i] print(retezec2) #Vojta import math deka = int(input("Zadej cislo v desitkove soustave: ")) zbytek = deka exp = int(math.log(zbytek, 2))+1 cislo = 0 while(zbytek>0): cislo += (zbytek%2)*10**exp exp += 1 zbytek=zbytek//2 cislo = int(cislo / 10**(int(math.log(deka, 2))+1)) print(cislo) === Úkol 4 === Počítač vygeneruje náhodné číslo od 1 do 100 a vy ho musíte uhádnout. Když odpovíte špatně, počítač vám prozradí, jestli je vygenerované čílo větší nebo menší. Když uhádnete, program končí a pogratuluje vám. Vygenerovat náhodné číslo je možné pomocí následujícího kódu s použitím balíčku random: import random max = 100 to_be_guessed = int(max * random.random()) + 1 Vzorový průběh: Zkus uhadnout moje cislo: 50 Moje cislo je mensi. Zkus uhadnout moje cislo: 20 Moje cislo je vetsi. Zkus uhadnout moje cislo: 30 Moje cislo je vetsi. Zkus uhadnout moje cislo: 40 Moje cislo je vetsi. Zkus uhadnout moje cislo: 45 Uhadl jsi :-) 45 == Řešení == /* //Bude zveřejněno na konci třetího dne.// */ #Lukas Halaska import random a = int(100 * random.random()) + 1 b = int(input("Zkus uhadnout cislo: ")) while b!=a: if b>a: print("Moje cislo je mensi") else: print("Moje cislo je vetsi") b = int(input("Zkus uhadnout cislo: ")) print("Uhodl jsi") === Úkol 5 === Člověk si myslí číslo od 1 do 100 a počítač se jej snaží uhádnout. Může se ovšem zeptat pouze, jestli je hádané čílo větší než nějaká hodnota. Napiště program, který co nejrychleji uhádne toto číslo. Vzorový průběh: Myslete si cislo mezi 1 a 100 Je tvoje cislo vetsi nez 50 ? (y/n) n Je tvoje cislo vetsi nez 25 ? (y/n) y Je tvoje cislo vetsi nez 38 ? (y/n) y Je tvoje cislo vetsi nez 44 ? (y/n) n Je tvoje cislo vetsi nez 41 ? (y/n) y Je tvoje cislo vetsi nez 43 ? (y/n) n Je tvoje cislo vetsi nez 42 ? (y/n) n Vase cislo je 42 == Řešení == /* //Bude zveřejněno na konci třetího dne.// */ # Jirka a Honza dolni = 1 horni = 100 while horni != dolni: stred = ((horni+dolni)//2) c = input("Je tvoje cislo vetsi nez " + str(stred) + "? (y/n)") if c == "y": dolni = stred + 1 else: horni = stred print("Tvoje cislo je: " + str(horni)) === Úkol 6 === Načtěte celé číslo ze standardního vstupu a vypište nejmenší prvočíslo, které je větší než zadané číslo. == Řešení == /* //Bude zveřejněno na konci třetího dne.// */ # anonym import math x = int(input("Zadejte cislo ")) a = 1 nejvetsi = 0 while a!=0: x = x + 1 for i in range (2, int(math.sqrt(x)+1)): if x%i == 0: a = 2 if a==1: nejvetsi = x break a = 1 print(nejvetsi) ===== Složené datové typy ===== ==== Seznamy ==== Pokud pracujeme s větším množstvím hodnot, je téměř nemožné mít pro každou hodnotu vlastní proměnnou. V těchto případech používáme seznam (anglicky list), který je uspořádanou skupinou více hodnot. Seznam vytvoříte pomocí hranatých závorek. cisla = [3, 5, 7, 11] Seznam může mít libovolný počet prvků a může tedy být i prázdný! ==== Přístup k prvkům ==== Pro zjištění prvku na i-té pozici lze použít indexování. seznam[i] Nezapomínejte, že seznam je indexovaný **od nuly** (tedy první prvek má index 0.) Dokonce je možné indexovat prvky seznamu odzadu. seznam[-1] # Posledni prvek seznam[-2] # Predposledni prvek Pokud prvek seznamu neexistuje, program skončí s chybou, tedy je duležité vědět, jak velký seznam je. Pro tento případ se používá funkce len(), která vrátí počet prvků. velikost = len(seznam) ==== Slicing ==== Pokud chcete získat více prvků, lze použít takzvaný slicing. seznam2 = seznam[2:4] Tento příkaz vrátí nový seznam o dvou prvcích s indexy 2 a 3. Obecně slicing funguje podobně jako range, tedy seznam[a:b] bere prvky s indexy seznam[2:6:2] vypíše prvky s indexy 2 a 4. ==== Operace se seznamem ==== * **append**(x) - Přidá prvek na konec seznamu. * **extend**(L) - Na konec seznamu přidá všechny prvky seznamu L. * **insert**(i, x) - Vloží prvek x na pozici i. * **pop**(i) - Odstraní prvek na pozici i a vrátí jeho hodnotu. * **count**(x) Vrátí počet všech výskytů prvků, jejichž hodnota je rovna x. * **sort**() - Seřadí prvky seznamu podle velikosti. * **reverse**() - Obrátí pořadí prvků v seznamu. Příklady použití: cisla = [2, 3, 5, 7] # vytvoreni seznamu print(cisla) # vypise [2, 3, 5, 7] cisla.append(13) # pridani cisla 13 na konec seznamu print(cisla) # vypise [2, 3, 5, 7, 13] cisla.insert(4, 11) # pridani cisla 11 na pozici 4 print(cisla) # vypise [2, 3, 5, 7, 11, 13] x = cisla.pop(0) # odstrani prvni cislo ze seznamu print(cisla) # vypise [3, 5, 7, 11, 13] cisla = [3, 2, 1, 4, 5] cisla.sort() # serazeni seznamu podle velikosti print(cisla) # vypise [1, 2, 3, 4, 5] cisla.reverse() # obraceni poradi cisel v seznamu print(cisla) # vypise [5, 4, 3, 2, 1] ==== N-tice ==== N-tice (anglicky tuple) je datová struktura podobná seznamu. N-tice se od seznamů liší tím, že je nelze měnit, a tedy nelze volat funkce append(), insert(), atd. Proto se používají v případech, kdy data nepotřebujeme a nechceme měnit. N-tici vytvoříte pomocí kulatých závorek. dny = ("pondeli", "utery", "streda", "ctvrtek", "patek", "sobota", "nedele") Ze seznam můžeme vytvořit novou n-tici použitím funkce tuple(). Z n-tice můžeme vytvořit nový seznam použitím funkce list(). ==== Úkoly ==== === Úkol 1 === Napište program, který načte 10 čísel, uloží je do seznamu a obrátí jejich pořadí. Nepoužívejte funkci **reverse**(). == Řešení == /* //Bude zveřejněno na konci třetího dne.// */ # Jan Tosner seznam = [] for i in range(0,10): x = int(float(input("Zadejte číslo: "))) seznam.insert(0,x) print(seznam) === Úkol 2 === Napište program, který načte 5 čísel a najde medián. == Řešení == /* //Bude zveřejněno na konci třetího dne.// */ # Stepan numbers = [] y = 5 for i in range (0, 5): x = input ("zadejte " + str(y) + " cisel") x = int (x) numbers.append(x) numbers.sort () z = len (numbers) if z%2 == 0: med = (numbers[z/2]+numbers[(z/2)+1])/2 print (med) else: med = numbers[(int(z/2))] print (med) === Úkol 3 === Napište program, který načte 10 čísel najde mezi nimi dvě čísla taková, že jejich rozdíl je největší možný. == Řešení == /* //Bude zveřejněno na konci třetího dne.// */ # Jan Tosner seznam = [] for i in range(0,10): x = int(float(input("Zadejte číslo: "))) seznam.append(x) seznam.sort() print("Jsou to tato čísla:",seznam[-1], "a", seznam[0]) === Úkol 4 === Napište program, který načte 10 čísel najde mezi nimi dvě čísla taková, že jejich rozdíl je nejmenší možný. == Řešení == /* //Bude zveřejněno na konci třetího dne.// */ # Jan Tosner seznam = [] for i in range(0,10): x = int(float(input("Zadejte číslo: "))) seznam.append(x) seznam.sort() z = seznam[1]-seznam[0] for i in range(0,9): if (seznam[i+1]-seznam[i]) <= z: x = seznam[i+1] y = seznam[i] z = x-y print("Jsou to tato čísla:",x, "a", y) === Úkol 5 === Napište program, který načte 10 čísel a vypíše je seřazené podle velikosti. Nepoužívejte funkci ''sort()''. == Řešení == /* //Bude zveřejněno na konci třetího dne.// */ # Jan Tosner seznam = [] for i in range(0,10): x = int(float(input("Zadejte číslo: "))) seznam.append(x) for i in range(9,0,-1): for j in range(9,0,-1): if seznam[j] < seznam[j-1]: z = seznam.pop(j) seznam.insert(j-1,z) print(seznam) ===== Návrhy na rozsáhlejší programy ===== /* ==== Hry v terminálu ==== Knihovna {{:courses:pri-bootcamp:textgame.py|textgame.py}} (0.0.6a) from textgame import * === Textová hra === state = "zacatek" while state != "konec": if state == "zacatek": print("") print("Jsi sladkem ve znamem pivovaru. Je rano a zvoni ti budik.") print("Co udelas?") print("1: Pujdu do prace.") print("2: Zustanu doma.") choice = input("Tvoje volba: ") if choice == 1: state = "vyhra" if choice == 2: state = "prohra" if state == "vyhra": print("") print("Sel jsi do pivovaru a odvedl jsi dobrou praci. Vyhral jsi!") state = "konec" if state == "prohra": print("") print("Zustal jsi doma a z prace te vyhodili. Prohral jsi.") state = "konec" print("Konec hry.") === Kviz === import random pocet = input("Zadejte pocet otazek: ") for i in range(1, pocet+1): otazka = random.randint(1, 2) print("") if otazka == 1: print("Jake je hlavni mesto Australie?") print("1. Canberra") print("2. Sydney") print("3. Praha") odpoved = input("Vase odpoved: ") if odpoved == 1: print("Spravne!") else: print("Spatne!") if otazka == 2: print("V jakem roce byl zalozen Plzensky Prazdroj?") print("1. 1841") print("2. 1842") print("3. 1843") odpoved = input("Vase odpoved: ") if odpoved == 2: print("Spravne!") else: print("Spatne!") */ ==== Kreslení obrázků ==== Nechť sem vstoupí jen programátor zručný a zvídavý! **Ale vážně**, tohle už jsou pokročilé věci!!! V této sekci se lehce seznámíme s dalším odvětvím informatiky, známým pod pojmem počítačová grafika, a hlavně si tu zopakujeme vše, co se dosud probíralo a co už byste měli ovládat (větvení programu, cykly, funkce, moduly, seznamy). Pokud jste v terminologii počítačové grafiky trochu zběhlí, pravděpodobně některé informace v následujícím odstavci budete chtít označit jako chybné. V rámci rozsahu osnov BootCampu jsme některé informace zjednodušili na možná ne zcela přesné, ale zato, dle nás, názornější a jednodušší na pochopení. Každý obrázek v počítači se skládá z mnoha malých čtverečků, kterým se říká pixely. Pixely tvoří pravoúhlou mřížku (označme ji jako bitmapu), která pokrývá celý obrázek (Ano. I tenhle obrázek, který na vás svítí z monitoru!) Jeden pixel typicky v paměti počítače popíšeme pomocí tří čísel. Tato trojice je známá jako RGB. Jedná se o tři základní barvy (červená, zelená a modrá). Každé z těchto tří čísel vyjadřuje, jak moc daná barva ovlivní výslednou barvu celého pixelu. Kombinací hodnot jednotlivých barev (což za nás dělá displej), pak dostaneme výslednou barvu, kterou nám náš monitor odpovídající pixel obarví. V následujícím cvičení si zkusíme zapsat do paměti počítače posloupnost čísel a necháme počítač, aby tato čísla interpretoval jako hodnoty RGB. Uvidíme, jestli se nám podaří tímto postupem nakreslit nějaký pěkný obrázek. Paměť počítače pro nás bude jednoduše pythonovský seznam. Do seznamu budeme zapisovat postupně RGB všech pixelů na obrázku, který se snažíme vytvořit. Tento seznam pak uložíme do souboru a počítači řekneme, že tento soubor je obrázek. **Zní to složitě?** Nebojte se, část práce jsme již udělali za vás. Stáhněte si modul {{:courses:pri-bootcamp:libbitmap.py|}}, ve kterém jsou již uložené RGB některých základních barev a který nabízí funkci na zápis seznamu s daty do souboru .PPM, což je jednoduchý obrázkový soubor (mnohem jednodušší než například .PNG, .JPG či jiné, které pravděpodobně znáte). Ufff. To už je ale textu. Rychle sem hodíme nějaký ukázkový kód, který nakreslí třeba žlutý čtverec o délce strany 50 pixelů. """ bitmap_test.py created by Jan Toth (c) 2017 Ukazka pouziti knihovny 'libbitmap.py' """ # Importujeme vse z knihovny 'libbitmap.py' from libbitmap import * # Nastavime si pocatecni hodnoty nasich dat rozmer = 50 obrazek = [] # Zapiseme data do seznamu # Colours. nam poskytuje importovana knihovna # Pro prehled vsech dostupnych barev nahlednete do knihovny for i in range(rozmer**2): obrazek.extend(Colours.YELLOW) # Ulozime vytvorena data do souboru # save_image(obrazek, jmeno, sirka, vyska) nam poskytuje importovana knihovna save_image(obrazek, "zluty_ctverec", rozmer, rozmer) Přijde vám, že se nic nestalo? Podívejte se do adresáře, ve kterém máte tento skript uložený. Zdá se vám to jednoduché? Pokud ano, zkuste nakreslit vlastní obrázky a pochlubte se ostatním. Zajímavé mohou být státní vlajky. Začněte například polskou, pak můžete přejít na německou či francouzskou. No a samozřejmě by byla také hezká vlajka česká! Pokud si vzhled všech vlajek nepamatujete, strejda [[https://www.google.cz/|Google]] vám určitě poradí ;-) Pokud by vám nestačily barvy, které vám dává k dispozici poskytnutá knihovna, můžete např. [[https://www.w3schools.com/colors/colors_picker.asp|zde]] vytouženou barvu najít. Potom zkopírujte hexadecimální vyjádření vámi vybrané barvy (ta čísla, která následují po znaku '#') a ve vašem kódu tuto hodnotu pošlete jako argument funkci Colours.get_colour_from_hex(), která vám na oplátku vrátí seznam s RGB hodnotami dané barvy. from libbitmap import* moje_barva = Colours.get_colour_from_hex(66ffe0) # A muzete pouzivat novou barvu! Pokud vám to jednoduché nepřijde, nebojte se zeptat! Pokud se budete chtít svými výtvory pochlubit, pravděpodobně je budete chtít zobrazit ve Windows. Tento operační systém však bohužel tak jednoduchý formát, jako je .PPM, nezvládá interpretovat. Pro převod na např. .PNG můžete použít tento online [[https://convertio.co/ppm-png/|konvertor]].