Cvičení 1: Úvod do cvičení
instalace Python
náplň cvičení
odevzdávací systém
Odevzdávací systém
Pro přihlášení do odevzdávacího systému musíte znát vaše hlavní přístupové heslo.
Domácí úlohy jsou dvojího typu lehká/těžká, typ úlohy určuje jméno souboru, který odevzdáváte. Sledujte pokyny u zadání každé domácí úlohy
Dotazník
* Prosím věnujte pár minut vyplnění dotazníku
Organizace cvičení
Ti, kteří již programují a znají algoritmy, si je procvičí
Ti, kteří zatím jen programovali, se naučí nejdříve analyzovat problém a vybrat vhodný algoritmus.
Ti, kteří zatím neprogramovali, se naučí základy jazyka Python a algoritmickému přístupu k programování
Zápočet
Zápočet získáte, pokud ze cvičení získáte minimálně 12 bodů.
Ve cvičení bude 10 úloh. Můžete si vybrat buď lehčí úlohu za 1 bod, nebo těžší úlohu za 2 body. Lehké úlohy nepředpokládají žádné znalosti mimo přednášky a cvičení. Těžší úlohy se hodí pro ty z vás, kteří již programovat umí a jsou i náročnější a rozsáhlejší.
Poslední úloha ve cvičeních bude větší semestrální práce za 5 bodů.
Každou úlohu je nutné odevzdat nejpozději do 3 týdnů od zadání (cvičící může udělit výjimku - na základě lékařského potvrzení atp.)
Z každé úlohy (i ze semestrální práce) musí student získat nenulový počet bodů, hodnocení úlohy provádí odevzdávací systém a je možné získat i desetinné hodnocení za částečně fungující úlohu.
POZOR: Odevzdávací systém má někdy omezený počet testovacích případů. Nikdy neodevzdávejte program typu: když vstup=1, výstup je 5, když vstup=2, výstup je 10, když … . Může se stát, že Vám odevzdávací systém za takový program přidělí nějaké body, ale když to dodatečně zjistí cvičící, tak Vám tyto body odebere a budete muset vyřešit zadanou úlohu znovu obecně. Nikdy to nedělejte u zkoušky, protože to může být důvod k vyloučení od zkoušky.
Každý může řešit libovolné úlohy - teoreticky můžete získat až 25 bodů z cvičení.
Pokud začnete řešit těžkou úlohu a její řešení se Vám nepodaří, lze i později odevzdat úlohu lehčí.
Zápočet je nutné získat před zkouškou
Počítačová laboratoř
Linuxové počítače se nesmí vypínat a je také zakázáno z nich odpojovat jakékoliv kabely, a to včetně síťového (ethernet) kabelu!
Pro připojení vlastního počítače využijte buď WiFi připojení nebo připravené kabely vyvedené na stoly v laboratoři.
Připojení na počítač:
Pro nastavení hesla v učebnách je možné se přihlásit pomocí username: problem s heslem: login.
Pro odhlášení je třeba stisknout CTRL+Q.
Pro práci na počítači si spusťte terminál (Applications $\rightarrow$ Terminal)
Změna hesla se provede příkazem passwd spuštěným z terminálu . Změna se projeví okamžitě na všech stanicích.
Úkol 1 Spuštění Pythonu
Na počítačích v laboratoři je již instalován Python3.
Pro instalaci na Linux Ubuntu napište
sudo apt install python3
Spuštění Python z terminálu, napište příkaz: python3
2 + 3
10 / 3
a = 10
a
Výrazy
* Operace:
+,- sčítání, odčítání - nejmenší priorita
*,/, //, % násobení, dělení, dělení se zaokrouhlením dolů - celočíselné dělení, zbytek po dělení - vyšší priorita než sčítání
+,- unární operace, neboli +,- před číslem - vyšší priorita než předchozí řádek
** mocnění - nejvyšší priorita
* Operace se vyhodnocují v pořadí jejich priorit. V případě shodných priorit zleva doprava. Tedy:
2 + 3 * 4 - 1 = 2 + (3 * 4) - 1
2 - 3 + 1 = (2 - 3) + 1
3. / 2. * 10. = (3. / 2.) * 10.
3. * 2. ** 5 + 1 = (3. * (2. ** 5)) + 1
POZOR vyjímka 2 ** 2 ** 3 = 2 ** (2 ** 3)
Úkol 2 - Python jako kalkulačka
Python rozlišuje celá čísla a reálná čísla. Pokud je jeden operand ve výrazu reálné číslo, je celý výraz reálné číslo. Pokud je ve výrazu $/$, pak je výsledek vždy reálné číslo. Reálná čísla lze převést na celá zahozením desetinného rozvoje příkazem int(reálné číslo). Opačně celé číslo na reálné převedete příkazem float(celé číslo).
Zjistěte kolik je:
14 % 6
14 % -6
14 % 2.5
14 // 6
14 / 6
int(14 / 6)
14.0 // 6.0
14 // -6
int(14 / -6)
float(14 // -6)
2 ** 2 ** 2 ** 2
Přidejte závorky, aby platilo (řešení ověřte v Pythonu):
Proměnné
Proměnná slouží k uchování hodnoty výrazu
Název proměnné musí:
začínat písmenem, nebo znakem _
obsahuje pouze písmena, číslice, a znak _
nesmí být shodný s klíčovým slovem jazyka Python3 - False, None, True, and, as, assert, break, class, continue, def, del, elif, else, except, finally, for, from, global, if, import, in, is, lambda, nonlocal, not, or, pass, raise, return, try, while, with, yield
Možné názvy proměnných a, a2016, a_ted_to_sem_ulozim, rozdil_dvou_cisel, as5
Špatné názvy proměnných 1a, as, 1_a, is
U proměnných závisí na velikosti písmen (python je case-sensitive). Proměnná cislo je tedy jiná než proměnná Cislo.
Přiřazení hodnoty proměnné se děje operátorem '='.
Výstup
Pokud Váš program něco spočítá, je důležité tuto hodnotu nějak zobrazit.
Standardní výstup programu je na obrazovku pomocí funkce print:
print(1, 2, 3)
print("1 + 2 je", 1 + 2)
print("Hodnota promenne a je", a)
Program v jazyce Python
Program v Pythonu je zapsaný v textovém souboru.
Interpret Pythonu (např. program python3) vykonává zadané příkazy postupně tak jsou uvedeny v souboru.
Program lze vytvořit v libovolném textovém editoru, který vytváří prostý text. Pozor: nelze použít např. textové editory typu Word, protože ukládají formátovaný dokument, který interpret Pythonu neumí zpracovat.
Pro jednodušší tvorbu programů slouží integrovaná prostředí:
IDLE - velmi jednoduché na ovládání, automatické doplňování textu, nápověda, ladění, součást prostředí Python. Spouští se příkazem
idle3 nebo ̈́
idle (záleží na distribuci pythonu).
Pyzo - velmi jednoduché a příjemné ovládání
PyCharm - uživatelsky příjemnější, složitější na učení
Eclipse - PyDev, komplexní prostředí pro vývoj programů v jazycích Java, C/C++ i Python, složitější pro začátečníky.
Vstup
Váš program často potřebuje zadat nějakou vstupní hodnotu.
Standardní vstup programu je z terminálu funkce input:
a = int(input())
b = float(input(“Zadejte realne cislo:”))
c = input(“Zadej cokoliv”)
První dva příklady přetypují zadaný vstup na číslo celé, nebo reálné. To není vždy možné, třeba pokud zadáte chybně číslo 1a2. Jak tuto situaci ošetřit se dozvíte později.
Zatím předpokládejte korektně zadané vstupy.
Další možností je předat data jako argumenty příkazové řádky:
import sys # načtení modulu pro použití funkcí a proměnných modulu sys
a = int(sys.argv[1])
print("Zadana hodnota:")
print(a)
Úkol 3 - První program v Pythonu
Úkol 4 - Výpočty v Pythonu
Vytvořte program pocitani.py, který načte dvě čísla z příkazové řádky a vytiskne jejich součet, rozdíl, součin, podíl
Pro načtení čísel použijte konstrukci
import sys
a = float(sys.argv[1])
b = float(sys.argv[2])
print(a+b)
print(a-b)
print(a*b)
print(a/b)
Zadejte vstupy (10, 20), (100.0, 120.0) a (55.5, 0). Jaké jsou výstupy?
Cykly
Základní druhy cyklů
For cyklus
for cyklus standardně prochází zadaný seznam hodnot
for cyklus je založen na proměnné, která prochází seznam hodnot a pro každou hodnotu ze seznamu provede blok instrukcí
for proměnná in seznam:
blok instrukcí
for k in range(1, 20, 1):
print(k)
for i in "abcd":
print(i)
for i in (1, 10, 2, 8):
print(i)
Pro standardní procházení nějakého rozmezí je kontrukce range(start, cíl, krok), případně jednodušší verze range(cíl), kdy start je automaticky 0 a krok je nastaven na 1, nebo range(start, cíl), kdy krok je roven 1.
Lze vytvořit i for cyklus, který má dynamicky měnící se seznam hodnot, případně vrací nekonečně krát stejné/rozdílné hodnoty. V tomto případě se pak jedná spíše o while cyklus a vám doporučujeme vzhledem k přehlednosti implementovat takový program jako while cyklus.
Úkol 5 - Součet třetích mocnin, test odevzdávacího systému
Přejmenujte program na cubic_sum.py a upravte jej tak, aby počítal součet třetích mocnin $$\sum^{n}_{k=0}k^3$$
Dále upravte program tak, aby zkontroloval, zda se součet třetích mocnin rovná $$\sum^{n}_{k=0}k^3 = \left(\frac{n(n+1)}{2}\right)^2$$
Program vytiskne na jednu řádku součet třetích mocnin, na další řádku vytiskne výsledek podle vzorečku
Vytištěné výsledky musí být celá čísla.
PříkladyVstup:
4
Výstup:
100
100
Vstup:
12
Výstup:
6084
6084
Vstup:
5
Výstup:
225
225
Větvení programu
Pokud potřebujeme vykonat část programu jen při splnění určitých podmínek, použijeme příkaz if.
Jeho nejdednodušší tvar je:
if podmínka:
kód
V tomto případě se nejdříve vyhodnotí podmínka a je-li splněna, je vykonán příslušný kód. Pokud podmínka splněna není, kód se nevykoná.
Příklad: vytiskni “sudé číslo” pokud proměnná $a$ obsahuje sudé číslo.
if (a % 2) == 0:
print("sude cislo")
Obecnější tvar větvení je
if podmínka1:
kód1
elif podmínka2:
kód1
else:
kód2
V tomto případě lze použít vícero bloků elif.
Příklad: pokud je v proměnné $a$ záporné číslo, vytiskni “zaporne”, jinak vypis jestli je číslo v proměnné $a$ liché nebo sudé.
a = 4
if a < 0:
print("zaporne")
elif (a % 2) == 0:
print("sude")
else:
print("liche")
Úloha 6
Domácí práce
Domácí úkol
Lehká varianta
Předpokládejte, že všechny vstupy jsou zadány korektně a vstup obsahuje dva řádky, každá řádka obsahuje pouze jedno celé číslo.
Výsledek musí být celé číslo.
PříkladyVstup:
5
2
Výstup:
224
tj. $2^3+3^3+4^3+5^3 = 8 + 27 + 64 + 125 = 224$
Vstup:
-3
3
Výstup:
0
$ (-3)^3 + (-2)^3 + (-1)^3 + 0^3 + 1^3 + 2^3 + 3^3 = -27 + (-8) + (-1) + 0 + 1 + 8 + 27 = 0$
Vstup:
3
-4
Výstup:
-64
$ (-4)^3 + (-3)^3 + (-2)^3 + (-1)^3 + 0^3 + 1^3 + 2^3 + 3^3 = -64 + (-27) + (-8) + (-1) + 0 + 1 + 8 + 27 = -64 $
Těžká varianta
Napište program seq_sum.py, který počítá součet nejdelší posloupnosti čísel podle zadaných pravidel
Vstup:
jedna řádka ze standarního vstupu
řádka obsahuje posloupnost celých čísel $x_1, ... ,x_n$ oddělených mezerou
pro načtení a převedení vstupu na pole celých čísel můžete použít příkaz
nums = list(map(int, input().split()))
Program najde nejdelší rostoucí posloupnost $x_i < x_{i+1} < ... < x_{i+j}$, která se skládá pouze ze sudých čísel.
Výstup: dvě řádky na standardní výstup
Pokud je v posloupnosti více rostoucích posloupností s maximální délkou, pak program hledá tu s největším součtem.
Pokud taková posloupnost neexistuje, pak je výstupem 0 a na dalším řádku také 0.
Příklady
Hledá se nejdelší
nepřerušená posloupnost. V následující ukázce je nejdelší taková
-4 0 2 8 10 se součtem 16.
Vstup:
3 -2 -1 -4 0 2 8 10 1 13 15
Výstup:
5
16
U dvou a více stejně dlouhých sekvencí rozhoduje jejich součet
Vstup:
1 2 8 4 10 1 5 7
Výstup:
2
14
Žádná sekvence
Vstup:
1 3 -5 -7 -9 -3
Výstup:
0
0