Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Java: MorseCode Converter

I'm trying to convert Morse code into text.

I have two text files to use with this problem. morseCode.txt: I have a file that i read off that contains the letters and corresponding Morse code equivalent.

morse.dat: Its the file that contains the encrypted message in Morse code

I was able to read the first file properly and then store then into separate arrays. I tested it by printing the array for letters and array morse code and found that it did store it properly and in order.

I'm having problems with reading the message the second file. This is the morseCode.txt key:

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   ----. 
.  .-.-.- 
,   --..-- 
?   ..--.. 

This is what the Message.txt file looks like:

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

Its supposed to ouput:

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

+++THIS IS MY SOLUTION.+++

/*     
 *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();
    }
}
like image 787
HelloWorld Avatar asked Dec 06 '09 20:12

HelloWorld


People also ask

How many characters are in Morse code?

International Morse code encodes the 26 basic Latin letters A through Z, one accented Latin letter (É), the Arabic numerals, and a small set of punctuation and procedural signals (prosigns). There is no distinction between upper and lower case letters. Each Morse code symbol is formed by a sequence of dits and dahs.

What is Morse code implement Morse code in C?

Morse code is a method of transmitting text information as a series of on-off tones, lights, or clicks that can be directly understood by a skilled listener or observer without special equipment.


1 Answers

You will have a problem using Scanner to parse the morse.dat file because there are two types of delimiter - a space and a new line. The easiest way is probably to read one line at a time using a BufferedReader, and split the line on a space. Here is the code to do that. I avoided using methods because you haven't learned about them yet.

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

Output of above program:

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

I hope that helps you!

like image 51
Mark Byers Avatar answered Oct 06 '22 00:10

Mark Byers