1

Programátorské opáčko

Než se společně vrhneme vstříc dalším programátorským dobrodružstvím, vyplatí se zrekapitulovat si absolutní základy, které jste možná načerpali na živém kurzu Úvod do programování nebo je znáte odjinud. Tento text je pouze stručné opakování toho, co se na kurzu probíralo. Pokud si během čtení budete potřebovat osvěžit detaily, můžete se vrátit zpět do příslušné lekce Úvodu.

Základem všech základů je vědět, co jsou to hodnoty (čísla, řetězce, seznamy, ...) a jak se s nimi pracuje pomocí operátorů. Měli byste rozumět tomu, co jsou a jak se používají proměnné, co jsou to funkce a jak se volají a také byste měli znát základní příkazy pro řízení běhu programu jako jsou podmínky nebo cykly. Pokud si v něčem z toho nejste jistí, tato kapitola je právě pro vás.

Hodnoty, operátory a proměnné

Základní stavební bloky veškerého programování jsou hodnoty, operátory a proměnné. S hodnotami provádíme výpočty pomocí různých operátorů a výsledky si pak ukládáme do proměnných pro pozdější použití.

Hodnoty

V Pythonu jsme jako základní hodnoty viděli celá čísla, desetinná čísla, řetězce a pravdivostní hodnoty. Kategoriím, do kterých se hodnoty řadí jsme říkali datové typy.

Datový typ Python název Příklad
celá čísla int 12, 34, -6, ...
desetinná čísla float 16.0, 14.5, 0.23, ...
řetězce str 'jaro', "duben", "37",...
pravdivostní hodnoty bool True, False

Operátory

Pomocí operátorů s hodnotami různě počítáme a pracujeme. Můžeme je sčítat, odčítat, násobit, dělit, porovnávat apod. Operátorů je více různých druhů. Máme například operátory aritmetické, které slouží k počítání. Pokud tyto operátory použijeme, výsledkem je vždy číslo.

Operátor Název Příklad Výsledek
+ sčítání 14 + 5 19
- odčítání 14 - 5 9
* násobení 14 * 5 70
** mocnění 14 ** 5 537824
/ dělení 14 / 5 2.8
// celočíselné dělení 14 // 5 2
% zbytek po dělení 14 % 5 4

Dejme tomu, že chceme spočítat svoji měsíční výplatu, pracujeme-li sedm a půl hodiny denně 21 dní v měsíci za 350kč na hodinu. Můžeme pak v Pythonu psát

>>> 7.5 * 21 * 350
55105.0

Máme ovšem také operátory porovnávací, jejichž výsledkem nejsou čísla ale pravdivostní hodnoty.

Operátor Název Příklad Výsledek
> větší než 14 > 5 True
>= větší nebo rovno 14 >= 14 True
< menší než 14 < 5 False
<= menší nebo rovno 14 <= 5 False
== rovno 'ahoj' == "ahoj" True
!= nerovno '13' != 13 True

Proměnné

Proměnné slouží k tomu, abychom si výsledek výpočtu uložili a mohli jej použít později buď v jiném výpočtu, nebo jej třeba sdělit uživateli našeho programu.

U proměnných je důležité volit smysluplná jména, aby bylo nám i ostatním jasné, co se uvnitř proměnné nachází. Také je pravidlem pojmenovávat proměnné anglicky

Spočítejme svou měsíční výplatu, známe-li počet odpracovaných hodin během dne, počet dní v měsíci a svou hodinovou sazbu.

>>> hours = 7.5
>>> days = 21
>>> pay = 350
>>> salary = hours * days * pay

Můžeme se pak zeptat, zda je naše výplata vyšší než například 50 000 kč.

>>> salary >= 50000
True

Cvičení

1

Obraz

Představte si, že si chcete vyzdobit váš obývací pokoj nástěnným obrazem jako na této fotografii:

Obývcí pokoj

Stěna v pokoji má na šířku 245cm a obraz chceme v šířce 175cm. Fotografii stromu máme k dispozici v rozlišení 4250×2040 pixelů. Obraz je třeba zavěsit na tři skoby zapuštěné do zdi těsně pod horním okrajem rámu. Jedna skoba je horizontálně uprostřed obrazu a zbylé dvě jsou vždy 10 cm od levého a pravého kraje obrazu (viz obrázek). Použijte konzoli jazyka Python k provedení následujících výpočtů.

  1. Do proměnné wallWidth uložte šířku zdi, do proměnné frameWidth šířku rámu obrazu. Spočítejte v jaké vzdálenosti od levého okraje stěny vychází pozice všech tří skob. Výsledky uložte do proměnných clinch1, clinch2, clinch3.
  2. Do proměnné photoWidth uložte šířku fotografie v pixelech, do proměnné photoHeight uložte výšku v pixelech. Do proměnné frameHeight spočítejte potřebnou výšku rámu obrazu v centimetrech tak, aby se zachoval poměr stran pořÍzené fotografie.

Volání funkcí a moduly

Funkce za nás odvedou spoustu náročné práce aniž bychom se s takovou prací museli pořád dokola obtěžovat sami. Takovéto užitečné činnosti jsou například zaokrouhlování, zjišťování délky řetězců, převádění řetězců na čísla a zpět, výstup na obrazovku nebo získávání vstupu od uživatele.

Funkce Popis Příklad Výsledek
round() Zaokrouhlování round(3.141) 3
len() délka len('martin') 6
int() převod na celé číslo int('14') 14
float() převod na desetinné číslo float('14.5') 14.5
str() převod na řetězec str(14) '14'
print() výstup na obrazovku print('ahoj') na obrazovce vytištěno ahoj
input() vstup od uživatele input('Věk: ') vstup z terminálu, vždy jako řetězec

Vstup a výstup

Aby naše programy mohly provádět skutečně něco užitečného, potřebují získat vstup od uživatele a také uživateli sdělit výsledek práce programu - takzvaný výstup. Výstup na konzoli provádíme pomocí funkce print, vstupy získáváme pomocí funkce input. Takto například vypadá program, který po uživateli chce jeho rok narození a vypíše jej rovnou na konzoli.

year = input('Zadejte rok narozeni: ')
print(year)

Při práci se vstupem a výstupem se však poprvé setkáváme také s nutností takzvané konverze hodnot. Funkce input totiž vždy vrací zadaný vstup jako řetězec. Pokud bychom tedy zadali na konzoli například hodnotu 1992, obsah proměnné year bude vypadat takto: '1992'. Pokud chceme s rokem narození pracovat jako s číslem, je třeba jej na číslo převést pomocí funkce int. Dejme tomu,že bychom chtěli spočítat věk uživatele, za předpokladu, že je zrovna rok 2019.

year = int(input('Zadejte rok narozeni: '))
age = 2019 - year
print(age)

Nejspíš bychom také pro uživatele chtěli nějakou přívětivější zprávu než jen holé číslo. V takovém případě musíme číslo v proměnné age převést opět zpátky na řetězec, abychom jej mohli vložit do naší zprávy

year = int(input('Zadejte rok narozeni: '))
age = 2019 - year
print('Vas vek je: ' + str(age))

Moduly

Protože s výše uvedenými funkcemi bychom si zdaleka nevystačili, mnoho dalších užitečných funkcí se ukrývá v modulech, které můžeme do našich programů takzvaně importovat. Jeden z významných modulů se jmenuje math a obsahuje různé matematické funkce. Importujeme jej příkazem

>>> import math

Můžeme pak použít například funkci ceil či floor, které provádějí zaokrouhlování vždy dolů nebo vždy nahoru.

>>> math.ceil(3.1)
4
>>> math.floor(3.9)
3

Velmi šikovný je také modul random, který obsahuje funkce pro generování náhodných čísel. Funkce randint umí například vygenerovat náhodné číslo podle zadaných mezí. Můžeme tak například simulovat hod kostkou.

>>> import random
>>> random.randint(1, 6)
4
>>> random.randint(1, 6)
1
>>> random.randint(1, 6)
2
>>> random.randint(1, 6)
6

Cvičení

2

Falšovač rodných čísel

Napište program, který bude falšovat rodná čísla. Uživatel zadá svůj den, měsíc a rok narození, vždy jako dvě cifry. Program poté vygeneruje rodné číslo, které za lomítkem obsahuje čtyři zcela náhodné cifry.

Příklad fungování programu:

Vložte den narození: 04
Vložte měsíc narození: 11
Vložte rok narození: 82
Rodné číslo: 820411/7951

Poznámka: Ve skutečnosti není generování rodných čísel takto jednoduché. Pravidla se liší pro muže a pro ženy. Rodná čísla navíc musí splňovat další kritéria, jako například dělitelnost 11. Náš program tedy ve zločinecké praxi ještě neobstojí.

Podmínky

Pomocí podmínek se programy rozhodují, jakou cestou se během svojí práce vydat. Můžeme mít program s velmi jednoduchou podmínkou, například:

password = input('Vložte heslo: ')
if len(password) < 6:
  print('Heslo není bezpečné')

Můžeme však také přidat negativní větev

password = input('Vložte heslo: ')
if len(password) < 6:
  print('Heslo není bezpečné')
else:
  print('Heslo v pořádku')

Často však potřebujeme podmínky, které mají vícero větví.

password = input('Vložte heslo: ')
passLen = len(password)
if passLen < 6:
  print('Heslo není bezpečné')
elif passLen < 8:
  print('Slabé heslo')
elif passLen < 10:
  print('Průměrné heslo')
elif passLen < 12:
  print('Bezpečné heslo')
else:
  print('Paranoidní heslo')

Ve všech těchto příkladech si všimněte práce s odsazením. Jazyk Python je citlivý na odsazení a právě podle velikosti odsazení pozná, do jakého bloku patří které řádky kódu.

Cvičení

3

Trojúhelník

Z geometrie víme, že součet všech úhlů v trojúhelníku je vždy 180. Napište program, který si na vstupu vyžádá velikosti tří úhlů a zodpoví, zda může existovat trojúhelník s takto zadanými úhly.

4

Dny v měsíci

Napište program, který dostane na vstupu číslo měsíce v roce (1-12) a vypíše na výstup počet dní v tomto měsíci. Předpokládejme pro jednoduchost, že měsíc únor má vždy 28 dní.

5

Největší ze tří

Napište program, který požádá uživatele o tři celá čísla a vypíše na výstup největší z nich.

6

Stupně vítězů

Napište program, který bude simulovat průběh klasické olympijské disciplíny plavání 100 m na volný způsob. Plavci v této disciplíně běžně dosahují časů pod 50 s. Napište program, který si od uživatele vyžádá jména tří plavců. Pro každého plavce vygeneruje náhodné číslo mezi 45 a 60, které bude představovat jím dosažený čas. Vypište na výstup, který plavec získá zlatou, stříbrnou a bronzovou medaili. Spusťte program vícekrát po sobě a ověřte, že skutečně vykazuje náhodné chování.

Sekvence

Sekvence nám umožňují do jedné proměnné uložit více hodnot najednou. Hodnoty uvnitř sekvencí sídlí na takzvaných indexech, které se vždy počítají od nuly. Jedna z nejjednodušší sekvencí je řetězec.

>>> name = 'hubert'
>>> name[0]
'h'
>>> name[4]
'r'

Ty vůbec nejpoužívanější sekvence jsou ovšem seznamy. Do nich lze uložit jakékoliv množství hodnot jakéhokoliv typu. Dokonce můžeme mít seznamy seznamů.

>>> grades = [2, 3, 4, 1, 1]
>>> temperatures = [13.4, 13.5, 12.8, 11.9]
>>> users = ['mark', 'carl', 'eve', 'ellen']
>>> payment = ['John Doe', 12000, true]
>>> points = [[140, 120], [60, 92], [34, 68]]

Přístupy k indexům sekvencí se dají skládat za sebe. Můžeme tak získat například čtvrté písmenko druhého jména v seznamu users

>>> users[1][3]
'l'

nebo první číslo třetího seznamu v proměnné points

>>> points[2][0]
'l'

Cvičení

7

Částka slovně

Napište program, který na vstupu obdrží třícifernou částku v korunách a vypíše na výstup slovy její velikost. Například pro vstup 356 program vypíše

tři sta padesát šest

Cyklus FOR

Cyklus FOR slouží k opakovanému provádění nějakého kousku kódu pro každý prvek nějaké sekvence. Mějme například seznam šesti nejpoužívanějších TLD domén. Chceme-li tyto domény vypsat všechny na obrazovku, napíšeme cyklus takto:

domains = ['.com', '.de', '.cn', '.net', '.uk', '.org'],
for dom in domains:
  print(dom)

Blok kódu uvnitř cyklu se vykoná pro každý prvek seznamu domains s tím, že při každém opakování cyklu se do proměnné dom uloží prvek, který je zrovna na řadě.

Mohli bychom ovšem chtít pouze dvoupísmenné domény a vyzkoušet, jak s nimi bude působit jméno našich stránek. K tomu budeme potřebovat do cyklu vložit více příkazů:

domains = ['.com', '.de', '.cn', '.net', '.uk', '.org'],
for dom in domains:
  if len(dom) <= 3:
    print('kodim' + dom)

V cyklech můžeme také využívat proměnné vytvořené vně tělo cyklu. Takto můžeme dělat různé výpočty nad seznamy, například spočítat průměr zadaných čísel.

numbers = [5, 1, 3, 3, 4, 1, 1, 2, 5, 4, 1],
sum = 0
for num in numbers:
  sum += num
average = sum / len(numbers)
print('Prumer: ' + str(average))

Ukažme si ještě jeden cyklus, který najde nejvyšší ze zadaných čísel.

numbers = [6, 7, 1, 4, 9, 2, 5, 3, 8, 4, 6, 1],
max = numbers[0]
for num in numbers[1:]:
  if num > max:
    max = num
print('Maximum: ' + str(max))

Cvičení

8

Přechylování příjmení

Vytvořte program, který na začátku bude obsahovat následující seznam příjmení

surnames = ['Novák', 'Dvořák', 'Kolář', 'Eliáš', 'Čermák', 'Kalous']

Napište cyklus, který vypíše tato jména v jejich ženské podobě tedy Nováková, Dvořáková atd.

9

Vyznamenání

Vytvořte program, který na začátku bude obsahovat následující seznam studentů a jejich průměrných známek ze studia

grades = [
  ['Josef Novák', 1.65],
  ['Martin Dvořák', 1.44],
  ['Kateřina Kolářová', 1.15],
  ['Kryštof Eliáš', 1.11], 
  ['Ludmila Čermáková', 1.24], 
  ['Miroslav Kalous', 1.98],
  ['Jaromír Ježek', 1.28],
  ['Kristýna Slezáková', 1.35],
  ['Igor Rosický', 1.05],
  ['Lenka Zdražilová', 1.39]
]

Student prospěl s vyznamenáním, jestliže jeho průměrná známka nepřekročila 1.2. Student prospěl s pochvalou, jestliže jeho průměrná známka nepřekročila 1.4. Napište cyklus, který vypíše jména všech studentů, kteří prospěli s pochvalou či vyznamenáním. Ke každému jménu vypište pochvala či vyznamenání podle druhu ocenění, které si student zaslouží

10

Teploy 2017

Vytvořte program, který na začátku bude obsahovat následující seznam průměrných teplot v ČR pro jednotlivé měsíce za rok 2017.

temps = [-5.6, 1.1, 5.9, 6.9, 13.8, 18.2, 18.5, 18.8, 11.8, 9.5, 3.7, 0.8]

Napište program, který pomocí cyklu spočítá v kolika měsících klesla průměrná teplota pod 4 stupně Celsia. Vypište toto číslo na výstup.