====== 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/1FAIpQLSfufy6pm84fUkuyZChNZEqyskfrl2vIIDosVdxLolN4JivmGA/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áše použijte ikonu **Set password** na ploše. * Pro práci na počítači si spusťte terminál (Applications $\rightarrow$ Terminal) ==== Úkol 1 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)%%'' ==== Ú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. * 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 ==== * 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 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") ==== Ú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 ===== ==== 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^3$ 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: 224 tj. $2^3+3^3+4^3+5^3 = 224$ Vstup: 3 -3 Výstup: 0 $ (-3)^3 + (-2)^3 + (-1)^3 + 0^3 + 1^3 + 2^3 + 3^3= 0$ Vstup: 9 9 Výstup: 729 $ 9^3= 729$ ==== 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ší nepřerušenou **klesající** posloupnost $x_i > x_{i+1} > ... > x_{i+j}$, která se skládá pouze z čísel jejichž absolutní hodnota **není prvočíslo** . * Poznámka: 1 ani 0 není prvočíslo, 2 je prvočíslo. * **Výstup:** dvě řádky na standardní výstup * 1. řádek: délka této posloupnosti (celé číslo) * 2. řádek: součet této posloupnosti (celé číslo) * Pokud je v posloupnosti více klesajících posloupností s maximální délkou, pak program hledá tu s největším součtem. * Posloupnost může mít i jen jeden prvek. I to je posloupnost. * Pokud taková posloupnost neexistuje (neexistuje ani jedno číslo s absolutní hodnotou, která není prvočíslo), pak je výstupem 0 a na dalším řádku také 0. * Odevzdávejte do úlohy HW01 * **Příklady** * Hledá se nejdelší **nepřerušená** posloupnost. V následující ukázce je nejdelší taková ''-4 -8'' se součtem -12.Vstup: 5 -4 -8 7 -10 Výstup: 2 -12 * U dvou a více stejně dlouhých sekvencí rozhoduje jejich součet. Sekvence ''-4 -6 -10'' má menší součet než sekvence ''6 4 0'' Vstup: 23 -4 -6 -10 0 1 3 6 4 0 5 5 10 Výstup: 3 10 * Žádná sekvence Vstup: 2 7 3 5 11 Výstup: 0 0