0

この Java コードは、英語をモールス符号に変換するためのものです。

このプログラムは、ユーザーがセンチネル文字 $ を入力すると終了します。入力された各文字列に続いて、プログラムはモールス信号に相当するものを表示し、文字間に空白スペース (ø) を、単語間に 2 つの øø を残します。

例えば。こんにちは世界。出力は ....ø.ø.-..ø.-..ø---øø.--ø---ø.-.ø.-..ø-..

私のコードにはいくつかの問題があります。1. ユーザーが ø を入力している間、プログラムを終了するには $ をどこに置くべきかわかりません。2.出力は正しいですが、常に (ø) で終わります。System.out.print(code[variable] + "ø");

これが私のコードです:

public class Morse{
public static void main (String [] args)
{
    Scanner englishtomorse = new Scanner(System.in);
    System.out.println ("Please enter an original sentence in English.");
    english = englishtomorse.nextLine();
    String str = englishtoMorse(english);
    System.out.println(str);
}

public static String englishtoMorse(String english)
{
    String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    String code[] =  {"._", "_...", "_._.", "_..",".",".._.","__.", "....",
        "..", ".___", "_._", "._..", "__","_ .", "___", ".__.", "__._", "._.",
        "...", "_", ".._", "..._", ".__", "_.._", "_.__", "__.."};
    english = english.toUpperCase();
    for(int xyz = 0; xyz < english.length(); xyz++)
    {
        char letter = english.charAt(xyz);
        if (letter == ' ')
        {
            System.out.print ("ø");
            continue;
        }
        for(int variable = 0; variable < alphabet.length(); variable++)
        {
            if(alphabet.charAt(variable) == letter)
            {
                System.out.print(code[variable] + "ø");
                break;
            }
        }
    }
    return " ";
}
4

1 に答える 1

1

コードには、注意が必要な問題がいくつかあります。

  1. Sun/Oracle の命名規則を参照してください。これにより、コードが非常に読みやすくなります。camelCase 必須です。

  2. ScannerJava ではリソースと見なされます。したがって、開いたら閉じなければなりません。そうしないと、リソース リークの問題が発生する可能性があります。リソースを閉じるのは単純なメソッド呼び出しですが、無視してはいけません。

例えば。:

resourceVariableName.close().
  1. 3 行目の英語の変数宣言はどこにありますか?

英語 = 英語tomorse.nextLine();


最初の問題:

は、 Java SE APIScannerに記載されているように、ファイルの終わりの状態が見つかるまで読み取りを続けます。

Scannerを使用してループ内でデータを処理し、ファイルの終了条件を満たしているか、「特別な」終了ワードが見つかった場合に次の操作を停止するのは一般的な方法です。

したがって、コードをリファクタリングして、次の状況を考慮することができます。

  • スキャナが複数の行を検出しました

  • ユーザーは予約済みの終了語 ($) を入力しませんでした

例えば:

Scanner myScanner = new Scanner(System.in);

while(myScanner.hasNext() && !myScanner.equals("$")) {
    System.out.println(this.englishToMorse(myScanner.nextLine()));
}

myScanner.close();

2 番目の問題は、メソッド ロジックを確認する必要があります。あなたは文字列を返すと述べていますが、常に

戻り値 " ";

どのような状況でも空の文字列を返す必要があるのはなぜですか? メソッド シグネチャは重要です。なぜなら、メソッドが何を実行でき、何を返さなければならないかを予測できるからです。

このクラスを友人に提供し、友人がメソッドを呼び出した場合、メソッド シグネチャの戻り値の型に記載されているモールス信号を返さないことを、友人はどのように予測できるのでしょうか。

ところで、この問題は、2 つの配列をループすることなく、より良い方法で解決できます。Map データ構造を見てください。これにより、ソリューション全体が大幅に改善されます。

于 2015-10-12T01:49:48.750 に答える