====== Cvičení 1: Úvod do cvičení ======
* instalace Python
* náplň cvičení
* individuální řešení, [[help:common:plagiaty_opisovani|plagiáty]]
* odevzdávací systém
==== Odevzdávací systém ====
* Všechny domácí práce se odevzdávají přes [[ http://cw.felk.cvut.cz/upload/ | 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í [[ https://docs.google.com/forms/d/e/1FAIpQLScIZ9JBg-x80ienQ-lzXIL_YczLy-n6TODD5MLvB_reumGCJw/viewform?usp=sf_link | 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ší.
* 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čí.
* Všechny úlohy se odevzdávají přes [[http://cw.felk.cvut.cz/upload/|Odevzdávací systém]]
* **Zápočet je nutné získat před zkouškou**
==== Počítačová laboratoř ====
* [[https://cyber.felk.cvut.cz/cs/study/computer-labs/|Vybavení laboratoře]].
* 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č:
* Heslo pro přihlášení v učebnách si nastavíte na adrese: https://cw.felk.cvut.cz/password.
* 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 Vašich osobních počítačích si stáhněte z adresy https://www.python.org/downloads/ balíček Python 3.X.Y
* 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
* Program Python ukončíte zadáním funkce quit(), nebo stiskem Ctrl+D - konec vstupu.
==== 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):
* ''10 - 3 + 7'' je 0
* ''12 + 3 * 2'' je 30
* ''%%10 - 3 % 3 ** 10%%'' je 1
* ''%%2 ** 2 ** 2 ** 2%%'' je 256 - najděte alespoň dvě řešení
==== 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)
* Funkce ''print'' má mnoho variant, pro začátek nám bude stačit tato základní funkčnost.
==== 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í:
* [[https://docs.python.org/2/library/idle.html|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).
* [[http://www.pyzo.org/|Pyzo]] - velmi jednoduché a příjemné ovládání
* [[https://www.jetbrains.com/pycharm/|PyCharm]] - uživatelsky příjemnější, složitější na učení
* [[http://www.pydev.org/|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)
* Příklad použití: ''python3 jmenoPythonProgramu.py 45''
* Program vypíše argument: 45
==== Úkol 3 - První program v Pythonu ====
* Spusťte prostředí IDLE, nebo PyCharm napsáním příkazu ''idle3'' v terminálu, nebo výběrem programu PyCharm v menu na obrazovce
* V menu File $\rightarrow$ New window vytvořte Váš první soubor
* Napište program, který do proměnné **a** uloží hodnotu **10**, do proměnné **b** hodnotu **5** a do proměnné **c** hodnotu proměnné **a** zmenšenou o hodnotu proměnné **b+1**.
* Vytiskněte hodnotu proměnných **a**, **b** a **c** na obrazovku.
* Uložte program do souboru příkazem File $\rightarrow$ Save
* Spusťte program příkazem Run $\rightarrow$ Run Module, nebo klávesou F5
==== Ú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 - procházení seznamu hodnot
* while cyklus - opakuj cyklus dokud platí podmínka - příští týden
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 ====
* Stáhněte si k sobě program {{:courses:b3b33alp:cviceni:soucet.py|soucet.py}}
* 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.
* **Program odevzdejte [[ http://cw.felk.cvut.cz/upload/ | odevzdávacím systémem ]] (úloha HW00).**
* **Příklady**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")
==== Úloha 6 ====
* Upravte program z úlohy 5 tak, aby:
* načetl vstupní číslo z příkazové řádky
* program vytiskne ANO pokud je hodnota vzorce stejná jako vypočtený součet, nebo vytiskne NE pokud je hodnota rozdílná
===== Domácí práce =====
* Nainstalujte si [[ https://www.python.org/downloads/ | Python ]] a vyzkoušejte vývojové prostředí ( [[ https://www.jetbrains.com/pycharm/|Pycharm]], [[ https://eclipse.org/ | Eclipse ]] + [[ http://www.pydev.org/ | PyDev ]], ...).
* Projděte si úvod do jazyka Python buď v českém jazyce [[ http://howto.py.cz/index.htm | Učíme se programovat v jazyce Python 3 ]], [[ http://diveintopython3.py.cz/index.html| Ponořme se do Pythonu ]] , nebo v anglickém jazyce [[http://openbookproject.net/thinkcs/python/english3e/way_of_the_program.html|kapitolu 1]] a [[http://openbookproject.net/thinkcs/python/english3e/variables_expressions_statements.html|kapitolu 2]] knihy {[a4b99rph:Wentworth2012]}, nebo [[https://docs.python.org/3/tutorial/index.html|The Python Tutorial]].
* Projděte si odkazy v sekci [[courses:b3b33alp:literatura]].
* Kdo se ještě v učebně nepřihlásil, zjistěte si své heslo do KOSu a [[ https://cw.felk.cvut.cz/password/ | zařiďte si heslo do sítě FELK]].
===== Domácí úkol =====
Projděte si podrobně [[courses:b3b33alp:cviceni:odevzdavaci_instrukce|odevzdávací instrukce]], vyberte si lehčí nebo těžší úlohu a odevzdejte ji do [[ http://cw.felk.cvut.cz/brute/ | odevzdávacího systému ]] jako HW01
==== Lehká varianta ====
* Napište program **int_sum.py**, který počítá součet mocnin posloupnosti čísel
* **Vstup:** tři řádky ze standardního vstupu, které postupně obsahují celá čísla $a$, $b$, $k$
* **Výstup:** celé číslo, které je součtem výrazů $i^k$ pro všechna celá čísla $i$ od $min(a,b)$ do $max(a,b)$ (včetně)
* Můžete vycházet z programu {{:courses:b3b33alp:cviceni:soucet.py|soucet.py}}.
* Předpokládejte, že všechny vstupy jsou zadány korektně a vstup obsahuje tři řádky, každá řádka obsahuje pouze jedno celé číslo.
* Výsledek musí být **celé** číslo.
* **Příklady**Vstup:
5
3
2
Výstup:
50
tj. $3^2 + 4^2 + 5^2 = 50$ Vstup:
1
18
2
Výstup:
2109
Vstup:
8
8
2
Výstup:
64
==== Těžká varianta ====
* 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 z **sudých záporných** čísel.
* Výstup: dvě řádky na standardní výstup
* 1. řádek: délka této posloupnosti
* 2. řádek: součet této posloupnosti
* 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).
* **Příklady**
* Hledá se nejdelší **nepřerušená** posloupnost. V následující ukázce je nejdelší taková ''-100 -8 -6 -4'' se součtem -118.Vstup:
6 4 -100 -8 -6 -4 -8 15
Výstup:
4
-118
* Dvě stejně dlouhé sekvence, rozhoduje součetVstup:
3 -10 -8 -2 1 -6 -4 -2 2
Výstup:
3
-12
* Žádná sekvence
Vstup:
1 3 -5 -7 0 2
Výstup:
0
0