//--------- morse.h ------------------------------------------------

// Doplňte funkci pro dekódování morseovy abecedy a doplňte funkci pro odalokování stromu.
// Prostudujte příklad, snažte se pochopit jeho činnost – binární strom
// vyhledejte funkci, která není vyplněná a na základě komentářů ji doplňte
// následně zkuste přepsat z C struktury na C++ třídu)
// v tomto souboru jsou vlastně soubory čtyři – datový pro morseovku, dva zrojové a hlavičkový



#ifndef morseH

#define morseH





struct TMorse {

char znak;

TMorse *tecka;

TMorse *carka;

};



int FillMorseFromFile(char *Name,TMorse * & First);



int DecodeMorse(char *ret, TMorse* First);



void CloseMorse(TMorse * &First);



//---------------------------------------------------------------------------

#endif

//------ morse.cpp -------------------------------------------------------



#pragma hdrstop



#include<iostream>

#include<fstream>



using namespace std;





#include "morse.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)





int Insert(TMorse * First,char *ret, char znak)

{

int poz = 0;

TMorse **ref;



if (ret[0] == NULL) return -1;

while (1) {

switch (ret[poz]) {

case '.' : ref = &First->tecka;break;

case '-' : ref = &First->carka;break;

case '\0': First->znak = znak; return 1;

default: return -1;

}

if (*ref == NULL)

{

*ref = new TMorse;

(*ref)->znak = 255;

(*ref)->tecka = NULL;

(*ref)->carka = NULL;

}

First = *ref;

poz++;

}

return 1;

}





int FillMorseFromFile(char *Name,TMorse * & First)

{

if (First != NULL)

return -1; // vzdy zakladame novy strom

ifstream is(Name,ios::in);

if (!is.is_open())

return -2;



First = new TMorse;

First->znak = 255; // chyba - neni znak

First->tecka = NULL;

First->carka = NULL;



char txt[51];

int i,pocet;

is >> pocet; // prvni řádek - počet znaků

is .get();

for (i = 0; i< pocet;i++)

{

is.getline(txt,50);

if (Insert(First,&txt[2],txt[0])<0)

{

cout << "znak "<<txt << " nelze zaradit \n";

return -3;

}

}



return 1;

}

// funkce převádí sérii teček a čárek umístěných v ret na znak, který přísluší této sérii čárek a teček,

// tento znak uloží do proměnné znak

// v ret může být i více znaků, které jsou odděleny mezerami, ukončovacím znakem je je tedy konec řetězce ´\0´ nebo mezera

// funkce vrací chybu – záporné číslo, nebo počet znaků vyčtených z řetězce (tj. Kolik znaků od začátku řetězce patří k dekódovanému znaku )

int ZnakZMorse(char *ret, TMorse*First, char&znak)

{



return -1;

}



int DecodeMorse(char *ret, TMorse* First)

{

int poz=0,i;

char p;



while (1)

{

if (ret[poz]==NULL) return 1 ;

if (ret[poz]==' ')

{cout << ' ';poz++;}

if ((i=ZnakZMorse(&ret[poz],First,p))<= 0)

return -1;

poz += i;

cout << p;

if (ret[poz]==NULL) return 1 ;

poz++;

}



return 1;

}





void CloseMorse(TMorse * &First)

{

cout << First->znak;

// funkce postupně voláním sama sebe projde strom až do posledních uzlů

// a od těchto posledních uzlů jej smaže.





}



//--------- morsemain.cpp -------------------------------------



#pragma hdrstop



//---------------------------------------------------------------------------



#include <iostream>

#include <fstream>



using namespace std;



#include "morse.h"





#pragma argsused

int main(int argc, char* argv[])

{

TMorse *First = NULL;

FillMorseFromFile("morse.dat",First);



DecodeMorse("--- -. --- - --- -. . -. .. .- --.. - .- -.- - . --.. -.- -.--",First);

cout << endl;

CloseMorse(First);

char i;

cin >> i;



return 0;

}

//---------------------------------------------------------------------------

morse.dat

36

a .-

b -...

c -.-.

d -..

e .

f ..-.

g --.

h ....

i ..

j .---

k -.-

l .-..

m --

n -.

o ---

p .--.

q --.-

r .-.

s ...

t -

u ..-

v ...-

w .--

x -..-

y -.--

z --..

1 .----

2 ..---

3 ...--

4 ....-

5 .....

6 -....

7 --...

8 ---..

9 ----.

0 -----