10. Rozum do hrsti

Táto kapitola obsahuje niekoľko neriešených úloh resp. námetov pre samostatnú prácu. Každá z úloh vyžaduje použitie niektorej z dynamických údajových štruktúr, o ktorých sme hovorili v predchádzajúcich kapitolách. V prípade problémov či nejasností, odporúčam vrátiť sa k príslušnej kapitole resp. požiadať o radu skúsenejšieho kolegu - programátora alebo svojho učiteľa programovania. Určite sa poteší :-)

Veľa úspechov!


  Množiny sú reprezentované jednosmernými lineárnymi zoznamami svojich prvkov (každý prvok množiny je v zozname uložený práve raz, prvkami množiny sú celé čísla). Napíšte program, ktorý umožní zrealizovať operácie zjednotenia a prieniku dvoch množín.

Napr. pre dva vstupné zoznamy, z ktorých jeden obsahuje (v ľubovoľnom poradí) prvky 1, 3, 5, 6, 8 a druhý 2, 3, 4, 5, 6 bude v prípade zjednotenia výsledný zoznam obsahovať prvky (opäť v ľubovoľnom poradí) prvky 1, 2, 3, 4, 5, 6, 8 a v prípade prieniku zase prvky 3, 5, 6.

Vyriešte úlohu aj pre prípad, keď sú množiny reprezentované usporiadaným lineárnym zoznamom svojich prvkov.


  Vytvorte program kontrolujúci správnosť uzátvorkovania výrazu s využitím zásobníka. Vstupom programu nech je výraz - postupnosť znakov, ktorá môže obsahovať písmená anglickej abecedy, matematické operátory +, -, /, * a samozrejme zátvorky ( , ).


  Vytvorte program, ktorý vypočíta hodnotu xn pre veľké prirodzené číslo x.


  Vytvorte program na výpočet členov Fibonacciho postupnosti pomocou posuvného registra.

Fibonacciho postupnosť: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144,...

Rekurentný vzťah: F0 = 0,  F1 = 1,  Fi = Fi-1 + Fi-2   pre i >= 2


  Sú dané dva usporiadané zoznamy celých čísel. Napíšte program, ktorý z nich vytvorí jeden usporiadaný zoznam tak, že preradí číslo z konca prvého zoznamu na správne miesto do druhého zoznamu. Postup sa opakuje, až kým nevznikne jeden usporiadaný zoznam. Nie je možné použiť funkcie malloc ani free, výsledok musíte dosiahnuť len zmenami ukazovateľov v uzloch!


  Vytvorte program, ktorý bude simulovať pohyb guľôčky po "rulete". Zo súboru načítajte poradie políčok na rulete - pre každé políčko číslo a farbu (červená, čierna). Gulička môže byť na ruletu hodená ľubovoľným smerom, zastaví sa náhodne na niektorom políčku. Využite cyklický obojsmerný lineárny zoznam.

Vyriešte aj pre prípad, keď sú na rulete dve rôzne guličky pohybujúce sa opačnými smermi - keď sa stretnú, odrazia sa od seba a pokračujú v pohybe opačnými smermi ako pred nárazom.


  Implementujte zásobník a front ako jednorozmerné pole. Napíšte potrebné funkcie realizujúce jednotlivé operácie, ošetrite všetky "kritické" situácie - ako preplnenie zásobníka (frontu), snaha vybrať prvok z prázdneho zásobnika (frontu).


  Vytvorte program, ktorý umožní simulovať priebeh tenisového turnaja. Na vstupe prečítajte počet kôl. Vytvorte "turnajového pavúka" - úplný binárny strom potrebnej výšky a do listov uložte mená hráčov. V každom kole sa s dvojice hráčov na najnižšej úrovni stromu náhodne určí víťaz, ktorý postúpi do ďalšieho kola (v strome o úroveň vyššie). Po prebehnutí každého kola sa najnižšia úroveň stromu zruší. Zobrazujte priebeh turnaja na obrazovke tak, aby bolo možné sledovať, kto s kým hral a na konci oznámte meno víťaza celého turnaja.

Ak má turnaj 3 kolá - štvrťfinále, semifinále a finále - znamená to, že sa ho zúčastňuje 23 = 8 kráčov.


  Napíšte program, ktorý bude analyzovať vstupný textový súbor. Vstupný súbor sa bude čítať po slovách (slovo chápeme ako postupnosť znakov pred a za ktorou je medzera alebo znak konca riadku) a prečítané slová sa budú ukladať do binárneho vyhľadávacieho stromu (tzv. lexikografický strom). Ak sa prečítané slovo nachádza v strome, zvýšime počet jeho výskytov, ak sa v strome zatiaľ nenachádza, pridáme ho na správne miesto. Na obrazovku sa vypíše tabuľka výskytov jednotlivých slov. Na požiadanie program zistí, či sa hľadané slovo nachádzalo v súbore.


  Napíšte funkciu, ktorá zabezpečí zobrazenie binárneho stromu na obrazovke v prehľadnej podobe (hodnoty vrcholov budú vhodne odsadené zľava podľa úrovní).