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]