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]
|