9.  Stromy

9.6  Problém - Morseova abeceda

  Vytvorte program na dekódovanie správy napísanej v Morseovej abecede. Správu prečítajte z textového súboru.


Riešenie

Pri dekódovaní využijeme binárny vyhľadávací strom. V jeho vrcholoch budú uložené jednotlivé písmená abecedy, v koreni je ako špeciálny znak medzera.

typedef struct vrchol {
       char  znak;
       struct vrchol *bodka, *ciarka;
} TVrchol;

TVrchol *strom;

Zo súboru čítame postupnosti bodiek a čiarok. Znak bodka znamená presun ukazovateľa na ľavý podstrom, znak čiarka na pravý podstrom.





Ak prečítame zo súboru kód --.. pôjdeme z koreňa vpravo, vpravo, vľavo, vľavo. Skončíme vo vrchole s písmenom z. Takýmto spôsobom pre každý prečítaný kód nájdeme rýchlo zodpovedajúce písmeno. Dekódovanie bude prebiehať v cykle:

void dekoduj(TVrchol *strom)
{
   TVrchol *p;
   char c;

   p = strom;

   while ((c = getc(fr)) != EOF) {
     if (c == '.') p = p->bodka;
     else if (c == '-') p = p->ciarka;
          else {
             putchar(p->znak);
             p = strom;
          }
   }
}

Pred čítaním kódu ďalšieho písmena nastavíme ukazovateľ opäť na koreň stromu!

Pre jednoduchosť budeme predpokladať, že na vstupe je správa v dohodnutom formáte - za kódom písmena ako oddeľovač nasleduje vždy znak /, za každým slovom aspoň dva znaky //.

Vytvorený program má tri časti - vytvorenie dekódovacieho stromu, otvorenie súboru pre čítanie a postupné dekódovanie správy.

Príklad vstupu: -../-.--/-./.-/--/../-.-./-.-/.//.../-/.-./..-/-.-/-/..-/.-./-.--/
Výstup: dynamicke struktury

[Program]