Úlohy ke cvičením 1–3
Úlohy jsou seřazeny podle obtížnosti: nejdříve krátké úlohy k jednotlivým tématům, pak složitější úlohy.
U každé úlohy je uveden příklad běhu programu; vstupy jsou pouze ilustrativní, program musí fungovat pro libovolný vstup.
Každý program vždy otestujte na různých vstupních datech, včetně mezních hodnot (nula, záporná čísla, prázdný vstup, apod.)
Používejte především látku z cvičení 1–3: čísla typu int a float, modul math, funkce input() a print(), formátované řetězce, podmínky, řetězce a jejich metody, cykly for a while a jednoduché seznamy [].
1. Čísla a výrazy
Co vypočítá Python?
V kódové buňce postupně vyhodnoťte následující výrazy. Nejprve si poznamenejte, jaký výsledek a jaký typ očekáváte, potom výraz spusťte a výsledek ověřte pomocí print() a type().
python1 + 2 * 3
(1 + 2) * 3
7 / 2
7 // 2
7.0 // 2
-7 // 2
-7 % 2
7 // -2
7 % -2
2 ** 10
2 ** -1
2 ** 0.5
Zodpovězte:
Proč má
7 / 2jiný typ než7 // 2?Jak se liší
-7 // 2a7 // -2od běžného dělení? Kterým směrem//zaokrouhluje?Platí pro kladná i záporná čísla vztah
x == (x // y) * y + x % y? Ověřte na několika příkladech.Proč je
2 ** -1typufloat? Jakého typu je2 ** 1?
Velká celá čísla a nepřesná desetinná čísla
Prozkoumejte v kódové buňce tyto výrazy:
python2 ** 100
2 ** 100 + 1
type(2 ** 100)
1e308 * 10
0.1 + 0.2
0.1 + 0.2 == 0.3
abs((0.1 + 0.2) - 0.3)
math.isclose(0.1 + 0.2, 0.3)
Zodpovězte:
Je počet cifer celých čísel (
int) v Pythonu nějak omezený? Zkuste např.2 ** 1000.Od jaké hodnoty již
floatnerozliší sousední celá čísla? Ověřte např.float(2 ** 53 + 1) == 2 ** 53.Co se stane, když číslo
floatpřeteče? Jak taková hodnota vypadá a jak se chová při porovnávání?Vysvětlete, proč je
0.1 + 0.2 == 0.3nepravda, a proč je pro porovnávání desetinných vhodné použítmath.isclose().Jaký je rozdíl mezi
math.isclose(a, b)aabs(a - b) < 1e-10?
Modul math
Napište program, který načte poloměr kruhu (desetinné číslo) a vypíše:
obvod a obsah kruhu na dvě desetinná místa,
druhou odmocninu poloměru na čtyři desetinná místa,
math.floor(),math.ceil()around()poloměru.
Příklad:
Zadejte poloměr: 2.5
Obvod: 15.71
Obsah: 19.63
Odmocnina: 1.5811
floor: 2, ceil: 3, round: 2
Proč se round(2.5) liší od math.ceil(2.5)? Zkuste také round(3.5) a výsledek vysvětlete.
2. Vstup, výstup a formátování
Dvě čísla
Napište program, který načte dvě desetinná čísla a vypíše jejich součet, rozdíl, součin, podíl, celočíselný podíl, zbytek po dělení a mocninu. Předpokládejte (nebo i zajistěte), že druhé číslo není nula.
Zadejte první číslo: 7
Zadejte druhé číslo: 2
Zadal jste čísla 7.0 a 2.0.
7.0 + 2.0 = 9.0
7.0 - 2.0 = 5.0
7.0 * 2.0 = 14.0
7.0 / 2.0 = 3.5
7.0 // 2.0 = 3.0
7.0 % 2.0 = 1.0
7.0 ** 2.0 = 49.0
Každý řádek vypište jediným formátovaným řetězcem, který zadané hodnoty, operátory i výsledek.
Účtenka
Napište program, který načte název zboží, cenu za kus a počet kusů. Vypíše zarovnanou účtenku: záhlaví, řádek s položkou a řádek s celkovou cenou. Ceny vypisujte na dvě desetinná místa.
Zboží: sešit
Cena za kus: 35.5
Počet kusů: 2
Položka | počet | cena/kus | celkem
---------+-------+----------+---------
sešit | 2 | 35.50 | 71.00 Kč
Převod sekund na čas
Napište program, který načte celý počet sekund (nezáporné číslo) a vypíše jej ve tvaru dní, hodin, minut a sekund.
Zadejte počet sekund: 93784
1 den, 02:03:04
Použijte operátory // a %. Hodiny, minuty a sekundy vypisujte vždy dvouciferně (formát {:02d}).
Zaokrouhlování a formátování
Pro hodnoty 2.675, 2.5, 1.005 a -2.5 vypište:
hodnotu tak, jak ji vypíše
print(),hodnotu formátovanou na dvě desetinná místa (
f'{x:.2f}'),výsledek
round(x, 2),výsledek
round(x).
2.675 | 2.67 | 2.67 | 3
2.5 | 2.50 | 2.5 | 2
1.005 | 1.00 | 1.0 | 1
-2.5 | -2.50 | -2.5 | -2
Zodpovězte:
Proč
f'{2.675:.2f}'není2.68?Proč je
round(2.5)rovno2, aleround(3.5)je4?Které z těchto způsobů jsou vhodné pro finanční výpočty a které ne?
3. Rozhodování
Jaké je to číslo?
Napište program, který načte celé číslo a vypíše, zda je kladné, záporné nebo nulové, zda je sudé nebo liché, a zda je dělitelné třemi.
Zadejte celé číslo: -9
-9 je záporné.
-9 je liché.
-9 je dělitelné třemi.
Ověřte, že program správně funguje i pro 0, a že nula je sudá. Použijte operátor %.
Přestupný rok
Napište program, který načte rok a rozhodne, zda je přestupný. Rok je přestupný, pokud je dělitelný čtyřmi, ale ne stem, ledaže by byl dělitelný čtyřmi sty.
Zadejte rok: 1900
Rok 1900 není přestupný.
Otestujte roky 1900, 2000, 2024 a 2023. Podmínku zapište jediným výrazem s operátory and, or a not.
Zjistěte, jak daleko do minulosti a budoucnosti lze výraz použít.
Trojúhelník
Načtěte tři délky stran na jednom řádku oddělené mezerami. Rozhodněte, zda lze trojúhelník sestrojit (každá strana musí být kratší než součet zbývajících dvou a všechny strany musí mít kladnou délku). Pokud ano, určete, zda je trojúhelník rovnostranný, rovnoramenný nebo různostranný, a zda je pravoúhlý.
Zadejte strany: 3 4 5
Trojúhelník lze sestrojit: různostranný, pravoúhlý.
Zadejte strany: 1 2 5
Trojúhelník nelze sestrojit.
Nezapomeňte, že délky stran je možné zadat v libovolném pořadí.
Známka
Napište program, který načte počet bodů (celé číslo 0–100) a vypíše známku: 90–100 ⇒ 1, 80–89 ⇒ 2, 70–79 ⇒ 3, 60–69 ⇒ 4, 0–59 ⇒ 5. Pro hodnoty mimo rozsah vypište chybové hlášení.
Zadejte počet bodů: 83
Známka: 2
Zadejte počet bodů: 120
Neplatný počet bodů.
Použijte řetězení ifelifelse.
Kvadratická rovnice
Načtěte koeficienty a, b, c na jednom řádku oddělené mezerami. Vypište diskriminant a reálné kořeny rovnice a*x**2 + b*x + c == 0.
Zadejte a b c: 1 -3 2
D = 1
x1 = 2
x2 = 1
Ošetřete tyto případy:
D < 0: rovnice nemá reálné kořeny.D == 0: jeden dvojnásobný kořen. Diskriminant porovnávejte s ohledem na nepřesnostfloat, např. pomocímath.isclose().a == 0: nejde o kvadratickou rovnici. Pokud je ib == 0, vypište, zda rovnice nemá řešení (c != 0), nebo jich má nekonečně mnoho (c == 0).
Kořeny vypisujte na tři platné číslice ({:.3g}), aby výstup nebyl přeplněný desetinnými místy.
Maximum a medián
Načtěte tři čísla. Pomocí podmíněných výrazů (ternárního operátoru) určete a vypište největší z nich a prostřední z nich (medián).
Zadejte tři čísla: 3 8 5
Maximum: 8
Medián: 5
Podmíněné výrazy (a if podminka else b) použijte místo funkcí max() a min(); ty použijte pouze pro kontrolu výsledku.
Vstupenky do kina
Napište program, který načte věk zákazníka a počet osob. Cena vstupenky je: do 6 let zdarma, 6–17 let 120 Kč, 18–64 let 200 Kč, 65 let a více 150 Kč. Pro skupinu pěti a více osob je z celkové ceny sleva 10 %.
Věk: 30
Počet osob: 6
Cena za osobu (před slevou): 200 Kč
Celkem bez slevy: 1200 Kč
Sleva 10 %: -120 Kč
K zaplacení: 1080.00 Kč
Pro nekladný počet osob vypište chybu. Slevu počítejte z celkové ceny a částky vypisujte na dvě desetinná místa.
4. Řetězce
Analýza slova
Napište program, který načte jedno slovo a vypíše o něm základní informace.
Slovo: programovani
Délka: 12
První znak: p
Poslední znak: i
První tři: pro
Poslední dvě: ni
Velkými: PROGRAMOVANI
Malými: programovani
Obráceně: inavomargorp
Třikrát: programovani programovani programovani
Použijte len(), indexaci a skládání řetězců nebo metody upper(), lower(). Obrácení lze provést cyklem nebo pomocí řezu (slice).
Každé druhé písmeno
Napište program, který načte slovo a vypíše každé druhé písmeno, tedy znaky na pozicích 1, 3, 5, … (indexováno od nuly).
Slovo: programovani
rgaoai
Úlohu vyřešte třikrát, pokaždé jinak, a všechny tři výsledky vypište (musí být stejné):
cyklem
for i in range(len(s))s podmínkou nai,cyklem
for i in range(1, len(s), 2),řezem řetězce.
Palindrom
Napište program, který zjistí, zda je zadaný text palindrom, tedy zda se čte stejně zleva i zprava. Program musí ignorovat velikost písmen, mezery, interpunkci a diakritiku (á, é, í, ó, ú, ů, ý považujte za a, e, i, o, u, u, y).
Zadejte text: Kobyla má malý bok
Text je palindrom.
Zadejte text: Jelenovi pivo nelej
Text je palindrom.
Zadejte text: Petr
Text není palindrom.
Otestujte i další texty. Porovnávání proveďte v cyklu znak po znaku od začátku a od konce, bez vytváření obrácené kopie řetězce. Řešení typu s == s[::-1] použijte jen jako kontrolu.
Silné heslo
Napište program, který zkontroluje zadané heslo. Heslo je silné, pokud má alespoň 8 znaků, obsahuje alespoň jedno malé písmeno, jedno velké písmeno, jednu číslici a jeden speciální znak (cokoli, co není písmeno, číslice ani mezera), a neobsahuje mezery.
Heslo: Heslo123!
Délka alespoň 8: ano
Malé písmeno: ano
Velké písmeno: ano
Číslice: ano
Speciální znak: ano
Bez mezer: ano
Heslo je silné.
Heslo: heslo
Délka alespoň 8: ne
Malé písmeno: ano
Velké písmeno: ne
Číslice: ne
Speciální znak: ne
Bez mezer: ano
Heslo není silné.
Iniciály
Napište program, který načte celé jméno (dvě a více slov oddělených mezerami) a vypíše iniciály, příjmení velkými písmeny a počet slov.
Jméno: Jan Amos Komenský
Iniciály: J. A. K.
Příjmení: KOMENSKÝ
Počet slov: 3
Použijte metodu split() a cyklus for. Poslední slovo považujte za příjmení.
Caesarova šifra
Napište program, který načte text a celočíselný posun. Text zašifruje posunem písmen v abecedě (jen písmena a–z a A–Z, s přetočením přes konec abecedy); ostatní znaky zůstanou beze změny. Potom šifru dešifrujte zpět a ověřte, že dostanete původní text.
Zadejte text: Abc xyz!
Posun: 3
Šifra: Def abc!
Dešifrováno: Abc xyz!
Dešifrování je jen posun opačným směrem, není třeba psát druhý algoritmus. Záporný posun musí fungovat také.
Počítání znaků
Napište program, který načte text a spočítá, kolik obsahuje samohlásek (včetně ě), souhlásek, číslic, mezer a ostatních znaků. Na konci vypište i celkový počet znaků.
Zadejte text: Ahoj, světe! 42
Samohlásky: 4
Souhlásky: 5
Číslice: 2
Mezery: 2
Ostatní: 2
Celkem znaků: 15
Použijte jediný cyklus for přes znaky textu a větvení ifelifelse.
5. Cykly
Tabulka mocnin
Napište program, který načte přirozené číslo n a vypíše tabulku čísel 1 až n s jejich druhou a třetí mocninou.
Zadejte n: 5
n | n^2 | n^3
----+-------+-------
1 | 1 | 1
2 | 4 | 8
3 | 9 | 27
4 | 16 | 64
5 | 25 | 125
Pro n < 1 vypište chybu. K zarovnání sloupců použijte šířku ve f-stringu.
Součet a průměr
Napište program, který opakovaně načítá čísla, dokud uživatel nezadá prázdný řádek. Potom vypíše počet zadaných čísel, jejich součet a průměr na dvě desetinná místa. Pokud uživatel nezadal žádné číslo, vypište odpovídající hlášení.
Zadejte číslo (prázdný řádek ukončí): 4
Zadejte číslo (prázdný řádek ukončí): 7.5
Zadejte číslo (prázdný řádek ukončí): 2
Zadejte číslo (prázdný řádek ukončí):
Počet čísel: 3, součet: 13.5, průměr: 4.50.
Nečíselný vstup by neměl ukončit program: vypište hlášení a pokračujte dalším zadáním. Použijte cyklus while a try/except.
Hádání čísla
Napište program, který si v proměnné zvolí tajné číslo od 1 do 100. Uživatel hádá; program po každém pokusu napoví „Více.“ nebo „Méně.“ (podle toho, jakým směrem se má hádat), a nakonec vypíše, na kolikátý pokus se číslo podařilo uhodnout.
Hádej číslo od 1 do 100: 50
Méně.
Hádej číslo od 1 do 100: 25
Více.
Hádej číslo od 1 do 100: 42
Uhodl jsi na 3. pokus!
Ošetřete vstup mimo rozsah a nečíselný vstup; takové pokusy se do počtu pokusů nepočítají.
Prvočíslo
Napište program, který načte celé číslo a rozhodne, zda je prvočíslo. Pokud není, vypište jeho nejmenšího dělitele většího než jedna.
Zadejte číslo: 97
97 je prvočíslo.
Zadejte číslo: 91
91 není prvočíslo, nejmenší dělitel je 7.
Fibonacciho posloupnost
Napište program, který načte n a vypíše prvních n členů Fibonacciho posloupnosti (0, 1, 1, 2, 3, 5, …) na jeden řádek oddělené mezerami. Na závěr vypište podíl posledních dvou členů na šest desetinných míst.
Zadejte n: 10
0 1 1 2 3 5 8 13 21 34
Podíl posledních dvou členů: 1.619048
Pro n < 1 vypište chybu. Pro n == 1 podíl nevypisujte. S rostoucím n se podíl blíží číslu 1.618034 (zlatý řez) – ověřte to.
Cifry čísla
Napište program, který načte nezáporné celé číslo a vypíše počet jeho cifer, součet cifer, ciferný součet (součet cifer opakovaný tak dlouho, dokud nezbude jedna cifra) a číslo zapsané ciframi v opačném pořadí.
Zadejte nezáporné celé číslo: 2026
Počet cifer: 4
Součet cifer: 10
Ciferný součet: 1
Obrácené číslo: 6202
Řešte pomocí // a %, bez převodu na řetězec. Ověřte výsledek i pro 0.
Největší společný dělitel
Napište program, který načte dvě kladná celá čísla a vypíše jejich největšího společného dělitele a nejmenší společný násobek. Použijte Euklidův algoritmus s cyklem while. Nezapomeňte ošetřit záporná čísla (s pomocí abs()).
Zadejte dvě čísla: 24 36
NSD(24, 36) = 12
NSN(24, 36) = 72
Obrazce z hvězdiček
Napište program, který načte výšku n a vypíše tři obrazce: pravoúhlý trojúhelník, středově symetrický trojúhelník, číselnou pyramidu a Pascalův trojúhelník. Příklad pro n = 5:
Zadejte výšku: 5
*
**
***
****
*****
*
***
*****
*******
*********
1
121
12321
1234321
123454321
1
11
121
1331
14641
Collatzova posloupnost
Napište program, který načte kladné celé číslo a vypíše Collatzovu posloupnost: sudé číslo se dělí dvěma, liché se násobí třemi a přičte se jedna. Končí se u čísla 1. Nakonec vypište počet kroků a největší dosažené číslo.
Zadejte číslo: 6
6 3 10 5 16 8 4 2 1
Kroků: 8
Maximum: 16