2009-12-06 29 views
6

Estoy tratando de convertir el código Morse en texto.Java: Convertidor MorseCode

Tengo dos archivos de texto para usar con este problema. morseCode.txt: Tengo un archivo que leo que contiene las letras y el correspondiente código Morse equivalente.

morse.dat: Es el archivo que contiene el mensaje cifrado en código Morse

yo era capaz de leer correctamente el primer archivo y luego almacenar entonces en matrices independientes. Lo probé imprimiendo la matriz de letras y el código morse de la matriz y descubrí que lo almacenaba correctamente y en orden.

Tengo problemas para leer el mensaje del segundo archivo. Esta es la clave morseCode.txt:

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 --.. 
0 ----- 
1 .---- 
2 ..--- 
3 ...-- 
4 ....- 
5 ..... 
6 -.... 
7 --... 
8 ---.. 
9 ----. 
. .-.-.- 
, --..-- 
? ..--.. 

Esto es lo que se ve el archivo Nuevo.txt como:

- .... .. ... 
.. ... 
.- 
- . ... - 
.--. .-. --- --. .-. .- -- .-.-.- 
.. ..-. 
-.-- --- ..- 
... . . 
- .... .. ... 
-- . ... ... .- --. . 
- .... .- - 
.. ... 
--. --- --- -.. 
-. . .-- ... 
-.-- --- ..- .-. 
.--. .-. --- --. .-. .- -- 
.-- --- .-. -.- ... .-.-.- 

su supone que ouput:

THIS IS A TEST PROGRAM. 
IF YOU SEE THIS MESSAGE THAT IS GOOD NEWS YOUR PROGRAM WORKS. 

+++ ESTA ES MI SOLUCIÓN. +++

/*  
*This is a program that translates Morse Code to English text. The key is read from a file. 
* 
*The file contains the equivalent letters and Morse code. The entire key is stored in an array for reference. 
* 
*A second file contains the encrypted message. The program reads the message file and converts individual Morse code 
* 
*letters into alphabet letters. The results are displayed and printed out to another file. */ 

import java.io.*; 
import java.util.Scanner; 

//file writer and print writer to save the output 
public class Assignment4 
{ 
@SuppressWarnings("null") 
public static void main (String [] args) throws IOException 
{ 
    //arrays for letters and Morse Code values 
    String[] letter = new String[39], morseCode = new String[39];  
    //this is the file with the letters and morse code equivalent 
    File file1 = new File ("c:/morseCode.txt"); 
    Scanner in = new Scanner(file1); 

    int i = 0; 

    while (in.hasNext()) 
     { 
      //read in letter 
    letter[i] = in.next(); 
    //read in Morse Code 
      morseCode[i] = in.next();   

      i++; 
     } 

    //this is the file with encrypted message 
    String morseLine, morseLetter, theLetter = " "; 
    //this file contains the encrypted message 
    File file2 = new File ("c:/morse.dat"); 
    Scanner data = new Scanner(file2); 

    //this appends the data to the file and keeps a running input 
    FileWriter fWriter = new FileWriter("c:/Message.txt", true); 
    PrintWriter outPutFile = new PrintWriter(fWriter); 

    boolean found; 
    int number = morseCode.length; 

    while (data.hasNext()) 
    { 
    //reads each line of mesage 
    morseLine = data.nextLine(); 

    i = 0; 
    int j = 0, k = 0;  
    j = morseLine.indexOf(" "); 

    while (j != -1) 
    { 
    //determines the end of a letter in Morse code and stores the 
    morseLetter = morseLine.substring(i, j); 

    found = false;  
    k = 0;  
    theLetter = " "; 

    //this loop searches the array of morseCode for the equal Morse code letter 
    //then it assigns the corresponding letter that is equivalent 
    while (k < number && !found) 
    { 
    if (morseLetter.equals(morseCode[k])) 
    { 
     theLetter = letter[k];  
     found = true; 
    } 

    else 
    { 
     k++; 
    } 
    } 

    //this condition prints the equivalent letter of the Morse code letter 
    //on the message 
    if (!theLetter.equals(" ")) 
    { 
    System.out.print(theLetter);  
    outPutFile.print(theLetter); 
    } 

    i = j + 1;  
    j = morseLine.indexOf(" ", i);  
    } 

    if(theLetter.equals(".")) 
    { 
    //moves to the next line at the end of the sentence 
    System.out.println(""); 
    outPutFile.println(""); 
    } 

    else 
    { 
    //this separates the letters into words 
    System.out.print(" "); 
    outPutFile.print(" "); 
    } 
    } 

    outPutFile.close(); 
    } 
} 
+0

Hola Mark, No pude seguir su solución, pero encontré una solución. No estamos entrando en programación orientada a objetos en mi curso ya que es una clase de principiante. ¿Puede mostrarme la solución completa al problema utilizando su Buffered Reader? Publiqué mi solución arriba. Gracias. – HelloWorld

+0

No nos han enseñado cómo usar los Métodos por cierto. Algunas personas se han preguntado por qué mi código es así. – HelloWorld

Respuesta

3

Tendrás un problema al usar el escáner para analizar el archivo morse.dat porque hay dos tipos de delimitador: un espacio y una nueva línea. La forma más fácil es, probablemente, leer una línea a la vez usando un BufferedReader y dividir la línea en un espacio. Aquí está el código para hacer eso. Evité usar métodos porque aún no has aprendido sobre ellos.

import java.io.*; 
import java.util.*; 

public class Assignment4 
{ 
    public static void main(String[] args) throws IOException 
    { 
     Map<String, String> morseCodes = new HashMap<String, String>(); 
     File file1 = new File ("morsecode.txt"); 
     Scanner in = new Scanner(file1); 

     while (in.hasNext()) 
     { 
      String letter = in.next();   
      String code = in.next(); 
      morseCodes.put(code, letter); 
     } 

     File morseCode = new File("message.txt"); 
     BufferedReader bufferedReader = new BufferedReader(new FileReader(morseCode)); 
     String line; 

     while ((line = bufferedReader.readLine()) != null) 
     { 
      String letter = ""; 

      for (String morseLetter: line.split(" ")) 
      { 
       letter = morseCodes.get(morseLetter); 
       System.out.print(letter); 
      } 

      if (letter.equals(".")) { 
       // Insert a new line after a period. 
       System.out.println(); 
      } else { 
       // Insert a space between words. 
       System.out.print(' '); 
      } 
     } 
    } 
} 

salida del programa anterior:

THIS IS A TEST PROGRAM. 
IF YOU SEE THIS MESSAGE THAT IS GOOD NEWS YOUR PROGRAM WORKS. 

espero que ayude!

2
while (data.hasNext()) 
{ 
    //read in letter 
      words[e] = message[e].indexOf(" "); 

Teniendo en cuenta que abra el archivo como data y en realidad no hace nada con él, no me sorprende que no está funcionando.

Desea obtener los tokens individuales del archivo de datos y luego buscarlos en su matriz de datos morse.

Cuestiones relacionadas