Cvičení č. 3 rozšířené o poznámky ze cvičení a řešení některých příkladů (ZS 2026/27)¶
- Jak efektivně psát na klávesnici – určitě všichni ovládáme nebo alespoň procvičujeme psaní všemi deseti 😃
- Jak jsou kódovaná data v paměti počítače
- Jak zadávat číselné hodnoty – převod textu získaného pomocí funkce
inputna číslo
Funkce input vždy vrátí textový objekt, i když uživatel zadá číslo.
Pokud chceme získat číselný objekt, musíme použít příslušnou funkci, která získá číselnou hodnotu z textu:
- funkce
intvrátí celé číslo:a = int(input("Zadej celé číslo:"))
- funkce
floatvrátí "reálné" číslo:a = float(input("Zadej libovolné reálné číslo:"))
Datové typy a zápis hodnot v Pythonu¶
V této sekci si ukážeme použití základních aritmetických typů v jazyku Python (bool, int, float, complex), podporované operátory a převod mezi různými typy.
Naopak práci s textovými řetězci (typ str) odložíme na později.
# každá hodnota nebo proměnná má nějaký datový typ (např. `bool`, `int`, `float`, `str`)
# typ proměnné interpret určí automaticky
# abychom zjistili, jakého je nějaká proměnná typu, můžeme použít funkce `type` a `isinstance`
a = 5
print (a, "je typu", type(a))
b = 5.3
print (b, "je typu", type(b))
c = "5"
print (c, "je typu", type(c))
d = True
print (d, "je typu", type(d))
e = None
print (e, "je typu", type(e))
type(e)
5 je typu <class 'int'> 5.3 je typu <class 'float'> 5 je typu <class 'str'> True je typu <class 'bool'> None je typu <class 'NoneType'>
NoneType
# připomenutí: funkce input vrací vždy str:
x = input("zadej hodnotu")
print(x)
type(x)
45
str
# výsledek operace může být jiného typu než operandy:
x = 5 / 3
print(x)
type(x)
1.6666666666666667
float
x = 5 > 3
print(x)
type(x)
True
bool
Typ bool a speciální hodnota None¶
Typ bool je datový typ umožňující reprezentovat pravdivostní hodnoty pravda (true) a nepravda (false), které se v jazyku Python zapisují pomocí konstant True a False (pozor na velká písmena!).
Dále je možné použít funkci bool pro převod jiných datových typů a používat logické operátory and, or, not:
# definice proměnné typu bool
a = True
b = False
print(a, b)
# operátory and, or, not
(a and b) or not True
True False
False
c = a and (not a or True)
print(c)
True
# převod hodnot na bool:
# na bool mohu převádět jiné datové typy:
# 0 nebo 0.0 -> False
# nenulové číslo -> True
# prázdný string -> False
# jakýkoliv neprázdný string -> True
print(bool(0), bool(0.0), bool(""))
print(bool(13), bool(2.5), bool("cokoliv"))
print(bool(-1), bool(-1.0), bool("0"))
False False False True True True True True True
a = True
b = 0
print(a and not bool(b))
True
# pozor!
print(bool("False"))
True
# převod z bool na int, float, str:
a = False
print(int(a), float(a), str(a))
a = True
print(int(a), float(a), str(a))
0 0.0 False 1 1.0 True
# operátory porovnání: == , != , < , > , >= , <=
x = 10
y = 4
a = x > y
print(a, type(a))
print(x > y, x < y, x >= y, x <= y, x == y, x != y)
print ( (x > y) and not (y < 1))
True <class 'bool'> True False True False False True True
K zamyšlení a vyzkoušení: jaké další operátory jsou v Pythonu k dispozici pro hodnoty typu bool?
V jazyku Python existuje další hodnota reprezentovaná konstantou None, která představuje "prázdnou" hodnotu.
Lze ji použít např. pro inicializaci proměnné, kterou budeme dále v programu potřebovat, ale zatím pro ni nemáme žádnou užitečnou hodnotu.
Hodnota None také může sloužit k zavedení ternární logiky v programu, ale na rozdíl od hodnot True a False má svůj vlastní typ (ne bool ani int, ale NoneType).
# speciální hodnota None ... pro "prázdnou" hodnotu (typu NoneType)
x = None
print(x)
type(x)
None
NoneType
# funkce print vrací hodnotu None:
x = print("ahoj")
print(x)
type(x)
ahoj None
NoneType
Typ int¶
Typ int je datový typ pro reprezentaci celých čísel.
Přípustné hodnoty jsou např. 0, 1, 2, 3, ..., a dále -1, -2, -3, ...
Celá čísla se ve zdrojovém kódu jazyka Python běžně zadávají v desítkové soustavě, jako např.:
a = 123456789
print(a, type(a))
123456789 <class 'int'>
Omezení na zápis celých čísel ve zdrojovém kódu jsou v zásadě dvě: číselný zápis nesmí začínat nulou a mezi číslicemi nesmí být mezery:
a = 01
Cell In[42], line 1 a = 01 ^ SyntaxError: leading zeros in decimal integer literals are not permitted; use an 0o prefix for octal integers
a = 123 456
Cell In[43], line 1 a = 123 456 ^ SyntaxError: invalid syntax
Naopak mezi číslicemi může vystupovat znak _, který slouží jako oddělovač pro člověka významných číslic, podobně jako např. mezery v zápisu telefonního čísla.
Jakýkoliv výskyt znaku _ však nezmění číselnou hodnotu.
print(2_123_456)
print(77_888_8_99)
2123456 77888899
Zápis čísel v jiných soustavách¶
Kromě desítkové soustavy lze pro zápis čísel v jazyku Python použít také dvojkovou (binární), osmičkovou nebo šestnáctkovou (hexadecimální) soustavu.
Pro odlišení od desítkového zápisu se používají prefixy 0b, 0o a 0x, za kterými následují číslice příslušné soustavy, přičemž první číslice za prefixem může být 0:
- dvojková:
0b01 - osmičková:
0o01234567 - šestnáctková:
0x0123456789abcdef
0b101
5
V libovolné soustavě také můžeme použít oddělovač číslic _ pro zlepšení čitelnosti kódu, např.:
print(0b1011000_10101011)
22699
Všimněte si, že rozlišení číselných soustav vystupuje pouze na úrovni zdrojového kódu. Jak bylo řečeno, interně program pracuje vždy se dvojkovou soustavou. Naopak pro výstup jazyk Python používá desítkovou reprezentaci dané hodnoty (pokud mu neřekneme jinak):
print(11)
print(0o11)
print(0x11)
print(0b11)
11 9 17 3
# uměli byste sami převést číslo do desítkové soustavy?
0b1101
13
0o72
58
# chyba: číslice 9
0o92
Cell In[21], line 1 0o92 ^ SyntaxError: invalid digit '9' in octal literal
0o101
65
0xF
15
0x12
18
0x101
257
0xA2
162
Pokud chceme vytisknout reprezentaci čísla v jiné soustavě než desítkové, můžeme použít některou z funkcí bin, oct a hex:
print(bin(10), oct(10), hex(10))
0b1010 0o12 0xa
# pozor, fce bin, oct, dec, vrací textový řetězec, ne číslo
s = bin(11)
print(s)
type(s)
0b1011
str
print(bin(11))
print(oct(0x11))
print(hex(0b1111))
0b1011 0o21 0xf
Všechny tři funkce však vrací textový řetězec (typ str, na který se podrobně podíváme později), ale jako vstup očekávají číslo (typ int).
Nelze je tedy skládat, např. výrazy jako hex(bin(1)) nebo oct(hex(1)) nebudou fungovat.
# nefunguje:
hex(bin(1))
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) Cell In[29], line 2 1 # nefunguje: ----> 2 hex(bin(1)) TypeError: 'str' object cannot be interpreted as an integer
Příklad¶
Napište program, který se uživatele zeptá na celé číslo v desítkové soustavě a vypíše ho v binární, osmičkové a šestnáctkové soustavě
s = input("Zadej cele cislo")
x = int(s)
# x = int(input("Zadej cele cislo"))
print("binární: ", bin(x))
print("osmičková: ", oct(x))
print("šestnáctková:", hex(x))
binární: 0b101101 osmičková: 0o55 šestnáctková: 0x2d
Aritmetické operátory¶
S číselnými hodnotami můžeme provádět různé aritmetické operace. V Pythonu jsou k dispozici tyto aritmetické operátory:
| Operace | Výsledek |
|---|---|
x + y |
součet hodnot $x$ a $y$ |
x - y |
rozdíl hodnot $x$ a $y$ |
x * y |
součin hodnot $x$ a $y$ |
x / y |
podíl hodnot $x$ a $y$ |
x // y |
celočíselný podíl hodnot $x$ a $y$ |
x % y |
zbytek po celočíselném dělení hodnot $x$ a $y$ |
-x |
hodnota $-x$ |
+x |
hodnota $x$ |
x ** y |
$x^y$ ($x$ "na" $y$) |
Jak uvidíme na dalších cvičeních, některé z těchto operátorů lze použít i pro hodnoty nečíselných typů, kde ale mají jiný význam.
# příklad na unární plus
6 * +5
30
# příklad na unární minus
x = 67
6 * -x
-402
# výsledek použití operátoru / je vždy float
6 / 1
6.0
# chci-li int, použiju //
6 // 1
6
Příklad¶
Přesný čas
- Napište program, který zadaný čas ve vteřinách vypíše v hodinách, minutách a vteřinách. Případně i ve dnech a rocích.
- Napište program, který zadaný čas ve dnech, hodinách, minutách a vteřinách vypíše ve vteřinách.
# 125 vteřin .. 0 hodin, 2 minuty a 5 vteřin
# 3723 vteřin -> 1 h, 2 m 3 s ..... 3723 = 3600 + 120 + 3
# nejdrive vteriny -> minuty + zbyle vteriny
# // %
vteriny = int(input("Zadej čas ve vteřinách"))
print("Čas je", vteriny, "vteřin.")
cas je 3723 vteřin.
minuty = vteriny // 60
print(minuty)
zbyle_vteriny = vteriny - minuty * 60
print("Výsledek je", minuty, "minut a", zbyle_vteriny, "vteřin." )
62 Výsledek je 62 minut a 3 vteřin.
minuty = vteriny // 60
zbyle_vteriny = vteriny % 60
print("Výsledek je", minuty, "minut a", zbyle_vteriny, "vteřin." )
Výsledek je 62 minut a 3 vteřin.
minuty = vteriny // 60
zbyle_vteriny = vteriny % 60
hodiny = minuty // 60
zbyle_minuty = minuty % 60
print("Výsledek je", hodiny, "hodin,", zbyle_minuty, "minut a", zbyle_vteriny, "vterin." )
Výsledek je 1 hodin, 2 minut a 3 vterin.
# 125 vteřin .. 0 hodin, 2 minuty a 5 vteřin
celkem_vterin = int(input("Zadej počet vteřin"))
celkem_minut = celkem_vterin // 60
zbylych_vterin = celkem_vterin % 60
celkem_hodin = celkem_minut // 60
zbylych_minut = celkem_minut % 60
celkem_dnů = celkem_hodin // 24
zbylych_hodin = celkem_hodin % 24
# obdobně pro roky ... dělím 365
print("Výsledek je", celkem_dnů, "dnů", zbylych_hodin, "hodin", zbylych_minut, "minut a", zbylych_vterin, "vteřin.")
Výsledek je 1095 dnů 1 hodin 49 minut a 8 vteřin.
vteřin = int(input("Zadej počet vteřin"))
minut = int(input("Zadej počet minut"))
hodin = int(input("Zadej počet hodin"))
dnu = int(input("Zadej počet dnů"))
roku = int(input("Zadej počet roků"))
# typické řešení:
celkem = vteřin + 60*minut + 60*60*hodin + 60*60*24*dnu + 60*60*24*365*roku
print("Celkem", celkem, "vteřin.")
Celkem 94614548 vteřin.
Typ float¶
Typ float je datový typ pro reprezentaci "reálných" čísel.
Tyto hodnoty můžeme ve zdrojovém kódu zapsat pomocí běžného zápisu s desetinnou tečkou, např. 1.5, 2.0 nebo 2. (výraz 2. je ekvivalentní 2.0 a je různý od 2).
Stejně jako v případě celých čísel i pro hodnoty typu float můžeme používat oddělovač _, a to jak před desetinnou tečkou, tak i za ní:
x = 2.3
print(x, type(x))
2.3 <class 'float'>
x = .5
x
0.5
x = 5.
x
5.0
print(1_234.567_8) # libovolně mohu prokládat _
1234.5678
Kromě zápisu v klasickém tvaru s desetinnou tečkou můžeme pro zápis "reálných" čísel použít tzv. exponentový tvar, ve kterém použijeme písmeno e nebo E, za něž zapíšeme číslo oznamující, kolikátou mocninou deseti se má vynásobit číslo zadané vlevo od znaku e, resp. E.
Python tento tvar používá také v některých případech pro výpis:
# exponentový tvar: s e/E (číslo násobíme mocninami deseti)
print(123e-3)
print(123e3)
0.123 123000.0
# exponentový tvar bude i u výpisu:
print(123_456_789_0_123_456_789_0_123_456_789.)
print(1/10000000000)
1.2345678901234568e+28 1e-10
Všimněte si, že při výpisu posledního čísla Python nevypsal všechny číslice, které se vyskytují v zápisu čísla ve zdrojovém kódu. To ale neznamená, že s nimi program nepracuje. Při převodu desetinného čísla do dvojkové soustavy a uložení v paměti počítače sice může dojít k zaokrouhlení, ale k dalšímu zaokrouhlení s ještě menší přesností dochází při výpisu čísla v desítkové soustavě. Toto chování je kvůli pohodlí uživatele. Později si ukážeme, jak ovlivnit přesnost vypisovaných čísel.
S hodnotami typu float můžeme provádět všechny aritmetické operace stejně jako pro typ int, viz tabulka výše.
K zamyšlení a vyzkoušení: jak funguje celočíselné dělení pro necelá čísla?
430. / 10.
43.0
# zaokrouhlovací chyba:
4.3 / 0.1 #== 43
42.99999999999999
2.5 ** 2.5
9.882117688026186
print(432.1 // 10, 432.1 % 10)
43.0 2.1000000000000227
print(4.321 // 0.1, 4.321 % 0.1)
43.0 0.02099999999999949
print(123.4 // 10, 123.4 % 10)
12.0 3.4000000000000057
print(123.4 // 0.1, 123.4 % 0.1)
1233.0 0.09999999999999884
Číselné hodnoty můžeme v programu převádět z typu int na typ float a opačně.
Explicitní převod typu pro danou hodnotu vyvoláme, pokud int nebo float použijeme jako funkci:
print(int(1.5))
print(float(2))
1 2.0
# k převodu z int na float někdy dojde automaticky při aritmetických operacích:
4 / 4
1.0
5.0 + 6
11.0
x = 4
x * 1.
4.0
# k převodu mezi int a float mohu použít funkce `int` a `float`
float(4)
4.0
int(3.6) # zaokrouhlí vždy k 0
3
int(-3.6) # zaokrouhlí vždy k 0
-3
round(-3.6) # zaokrouhlí k nejbližšímu celému číslu
-4
float(True) # bool -> float
1.0
float("1.3") # str -> float
1.3
float('3.78e2') # str -> float
378.0
K převodu typu může dojít také implicitně, např. pokud sčítáme hodnotu typu int s hodnotou typu float, přičemž výsledek bude "většího" typu float.
Všimněte si, že funkce int zaokrouhluje vždy směrem dolů, tj. odsekne a zahodí desetinnou část daného čísla.
Pokud chceme zaokrouhlení směrem k nejbližšímu celému číslu, poslouží nám funkce round:
print(round(-1.5))
-2
Matematické funkce a konstanty¶
Kromě aritmetických operátorů je často potřeba při práci s číselnými hodnotami použít nějakou matematickou funkci.
Nejzákladnější funkce abs, min a max jsou v jazyku Python k dispozici přímo.
Poznamenejme, že funkce min a max mají dva nebo více číselných parametrů a funkce abs má jeden číselný parametr.
abs(-45.5)
45.5
min(10, 1.3, 1, 1.2, 2)
1
a = -1.4
b = 2.8
c = min(a, b)
d = max(a, b, c)
e = abs(d)
print(c, d, e)
-1.4 2.8 2.8
Další matematické funkce jako např. sqrt (odmocnina), sin nebo cos nejsou k dispozici přímo, ale v tzv. modulu.
Moduly jsou v jazyku Python ucelené části zdrojového kódu, které obsahují proměnné, funkce a další objekty.
V první řadě je potřeba říci, že Python poskytuje širokou standardní knihovnu složenou z mnoha modulů, které programátorům usnadňují život.
Jeden z takových modulů je modul math obsahující matematické funkce a konstanty.
Abychom obsah modulu zpřístupnili, musíme jej nejprve importovat pomocí příkazu import.
K objektům v modulu se potom dostaneme pomocí tečkové notace:
import math
math.cos(0)
1.0
math.pi
3.141592653589793
math.cos(math.pi)
-1.0
import math
print("Číslo π je přibližně", math.pi)
print("Hodnota cos(π) je ", math.cos(math.pi))
pi = 3.14
print("Číslo π je přibližně", pi)
print("Hodnota cos(π) je ", math.cos(pi))
Číslo π je přibližně 3.141592653589793 Hodnota cos(π) je -1.0 Číslo π je přibližně 3.14 Hodnota cos(π) je -0.9999987317275395
# jakmile provedu import, do restartu Kernelu mohu funkce a jiné objekty z modulu používat
print(math.exp(3))
20.085536923187668
math.e
2.718281828459045
Alternativním způsobem importování je zápis from math import ..., kde místo ... napíšeme seznam identifikátorů, které chceme importovat, oddělených čárkami.
Na rozdíl od předchozího způsobu pak nemusíme používat tečkovou notaci a importované objekty máme k dispozici přímo.
Předchozí příklad tedy můžeme přepsat následovně:
from math import pi, cos
print("Číslo π je přibližně", pi)
print("Hodnota cos(π) je ", cos(pi))
Číslo π je přibližně 3.141592653589793 Hodnota cos(π) je -1.0
pi = 3.14
print(pi)
from math import pi
print(pi)
pi = 3.14
print(pi)
3.14 3.141592653589793 3.14
cos = "ahoj"
print(cos)
from math import cos
print(cos)
print(cos(0))
cos = "ahoj"
print(cos)
ahoj <built-in function cos> 1.0 ahoj
Místo seznamu identifikátorů můžeme z modulu importovat vše pomocí příkazu from math import *.
To nám ušetří práci s psaním dlouhého seznamu názvů, ale na druhou stranu se tím zvýší pravděpodobnost kolize mezi názvy importovaných objektů a námi definovaných proměnných a funkcí.
from math import * # NEPOUŽÍVAT !!!!
print(pi, e, inf)
3.141592653589793 2.718281828459045 inf
K tématu modulů se během semestru ještě několikrát vrátíme. Naučíme se používat další funkce a třídy dostupné v modulech standardní knihovny a také se naučíme tvořit vlastní moduly pro přehlednější strukturování vlastního programu.
Příklady¶
- Napište program, který se uživatele zeptá na poloměr kruhu a vypíše jeho obvod a obsah.
import math
r = float(input("Zadejte poloměr kruhu: "))
o = 2 * math.pi * r
S = math.pi * r**2
print("Obvod kruhu je:", o)
print("Obsah kruhu je:", S)
Obvod kruhu je: 32.044245066615886 Obsah kruhu je: 81.71282491987051
- (Pythagorova věta) Napište program, který od uživatele zjistí délky dvou kratších stran pravoúhlého trojúhelníka a vypočítá délku jeho nejdelší strany.
a = float(input("Zadej stranu a"))
b = float(input("Zadej stranu b"))
c = (a ** 2 + b ** 2) ** (1 / 2)
print("Delka přepony je", c)
Delka přepony je 4.186884283091665
# alternativně: math.sqrt()
c = math.sqrt(a ** 2 + b ** 2)
print("Delka přepony je", c)
Delka přepony je 4.186884283091665
(-1) ** 0.5
(6.123233995736766e-17+1j)
math.sqrt(-1)
--------------------------------------------------------------------------- ValueError Traceback (most recent call last) Cell In[5], line 1 ----> 1 math.sqrt(-1) ValueError: expected a nonnegative input, got -1.0
- Napište program, který se uživatele zeptá na jeho hmotnost a pomocí průměrné hustoty lidského těla ($1000~kg/m^3$) spočítá jeho objem. Jaký by měl uživatel průměr, pokud by měl tvar koule?
# 1. objem
m = float(input("Zadej svou hmotnost v kg"))
V = m / 1000
print("Objem je", V, "m^3")
Objem je 0.06 m^3
# 2. průměr
import math
# koule: V = 4/3 Pi r^3
r = (3 / 4 * V / math.pi ) ** (1 / 3)
d = 2 * r
print("Průměr člověka-koule o objemu", V, "m^3 je", d, "m.")
Průměr člověka-koule o objemu 0.06 m^3 je 0.4857180126010562 m.
- Objemy a povrchy geometrických těles
- Napište program, který spočítá objem a povrch koule o průměru $d$, který zadá uživatel.
- Napište program, který spočítá objem a povrch čtyřbokého jehlanu se základnou o straně délky $a$ a výškou délky $v$.
- Napište program, který spočítá obvod a plochu pravidelného mnohoúhelníku o straně délky $a$.
# nedělali jsme společně
- Pravidelné mnohostěny Napište program, který spočítá objem a povrch pravidelného čtyřstěnu, krychle, pravidelného osmistěnu, pravidelného dvanáctistěnu a pravidelného dvacetistěnu.
- Šitý fotbalový míč Napište program, který spočítá délku švů na fotbalovém míči tvaru komolého dvacetistěnu o poloměru $r$.
Rozšíření nbgrader¶
V prostředí JupyterHub je nainstalované rozšíření nbgrader, které budeme používat pro zadávání a odevzdávání úkolů. Studentský pohled představuje nabídka Assignment List, kterou najdete v menu:

Po kliknutí se otevře nová záložka s nabídkou kurzů, ve kterých je přihlášený uživatel studentem. Dokud není zadaný žádný úkol, tento seznam je prázdný:

Také se objeví "no courses found", což však není chyba – znamená to, že zatím není zadaný žádný úkol.
Po zadání prvního úkolu se v nabídce objeví název kurzu s aktuálním rokem: zpro2026.
Po zveřejnění nového úkolu se objeví další položka v seznamu "Released assignments":

Kliknutím na tlačítko "Fetch" se stáhnou soubory pro daný úkol do vašeho domovského adresáře a objeví se příslušná položka v seznamu "Downloaded assignments":

Klikněte na název úkolu (viz červený rámeček výše) a poté na název souboru (o řádek níže, viz červený rámeček na dalším obrázku):

Tím se v nové záložce otevře Jupyter notebook se zadáním úkolu, který může vypadat např. takto:

V zadání je typicky několik buněk, které byste neměli měnit.
Buňka, ve které je potřeba vypracovat zadaný úkol, je označena komentářem YOUR CODE HERE.
V tomto ukázkovém příkladu je potřeba nahradit celý obsah buňky, v budoucích úkolech však může být předpřipravený kód, který je potřeba dokončit.
Při programování úkolu můžete využít tlačítko "Validate", kterým se spustí kontrola testů, které byly zveřejněny spolu s úkolem. Dále může úkol obsahovat skryté testy, které studenti nevidí, ale provedou se při kontrole úkolu vyučujícím.
Jakmile jste dostatečně spokojeni se svým řešením, zkontrolujte, že notebook s úkolem je uložený (stiskněte Ctrl+S).
Poté přejděte zpět na záložku "Assignments", pro jistotu znovu použijte tlačítko "Validate" a odevzdejte úkol pomocí tlačítka "Submit":

Po odevzdání se objeví nová položka v seznamu "Submitted assignments" s časem odevzdání a tlačítko "Fetch Feedback", které v této chvíli nemá žádný efekt:

Teprve po zkontrolování úkolu vyučujícím a zveřejnění hodnocení, což může trvat několik dní, tlačítko "Fetch Feedback" stáhne report s ohodnoceným úkolem. Kliknutím na odkaz "view feedback" se v průzkumníku souborů nalevo zobrazí HTML soubor, který můžete otevřít a podívat se na své hodnocení.


Report obsahuje bodové ohodnocení buněk na základě vykonání automatických testů a případně také osobní vyjádření vyučujícího. Také se vám zobrazí kód skrytých testů, v této ukázce jsou však zastřeny:

Poznámky a omezení¶
- Rozšíření nbgrader ve svém rozhraní neumožňuje studentům zobrazit deadline pro daný úkol. Datum tedy budeme ručně psát v textu samotného zadání.
- Systém umožňuje opakované odevzdání úkolu. Před oznámkováním a zveřejněním výsledků to můžete využívat, výsledný report pak bude odpovídat poslední odevzdané verzi. Po oznámkování a zveřejnění výsledků se již oprava úkolu nijak neprojeví.