[C++] Dekoder alfabetu Morsa C++

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();

}
}
*/
Ten wpis został opublikowany w kategorii Algortymy i struktury danych, C++, Programowanie, Studia i oznaczony tagami , , , . Dodaj zakładkę do bezpośredniego odnośnika.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

*

Możesz użyć następujących tagów oraz atrybutów HTML-a: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>