====== 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 * Další pokyny pro odevzdávání úkolů najdete na stránce [[courses:b3b33alp:cviceni:start#obecne_pokyny_pro_odevzdavani_domacich_ukolu|Cvičení]] ==== Dotazník ==== * Prosím věnujte pár minut vyplnění [[ https://docs.google.com/forms/d/e/1FAIpQLScd-kVmW4OGuW20oQs8Fw0f1TxF7c7WN_8yJFpmPuTJnnjwVQ/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í ==== Počítačová laboratoř ==== * [[https://cyber.felk.cvut.cz/cs/study/computer-labs/|Vybavení laboratoře]]. * 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č: * 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: **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 Windows si stáhněte z adresy https://www.python.org/downloads/ balíček Python 3.7.X * Pro instalaci na Linux Ubuntu napište sudo apt install python3 * Pro instalaci na telefonech nebo tabletech doporučujeme použít webovou verzi Python3 z odkazu [[https://www.programiz.com/python-programming/online-compiler/]], nebo aplikaci //Learn Python: Programiz// pro Android i Apple. * Pro sdílení kódu, tedy interaktivní spolupráci s učitelem si nainstalujte //Visual Code Studio// ze stránky [[https://code.visualstudio.com/]] * 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)%%'' ==== 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, 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) * 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. * Visual studio code, vhodné zejména při distanční výuce. [[ https://cw.fel.cvut.cz/b201/courses/b3b33alp/cviceni/visualstudiocode | Návod na instalaci ]]. ==== 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) * Příklad použití: ''python3 jmenoPythonProgramu.py 45'' * Program vypíše argument: 45 ==== 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. * 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 ==== * 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 100Vstup: 12 Výstup: 6084 6084Vstup: 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 ===== * 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 ===== ==== Lehká varianta ==== * Napište program **int_sum.py**, který počítá součet mocnin posloupnosti čísel * **Vstup:** dvě řádky ze standardního vstupu, které postupně obsahují celá čísla $a$, $b$ * **Výstup:** celé číslo, které je součtem výrazů $i^4$ pro všechna celá čísla $i$ * pokud je $a \le b$ od $a$ do $b$ (včetně) * pokud je $a > b$ od $b$ do $a$ (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 dvě řádky, každá řádka obsahuje pouze jedno celé číslo. * Výsledek musí být **celé** číslo. * **Příklady**Vstup: 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 {{ :courses:b3b33alp:cviceni:long_test0.txt |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''. * Program v souboru **max_seq.py** odevzdejte pomocí odevzdávacího systému (úloha HW01). **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''.