Notes and Talks/UJEP/PRG1/04

Ú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:

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:

Modul math

Napište program, který načte poloměr kruhu (desetinné číslo) a vypíše:

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:

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:

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:

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é):

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