Jump to content
inesbras

Tradutor de Código Morse

Recommended Posts

inesbras

Boa noite a todos!

Estou a fazer um tradutor/codificador de codigo morse. O codificador de texto para morse funciona bem:

#include <iostream>
#include <string>
#include <stdio.h>
using namespace std;

//Codificador TEXTO - MORSE//

string textomorse(char c)
   {
      string texto = "abcdefghijklmnopqrstuvwqyz1234567890.,?'!/()&:;=-_$@";
   string morse[] = {".-   ","-...   ","-.-.   ","-..   ",".   ", "..-.   ", "--.   ",
                 "....   ", "..   ", ".---   ", "-.-   ", ".-..   ", "--   ",
                  "-.   ", "---   ", ".--.   ", "--.-   ", ".-.   ", "...   ", "-   ",
                  "..-   ", "...-   ", ".--   ", "-..-   ", "-.--   ", "--..   ",".----   ",
                 "..---   ","...--   ","....-   ",".....   ","-....   ",
                 "--...   ","---..   ","----.   ","-----   ",
                 ".-.-.-   ","--··--   ","··--··   ","·----·   ","-·-·--   ",
                 "-··-·   ","-·--·   ","-·--·-   ","·-···   ","----···  ","-·-·-·   ",
                 "-···-   ","-····-   ","··--·-   ","···-··-   ","·--·-   "};
     int index = texto.find(c);
       if(index!=-1)
            return morse[index];
         else
            return "       ";
   }

int main()
{
   string piu; 
   getline(cin, piu);
   string morse="";
      for(int i=0; i<piu.length(); i++)
      {
        morse += textomorse(piu[i]);
      }
      cout << morse << endl;

   return 0;
}
Até aqui tudo bem. Mas quando fui fazer o tradutor de morse para texto...dá o seguinte erro

error C2228: left of '.substr' must have class/struct/union e o programa não corre.

#include <iostream>
#include <string>
using namespace std;

//TRADUTOR MORSE TEXTO//

string morsetexto(char c)
   {
      string texto[] = {"a","b","c","d","e","f","g",
                  "h","i","j","k","l","m","n",
                  "o","p","q","r","s","t","u",
                  "v","w","q","y","z","1","2","3","4","5","6","7","8","9","0",".",",",
                  "?","'","!","/","(",")","&",":",";","=","-","_","$","@"};
   string morse[]= {".-","-...","-.-.","-..", ".", "..-.", "--.",
                 "....", "..", ".---", "-.-", ".-..", "--",
                  "-.", "---", ".--.", "--.-", ".-.", "...", "-",
                  "..-", "...-", ".--", "-..-", "-.--", "--..",".----   ",
                 "..---   ","...--   ","....-   ",".....   ","-....   ",
                 "--...   ","---..   ","----.   ","-----   ",
                 ".-.-.-   ","--··--   ","··--··   ","·----·   ","-·-·--   ",
                 "-··-·   ","-·--·   ","-·--·-   ","·-···   ","----···  ","-·-·-·   ",
                 "-···-   ","-····-   ","··--·-   ","···-··-   ","·--·-   "};

   
      int index = morse.find(c);
       if(index!=-1)
            return texto[index];

         else
            return "  ";
   }

int main()
{
   string piu; 
   getline(cin, piu);
   string text=" ";
      for(int i=0; i<piu.length(); i++)
      {
        text += morsetexto(piu[i]);
      }
      cout << text << endl;

   return 0;
}
já cheguei à conclusão que o erro está no int index = morse.find(c);, por num ler caracteres e noutro strings...mas não sei como o resolver!

Uma ajuda seria muito bem vinda :)

Share this post


Link to post
Share on other sites
kurayama

Nem podes comparar char's com strings nem os arrays em C++ são classes (de onde saiu esse find?)

Tens de ver como o input está feito, têm de haver um separador entre as letras, ("/", "|", etc..).

Divides as letras (cada uma fica uma string), mudas a função para receber uma string e podes usar este código para procurar.

string *last = texto + (sizeof(morse) / sizeof(string));
string *ptr = find(morse, last, letra); // metes aqui a letra em código morse
if(ptr!=last)
  return texto[ptr - morse];
else
  return "  ";

Share this post


Link to post
Share on other sites
inesbras

Antes demais obrigado pelas dicas, preferi seguir a do kurayama, mas mesmo assim ainda nao consegui por isto a funcionar. Ainda sou muito noob nisto.

#include <iostream>
#include <string>
#include <stdio.h>
using namespace std;

//TRADUTOR MORSE TEXTO//
int main()
  {
string morsetexto(char c)
{
	string texto[5] = "a|b|c";
string morse= ".-";"-...";"-.-.";

char *ptr;
ptr = strrchr(string, 's');

string *last = texto + (sizeof(morse) / sizeof(string));
string *ptr = find(morse, last, ".-");
string *ptr = find(morse, last,"-...");
string *ptr = find(morse, last, "-.-.");
if(ptr!=last)
  return texto[ptr--morse];
else
  return "  ";
}


{
string piu; 
getline(cin, piu);
string text=" ";
	for(int i=0; i<piu.length(); i++)
	{
        text += morsetexto(piu[i]);
	}
	cout << text << endl;

   return 0;
}

Reduzi só para 3 letras (a,b,c), só mesmo para não atrapalhar por agora. Fui reduzindo o numero e gravidade dos erros mas agora encravei nestes:

1>------ Build started: Project: morsetexto, Configuration: Debug Win32 ------

1>Compiling...

1>morsetexto2.cpp

1>.\morsetexto2.cpp(10) : error C2601: 'morsetexto' : local function definitions are illegal

1>        .\morsetexto2.cpp(8 ): this line contains a '{' which has not yet been matched

1>.\morsetexto2.cpp(40 ) : fatal error C1075: end of file found before the left brace '{' at '.\morsetexto2.cpp(8 )' was matched

1>Build log was saved at "file://c:\Documents and Settings\Inês Armada Brás\Ambiente de trabalho\FP TP1\MORSETEXTO\morsetexto\Debug\BuildLog.htm"

1>morsetexto - 2 error(s), 0 warning(s)

========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

O que é que me falta? Qualquer ajuda será bem vinda  :)

Share this post


Link to post
Share on other sites
kurayama

Tens aí vários erros

  - estás a meter a função morsetexto dentro da função main, têm de estar separadas

  - código morse é feito por pontos, barras e espaços. logo entre cada letra têm de haver um separador qualquer, tens de dividir a string em várias partes (usando por ex. a função strtok) e depois é que usar a função morsetexto em cada uma delas

  - estás a misturar C com C++, funções de strings em C não podem ser usadas em std::string de C++

Vê este código.. (assumo que o separador é '|')

#include <iostream>
#include <string>
#include <stdio.h>
using namespace std;

char morsetexto(const string& word)
{
  string texto = "abc";
  string morse[] = {".-","-...","-.-."};

  string *last = morse + (sizeof(morse) / sizeof(string));
  string *ptr = find(morse, last, word);
  if(ptr!=last)
    return texto[ptr - morse];
  else
    return ' ';
}

//TRADUTOR MORSE TEXTO//
int main()
{
  string piu; 
  getline(cin, piu);
  
  char *buf = new char[piu.length()];
  strcpy(buf, piu.c_str());
  char *tok;
  
  string text;
  for(tok = strtok(buf, "|"); tok!=NULL; tok = strtok(NULL, "|"))
    text += morsetexto(string(tok));
  
  delete buf;
  
  cout << text << endl;

  return 0;
}

/*
Input:
-.-.|.-|-...
Output:
cab
*/

Share this post


Link to post
Share on other sites
inesbras

hum... ainda me continua a dar o erro que ja me tinha aparecido antes...

string *ptr = find (morse, last, word);

1>.\morsetexto2.cpp(12) : error C3861: 'find': identifier not found

Será que me falta alguma biblioteca?

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.