Program w C++ który, dekoduje alfabet morsa na tekst, wraz ze znakami specjalnymi i liczbami. Oparty na strukturze drzewa BST. W celu wprowadzenia danych każdy kod należy wprowadzać nastÄ™pujÄ…co: ” ” – spacja jest to znak, że koniec litery, „/” – koniec wyrazu. Na przykÅ‚ad:
„.- .-.. –. — .-. -.– – — -.– / .. / … – .-. ..- -.- – ..- .-. -.– / -.. .- -. -.– -.-. ….” da nam wynik: „algorytmy i struktury danych”.
#include <cstdlib>
#include <iostream>
#include <string.h>
using namespace std;
char tab1[]={'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','.',',','?','+','-','=',';',':'};
string tab2[]={".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--..",".----","..---","...--","....-",".....","-....","--...","---..","----.","-----",".-.-.-","--..--","..--..",".-.-.","-....-","-...-","-.-.-.","---..."};
string posortowana[49];
char tab1posortowana[49];
void sortuj_dlugosc()
{
int k=0;
for(int j=1;j<=6;j++)
{
for(int i=0;i<44;i++)
{
if(tab2[i].length()==j)
{
posortowana[k]=tab2[i];
tab1posortowana[k]=tab1[i];
k++;
}
}
}
}
struct node // deklaracja wezla drzewa
{
char znak;
string mors;
node *left, *right, *top;
};
void dodaj_wezel(char znakc,string morsc, node *n)
{
string rozbity_kod;
int licznik=0;
node *s=n;
//wartosci dodanego wezla
node *x=new node;
x->left=x->right=NULL;
x->znak=znakc;
x->mors=morsc;
int stop=0;
do
{
if(x->mors.substr(licznik,1)==".")
{
if(n->left==NULL)
{
n->left=x;
stop=1;
}
else
{
n=n->left;
licznik++;
}
}
else if(x->mors.substr(licznik,1)=="-")
{
if(n->right==NULL)
{
n->right=x;
stop=1;
}
else
{
n=n->right;
licznik++;
}
}
}
while(stop==0);
};
void wyswietl_inorder(node *n)
{
if(n!=NULL)
{
cout<<n->znak<<" dla kodu: "<<n->mors<<endl;
wyswietl_inorder(n->left);
wyswietl_inorder(n->right);
}
}
// funkcja dekodujaca jeden znak
char dekoduj(string dane,node *n)
{
int dlugosc;
int licznik;
dlugosc=dane.length();
licznik=0;
node *q=n;
do
{
if(dane.substr(licznik,1)==".")
{
if(q->left==NULL) return NULL; // jezeli nie ma lewego dziecka zakoncz szukanie i nie zwaracaj wartosci
q=q->left;
licznik++;
}
else if(dane.substr(licznik,1)=="-")
{
if(q->right==NULL) return NULL; // jezeli nie ma lewego dziecka zakoncz szukanie i nie zwaracaj wartosci
q=q->right;
licznik++;
}
}
while((dane!=q->mors)); // jezel dane jest dluzsze od znalezionego ciagu i dlugosci sa rowne
if(dane==q->mors) return q->znak;
}
string znajdz(char znak)
{
for(int i=0;i<44;i++)
{
if(tab1[i]==znak)
return tab2[i];
}
}
int main()
{
node *n=new node; // przydzielona pamiec dla nowego wezla
// deklarujemy korzen
n->left=n->right=n->top=NULL;
n->znak=' ';
n->mors=" ";
sortuj_dlugosc();
/*
for(int i=0;i<45;i++)
{
cout<<posortowana[i]<<" dla litery: "<<tab1posortowana[i]<<endl;
}
*/
// dodanie posortowanych wezlow
for(int i=0;i<44;i++)
{
dodaj_wezel(tab1posortowana[i],posortowana[i],n);
}
/*
wyswietl_inorder(n);
*/
char str[200];
/*
//komunikacja z uzytkownikiem
printf ("Podaj slowo: ");
gets (str);
*/
int wybor;
cout<<"--------------------MENU----------------------"<<endl;
cout<<"1. Odczyt danych do dekodowania z pliku"<<endl;
cout<<"2. Odczyt danych do dekodowania z klawiatury"<<endl;
cin>>wybor;
switch(wybor)
{
case 1:
FILE * pFile;
char mystring [200];
pFile = fopen ("mors.txt" , "r");
fgets (str , 200 , pFile);
fclose (pFile);
break;
case 2:
{
gets(str);
}
default:
break;
}
if(wybor==2)
{ printf ("Podaj slowo: ");
gets(str);
}
char * znaki;
znaki = strtok (str," "); // funkcja rozbijajace morsa ze wzgledu na znaki ze wzgl na spacje
while (znaki != NULL)
{
if(strncmp (znaki,"/",2)==0) cout<<" ";
else cout<<dekoduj(znaki,n);
znaki = strtok (NULL, " "); //jezeli wszystko rozbite zakoncz petle ustawiajac znak na null
}
cout<<endl<<endl;
system("PAUSE");
return EXIT_SUCCESS;
}
/*
do dopracowania
void koduj()
{
{
FILE * pFile;
string zdanie;
pFile = fopen ("zakodowane.txt","w");
printf ("Podaj wyraz do zapisania: ");
cin>>zdanie;
int dlugosc=zdanie.length();
string rozbita;
string zmienna;
for(int i=0;i<dlugosc;i++)
{
rozbita=zdanie.substr(dlugosc,i+1);
zmienna =znajdz('rozbita');
cout<<zmienna<<endl;
fputs("sddadsa",pFile);
}
fclose (pFile);
main();
}
}
*/

