Maturitní otázka č. 1
1. Programování – Datové typy a pole
Proměnné a jejich vznik
Proměnná v programování slouží jako symbolické jméno pro určité místo v operační paměti (RAM) počítače, kam si program ukládá data potřebná pro svůj běh (například jméno uživatele, mezivýsledky výpočtů nebo stavy prvků ve hře). Během vykonávání programu se hodnota uložená v proměnné může měnit.
Způsob vzniku proměnné závisí na konkrétním programovacím jazyku:
- Deklarací: V silně (staticky) typovaných jazycích jako C, C++ nebo Java musí programátor nejprve oznámit, jakého typu proměnná bude a jak se bude jmenovat (např. "int cislo;"). Tím se v paměti vyhradí potřebné místo. Následně (nebo rovnou s deklarací) proběhne inicializace, tedy první přiřazení hodnoty (např. "cislo = 5;").
- Inicializací (přiřazením): V dynamicky typovaných jazycích jako Python nebo JavaScript proměnná vzniká automaticky v momentě, kdy je jí poprvé přiřazena nějaká hodnota (např. "cislo = 5"). Typ proměnné se určí dynamicky podle přiřazené hodnoty samotné.
Datové typy
Datový typ určuje charakter uložených dat – říká počítači, kolik paměti má pro proměnnou vyhradit a jaké operace s ní lze logicky provádět (např. čísla můžeme sčítat, texty můžeme spojovat).
Základní datové typy se mezi sebou liší reprezentací v paměti a účelem. Zde jsou ty nejběžnější:
- Celá čísla (Integer / int): Slouží k uchování celočíselných hodnot (např. -5, 0, 42). Typicky zabírají 4 bajty (32 bitů). Používají se pro matematické operace bez desetinné části a jako počítadla v cyklech nebo indexy polí.
- Reálná čísla (Float / Double): Ukládají čísla s plovoucí desetinnou čárkou (např. 3.14). Typ double nabízí dvojnásobnou přesnost oproti float. Používají se pro přesnější matematické, fyzikální a finanční výpočty.
- Logické hodnoty (Boolean / bool): Nabývají pouze dvou stavů: True (Pravda, často reprezentováno jako 1) nebo False (Nepravda, reprezentováno jako 0). Jsou klíčové pro řídící struktury, typicky podmínky a cykly.
- Znaky (Character / char): Obsahují vždy jen jeden konkrétní znak (písmeno, číslici, symbol), např. 'a', 'Z', '?'. K jejich zakódování se využívá ASCII tabulka nebo Unicode.
- Textové řetězce (String): Slouží pro uchování celých textů (slov, vět). Technicky jde často o jednorozměrné pole znaků (v jazyce C), v moderních jazycích jde o samostatný komplexní typ vybavený mnoha metodami.
Pole a příbuzné datové struktury
Pole (Array) je strukturovaný datový typ, který umožňuje do jedné proměnné uložit více hodnot stejného datového typu. Lze si ho představit jako přihrádky v řadě vedle sebe, kde má každá přihrádka své pořadové číslo – takzvaný index. Většina moderních programovacích jazyků (C, Java, Python) čísluje (indexuje) pole od nuly. Pole se používají všude tam, kde potřebujeme hromadně zpracovávat stovky souvisejících hodnot (např. seznam známek žáků) bez nutnosti vytvářet stovky individuálních proměnných.
Souvislost s n-ticemi, množinami a slovníky
Zatímco pole je většinou homogenní a měnitelné, moderní jazyky nabízejí další specializované struktury:
- N-tice (Tuples): Velmi podobné polím, ale jsou neměnné (immutable). Jakmile je vytvoříme, nelze do nich přidávat prvky ani je měnit. Slouží k bezpečnému uložení a přenosu pevných dat.
- Množiny (Sets): Neuspořádané kolekce prvků, které na rozdíl od pole nesmí obsahovat duplicity. Nelze z nich vybírat prvky pomocí indexu. Jsou vysoce optimalizované na hledání průniků a sjednocení.
- Slovníky (Dictionaries / Maps): Nepřistupujeme v nich k prvkům přes číselný index, ale pomocí unikátního "klíče" (např. slova). Je to párová datová struktura typu klíč-hodnota (např. klíč "jablko", hodnota "apple").
Třídění polí a souvislost s cykly
Zpracování polí je úzce spjato s cykly (nejčastěji cyklem "for"). Pomocí cyklu můžeme efektivně projít pole od prvního do posledního prvku a provést nad nimi operaci. Pokud chceme pole seřadit od nejmenšího po největší číslo, používáme třídicí algoritmy. Mezi nejjednodušší patří Bubble Sort (porovnávání sousedních prvků ve vnořených cyklech a jejich prohazování), mezi pokročilejší a rychlejší patří Quick Sort nebo Merge Sort.
Analýza sekvence příkazů
Sekvence v C-like jazycích:
int a,b,c; a=b=c=0; if (++b) a+=b; c=b++; a*=c;
Výsledek: a = 1, b = 2, c = 1 Vysvětlení krokování: 1. Všechny tři proměnné a, b, c se nastaví na nulu. 2. V podmínce if (++b) se aplikuje tzv. pre-inkrement. Hodnota b se nejprve zvýší o 1 (tedy b = 1) a vyhodnotí se podmínka. Jelikož je 1 pravda, blok if se provede. 3. Provede se a += b (tedy a = 0 + 1). Proměnná a je nyní 1. 4. Následuje c = b++. Zde jde o post-inkrement. Do proměnné c se přiřadí aktuální hodnota b (což je 1). Až POTÉ se hodnota b zvýší na 2. 5. Nakonec a *= c (tedy a = 1 * 1). Proměnná a zůstává 1.
Sekvence v Pythonu:
a=b=c=0 if (b+1): a=a+b c=b+1 a=a*c
Výsledek: a = 0, b = 0, c = 1 Vysvětlení krokování: 1. Proměnné a, b, c se nastaví na nulu. 2. Vyhodnocuje se podmínka if (b+1): Zde se samotné b nemění, pouze se sečte 0 + 1. Výsledek 1 je v Pythonu vyhodnocen jako True. 3. Provede se a = a + b (tedy a = 0 + 0). Proměnná a zůstává 0. 4. Provede se c = b + 1 (tedy c = 0 + 1). Proměnná c je nyní 1. 5. Nakonec a = a * c (tedy a = 0 * 1). Proměnná a zůstává 0.
Program pro výpis proměnných
Zde je implementace programu z bodu 3 v jazyce Python:
# Inicializace proměnných
a = b = c = 0
# Sekvence příkazů
if (b + 1):
a = a + b
c = b + 1
a = a * c
# Výpis výsledků na obrazovku
print("Výsledné hodnoty:")
print(f"a = {a}")
print(f"b = {b}")
print(f"c = {c}")
Tento kód jednoduše deklaruje proměnné na stejném řádku s nulovými hodnotami, následně provede požadované matematické a logické operace a na závěr naformátuje a vypíše na obrazovku konečné výsledky pro ověření (a=0, b=0, c=1).