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