6

モールス符号をテキストに変換しようとしています。

この問題で使用する 2 つのテキスト ファイルがあります。morseCode.txt: 私が読み取ったファイルには、文字と対応するモールス符号が含まれています。

morse.dat: モールス信号で暗号化されたメッセージを含むファイル

最初のファイルを適切に読み取ってから、別の配列に保存することができました。文字の配列とモールス信号の配列を印刷してテストしたところ、正しく順序どおりに格納されていることがわかりました。

2 番目のファイルのメッセージの読み取りに問題があります。これは、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   ----. 
.  .-.-.- 
,   --..-- 
?   ..--.. 

Message.txt ファイルは次のようになります。

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

出力するはずです:

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

+++これが私の解決策です.+++

/*     
 *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();
    }
}
4

2 に答える 2

3

スペースと改行の 2 種類の区切り文字があるため、スキャナーを使用して morse.dat ファイルを解析する際に問題が発生します。最も簡単な方法は、おそらく BufferedReader を使用して一度に 1 行ずつ読み取り、その行をスペースで分割することです。これを行うコードは次のとおりです。メソッドについてまだ学んでいないため、メソッドの使用を避けました。

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

上記のプログラムの出力:

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

お役に立てば幸いです。

于 2009-12-06T21:08:48.413 に答える
2
while (data.hasNext())
{
   //read in letter
           words[e] = message[e].indexOf(" ");

dataファイルを開いて実際に何もしないことを考えると、それが機能していないことに驚きはありません。

データ ファイルから個々のトークンを取得し、モールス配列でインデックスを検索します。

于 2009-12-06T20:35:06.143 に答える