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