====== Den 2 ====== ===== Opakování ===== === Úkol 1 === Na vstupu přečtěte celé číslo reprezentující útratu v hospodě v Kč. Vypiště kolik mincí je minimálně potřeba zaplacení účtu, pokud nemůžete platit bankovkami. Vypiště také, které mince to budou. Připomínáme, že české mince mají hodnoty: 1, 2, 5, 10, 20 a 50. Vzorový vstup: Zadejte vasi utratu: 79 Vzorový výstup: Celkem je potreba 5 minci Pocet minci o hodnote 50 Kc: 1 Pocet minci o hodnote 20 Kc: 1 Pocet minci o hodnote 10 Kc: 0 Pocet minci o hodnote 5 Kc: 1 Pocet minci o hodnote 2 Kc: 2 Pocet minci o hodnote 1 Kc: 0 Pokud je zákazník příliš dlouho v hospodě, pokusí se zadat záporné číslo. Všechny podobné situace musíte ve svých kódech ošetřovat a vypsat odpovídající chybovou hlášku. == Řešení == /* //Bude zveřejněno na konci druhého dne.// */ # Vojta utrata = int(input("Zadejte vasi utratu: ")) if (utrata > 0): padesat = utrata//50 zbytek = utrata%50 dvacet = zbytek//20 zbytek = zbytek%20 deset = zbytek//10 zbytek = zbytek%10 pet = zbytek//5 zbytek = zbytek%5 dva = zbytek//2 zbytek = zbytek%2 jedna = zbytek celkem = padesat+dvacet+deset+pet+dva+jedna print("Celkem je potreba " + str(celkem) + " minci") print("Pocet minci o hodnote 50 Kc:", padesat) print("Pocet minci o hodnote 20 Kc:", dvacet) print("Pocet minci o hodnote 10 Kc:", deset) print("Pocet minci o hodnote 5 Kc:", pet) print("Pocet minci o hodnote 2 Kc:", dva) print("Pocet minci o hodnote 1 Kc:", jedna) ===== For cyklus ===== Pokud potřebujete opakovat určitou část kódu několikrát, můžete tento program napsat pouze jednou a vložit jej do cyklu. Pro začátek se seznámíme s for cyklem. Jeho fungování si předvedeme na jednoduchém příkladu, kdy chceme 10-krát vypsat nápis "Hello world!", který nám je již dobře známý. for i in range(0, 10): print("Hello world!") Pro provedení příkazu print() **10-krát**, je potřeba nastavit rozsah **od 0 do 10**. Cyklus začíná první hodnotou a zvyšuje hodnotu i, dokud je menší než druhá hodnota rozsahu (10). ===== Vnořený cyklus ===== Pro některé úlohy nám nestačí jednoduchý cyklus. V takovém případě je možné vytvořit vnořený cyklus (vícenásobný). Jeho fungování si budeme demonstrovat na následujícím příkladu: for i in range(1, 5): for j in range(1, i): print(j) print("---") Výstup tohoto programu bude: --- 1 --- 1 2 --- 1 2 3 --- Uvnitř hlavního (vnějšího) cyklu mohou být nejenom další cykly, ale i podmínky a samostatné příkazy. ===== Modul random ===== Někdy je v programu užitečné generovat náhodná čísla. Právě k tomuto účelu slouží modul random. Jeho funkce randint(a, b) vrátí celé číslo v intervalu . Její použití demonstruje následující příklad, který vygeneruje náhodné číslo z rozsahu 1 až 6, a tedy simuluje hrací kostku. # Program hraci kostka import random x = random.randint(1, 6) print(x) Takto vygenerovaná čísla ve skutečnosti nejsou náhodná, ale pseudonáhodná. To znamená, že jsou počítána jasně definovaným algoritmem, který vytváří takovou posloupnost čísel, že se její prvky zdají být náhodné. Pokud chcete vygenerovat desetinné číslo, použijte funkci random(). Ta vygeneruje číslo z intervalu <0, 1). import random x = random.random() print(x) Pseudonáhodná čísla můžeme použít například při odhadu hodnoty pi metodou Monte Carlo (bude vysvětleno na tabuli.) ===== Úkoly na for-cyklus ===== === Rozcvička === Přečtěte číslo N ze standardního vstupu a poté: - vypište N-krát nějaký text (třeba "Ahoj"). - vypište čísla od 1 do N (včetně). - vypište sestupně čísla od N (včetně) do 1. == Řešení == /* //Bude zveřejněno na konci druhého dne.// */ # Vojta cislo = int(input("Zadej cislo N: ")) if cislo>0: for i in range(cislo): print("Ahoj") for i in range(1, cislo+1): print (str(i)) for i in range(cislo, 0, -1): print (str(i)) === Úkol 1 === Přečtěte celé číslo N ze standardního vstupu. Vypiště čísla 1 až N. Oddělte je vždy čárkou a mezerou. Pozor, za posledním číslem žádná čárka ani mezera být nemá. /* Příkaz pro výpis print() vždy zalomí řádek. V této úloze se nám to nehodí, a proto musíme použít jiný způsob. Využijte objektu stdout z modulu sys. Díky tomu můžete pokračovat na stejném řádku. from sys import stdout stdout.write("abc") */ Příkaz print v základním nastavení vždy zalomí řádek. Pokud chceme pořkačovat na stejném řádku musíme přidat parametr: end="", který Pythonu říká, jak ukončit výpis (prázdným textovým řetězcem) . print("abc",end="") Vzorový výstup pro N=5: 1, 2, 3, 4, 5 == Řešení == /* //Bude zveřejněno na konci druhého dne.// */ # Vojta cislo = int(input("Zadej cislo N: ")) if cislo>0: for i in range(1, cislo): print (str(i) + ", ", end='') print (cislo) === Úkol 2 === Přečtěte celé číslo N ze standartního vstupu. Vypiště čísla od N do 1 sestupně se stejným formátováním. Vzorový výstup pro N=5: 5, 4, 3, 2, 1 == Řešení == /* //Bude zveřejněno na konci druhého dne.// */ # Vojta cislo = int(input("Zadej cislo N: ")) if cislo>0: for i in range(cislo, 1, -1): print (str(i) + ", ", end='') print ("1") === Úkol 3 === Napište program pro výpočet faktoriálu. Program načte jedno číslo (předpokládejte, že se jedná o přirozené číslo nebo nulu) a následně spočítá a vypíše faktoriál tohoto čísla. Připomeňmě, že faktoriál čísla n je definován takto: * pro přirozené číslo n platí n!=123...n, * pro n=0 platí n!=1. Pro ověření správnosti vašeho programu si můžete výsledky zkontrolovat s následujícím seznamem: * 0! = 1 * 1! = 1 * 2! = 2 * 3! = 6 * 4! = 24 * 5! = 120 * 6! = 720 * 7! = 5 040 * 8! = 40 320 * 9! = 362 880 == Řešení == /* //Bude zveřejněno na konci druhého dne.// */ # Vojta faktorial = int(input("Zadej cislo N, jehoz faktorial budeme delat: ")) if (faktorial >= 0): if faktorial == 0: print("n!=1") else: vysledek = faktorial for i in range (faktorial-1, 0, -1): vysledek = vysledek*i print("n!=", vysledek) === Úkol 4 === Napište program, který načte jedno číslo (předpokládejte, že se jedná o přirozené číslo) a vypíše, zda se jedná o prvočíslo. Poznamenejme, že prvočíslo je takové přirozené číslo, které má právě dva dělitele: jedničku a samo sebe. **Tedy číslo jedna není prvočíslo!** Je vhodné “odchytit” číslo jedna a řešit ho zvlášť. Prvočíselnost u ostatních čísel ověřujeme tak, že zkoušíme, jestli je dané číslo dělitelné některým z čísel mezi jedničkou a daným číslem. Pokud je dělitelné alespoň jedním z nich, tak se nejedná o prvočíslo. To, jestli je číslo A dělitelné číslem B, zjistíte tak, že vypočítáte zbytek po dělení (použijeme tedy operátor %). Pokud je A dělitelné číslem B, pak A%B == 0. V opačném případě není A dělitelné číslem B. Při zjišťování, zda je číslo n prvočíslo nemusíme zkoušet, zda je dělitelné všemi čísly mezi 1 a n. Úplně stačí zjistit, zda je dělitelné některým z čísel mezi 1 a sqrt(n), protože pokud není dělitetlné žádným z těchto čísel, pak není dělitelné ani žádným z čísel mezi sqrt(n) a n. Dokážete zdůvodnit proč? == Řešení == /* //Bude zveřejněno na konci druhého dne.// */ # Vojta cislo = int(input("Zadej prvocislo: ")) if (cislo > 1): for i in range (cislo-1, 0, -1): if (cislo%i == 0) and (i>1): print("Cislo " + str(cislo) + " neni prvocislo.") break if i == 1: print("Cislo " + str(cislo) + " je prvocislo.") else: print("Cislo " + str(cislo) + " neni prvocislo.") === Úkol 5 === Přečtěte binární zápis čísla na vstupu a vypište jeho hodnotu v dekadickém zápise (normální číslo). Binární zápis načtěte jako textový řetězec. Jeho délku zjistíte funkcí len(retezec) b = input("Zadejte cislo ve dvojkove soustave: ") delka = len(b) i-tý znak textu můžete získat jako: text[i] Poznámka: V Pythonu se indexuje od nuly. Tzn. první znak je text[0], druhý je text[1], ... , poslední je text[delka-1] Vzorový vstup 10101 Vzorový výstup 21 == Řešení == /* //Bude zveřejněno na konci druhého dne.// */ # Vojta b = input("Zadejte cislo ve dvojkove soustave: ") hodnota = 0 for i in range (0, len(b)): hodnota += int(b[i])*2**(len(b)-i-1) print("Cislo v desitkove soustave ma hodnotu", hodnota) ===== Úkoly na vnořený for-cyklus ===== === Úkol 1 === Modifikujte program na testování prvočíselnosti tak, aby vypsal všechna prvočísla menší než zadané n. == Řešení == /* //Bude zveřejněno na konci druhého dne.// */ # Vojta cislo = int(input("Zadej cislo: ")) for x in range (0, cislo): for i in range (x-1, 0, -1): if (x%i == 0) and (i>1): #print("Cislo " + str(x) + " neni prvocislo.") break if i == 1: print(str(x), end=" ") print() === Úkol 2 === Načtěte hodnotu N na vstupu a vypiště jednotkovou matici o velikosti N*N. Jednotková matice je matice, která má diagonále (úhlopříčce) jedničky a všude jinde nuly. [[https://cs.wikipedia.org/wiki/Jednotkov%C3%A1_matice|Rigoróznější definice ]] Vzorový výstup pro N=3 1, 0, 0 0, 1, 0 0, 0, 1 == Řešení == /* //Bude zveřejněno na konci druhého dne.// */ # Vojta hodnost = int(input("Zadej hodnost matice: ")) for a in range (0, hodnost): for b in range (0, hodnost): if (a==b): print("1", end=" ") else: print("0", end=" ") print() === Úkol 3 === Načtěte na vstupu liché číslo N větší nebo rovno 5 a vypište na konzoli "baráček" o odpovídající velikosti. Pokud čílo není liché nebo je menší než 5. Vypiště nějakou chybovou hlášku. Vzorový výstup pro N=5 X X X XXXXX X X X X x X XXXXX == Řešení == /* //Bude zveřejněno na konci druhého dne.// */ # Vojta vyska = int(input("Zadej vysku domu: ")) if (vyska < 5) or (vyska%2==0): print("Vyska musi byt liche cislo vetsi nez 5") else: print((vyska//2)*" " + "#") for a in range (0, int((vyska//2)-1)): print(((vyska//2)-1-a)*" ", end="") print("#", end="") print((2*a+1)*" ", end="") print("#") print("#"*vyska) for c in range (vyska-2): print("#" + " "*(vyska-2) + "#") print("#"*vyska) ===== Volitelné úkoly ===== ===Úkol 1=== Napište program, který načte přirozené číslo //n//. Pak tento program vypíše //n//-tý člen Fibonacciho posloupnosti. == Řešení == /* //Bude zveřejněno na konci druhého dne.// */ # Vojta predpred = 1 pred = 1 souc = 0 cislo = int(input("Zadej prirozene cislo: ")) for i in range (cislo-3): souc = predpred + pred predpred = pred pred = souc print(souc) ===Úkol 2=== Napište program, který načte dvě přirozená čísla a najde a vytiskne jejich největšího společného dělitele. == Řešení == /* //Bude zveřejněno na konci druhého dne.// */ # Vojta a = int(input("Zadej prirozene cislo a: ")) b = int(input("Zadej prirozene cislo b: ")) for i in range (1,b): if (a%i==0) and (b%i==0): cislo = i print(cislo) ===Úkol 3=== Napište program, který načte dvě celá čísla a vypíše součet všech celých čísel v uzavřeném intervalu mezi nimi. == Řešení == /* //Bude zveřejněno na konci druhého dne.// */ # Honza prvni_cislo = int(input("Zadejte prvni cislo: ")) druhe_cislo = int(input("Zadejte druhe cislo: ")) if prvni_cislo > druhe_cislo: # prohodime hodnoty cisel, aby prvni cislo bylo mensi prvni_cislo, druhe_cislo = druhe_cislo, prvni_cislo soucet = 0 for i in range(prvni_cislo, druhe_cislo + 1): soucet += i print(soucet) ===Úkol 4=== Napište program který načte dvě přirozená čísla, základ a exponent, a vypočítá hodnotu základexponent. Nezapomeňte, že hodnota 00 není definovaná. Např.: Zadejte zaklad: 5 Zadejte exponent: 3 5^3 = 125 == Řešení == /* //Bude zveřejněno na konci druhého dne.// */ # Honza zaklad = int(input("Zadejte zaklad: ")) exponent = int(input("Zadejte exponent: ")) if exponent == 0: if zaklad == 0: # nula na nultou print("Hodnota je nedefinovana.") else: # cokoliv na nultou je jedna print(str(zaklad) + "^0 = 1") elif zaklad == 0: # nula na cokoliv (krome nuly) je nula print("0^" + str(exponent) + " = 0") else: vysledek = 1 for i in range(exponent): vysledek *= zaklad print(str(zaklad) + "^" + str(exponent) + " = " + str(vysledek)) ===Úkol 5=== Napište program, který vygeneruje 10 náhodných čísel v rozsahu 1 až 100. Program spočítá počet sudých a lichých čísel. Program dále spočítá průměrnou hodnotu všech čísel. Nakonec program nalezne největší a druhé největší číslo. == Řešení == /* //Bude zveřejněno na konci druhého dne.// */ # Honza import random pocet_cisel = 10 # ze zadani nejvetsi_cislo = 0 druhe_nejvetsi_cislo = 0 prumer = 0 pocet_sudych = 0 pocet_lichych = 0 print("Pocitac vygeneroval: ", end = "") for i in range(pocet_cisel): nahodne_cislo = random.randint(1, 100) if i == pocet_cisel - 1: print(nahodne_cislo) else: print(nahodne_cislo, end=", ") prumer += nahodne_cislo if nahodne_cislo % 2 == 0: pocet_sudych += 1 else: pocet_lichych += 1 if nahodne_cislo > nejvetsi_cislo: druhe_nejvetsi_cislo = nejvetsi_cislo nejvetsi_cislo = nahodne_cislo elif nahodne_cislo == nejvetsi_cislo or nahodne_cislo > druhe_nejvetsi_cislo: druhe_nejvetsi_cislo = nahodne_cislo prumer /= pocet_cisel print("Pocet sudych cisel ve vygenerovane posloupnosti je " + str(pocet_sudych)) print("Pocet lichych cisel ve vygenerovane posloupnosti je " + str(pocet_lichych)) print("Ve vygenerovane posloupnosti je " + str(nejvetsi_cislo) + " nejvetsim cislem.") print("Ve vygenerovane posloupnosti je " + str(druhe_nejvetsi_cislo) + " druhym nejvetsim cislem.") print("Prumer vygenerovane posloupnosti je " + str(prumer)) /* === Volitelne obsahlejsi ulohy === knihovnicka {{ :courses:pri-bootcamp:colorfultext.py | colorfultext.py}} ==Textová hra== from colorfultext import * 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!") */