Warning
This page is located in archive. Go to the latest version of this course pages. Go the latest version of this page.

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í

# 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 <a, b>. 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é:

  1. vypište N-krát nějaký text (třeba “Ahoj”).
  2. vypište čísla od 1 do N (včetně).
  3. vypište sestupně čísla od N (včetně) do 1.
Řešení

# 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 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í

# 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í

# 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í

# 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í

# 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í

# 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í

# 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. Rigoróznější definice

Vzorový výstup pro N=3

1, 0, 0
0, 1, 0
0, 0, 1

Řešení

# 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í

# 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í

# 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í

# 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í

# 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í

# 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í

# 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))

courses/pri-bootcamp/02.txt · Last modified: 2018/09/26 09:08 by kubikji2