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



  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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.

  6. 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