Cvičení 1: Úvod do cvičení
instalace Python
náplň cvičení
odevzdávací systém
Odevzdávací systém
Dotazník
* Prosím věnujte pár minut vyplnění dotazníku
Organizace cvičení
* Program 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ší.
Každou úlohu je nutné odevzdat nejpozději do 3 týdnů od zadání (cvičící může udělit vyjímku - na základě lékařského potvrzení atp.)
Z každé úlohy 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.
Poslední úloha ve cvičeních bude větší semestrální práce za 5 bodů.
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.
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 tak, aby se jmenoval cubic_sum.py a počítal součet třetích mocnin $\sum^{n}_{k=0}k^3$
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.
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
Upravte tento program tak, aby vytiskl součet výrazů $2*i+3$ pro všechna celá čísla $i$ od 1 do $n$ (včetně)
Upravený soubor pod názvem int_sum.py
odevzdejte do odevzdávacího systému (úloha HW01).
Výsledek musí být celé číslo.
Těžká varianta
Vstup:
jedna řádka ze standarního vstupu
řádka obsahuje posloupnost celých čísel $x_1, ... ,x_n$ oddělených mezerou
Program najde nejdelší rostoucí posloupnost $x_i < x_{i+1} < ... < x_{i+j}$, která se skládá pouze z lichých nezáporných čísel.
Výstup: dvě řádky na standardní výstup
Upřesnění: hledá se nejdelší nepřerušená posloupnost. V následující ukázce je nejdelší taková posloupnost 3 5 9
se součtem 17.
Vstup: 6 4 3 5 9 -4 13 15
Výstup:
3
17
Pokud je v posloupnosti více stejně dlouhých rostoucích posloupností, 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.
Program pod názvem seq_sum.py
nahrajte do odevzdávacího systému (úloha HW01).
Pro načtení vstupu můžete použít příkaz:
nums = list(map(int, input().split()))