====== 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/1FAIpQLSfpCFuW_5H1fMX__bgWperiOBELN2EtOg9JpTuhwl9F6_UbkA/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 9 úloh (jedna náročnější na pondělní prázdniny 28.10. s dvojnásobným bodovým ohodnocením). 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ší. * Poslední úloha ve cvičeních bude větší semestrální práce za 5 bodů. * Každou úlohu je nutné odevzdat nejpozději do 3 týdnů od zadání (cvičící může udělit výjimku - na základě lékařského potvrzení atp.) * Z každé úlohy (i ze semestrální práce) 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. * POZOR: Odevzdávací systém má někdy omezený počet testovacích případů. Nikdy neodevzdávejte program typu: když vstup=1, výstup je 5, když vstup=2, výstup je 10, když ... . Může se stát, že Vám odevzdávací systém za takový program přidělí nějaké body, ale když to dodatečně zjistí cvičící, tak Vám tyto body odebere a budete muset vyřešit zadanou úlohu znovu obecně. Nikdy to nedělejte u zkoušky, protože to může být důvod k vyloučení od zkoušky. * 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 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 ===== 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:** dvě řádky ze standardního vstupu, které postupně obsahují celá čísla $a$, $k$ * **Výstup:** celé číslo, které je součtem výrazů $i^k$ pro všechna celá čísla $i$ * pokud je $a>0$ od $0$ do $a$ (včetně) * pokud je $a \le 0$ od $a$ do $0$ (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 2 Výstup: 55 tj. $0^2+1^2+2^2+3^2 + 4^2 + 5^2 = 55$ Vstup: -3 3 Výstup: -36 $ (-3)^3 + (-2)^3 + (-1)^3 + 0^3 = -36$ Vstup: 9 4 Výstup: 15333 $ 0^4 + 1^4 + 2^4 + 3^4 + 4^4 + 5^4 + 6^4 + 7^4+ 8^4 + 9^4= 15333$ ==== 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ší **neklesající** posloupnost $x_i \leq x_{i+1} \leq ... \leq x_{i+j}$, která se skládá pouze z **lichých kladný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 neklesajících posloupností s maximální délkou, 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. * **Příklady** * Hledá se nejdelší **nepřerušená** posloupnost. V následující ukázce je nejdelší taková ''3 3 15 17'' se součtem 38.Vstup: 3 -2 -1 3 3 15 17 4 1 13 15 Výstup: 4 38 * U dvou a více stejně dlouhých sekvencí rozhoduje jejich součetVstup: 1 3 5 4 -3 1 5 7 Výstup: 3 13 * Žádná sekvence Vstup: 2 6 -5 -4 0 -3 Výstup: 0 0