Warning
This page is located in archive.

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áš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í:
  • 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 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 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")

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

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 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 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.

courses/b3b33alp/cviceni/t01.txt · Last modified: 2023/10/17 15:17 by vonasvoj