Vybrané konstrukce jazyka

V zájmu osvěty jsme si představili na příkladech několik syntaktických konstrukcí, které nám mohou pomoci při psaní přehlednějšího kódu. Pro někoho možná opakování, pro jiné snad zdroj inspirace do budoucna.

Padlo také pár slov k řešení minulé domácí úlohy. Například proč není dobré používat na vstup neznámé velikosti omezený zásobník.

Binární vyhledávací stromy

Byla představena datová struktura vhodná pro reprezentaci množiny porovnatelných prvků zvaná binární vyhledávací strom (BVS). Pro jednoduchost výkladu byla zvolena varianta, která neumožňuje vkládání duplicitních hodnot. Probrali jsme:

  1. vyhledávání prvku X v BVS:
    1. - začínám v kořeni
    2. - v každém kroku porovnám X s hodnotou aktuálního uzlu a podle toho se rozhodnu jestli pokračovat vlevo nebo vpravo
    3. - končím pokud najdu X, nebo dojdu do listu (není kam dál pokračovat, a s jistotou vím, že X ve stromě není)
  2. vkládání prvku X:
    1. - zkusím X najít
    2. - když ve stromě je, můžu skončit (pokud jsou duplicitní prvky zakázány)
    3. - když tam není, vložím X místo listu, ve kterém jsem neúspěšně skončil vyhledávání

      Odebírání bude probráno pořádně na příštím cvičení.

      Následující obrázek zobrazuje příklad BVS použitý na cvičení s vyznačenými intervaly v listech.

      Příklad BVS

Generování prefixových výrazů

S cílem procvičit znovu rekurzi jsme řešili úlohu generování výrazů v prefixové notaci. Protože každý takový výraz odpovídá jednoznačně určenému binárnímu stromu s operacemi (+,-,*,/) v uzlech a čísly v listech, lze mluvit o stromech všude tam, kde mluvíme o prefixových výrazech.

Postupně jsme programovali generátor složitějších výrazů. Varianty generátoru byly následující (podle toho co mělo být generováno):

  1. 1. úplný binární strom - pouze se sčítáním 1 (kód)
  2. 2. úplný binární strom - v patrech se postupně střídají operátory
  3. 3. úplný binární strom - operátory jsou voleny náhodně
  4. 4. náhodně volené operátory, náhodně rozhodujeme o tom, jestli podstrom pokračuje operací, nebo pouze náhodně zvoleným číslem

Ve všech případech byla maximální hloubka omezena nějakou konstantou.

Pro generování náhodných čísel jsme použili funkci random(x:integer), která generuje náhodná čísla z intervalu [0,x). Na začátku programu je třeba zavolat proceduru randomize, jinak bude random generovat v každém běhu programu totéž.

Stromová patra

Byla zadána nová úloha do CodExu za 30 bodů. Jejím hlavním smyslem je procvičení práce s BVS - konkrétně vkládání prvků. Kdo si zvlášť naprogramuje funkci na vyhledávání prvků, má velkou šanci, že si tím ušetří práci do budoucna.