Binární strom
Dekódování textové zprávy v Morseově Abecedě (MA)
Vytvořte knihovnu pro práci s binárním stromem reprezentujícím
morseovu abecedu.
Knihovna bude obsahovat:
- funkci
Create pro vytvoření stromu s morseovou abecedou ze souboru
-
funkci Insert pro vložení znaku do stromu při jeho vytváření
-
funkci Destroy pro zrušení stromu
- funkci Decode
pro převedení zprávy morseovy abecedy na text
- funkci DecodeChar
pro převedení jednoho znaku morseovy abecedy
Pro uzel stromu nadefinujte strukturu
struct
TMorse {
char iValue; // hodnota znaku pro sekvenci končící v
tomto uzlu
TMorse* iDash; // ukazatel na následující uzel stromu
po čárce
TMorse* iDot; }; // ukazatel na následující uzel stromu
po tečce
Vytvořte nový projekt a v něm soubory mainmorse.c pro funkci main a testovací kód. Dále vytvořte soubory morse.c a morse.h pro knihovnu MA. Přidejte soubory check.c a check.h.
Napište funkci Insert, která na základě reprezentace
znaku v MA vloží znak do stromu pro dekódování MA. Vstupem bude
vrchol stromu, řetězec teček a čárek reprezentující podobu znaku v
MA a vlastní znak.
void Insert(TMorse *aVrchol, char
*aMorseZnak, char aZnak);
Postup:
Funkce postupně prochází
řetězec aMorseZnak dokud
nedojde na konec.
Pokud je v řetězci znak tečka, vydá se
do uzlu odkazovaného iDot.
Při čárce se vydá do uzlu
odkazovaného iDash.
Pokud uzel z minulých bodů
neexistuje, vytvoří ho alokací vytvoří a naváže na současný
uzel.
Uloží do posledního vytvořeného uzlu hodnotu
aZnak.
Ve funkci main vytvořte proměnnou TMorse Strom a
pomocí funkce Insert vložte několik
znaků.
Insert(&Strom,“.-“,'a');
Insert(&Strom,“.---“,'j');
Insert(&Strom,“---“,'o');
Po
vyzkoušení zakomentujte.
Napište funkci Create, která na základě dat v souboru
vytvoří strom pro MA. Funkce bude mít jako vstup otevřený soubor s
hodnotami MA pro generování stromu. Vrátí vrchol vytvořeného stromu.
Data jsou v souboru morse.txt.
Znaky jsou řazeny abecedně z důvodu lepšího procvičení.
TMorse
*Create(FILE *aVstup);
Postup:
Funkce vytvoří vrchol
stromu.
Funkce načte ze souboru hodnotu int, udávají počet
následujících znaků v souboru.
Funkce postupně načítá řádky
souboru. Řádek obsahuje znak a po mezeře řetězec teček a čárek
(reprezentaci znaku v MA).
S připravenými hodnotami zavolá funkci
Insert pro zařazení znaku do stromu na základě řetězce.
Funkce
vrátí vrchol stromu.
Ve funkci main otevřete soubor „morse.txt“
pro čtení. Zavolejte funkci Create a její výslednou hodnotu uložte
do proměnné Morse.
Zavřete otevřený soubor.
Napište funkci Destroy, která zruší strom.
void
Destroy(TMorse **aVal);
Strom se musí rušit od uzlů
nejvzdálenějších od vrcholu.
Ve funkci main zavolejte funkci
Destroy na vytvořený strom MA.
Napište funkci DecodeChar, která dekóduje jeden znak.
Funkce dostane jako parametr převáděný řetězec a vrchol stromu,
poslední parametr slouží k uložení nalezeného čísla. Řetězec sestává
z teček a čárek. Jakýkoli jiný znak je znakem ukončovacím. Funkce
vrátí počet zpracovaných znaků.
int DecodeChar(TMorse *aVal,
char *aRet, char *aRet)
Postup:
Funkce prochází řetězec
dokud jsou v něm tečky a čárky. Počítá zpracované znaky.
Pokud
je v řetězci tečka, přesune se do uzlu odkazovaného iDot
(pokud existuje).
Pokud je v řetězci čárka, přesune se do uzlu
odkazovaného iDash (pokud existuje).
Pokud je v cestě
neexistující uzel, vrátí hodnotu nula. Jinak počet zpracovaných
znaků.
V návratové hodnotě aRet vrátí hodnotu iValue
z posledního dosaženého uzlu.
Ve funkci main zavolejte funkci
DecodeChar pro několik znaků. Ověřte výsledky a tento kód
zakomentujte.
Napište funkci Decode, která dekoduje text MA v
řetězci pomocí funkce DecodeChar.
Funkce bude mít jako
vstupní parametry strom MA a řetězec k dekódování. Dekódované znaky
bude tisknout do souboru, který bude dalším parametrem funkce.
void
Decode(TMorse *aVal, char* aRet, FILE *aOut);
Postup:
funkce
zavolá funkci DecodeChar na řetězec aRet.
Vrácený
znak vytiskne do výstupního souboru.
Zavolá funkci DecodeChar
s tím, že se v řetězci aRet posune o počet znaků, které již
vyhodnotila funkce DecodeChar a o oddělovač.
Pokud nejsou
znaky v řetězci, nebo funkce DecodeChar vrátila chybu, funkce
se ukončí.
Ve funkci main nadefinujte proměnnou typu řetězec, do
kterého zkopírujte následující zprávy a tu dekódujte.
char
*Zpravy[]={“--- ... --- “,“ “};
Poslední úpravy 2019-02-12