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í.")

Zaujal Tě tento online kurz?

Přihlásit k newsletteru

Projekt online vzdělávání byl realizován v rámci Stipendia Czechitas v projektu: „Ženy do IT“ (reg.č. CZ.03.1.51/0.0/0.0/16_061/0003268), který je financován z prostředků Evropského sociálního fondu prostřednictvím Operačního programu Zaměstnanost.