programátorský manuál

Podobné dokumenty
ALGORITMIZACE A PROGRAMOVÁNÍ

Programování v C++, 2. cvičení

Příklad : String txt1 = new String( Ahoj vsichni! ); //vytvoří instanci třídy String a přiřadí ji vnitřní hodnotu Ahoj vsichni!

Vyučovací hodina. 1vyučovací hodina: 2vyučovací hodiny: Opakování z minulé hodiny. Procvičení nové látky

Universita Pardubice Fakulta elektrotechniky a informatiky. Mikroprocesorová technika. Semestrální práce

Popis rozšířujících funkcí JScriptu

Popis funkcí exportovaných z knihovny nddbe.dll

VISUAL BASIC. Práce se soubory

2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus pro vyhledání položky v binárním stromu.

Přednáška 8. Proměnné. Psaní a ladění skriptů. Parametry skriptu. Vstup a výstup. Konfigurační soubory shellu. Úvod do Operačních Systémů Přednáška 8

Programování v jazyce C a C++

Čtvrtek 3. listopadu. Makra v Excelu. Obecná definice makra: Spouštění makra: Druhy maker, způsoby tvorby a jejich ukládání

Maturitní otázky z předmětu PROGRAMOVÁNÍ

Semestrální práce 2 znakový strom

Konvertor diakritiky 3. Instalace

Čtvrtek 8. prosince. Pascal - opakování základů. Struktura programu:

DUM 06 téma: Tvorba makra pomocí VBA

Manuál. Omluvenky online

DSL manuál. Ing. Jan Hranáč. 27. října V této kapitole je stručný průvodce k tvorbě v systému DrdSim a (v

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu

Celostátní kolo soutěže Mladý programátor 2016, kategorie C

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

63. ročník Matematické olympiády 2013/2014

Popis programu EnicomD

- znakové konstanty v apostrofech, např. a, +, (znak mezera) - proměnná zabírá 1 byte, obsahuje kód příslušného znaku

Microsoft. Word. Hromadná korespondence. Mgr. Jan Veverka Střední odborná škola sociální Evangelická akademie

Název předmětu: Školní rok: Forma studia: Studijní obory: Ročník: Semestr: Typ předmětu: Rozsah a zakončení předmětu:

Opravy a prodej. Uživatelská příručka. Milan Hradecký.

Abstraktní datové typy FRONTA

Inovace a zkvalitnění výuky prostřednictvím ICT Základy programování a algoritmizace úloh Typové a netypové soubory

Programovací jazyk Pascal

Standardní algoritmy vyhledávací.

Aplikace BSMS. Uživatelská příručka - 1 -

PROGRAMOVÁNÍ MIKROPOČÍTAČŮ CVIČENÍ 7

Internetový přístup do databáze FADN CZ - uživatelská příručka Modul FADN RESEARCH / DATA

2. úkol MI-PAA. Jan Jůna (junajan)

Pole a kolekce. v C#, Javě a C++

Úvod do programování. Lekce 1

27 Evidence kasiček. Popis modulu. Záložka Organizované sbírky

MAXScript výukový kurz

Kreslící program. V této lekci se naučíš vytvořit si vlastní kreslící program! Následujte postupně tyto INSTRUKCE

Internetový přístup do databáze FADN CZ - uživatelská příručka Modul FADN BASIC

PODPROGRAMY PROCEDURY A FUNKCE

[APLIKACE PRO PŘEHRÁVÁNÍ VIDEA - PROJEKT MIAMI - SERVEROVÁ ČÁST]

Reranking založený na metadatech

Inovace a zkvalitnění výuky prostřednictvím ICT Základy programování a algoritmizace úloh Jednoduché příkazy jazyka Pascal

Datové typy a struktury

Android Elizabeth. Verze: 1.1

Základy programování. Úloha: Eratosthenovo síto. Autor: Josef Hrabal Číslo: HRA0031 Datum: Předmět: ZAP

Prohlížení a editace externích předmětů

Program pro tvorbu technických výpočtů. VIKLAN - Výpočty. Uživatelská příručka. pro seznámení se základními možnostmi programu. Ing.

Tento studijní blok má za cíl pokračovat v základních prvcích jazyka Java. Konkrétně bude věnována pozornost rozhraním a výjimkám.

Test prvočíselnosti. Úkol: otestovat dané číslo N, zda je prvočíslem

C2110 Operační systém UNIX a základy programování

Operační systémy 2: Zápočtové úkoly

Implementace LL(1) překladů

2.1 Podmínka typu case Cykly Cyklus s podmínkou na začátku Cyklus s podmínkou na konci... 5

Sada 1 - Základy programování

Úvodem... 9 Kapitola 1 Karetních

Střední odborná škola a Střední odborné učiliště, Hořovice

Lekce 01 Úvod do algoritmizace

NPRG030 Programování I, 2017/18 1 / :22:16

Sada 1 - Základy programování

Spojové struktury. Spojová struktura (linked structure):

Odstranění řádků (na základě hodnoty)

Řídicí příkazy KAPITOLA 3. Vstup znaků z klávesnice

C# konzole Podíl dvou čísel, podmínka IF

7. Datové typy v Javě

DSA, První krok: máme dokázat, že pro left = right vrátí volání f(array, elem, left, right)

Iterační výpočty. Dokumentace k projektu č. 2 do IZP. 24. listopadu 2004

1.1 Struktura programu v Pascalu Vstup a výstup Operátory a některé matematické funkce 5

Pascal. Katedra aplikované kybernetiky. Ing. Miroslav Vavroušek. Verze 7

Úvod do programování 6. hodina

3. ANTAGONISTICKÉ HRY

Programování v C++ 3, 3. cvičení

Druhá skupina zadání projektů do předmětu Algoritmy II, letní semestr 2014/2015

Grantové projekty. V současné době jsou zpracovány tyto části:

Programování v jazyce JavaScript

02. HODINA. 2.1 Typy souborů a objektů. 2.2 Ovládací prvky Label a TextBox

Knihovna XmlLib TXV druhé vydání říjen 2012 změny vyhrazeny

17. července :51 z moravec@yahoo.com

Databáze prodejců. Tlačítka. Vytvoří kartu nového prodejce (Alt+N); Změní vybraného prodejce Uloží nového prodejce nebo změnu (Alt+U);

1. ESO9 MAJETEK ZÁKLADNÍ VLASTNOSTI DOPORUČENÝ HW... 3

Správa paměti. Karel Richta a kol. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Karel Richta, 2016

Sekvenční a podmíněné provádění

Práce se soubory. Úvod do programování 2 Tomáš Kühr

Programování v jazyce JavaScript

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu

Skripta ke školení. Základy VBA. vypracoval: Tomáš Herout. tel:

Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague

Lineární spojový seznam (úvod do dynamických datových struktur)

Binární soubory (datové, typované)

6. Příkazy a řídící struktury v Javě

VY_32_INOVACE_08_2_04_PR

Sada 1 - PHP. 03. Proměnné, konstanty

Programujeme v softwaru Statistica

Uživatelské příkazy: false - dialog ukončen IDCANCEL. Vytvoří nové okno. title - titulek okna

Test z programování v jazyce VBA v rámci předmětu Počítače II Vzorová zadání a vypracování

Transkript:

programátorský manuál Marek Polák 1. ročník, studijní skupina 41 zimní semestr 2012/2013 Programování I NPRG030

1. Úvod Vítejte v programátorském manuálu k programu Hádej zvíře. Tento manuál by Vám měl pomoci pochopit, jak program Hádej zvíře funguje, jaké algoritmy používá, a jak by se případně dal modifikovat. 2. Stručná specifikace Program Hádej zvíře je napsán v programovacím jazyce Pascal ve vývojovém prostředí Lazarus 1.0.4. Program Hádej zvíře je vlastně drobná hříčka. Databáze programu obsahuje několik otázek, zvířat a odpovědí na tyto otázky. Program vyzve uživatele, aby si myslel libovolné zvíře, a poté se jej snaží uhodnout položením co nejmenšího počtu otázek ze své databáze. Pokud uhodne, oznámí své vítězství a zeptá se, zda chce uživatel pokračovat ve hře. Jestliže program z nějakého důvodu zvíře neuhodne, požádá uživatele, zda by mu nesdělil, o jaké zvíře šlo, a v případě, že ho ještě neměl ve své databázi, ho do ní přidá. Pokud dojde k nerozlišitelnosti dvou zvířat, požádá uživatele o zadání nové otázky, kterou též přidá do své databáze. Podrobněji je fungování programu popsáno v uživatelském manuálu. 3. Kód programu Veškerý kód programu a soubory vývojového prostředí Lazarus se nachází v podsložce code. V případě, že programátorský manuál neposkytne dostatečné informace, je možné se orientovat podle poznámek přímo v kódu programu. 3.I Soubory Program využívá dva binární soubory, otazky.dat a zvire.dat, uložené ve stejném adresáři, jako spustitelný soubor. otazky.dat je soubor záznamů typu otazkasoubor (viz níže), slouží k uložení znění jednotlivých otázek a jejich pořadových čísel (bylo by možné i nahradit pořadová čísla pozicí otázky v souboru, čímž by se ušetřilo místo v souboru) zvire.dat je soubor záznamů typu zviresoubor (viz níže), slouží k uložení jmen jednotlivých zvířat a polí trojic (viz níže), která obsahují odpovědi na všechny otázky pro konkrétní zvíře, v indexu podle pořadového čísla otázky. Program si bohužel zatím neumí sám vytvořit soubory otazky.dat a zvire.dat, a neumí ani detekovat jejich nepřítomnost, což by se v budoucnu mělo změnit. V případě, že tyto soubory nebudou v adresáři se spustitelným souborem, bude nyní program hlásit běhové chyby. 2

3.II Globální konstanty, typy a proměnné konstanta max Číselná konstanta vyjadřující maximální možný počet otázek a odpovědí u každého zvířete, v základu nastavená na 1000. Bylo by možné ji i zvýšit, ale musel by se vytvořit nový soubor zvire.dat s delšími poli trojic. typ trojice Typ funguje jako rozšířený boolean, slouží k uložení informace ano, ne nebo nevim. To je důležité např. pro uložení odpovědi na otázku, která ještě nebyla položena, klasický boolean by toto nebyl schopen reprezentovat. typ poletrojic Typ je pole o max položkách obsahujících typ trojice. Slouží k ukládání odpovědí na jednotlivé otázky, ať už u každého zvířete v souboru zvire.dat, nebo v průběhu hádání na ukládání průběžných odpovědí. typ zvireseznam a zviresoubor Typy jsou záznamy sloužící k uložení jmen zvířat a odpovědí na jednotlivé otázky. Obsahují řetězec jmenozvirete pro uložení jména zvířete, o maximální délce 20 znaků (kvůli uložení v binárním souboru), a pole odpovedi typu poletrojic, pro uložení odpovědí na otázky. Typ zvireseznam navíc obsahuje ukazatel dalsi na další zvireseznam. To proto, že zvireseznam slouží k uchovávání zvířat v lineárním spojovém seznamu (dále LSS), zatímco zviresoubor k uchovávání v binárním souboru (kde by ukazatele byly bezúčelné). typ otazkaseznam a otazkasoubor Typy jsou záznamy sloužící k uložení znění otázky a pořadového čísla této otázky. Obsahují řetězec textotazky pro uložení znění, o maximální délce 250 znaků (kvůli uložení v binárním souboru), a integer poradiotazky pro uložení pořadového čísla otázky. Typ otazkaseznam navíc obsahuje ukazatel dalsi na další otazkaseznam. To proto, že otazkaseznam slouží k uchovávání otázek v LSS, zatímco otazkasoubor k uchovávání v binárním souboru (kde by ukazatele byly bezúčelné). proměnná seznamzvirat Proměnná je ukazatel na zvireseznam. Funguje ve vlastním těle programu jako ukazatel na začátek LSS všech zvířat. Je předávána dalším funkcím a procedurám. proměnná seznamotazek Proměnná je ukazatel na otazkaseznam. Funguje ve vlastním těle programu jako ukazatel na začátek LSS všech otázek. Je předávána dalším funkcím a procedurám. proměnná pocetotazek Proměnná je integer udávající celkový počet otázek v databázi. Slouží k tomu, aby program případně nekontroloval odpovědi v poletrojic, které ve skutečnosti zatím neodpovídají žádné otázce. Proměnná pocetotazek je nastavena vždy při zavolání funkce NactiOtazky (viz níže), může být zvýšena o 1 procedurou PridejOtazku (viz níže). 3

3.III Funkce a procedury funkce LowCase Jednoduchá funkce, která parametrem dostane řetězec a vrátí ten samý řetězec, napsaný pouze malými písmeny. Funkce je volána pouze procedurou ProhralJsem, nevolá žádnou jinou funkci ani proceduru. procedura Napis Procedura parametrem dostane řetězec, na standardním výstupu přeskočí řádek, napíše >> a přijatý řetězec. Procedura je volána procedurami VypisDatabazi, Vyuka, Privitej, PridejOtazku, VyhralJsem, ProhralJsem, ZkusHadat a ZeptejSe, sama nevolá žádnou jinou funkci ani proceduru. funkce Precti Funkce na standardním výstupu přeskočí řádek, napíše << a poté ze standardního vstupu přečte řetězec, který vrátí. Funkce je volána procedurami Vyuka, Privitej, PridejOtazku, VyhralJsem, ProhralJsem, ZkusHadat a ZeptejSe, sama nevolá žádnou jinou funkci ani proceduru. funkce Interpretuj Funkce parametrem dostane řetězec, který se podle výskytu klíčových slov pokusí interpretovat jako typ trojice (ano, ne nebo nevím). Tuto hodnotu vrátí. Chování funkce je přesněji popsáno v uživatelském manuálu. Funkce je volána procedurami Vyuka, Privitej, PridejOtazku, VyhralJsem, ProhralJsem, ZkusHadat a ZeptejSe, sama nevolá žádnou jinou funkci ani proceduru. funkce StandardizujOtazku Funkce parametrem dostane řetězec, načež vrátí ten samý řetězec s prvním písmenem velkým a zakončený otazníkem (pokud tak nevypadal už předtím). Funkce je volána pouze procedurou PridejOtazku, sama nevolá žádnou jinou funkci ani proceduru. procedura SmazSeznamOtazek Procedura parametrem dostane ukazatel na záznam typu otazkaseznam, načež smaže celý LSS počínaje tímto záznamem. Procedura je volána procedurami VypisDatabazi, Vyuka, PridejOtazku a PtejSe, sama nevolá žádnou jinou funkci ani proceduru. procedura SmazSeznamZvirat Procedura parametrem dostane ukazatel na záznam typu zvireseznam, načež smaže celý LSS počínaje tímto záznamem. Procedura je volána procedurami VypisDatabazi, Vyuka, PridejZvire, ProhralJsem a ZkusHadat, sama nevolá žádnou jinou funkci ani proceduru. funkce NactiOtazky Funkce parametrem dostane globální proměnnou pocetotazek (pravděpodobně neinicializovanou), načež přiřadí soubor otazky.dat proměnné souborotazek a nastaví proměnnou pocetotazek podle počtu záznamů v tomto souboru. Poté všechny záznamy typu otazkasoubor z tohoto souboru postupně uloží do pomocného souboru pomocnyotazkasoubor typu otazkasoubor, ze kterého je přeuloží do typu otazkaseznam (tzn. přibude položka ukazatel na další záznam), načež je zapojí na konec LSS, který vytvoří. Návratová hodnota funkce je ukazatel na začátek tohoto LSS. Funkce je volána procedurami VypisDatabazi, Vyuka, PridejOtazku 4

a také ve vlastním těle programu, sama nevolá žádnou jinou funkci ani proceduru. funkce NactiZvirata - Funkce přiřadí soubor zvire.dat proměnné souborzvirat. Poté všechny záznamy typu zviresoubor z tohoto souboru postupně uloží do pomocného souboru pomocnyzviresoubor typu zviresoubor, ze kterého je přeuloží do typu zvireseznam (tzn. přibude položka ukazatel na další záznam). Řetězec jmenozvirete přeuloží nezměněný, pole odpovedi typu poletrojic přeuloží pouze do indexu pocetotazek, všechny vyšší indexy nastaví na nevím (odpovídají totiž zatím neexistujícím otázkám). Nakonec zapojí tento záznam typu zvireseznam na konec LSS, který vytvoří. Návratová hodnota funkce je ukazatel na začátek tohoto LSS. Funkce je volána procedurami VypisDatabazi, Vyuka, PridejZvire, ProhralJsem a také ve vlastním těle programu, sama nevolá žádnou jinou funkci ani proceduru. procedura UlozZvirata Procedura parametrem dostane ukazatel na záznam typu zvireseznam, načež přiřadí soubor zvire.dat proměnné souborzvirat a vymaže jeho obsah. Poté všechny záznamy typu zvireseznam z LSS počínaje ukazatelem přeuloží do typu zviresoubor (tzn. ukazatel na další prvek je zahozen), načež je zapíše do souboru zvire.dat. Procedura je volána procedurami Vyuka, DoplnZvire a PridejZvire, sama nevolá žádnou jinou funkci ani proceduru. procedura VypisDatabazi Procedura pomocí funkcí NactiOtazky a NactiZvirata načte veškerá data ze souborů otazky.dat a zvire.dat do dvou LSS. Poté po jednom projde všechny záznamy typu zvireseznam z LSS, pro každý po jednom projde všechny záznamy typu otazkaseznam z LSS a vypíše na standardní výstup vždy na jeden řádek řetězec jmenozvirete záznamu zvireseznam, řetězec textotazky záznamu otazkaseznam a obsah pole odpovedi záznamu zvireseznam z indexu odpovídajícímu integeru poradiotazky záznamu OtazkaSeznam. Po vypsání všech záznamů procedura pomocí procedur SmazSeznamZvirat a SmazSeznamOtazek smaže oba LSS a zavolá proceduru Privitej (viz níže). Procedura je volána pouze procedurou Privitej, sama volá procedury Napis, SmazSeznamZvirat, SmazSeznamOtazek a Privitej a funkce NactiZvirata a NactiOtazky. procedura Vyuka Procedura pomocí funkcí NactiOtazky a NactiZvirata načte veškerá data ze souborů otazky.dat a zvire.dat do dvou LSS. Poté po jednom projde všechny záznamy typu zvireseznam z LSS, pro každý po jednom projde všechny záznamy typu otazkaseznam z LSS a v případě, že obsah pole odpovedi záznamu zvireseznam na indexu odpovídajícím integeru poradiotazky záznamu otazkaseznam bude nevim, vypíše pomocí procedury Napis řetězec jmenozvirete záznamu zvireseznam, řetězec textotazky záznamu otazkaseznam a počká na vstup od uživatele, který pomocí funkce Interpretuj interpretuje jako typ trojice a uloží do pole odpovedi záznamu 5

zvireseznam na index odpovídající integeru poradiotazky záznamu otazkaseznam. Po projití celého LSS zvířat (nebo v případě, že uživatel na kteroukoliv otázku odpoví řetězcem konec ) procedura pomocí procedury UlozZvirata uloží celý LSS zvířat do souboru zvire.dat, načež pomocí procedur SmazSeznamZvirat a SmazSeznamOtazek smaže oba LSS a zavolá proceduru Privitej (viz níže). Procedura je volána pouze procedurou Privitej, sama volá procedury Napis, SmazSeznamOtazek, SmazSeznamZvirat a UlozZvirata a funkce Precti, Interpretuj, NactiOtazky a NactiZvirata. procedura Privitej Procedura přivítá uživatele řetězcem a zeptá zda, zda chce pokračovat, poté počká na vstup od uživatele. Pokud je vstupní řetězec vyuka, zavolá proceduru Vyuka, pokud je vstupní řetězec vypis, zavolá proceduru VypisDatabazi. V ostatních případech je vstupní řetězec funkcí Interpretuj interpretován jako typ trojice a v případě, že je různý od ano, ukončí celý program. Pokud je ano, napíše procedura další řetězec a opět interpretuje vstup od uživatele jako typ trojice, přičemž ano ukončí proceduru Privitej, ne a nevim počká na další vstup od uživatele (tudíž vznikne smyčka, přerušitelná pouze vstupem ano). Procedura je volána procedurami VypisDatabazi, Vyuka a také ve vlastním těle programu, sama volá procedury Napis, Vyuka a VypisDatabazi a funkce Precti a Interpretuj. procedura DoplnZvire - Procedura parametrem dostane pole znameodpovedi typu poletrojic, obsahující odpovědi pro myšlené zvíře, které ze hry vyplynuly, a ukazatele na začátek LSS všech zvířat a na jeden konkrétní záznam typu zvireseznam z tohoto LSS. Poté projde všechny indexy pole odpovedi tohoto záznamu a pole znameodpovedi do celkového počtu otázek (globální proměnná pocetotazek), a v případě, že na nějakém indexu bude v poli odpovedi nevim a v poli znameodpovedi ano nebo ne, dosadí do pole odpovedi hodnotu z pole znameodpovedi. Nakonec pomocí procedury UlozZvirata uloží celý LSS zvířat do souboru zvire.dat. Procedura je volána pouze procedurou ProhralJsem, sama volá proceduru UlozZvirata. procedura VyhazejZvirata Procedura parametrem dostane ukazatel zvirata na začátek LSS zvířat, proměnnou odpoved typu trojice a integer poradi, který odpovídá pořadovému číslu nějaké otázky. Pokud odpoved obsahuje hodnotu nevim, procedura skončí. V opačném případě procedura odstraní z LSS všechny záznamy, které v poli odpovedi na indexu poradi obsahují jinou odpověď než parametr odpoved a přitom neobsahují nevim. Provede to ve dvou cyklech. V prvním odstraní ze začátku LSS všechny nevyhovující záznamy a v případě, že LSS zůstane prázdný, procedura skončí. V druhém předpokládá, že ukazatel nyní ukazuje na první vyhovující záznam (tudíž pro každý další záznam má smysl hovořit o předchozím záznamu) a odstraní všechny nevyhovující záznamy až do konce LSS. Procedura je volána pouze procedurou ZeptejSe, sama nevolá žádnou jinou funkci ani proceduru. 6

funkce VyberNejlepsi Jedna z klíčových funkcí programu. Má za úkol vrátit integer značící pořadové číslo otázky, jejíž položení by i v horším případě mohlo vyřadit maximální počet zvířat z LSS. V případě, že by existovaly pouze odpovědi ano nebo ne, by stačilo nalézt otázku, počet jejíchž odpovědí ano a ne je co nejvyrovnanější, tzn. rozdíl počtu odpovědí ano a ne je co nejbližší nule. Přítomnost odpovědi nevim tuto možnost vylučuje. Je tudíž pravděpodobně nejjednodušší spočítat u každé otázky zvlášť počet odpovědí ano a ne, u každé vybrat ten nižší počet a poté nalézt nejvyšší z těchto nižších počtů. Funkce parametrem dostane ukazatel zvirata na začátek LSS zvířat a ukazatel otazky na začátek LSS otázek. Využívá pole testovacipole délky max (konstanta) záznamů, obsahujících integery ano a ne (pro uložení počtu odpovědí ano a ne) a boolean platne (pro uložení informace, zda je tato otázka ještě v LSS, nebo již byla položena). Nejprve funkce projde celý LSS zbývajících otázek a podle jejich poradiotazky nastaví boolean platne v poli testovacipole na indexu poradiotazky na true. Pak projde celý LSS zbývajících zvířat a u každého zaznemaná počty odpovědí ano a ne v jejich poli odpovedi. Nakonec projde celé testovacipole (bere v úvahu jen indexy s položkou platne na true), zvolí nižší z integerů ano a ne a pokud je vyšší než předchozí maximum (proměnná nejlepsihodnota), uloží ho jako nové maximum a zaznamená jeho index (proměnná index). Nakonec vrátí hodnotu proměnné index. Funkce je volána pouze procedurou PtejSe, sama nevolá žádnou jinou funkci ani proceduru. procedura PridejOtazku Procedura parametrem dostane pole znameodpovedi typu poletrojic, obsahující odpovědi pro myšlené zvíře, které ze hry vyplynuly, řetězec zvire obsahující jméno zvířete a ukazatel na jeden záznam typu zvireseznam v LSS zvířat. Pomocí funkce NactiOtazky načte všechny otázky do LSS. Poté požádá uživatele o zadání znění nové otázky, načež ho porovná s řetězcem textotazky všech otázek v LSS. Pokud nenalezne shodu, zvýší hodnotu globální proměnné pocetotazek o jedna a na stejnou hodnotu nastaví i poradiotazky nové otázky, pokud shodu nalezne, zaznamená si její poradiotazky. Pak se zeptá uživatele, jaká je správná odpověď pro nové zvíře, odpověď zaznamená do pole znameodpovedi na index odpovídající poradiotazky nové otázky a opačnou odpověď do pole odpovedi ukazatele na stejný index. Nakonec, pokud otázka v LSS (a tudíž v souboru otazky.dat) nebyla, přidá ji na konec souboru otazky.dat, načež pomocí procedury SmazSeznamOtazek smaže celý LSS otázek. Procedura je volána pouze procedurou PridejZvire, sama volá procedury Napis, NactiOtazky a SmazSeznamOtazek a funkce Precti, Interpretuj a StandardizujOtazku. procedura PridejZvire Procedura parametrem dostane pole znameodpovedi typu poletrojic, obsahující odpovědi pro myšlené zvíře, které ze hry vyplynuly, a řetězec zvire obsahující jméno nového zvířete. Pomocí funkce NactiZvirata 7

načte do LSS všechna zvířata. Po jednom je projde a porovná jejich pole odpovedi s polem znameodpovedi. Pokud se někde liší (tzn. jedno obsahuje ano a druhé ne na libovolném indexu), nastaví boolean OK na true, což znamená, že tato zvířata jsou rozlišitelná i bez toho, aby musela být přidána nová otázka. Pokud se ani na jednom indexu neliší (OK zůstane na false), je zavolána procedura PridejOtazku. Nakonec je celý LSS zvířat pomocí procedury UlozZvirata uložen do souboru a pomocí procedury SmazSeznamZvirat smazán a řetězec zvire obsahující jméno nového zvířete a pole ZnameOdpovedi jsou uloženy na konec souboru zvire.dat. Procedura je volána pouze procedurou ProhralJsem, sama volá procedury PridejOtazku, UlozZvirata a SmazSeznamZvirat a funkci NactiZvirata. procedura VyhralJsem Procedura řetězcem na standardní výstup oznámí výhru a zeptá se uživatele, zda si přeje pokračovat. Pokud je vstupní řetězec interpretován jinak než jako ano, bude program ukončen, v opačném případě skončí procedura. Procedura je volána pouze procedurou ZkusHadat, sama volá proceduru Napis a funkce Precti a Interpretuj. procedura ProhralJsem Procedura parametrem dostane pole znameodpovedi typu poletrojic, obsahující odpovědi pro myšlené zvíře, které ze hry vyplynuly. Poté řetězcem oznámí svou prohru a zeptá se uživatele, zda si přeje nové zvíře sdělit. Pokud je vstupní řetězec interpretován jinak než jako ano, zeptá se program, zda chce uživatel pokračovat. V opačném případě se program zeptá uživatele na jméno zvířete a zaznamená ho do řetězce zvire. Pak pomocí procedury NactiZvirata načte všechna zvířata ze souboru do LSS a porovná řetězec zvire s řetězcem jmenozvirete každého záznamu v LSS. Pokud nenalezne shodu (zvíře v souboru nebylo), zavolá proceduru PridejZvire, pokud shodu nalezne, zavolá proceduru DoplnZvire. Pak pomocí procedury SmazSeznamZvirat smaže celý LSS zvířat. Nakonec se uživatele zeptá, zda chce pokračovat. Pokud je vstupní řetězec interpretován jinak než jako ano, bude program ukončen, v opačném případě skončí procedura. Procedura je volána procedurami ZkusHadat a PtejSe, sama volá procedury Napis, PridejZvire, DoplnZvire a SmazSeznamZvirat a funkce Precti, Interpretuj, LowCase a NactiZvirata. procedura ZkusHadat - Procedura parametrem dostane pole znameodpovedi typu poletrojic, obsahující odpovědi pro myšlené zvíře, které ze hry vyplynuly, ukazatel zvirata na LSS zbývajících zvířat a boolean prerusit. Postupně projde všechna zvířata v LSS a zeptá se na ně uživatele. Pokud uživatel na nějaké odpoví ano, pomocí procedury SmazSeznamZvirat smaže celý LSS zvířat a spustí proceduru VyhralJSem, načež nastaví prerusit na true. Pokud projde celý LSS a uživatel neodpoví ano, spustí proceduru ProhralJsem a nastaví prerusit na true. Boolean prerusit je zde proto, aby dal proceduře PtejSe najevo, že program vyhrál nebo prohrál, a tudíž cyklus kladení otázek končí. 8

Procedura je volána procedurami ZeptejSe a PtejSe, sama volá procedury Napis, SmazSeznamZvirat, VyhralJsem a ProhralJsem a funkce Precti a Interpretuj. procedura ZeptejSe Procedura parametrem dostane ukazatel otazky na začátek LSS otázek, integer poradi značící pořadové číslo nějaké otázky, pole znameodpovedi typu poletrojic, ukazatel zvířata na začátek LSS zvířat a boolean prerusit. Poté projde LSS otázek, ve kterém se pokusí najít otázku s poradiotazky rovnou poradi. Pokud nenajde, zavolá proceduru ZkusHadat. Pokud najde, vypojí tuto otázku z LSS, vypíše její znění na standardní výstup a přečte odpověď od uživatele, kterou zaznamená do pole znameodpovedi na index poradi. Nakonec spustí proceduru VyhazejZvirata, která z LSS zvířat odstraní všechna zvířata s nevyhovující odpovědí na tuto otázku. Procedura je volána pouze procedurou PtejSe, sama volá procedury Napis, VyhazejZvirata a ZkusHadat a funkce Precti a Interpretuj. procedura PtejSe Procedura parametrem dostane ukazatele na začátek LSS zvířat a otázek. Poté nastaví boolean prerusit na false a všechny indexy pole znameodpovedi, které bude sloužit k průběžnému ukládání uživatelových odpovědí, na nevim. Pak spustí nekonečný cyklus. Pokud je LSS zvířat prázdný, smaže pomocí procedury SmazSeznamOtazek LSS otázek, zavolá proceduru ProhralJsem a následně se ukončí. Pokud v LSS zvířat zbývá poslední zvíře nebo je LSS otázek prázdný, smaže pomocí procedury SmazSeznamOtazek LSS otázek, zavolá proceduru ZkusHadat a v závislosti na hodnotě prerusit se ukončí. Pokud zbývá v LSS poslední otázka, zavolá proceduru ZeptejSe s pořadím této konkrétní otázky, načež se v závislosti na hodnotě prerusit ukončí. Ve zbylých případech (pokud zbývá ještě několik zvířat a několik otázek), zavolá proceduru ZeptejSe s pořadím otázky určeným funkcí VyberNejlepsi, načež se v závislosti na hodnotě prerusit ukončí. Procedura je volána pouze ve vlastním těle programu, sama volá procedury ZeptejSe, ZkusHadat, ProhralJsem a SmazSeznamOtazek. 3.IV Vlastní tělo programu Vlastní tělo programu tvoří nekonečný cyklus o čtyřech krocích: 1. procedura Privitej 2. načtení otázek funkcí NactiOtazky 3. načtení zvířat funkcí NactiZvirata 4. začátek hádání procedurou PtejSe 9

4. Nedostatky programu Do budoucna by bylo dobré, kdyby bylo odstraněno omezení počtu otázek (konstanta max), kvůli čemuž by bylo potřeba změnit způsob ukládání otázek a zvířat do binárních souborů. Hodila by se možnost exportu celé databáze do textového souboru (např. procedura Vypis, ale s výstupem do souboru), případně i výpis na standardní výstup pouze některých dat (např. pouze jednoho zvířete a všech otázek nebo pouze jedné otázky a všech zvířat). Zatím není možné prakticky nijak editovat již uložené záznamy v binárních souborech. Hodila by se procedura na jejich úpravu. 10