Páginas

NIMADRES

Traductor Codigo Morse a Texto en C++

El código morse o también conocido como alfabeto morse es un sistema de representación de letras y números mediante señales emitidas de forma intermitente.



Fue desarrollado por Alfred Vail mientras colaboraba en 1830 con Samuel Morse en la invención del telégrafo eléctrico. Vail creó un método según el cual cada letra o número era transmitido de forma individual con un código consistente en rayas y puntos, es decir, señales telegráficas que se diferencian en el tiempo de duración de la señal activa. La duración del punto es la mínima posible. Una raya tiene una duración de aproximadamente tres veces la del punto. Entre cada par de símbolos de una misma letra existe una ausencia de señal con duración aproximada a la de un punto. Entre las letras de una misma palabra, la ausencia es de aproximadamente tres puntos. Para la separación de palabras transmitidas el tiempo es de aproximadamente tres veces el de la raya. Morse reconoció la idoneidad de este sistema y lo patentó junto con el telégrafo eléctrico. Fue conocido como «American Morse Code» y fue utilizado en la primera transmisión por telégrafo.

Esta vez  hice de nuevo el programa que ya había subido como Convertir a Codigo Morse en C++.

Hoy tengo el programa pero la versión opuesta, ya que muchos me han pedido e programa, por falta de tiempo no había podido subir mas programas. Hoy se trata de ingresar precisamente el código y el programa regresa el texto.





#include <iostream>
#include <sstream>
#include <windows.h>

using namespace std;

void Insertar(string&);
void Morse(string);

void Menu()
{
   std::cout<<"\t============ CODIGO MORSE =============\n\n";
   std::cout<<"\t________________________________________\n";
   std::cout<<"\t|A .-    |  B -... |  C -.-. |  D -..  |\n";
   std::cout<<"\t|E .     |  F ..-. |  G --.  |  H .... |\n";                   
   std::cout<<"\t|I ..    |  J .--- |  K -.-  |  L .-.. |\n";
   std::cout<<"\t|M --    |  N -.   |  O ---  |  P .--. |\n";
   std::cout<<"\t|Q --.-  |  R .-.  |  S ...  |  T -    |\n";
   std::cout<<"\t|U ..-   |  V ...- |  W .--  |  X -..- |\n";
   std::cout<<"\t|Y -.--  |  Z --.. |         |         |\n";
   std::cout<<"\t________________________________________\n";
}
 
int main()
{
   string String = "";   
   Menu();
   Insertar(String);
   Morse(String);  
   std::cin.get();
   return 0;
}

void Insertar(string &String){
 std::cout<<"\nIngresa el codigo: ";
 getline(cin,String);
} 
void Morse(string String){
 string token;
 istringstream iss(String);
 std::cout<<"\nLa frase escrita es: ";
 stringstream morse;
 while ( getline(iss, token, ' ') ){
  if(strcmp(token.c_str(),".-")== 0)
   cout << "A";
  else if(strcmp(token.c_str(),"-...")== 0)
   cout << "B";
  else if(strcmp(token.c_str(),"-.-.")== 0)
   cout << "C";
  else if(strcmp(token.c_str(),"-..")== 0)
   cout << "D";
  else if(strcmp(token.c_str(),".")== 0)
   cout << "E";
  else if(strcmp(token.c_str(),"..-.")== 0)
   cout << "F";
  else if(strcmp(token.c_str(),"--.")== 0)
   cout << "G";
  else if(strcmp(token.c_str(),"....")== 0)
   cout << "H";
  else if(strcmp(token.c_str(),"..")== 0)
   cout << "I";
  else if(strcmp(token.c_str(),".---")== 0)
   cout << "J";
  else if(strcmp(token.c_str(),"-.-")== 0)
   cout << "K";
  else if(strcmp(token.c_str(),".-..")== 0)
   cout << "L";
  else if(strcmp(token.c_str(),"--")== 0)
   cout << "M";
  else if(strcmp(token.c_str(),"-.")== 0)
   cout << "N";
  else if(strcmp(token.c_str(),"---")== 0)
   cout << "O";
  else if(strcmp(token.c_str(),".--.")== 0)
   cout << "P";
  else if(strcmp(token.c_str(),"--.-")== 0)
   cout << "Q";
  else if(strcmp(token.c_str(),".-.")== 0)
   cout << "R";
  else if(strcmp(token.c_str(),"...")== 0)
   cout << "S";
  else if(strcmp(token.c_str(),"-")== 0)
   cout << "T";
  else if(strcmp(token.c_str(),"..-")== 0)
   cout << "U";
  else if(strcmp(token.c_str(),"...-")== 0)
   cout << "V";
  else if(strcmp(token.c_str(),".--")== 0)
   cout << "W";   
  else if(strcmp(token.c_str(),"-..-")== 0)
   cout << "X";
  else if(strcmp(token.c_str(),"-.--")== 0)
   cout << "Y";
  else if(strcmp(token.c_str(),"--..")== 0)
   cout << "Z";  
 }
 if(iss.fail());
}
Si tienen alguna sugerencia o comentario, no duden en hacérmelo saber.

Automata en C++

La teoría de autómatas es una rama de las ciencias de la computación que estudia las máquinas abstractas y los problemas que éstas son capaces de resolver. La teoría de autómatas está estrechamente relacionada con la teoría del lenguaje formal ya que los autómatas son clasificados a menudo por la clase de lenguajes formales que son capaces de reconocer.
Un autómata es un modelo matemático para una máquina de estado finito (FSM sus siglas en inglés). Una FSM es una máquina que, dada una entrada de símbolos, "salta" a través de una serie de estados de acuerdo a una función de transición (que puede ser expresada como una tabla). En la variedad común "Mealy" de FSMs, esta función de transición dice al autómata a qué estado cambiar dados unos determinados estado y símbolo.
La entrada es leída símbolo por símbolo, hasta que es "consumida" completamente (piense en ésta como una cinta con una palabra escrita en ella, que es leída por una cabeza lectora del autómata; la cabeza se mueve a lo largo de la cinta, leyendo un símbolo a la vez) una vez la entrada se ha agotado, el autómata se detiene.

Dependiendo del estado en el que el autómata finaliza se dice que este ha aceptado o rechazado la entrada. Si éste termina en el estado "acepta", el autómata acepta la palabra. Si lo hace en el estado "rechaza", el autómata rechazó la palabra, el conjunto de todas las palabras aceptadas por el autómata constituyen el lenguaje aceptado por el mismo.

En este autómata nos basamos en la imagen siguiente, la cual muestra el diagrama del autómata con la secuencia de estados, este es un autómata finito determinista, ya no tiene transiciones vacías.
El programa esta hecho en base al ejemplo tal cual.


Este autómata verifica una cadena, si llega al estado 4 significa que la cadena ingresada es un hexadecimal, si el estado termina en 5 significa que es un natural, si termina en 7  es decimal, si termina en 8 es un octal.
Este es solo un ejemplo, ustedes en base a este que esta simple pueden hacer uno mucho mas complejo.

La manera en la que se maneja el programa es muy parecida a la de un analizador léxico ya que regresa que tipo de cadena es, esto lo hice solo para verificar que el programa funciona correctamente.





Eh aquí el Código:


#include <iostream>
#define UDEF -1
using namespace std;
int delta(int estado, char c){
 switch(estado){
          case 0: if(c == '0') return 1;
                  else if((isdigit(c)) and c > '0') return 5;
                  else if(c == '.') return 6;
                  else return UDEF;
          case 1: if(isdigit(c) and c < '8') return 8;
                  else if(c == 'X' or c == 'x') return 2;
                  else if(c == '.') return 6;
                  else return UDEF;
          case 2: if(isxdigit(c)) return 3;
                  else return UDEF;
          case 3: if(isxdigit(c)) return 4;
                  else return UDEF;
          case 4: if(isxdigit(c)) return 3;
                  else return UDEF;
          case 5: if(isdigit(c)) return 5;
                  else if( c == '.') return 6;
                  else return UDEF;
          case 6: if(isdigit(c)) return 7;
                  else return UDEF;
          case 7: if(isdigit(c)) return 7;
                  else return UDEF;
          case 8: if(isdigit(c) and c < '8') return 8;
                  else return UDEF;                  
    }
}

string process(int estado, const char *cadena){
    for(int i = 0;cadena[i] != 0; i++){
        estado = delta(estado,cadena[i]);
        if(estado == UDEF) break;
    }
 if(estado == 4) return "hexadecimal";
 else if(estado == 5) return "natural";
 else if(estado == 7) return "decimal";
 else if(estado == 8) return "octal";
 else return "no valida";
}

string test(const char *cadena){
    int pf = 0; // estado inicial
    string tipo;
    tipo = process(pf,cadena);
    return tipo;
}

int main(){
 string cadena;
 cout << "Ingresa la cadena: ";
 getline(cin,cadena);
 cout << "La cadena es: " << test(cadena.c_str());
 return 0;
}


Si tienen comentarios o sugerencias, no duden en comentar.