Cvičení 1: Úvod do cvičení

  • instalace Python
  • náplň cvičení
  • individuální řešení, plagiáty
  • odevzdávací systém

Odevzdávací systém

  • Všechny domácí práce se odevzdávají přes 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 Cvičení

Dotazník

* Prosím věnujte pár minut vyplnění 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ř

  • 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í:
  • 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.
  • Visual studio code, vhodné zejména při distanční výuce. 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 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.
  • 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

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 $k$, $a$
    • Výstup: celé číslo, které je součtem výrazů $i^k$ pro všechna celá čísla $i$
      • pokud je $a \ge 0$ od $0$ do $a$ (včetně)
      • pokud je $a < 0$ od $a$ do $0$ (včetně)
  • Můžete vycházet z programu 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:
    2
    5
    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:
    4
    9
    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, \ldots ,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 neklesající posloupnost $x_i \le x_{i+1} \le \ldots \le x_{i+j}$, která se skládá pouze z čísel jejichž absolutní hodnota je 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 rostoucí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 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á -2 -2 se součtem -4.
      Vstup: 
      5 -2 -2 10 8
      Výstup:
      2
      -4
    • U dvou a více stejně dlouhých sekvencí rozhoduje jejich součet. Sekvence -7 -7 -2 má menší součet než sekvence 3 5 5
      Vstup: 
      20 -7 -7 -2 0 1 3 5 5 10
      Výstup:
      3
      13
    • Žádná sekvence
      Vstup:
      0 1 4 -4 8 1 
      Výstup:
      0
      0
courses/b3b33alp/cviceni/t01.txt · Last modified: 2021/09/20 19:59 by stepan