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
Další pokyny pro odevzdávání úkolů najdete na stránce
Cvičení
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í
Počítačová laboratoř
Linuxové počítače se nesmí vypínat tlačítkem 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: guest s heslem: xxx.
Po příhlášení použijte ikonu Set password na ploše.
Pro práci na počítači si spusťte terminál (Applications $\rightarrow$ Terminal)
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
Objeví se popis spuštěné verze a znaky >>>
Nyní můžete zadávat příkazy jazyka Python např:
2 + 3
10 / 3
a = 10
a
Výrazy
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, a b
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 programu
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)
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.
POZOR: pokud měníte proměnnou cyklu v těle cyklu, nemá to vliv na její hodnotu v dalším cyklu, tedy:
for i in range(10):
print(i)
i = i -1
změna i v tomto případě, nemá vliv na provádění cyklu.
Výsledkem tohoto cyklu jsou mocniny dvojky:
for i in range(10):
i = 2**i
print(i)
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.
Vstup:
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")
Bez elif
bychom museli odsazovat tímto způsobem:
a = 4
if a < 0:
print("zaporne")
else:
if (a % 2) == 0:
print("sude")
else:
print("liche")
Domácí práce
Domácí úkol
Lehká varianta
Předpokládejte, že všechny vstupy jsou zadány korektně a vstup obsahuje dvě řádky, každá řádka obsahuje pouze jedno celé číslo.
Výsledek musí být celé číslo.
PříkladyVstup:
2
5
Výstup:
978
tj. $2^4+3^4+4^4+5^4 = 978$
Vstup:
3
-3
Výstup:
196
$ (-3)^4 + (-2)^4 + (-1)^4 + 0^4 + 1^4 + 2^4 + 3^4= 196$
Vstup:
9
9
Výstup:
6561
$ 9^4= 6561$
Těžká varianta
Napište program max_seq.py, který v posloupnosti čísel najde podposloupnost, která má největší součet.
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()))
Výstup: D S
, kde D
je délka a S
je součet nalezené podposloupnosti
Poznámka:
Pole na vstupu obsahuje vždy alespoň jedno číslo.
Podposloupnost s jedním číslem je také podposloupnost s délkou 1. Podposloupnost musí mít alespoň jedno číslo.
Posloupnost obsahuje i záporná čísla.
Snažte se najít co nejrychlejší algoritmus, který by fungoval i pro dlouhé sekvence o 12000 prvcích rychle (nejlépe do 0.1s). Můžete si svůj program otestovat na tomto souboru
long_test0.txt.
Snažte se analyzovat, co musí pro podposloupnost s největším součtem platit a zkusit procházet prvky vstupní posloupnosti pouze jednou.
Příklad: podposloupnost s největším součtem v posloupnosti 3 1 -6 2 4 1 -3 2 -5 4 -5
je 2 4 1
, jenž má největší možný součet 7. Výstupem programu bude délka podposloupnosti a její součet, tedy 3 7
.
Více příkladů:
Vstup programu je:
1 2 3 4 5 6
Výstup programu bude:
6 21
protože program cel8 posloupnost je podposloupností s největším součtem 21.
Vstup programu je:
-2 -1 -3 -4 -5 -6
Výstup programu bude:
1 -1
protože podposloupnost s největším součtem je podposloupnost s jedním prvkem
-1
.
Vstup programu je:
1 2 5 -10 8 -3 2 1 -1 2 -2 5 -16 8 -10 2 3
Výstup programu bude:
8 12
Protože podposloupnost
8 -3 2 1 -1 2 -2 5
má ze všech podposloupností největší součet
12
.