Sedmá lekce je zaměřena na praktické příklady využívající řetězce, seznamy, cykly a podmínky, a příkazy knihoven „time“ a „os“.
Studijní materiály
Odkaz pro zobrazení Google Slides.
Kontrolní otázky
Jakým příkazem zjistíme index znaku v řetězci? Uveď konkrétní příklad, který po zkopírování do Sublime Text vrátí číslo indexu.
Napadá tě vlastní zadání hry či programu? Zapiš si jej a sestav jeho řešení.
Programy
Captcha
"""
captcha.py
Vygeneruj „x“ náhodných pětimístných captcha kódů složených ze znaků a–z, A–Z, 0–9 a ulož je do seznamu. V cyklu captcha kódy vypisuj na monitor a po uživateli vyžaduj, aby je přepisoval.
Počítej úspěšnost opisu.
"""
import random
mala = "abcdefghijklmnopqrstuvwxyz"
velka = mala.upper()
cifry = "0123456789"
x = input("Zadej, kolik captcha kódů chceš vygenerovat: ")
while not(x.isdigit()) or int(x) <= 0:
x = input("Zadej kladné číslo: ")
for i in range(0, int(x)):
# captcha: _ _ _ _ _
captcha = ""
opis = ""
kontrola = [] # pro uložení, kolikrát se uživatel ne/spletl
for j in range(0, 5):
coToBude = random.randint(1, 3)
if coToBude == 1:
captcha += random.choice(mala)
if coToBude == 2:
captcha += random.choice(velka)
if coToBude == 3:
captcha += random.choice(cifry)
print(captcha)
opis = input("Opiš captcha kód: ")
kontrola.append(captcha == opis)
while captcha != opis:
# do cyklu se vstoupí, pokud podmínka platí (opis neroven captcha)
opis = input("Opiš captcha kód: ")
kontrola.append(captcha == opis)
print(kontrola)
print(f"Úspěšnost: {(sum(kontrola) / len(kontrola)) * 100} %")
Mozek
"""
mozek.py
Vytvoř hru pro tréning mozku. Poznáš, co znamená slovo „KĚTVEN“ či „ČREEVN“? Lidskému mozku stačí znát první a poslední písmeno, ostatní písmena mohou být přeházená a přesto text dokáže přečíst.
"""
import random
slova = [
"leden",
"únor",
"březen",
"duben",
"květen",
"červen",
"červenec",
"srpen",
"září",
"říjen",
"listopad",
"prosinec"
]
def zamichejSlovo(slovo):
hadejSlovo = []
hadejSlovo.append(slovo[0])
prostredek = slovo[1:len(slovo) - 1]
random.shuffle(prostredek)
hadejSlovo.extend(prostredek)
hadejSlovo.append(slovo[len(slovo) - 1])
return hadejSlovo
slovo = random.choice(slova)
slovo = list(slovo)
hadejSlovo = zamichejSlovo(slovo)
while slovo == zamichejSlovo:
hadejSlovo = zamichejSlovo(slovo)
hadejSlovo = "".join(hadejSlovo)
slovo = "".join(slovo)
print(hadejSlovo)
tipy = []
uzivatel = input("Napiš slovo: ")
tipy.append(slovo == uzivatel)
while slovo != uzivatel:
print("Neuhodl/a jsi!")
uzivatel = input("Máš další pokus: ")
tipy.append(slovo == uzivatel)
print("\n---------------------\nStatistika pokusů\n")
print(f"Správně:\t{sum(tipy)}")
print(f"Špatně:\t\t{len(tipy) - sum(tipy)}")
Leetspeak
"""
leetspeak.py
Zašifruj řetězec řečí L3375P34K. Viz simple.wikipedia.org/wiki/Leet
Záměny znaků:
A → 4 B → 8 E → 3 G → 6
I → 1 O → 0 S → 5 T → 7 Z → 2
"""
znaky = "ABEGIOSTZ"
leet = "483610572"
vstup = input("Zadej řetězec k zašifrování: ")
vstup = vstup.upper()
vstup = list(vstup)
for i in range(0, len(vstup)):
pismenko = vstup[i]
if pismenko in znaky:
index = znaky.find(pismenko)
vstup[i] = leet[index]
vstup = "".join(vstup)
print(vstup)
Šibenice
"""
sibenice.py
Vytvoř hru šibenice. Do proměnné si ulož „tajné“ slovo a pomocnou proměnnou si naplň třeba hvězdičkami (jako místa pro písmena). Uživatel pak bude zadávat písmena, pokud bude písmeno v tajném slově, přepiš hvězdičku na dané písmeno.
Počítej trestné body.
"""
import os
def clear():
os.system("cls")
import time
sibenice = [
" \n \n \n \n \n_____________",
" \n \n \n \n \n___|_________",
" \n \n \n \n | \n___|_________",
" \n \n \n | \n | \n___|_________",
" \n \n | \n | \n | \n___|_________",
" \n | \n | \n | \n | \n___|_________",
" _ \n | \n | \n | \n | \n___|_________",
" __ \n | \n | \n | \n | \n___|_________",
" ___ \n | \n | \n | \n | \n___|_________",
" ____ \n | \n | \n | \n | \n___|_________",
" _____ \n | \n | \n | \n | \n___|_________",
" _____ \n | | \n | \n | \n | \n___|_________",
" _____ \n | | \n | O \n | \n | \n___|_________",
" _____ \n | | \n | O \n | - \n | \n___|_________",
" _____ \n | | \n | O \n | -| \n | \n___|_________",
" _____ \n | | \n | O \n | -|- \n | \n___|_________",
" _____ \n | | \n | O \n | -|- \n | / \n___|_________",
" _____ \n | | \n | O \n | -|- \n | / \ \n___|_________"
]
clear()
for radek in sibenice:
print(radek)
time.sleep(1)
clear()
"""
slovo = "listopad"
sifra = "*" * len(slovo)
trestneBody = 0
print(len(sibenice))
while sifra != slovo:
print("\n", sifra)
znak = input("Zadej znak: ")
sifra = list(sifra)
if znak in slovo:
for i in range(0, len(slovo)):
if slovo[i] == znak:
sifra[i] = znak
sifra = "".join(sifra)
clear()
else:
sifra = "".join(sifra)
trestneBody += 1
if trestneBody > len(sibenice):
trestneBody -= 1
break
print(sibenice[trestneBody - 1])
time.sleep(1)
clear()
print(sifra)
print(f"Počet trestných bodů: {trestneBody}.")
"""
Desítková → dvojková
"""
desitkovaDvojkova.py
Vytvoř program pro převod čísla z desítkové soustavy do dvojkové soustavy.
"""
cislo = int(input("Zadej desítkové číslo: "))
# číslo si přeuložíme do proměnné "x", s tou budeme dál pracovat
x = cislo
# nachystaný seznam pro zbytky po celočíselném dělení
seznam = []
# proměnnou "x" dělíme tak dlouho, dokud není rovna nule
while x != 0:
zbytek = x % 2
seznam.append(zbytek)
# "x" musíme do dalšího kola celočíselně podělit dvojkou
x = x // 2
# příprava sestupného cyklu
start = len(seznam) - 1
stop = -1
krok = -1
for i in range(start, stop, krok):
print(seznam[i], end = "")
Další programy
Následují programy, které vymyslely studentky procházející tento kurz. Inspirujte se a vymyslete své vlastní zadání s řešením v jazyku Python.
Hádání
"""
hadani.py
Uživatel na začátku programu zadá číslo od 1 do 3 a program na monitor vypíše odpovídající slovo uložené na dané pozici seznamu, ve kterém budou všechny samohlásky nahrazeny symbolem hvězdičky. Uživatel má za úkol dané slovo uhodnout.
"""
import random
cislo = int(input("Zadej číslo od 1 do 3 a zkus uhodnout slovo: "))
if 1 <= cislo <= 3:
slova = [
"počítač",
"laptop",
"python"
]
slovo = slova[cislo - 1]
samohlasky = ("aeiouyáéěíóúůý")
samohlaskyS = list(samohlasky)
slovoS = list(slovo)
for i in range(len(samohlasky)):
if samohlaskyS[i] in slovo:
index = slovo.find(samohlaskyS[i])
slovoS[index] = "*"
s = "".join(slovoS)
print(s)
odpoved = input("Uhodla jsi? Napiš slovo: ")
if slovo == odpoved:
print("Skvělé!")
else:
print("Ouha.")
else:
print("Nebylo zadáno číslo od 1 do 3.")
Shoda
"""
shoda.py
Vytvoř program, který projde dva seznamy a zjistí, které položky se shodují. Zároveň vypiš, kolikrát se daná položka prvního seznamu vyskytuje ve druhém seznamu.
"""
seznamA = ["Anna", "Božena", "Cecílie", "Dana", "Evžénie"]
seznamB = ["Alois", "Božena", "Cyril", "Dana", "Evžen"]
pocetA = []
for jmenoA in seznamA:
pocet = 0
for jmenoB in seznamB:
if jmenoA == jmenoB:
pocet += 1
pocetA.append(pocet)
if sum(pocetA) > 0:
print("Došlo ke shodě jmen prvního a druhého seznamu. Následuje výpis shod.")
for i in range(len(seznamA)):
if pocetA[i] > 0:
print(f"\t{seznamA[i]} se ve druhém seznamu vyskytuje {pocetA[i]}krát")
else:
print("Jména v seznamech se neshodují.")