Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.
— | pitel:isz:datove_ridici_struktury [30. 12. 2022, 13.43:01] (aktuální) – vytvořeno - upraveno mimo DokuWiki 127.0.0.1 | ||
---|---|---|---|
Řádek 1: | Řádek 1: | ||
+ | ====== Datové a řídicí struktury ====== | ||
+ | ===== Datové struktury ===== | ||
+ | [[wp> | ||
+ | **Strukturovaný datový typ** sestává z komponent jiného (dříve definovaného) typu, kterému říkáme **kompoziční typ**. Pokud jsou všechny komponenty strukturovaného typu stejného kompozičního typu, říkáme, že strukturovaný typ je **homogenní**. Komponentám homogenního typu se někdy říká **položky** (//item//), zatím co komponentám heterogenního typu se říká **složky** (// | ||
+ | |||
+ | ==== Pole ==== | ||
+ | [[wp> | ||
+ | |||
+ | **Pole** (//array//) je homogenní ortogonální (pravoúhlý) datový typ. Jednorozměrnému poli říkáme **vektor**, dvojrozměrnému poli říkáme **matice**. Lze vytvářet pole s neomezenou vícerozměrnou hierarchickou strukturou. Prvek vektoru je zpřístupňován jedním, prvek matice dvojicí indexů. Indexem může být libovolný ordinální typ. Pro svou homogenitu říkáme prvkům pole také **položky**. Typ pole je specifikován **rozsahem svých dimenzí** (rozměrů) a komponentním typem. Pole, jehož jméno a velikost dimenzí je pevně dána deklarací a nemohou se měnit v průběhu programu, se nazývá **statické** (vs **dynamické**). Pokus o přístup k prvku pole, jehož index je mimo specifikovaný rozsah, způsobí chybu. | ||
+ | |||
+ | **Řetězec** (// | ||
+ | |||
+ | ==== Seznam ==== | ||
+ | [[wp> | ||
+ | |||
+ | Seznam je homogenní, lineární, dynamická struktura. | ||
+ | * Lineárnost znamená, že každý prvek struktury má právě jednoho předchůdce (predecessor) a jednoho následníka (successor). Výjimku tvoří první a poslední prvek. | ||
+ | * Prvkem seznamu může být libovolný jiný datový typ -- také strukturovaný. Např. seznam seznamů. | ||
+ | * Seznam může být prázdný. | ||
+ | * Přístup k prvnímu (okrajovému) prvku je přímý, přístup k ostatním prvkům seznamu je sekvenční ve směru průchodu. Seznam, který lze procházet jen jedním směrem se nazývá " | ||
+ | |||
+ | {{ http:// | ||
+ | |||
+ | {{ http:// | ||
+ | ==== Zásobník ==== | ||
+ | {{ http:// | ||
+ | [[wp> | ||
+ | |||
+ | Zásobník je homogenní, lineární, dynamická struktura. | ||
+ | |||
+ | Zásobníku se také říká struktura typu **LIFO** z anglického " | ||
+ | |||
+ | Základní operace jsou: | ||
+ | * **Push** -- přidání pvku na vrchol zásobníku | ||
+ | * **Pop** -- vyzvednutí pvku z vrchol zásobníku | ||
+ | ==== Fronta ==== | ||
+ | {{ http:// | ||
+ | [[wp> | ||
+ | |||
+ | Fronta je dynamická, homogenní a lineární struktura. | ||
+ | |||
+ | Někdy se jí říká struktura typu " | ||
+ | |||
+ | Operace: | ||
+ | * **Enqueue** -- zařazení prvku na konec fronty | ||
+ | * **Dequeue** -- vyzvednutí prvku ze začítku fronty | ||
+ | |||
+ | ==== Binární strom ==== | ||
+ | {{ http:// | ||
+ | [[wp> | ||
+ | |||
+ | Binární strom je buď prázdný, nebo sestává z jednoho uzlu zvaného kořen a dvou podstromů -- levého a pravého. Oba podstromy mají vlastnosti stromu. | ||
+ | |||
+ | Binární strom je váhově vyvážený (weight balanced), když pro všechny jeho uzly platí, že počty uzlů jejich levého podstromu a pravého podstromu se rovnají, nebo se liší právě o 1. | ||
+ | |||
+ | Stromu, počet jehož uzlů je 2< | ||
+ | |||
+ | Binární strom je výškově vyvážený (height balanced) , když pro jeho všechny uzly platí, že výška levého podstromu se rovná výšce pravého podstromu, nebo se liší právě o 1. | ||
+ | |||
+ | === Průchody stromem === | ||
+ | [[wp> | ||
+ | |||
+ | Existují 3 způsoby průchodů: Preorder, Inorder a Postorder. Předpony pre, in a post určují kdy přijde na řadu kořenový uzel. Dále vždy projdeme nejdříve levý podstrom a poté pravý. Inverzní varianty průchodů obrací pouze pořadí větví. | ||
+ | ===== Řídicí struktury ===== | ||
+ | ==== Funkce ==== | ||
+ | [[wp> | ||
+ | <code c>int soucet(int x, int y); | ||
+ | |||
+ | int soucet(int x, int y) { | ||
+ | return x + y; | ||
+ | } | ||
+ | |||
+ | printf(" | ||
+ | </ | ||
+ | |||
+ | Funkce umožňují rozložit složitější problémy na jednodušší podproblémy. | ||
+ | |||
+ | **Deklarace** funkce (někdy také prototyp, v ukázce na začátku) se skládá z návratového typu, názvy funkce a seznamu parametrů. Ve většině případů ji lze vynechat, a použít rovnou definici. | ||
+ | |||
+ | **Definice** funkce rozšiřuje deklaraci o blok těla funkce. | ||
+ | |||
+ | Tělo funkce by mělo obsahovat příkaz '' | ||
+ | |||
+ | Funkce se volá jejím názvem a zadanými prarametry. | ||
+ | ==== Složený příkaz (blok) ==== | ||
+ | Složený příkaz je posloupnost libovolných příkazů (včetně dalších složených). Většinou se syntakticky odlišuje, například '' | ||
+ | |||
+ | ==== Výraz – příkaz ==== | ||
+ | Výrazem je nejen aritmetický výraz, prostý výskyt konstanty (literálu) či proměnné, ale i funkční volání a přiřazení. Jestliže výraz ukončíme symbolem ; (středník), | ||
+ | |||
+ | Zvláštním případem je prázdný příkaz. | ||
+ | ==== Podmíněný příkaz ==== | ||
+ | [[wp> | ||
+ | <code c>if (/ | ||
+ | / | ||
+ | } | ||
+ | |||
+ | if (/ | ||
+ | / | ||
+ | } else { | ||
+ | / | ||
+ | } | ||
+ | |||
+ | switch (/ | ||
+ | case /*stav*/: | ||
+ | / | ||
+ | break; | ||
+ | case /*stav*/: | ||
+ | / | ||
+ | break; | ||
+ | /*...*/ | ||
+ | default: | ||
+ | / | ||
+ | }</ | ||
+ | |||
+ | **'' | ||
+ | |||
+ | Složené závorky nejsou nutné, pokud se provede pouze jeden příkaz, společně s odsazením ale zvyšují přehlednost kódu a usnadňují doplnění dalšího kódu. | ||
+ | |||
+ | **'' | ||
+ | |||
+ | Podmíněné příkazy je samozřejmě možné do sebe zanořovat. | ||
+ | |||
+ | ==== Cykly ==== | ||
+ | Slouží k několikanásobnému opakování stejného bloku kódu. | ||
+ | |||
+ | Cykly je možné přerušit dvěma způsoby: | ||
+ | * **'' | ||
+ | * **'' | ||
+ | |||
+ | === while === | ||
+ | [[wp> | ||
+ | <code c>while (/ | ||
+ | / | ||
+ | } | ||
+ | |||
+ | do { | ||
+ | / | ||
+ | } while (/ | ||
+ | |||
+ | **'' | ||
+ | |||
+ | === for === | ||
+ | [[wp>For loop]] | ||
+ | <code c>for (/ | ||
+ | / | ||
+ | }</ | ||
+ | |||
+ | Tělo smyčky se provede tolikrát, dokud platí test podmínky. V těle je možné použít proměnnou inicializovanou v hlavičce smyčky. |