2

ユーザーからフレーズを取得し、ユーザーが入力したフレーズの暗号化されたコードをユーザーに返すプログラムを作成する必要があります。データを保持するために、配列または列挙リストを使用する必要がありました。私はROT13を使用してエンコードしています(各英字をアルファベットに沿って13桁前後に置き換えます)。私のプログラムは実行されますが、フレーズを入力することしかできません。その後は次のようになります。

java.lang.ArrayIndexOutOfBoundsException: 26
    at J4_1_EncryptionVer2.main(J4_1_EncryptionVer2.java:28)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at edu.rice.cs.drjava.model.compiler.JavacCompiler.runCommand(JavacCompiler.java:272)

私のプログラムのどこが悪いのかわからない! 助けてください!ありがとう

        import java.io.*;

public class J4_1_EncryptionVer2
{
  public static void main (String [] args) throws IOException
  {
    BufferedReader myInput = new BufferedReader (new InputStreamReader (System.in));

   String letterA [] = {"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"};
   String letterB [] = {"N","O","P","Q","R","S","T","U","V","W","X","Y","Z","A","B","C","D","E","F","G","H","I","J","K","L","M"};

    System.out.println ("Please enter a phrase: ");
    String message = myInput.readLine();

    int x = 0; 
    while (x < message.length()){

      String text = message;
      String letter = Character.toString(text.charAt(x));
        x++;

      int i = 0;

     if(letter.equals (letterA[i])){
        System.out.println (letterB[i]);
      }
      while (!(letter.equals (letterA[i]))){
        i++;
        if(letter.equals (letterA[i])){
        System.out.println (letterB[i]);
      }

    }
  }
}
}
4

5 に答える 5

1

3 つの問題:

  1. while (x <= message.length())する必要がありますwhile (x < message.length())
  2. x++後に移動する必要がありますtext.charAt(x)
  3. equals文字列値を比較するために使用します。

もちろん、AZを使用してテストすることしかできません

于 2013-09-13T04:06:59.923 に答える
0

他のユーザーが上記で提案したように、配列サイズを気にしませんでした..そしてwhileループを止めるものは何もありません:

while (!(letter.equals (letterA[i])))

配列を扱うとき、私は while があまり好きではありません。私の意見では、これはあなたの外側がどのように見えるべきかです.

      while (x < message.length())          
            {
                String text = message;
                String letter = Character.toString(text.charAt(x));
                x++;

                for(int i=0; i<letterA.length; i++)
                {
                    if(letter.equals(letterA[i]))if(letter.equals(letterA[i]))
                    {
                        System.out.print (letterB[i]);
                        break;
                    }
                    else if (letter.equals(" "))
                    {
                        System.out.print(" ");
                        break;
                    }
                }
            }

自分のマシンでテストしたところ、問題なく動作しました。

入力: これは私の平文です

出力: GUVF VF ZL CYNVAGRKG

于 2013-09-13T04:45:41.597 に答える
0

まず、例外の理由は、28 行目の境界外の配列インデックスです。i が境界内にあることを確認する必要はありません。また、ユーザーが入力したメッセージから文字を取得しています。これは、キーボードから何でもかまいません。次に、26 個の大文字のアルファベットのみである letterA でそれを探しています。基本的に、あなたは手紙を見つけられないletterAの終わりから離れます。

于 2013-09-13T04:00:50.610 に答える
0

大文字のみのletterA []を提供しています。あなたの比較ループは大丈夫です。ただし、 while (letter != letterA[i])ループを確認する必要があり ます。

出力をテストするためだけに大文字としてプログラムに入力を与えるときは、必ず確認してください。

于 2013-09-13T04:23:00.070 に答える
0
import java.io.*;

public class JavaApplication1 {

    public static void main(String[] args) throws IOException {
        BufferedReader myInput = new BufferedReader(new InputStreamReader(System.in));

        char letterA[] = {'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'};
        char letterB[] = {'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M'};

        System.out.println("Please enter a phrase: ");
        String message = myInput.readLine();
        message = message.toUpperCase();
        char letterC[] = new char[message.length()]; 

        int x = 0;
        for (int j = 0; j < message.length(); j++) {
            for (int i = 0; i < letterA.length; i++){
                if(message.charAt(j)==letterA[i]){
                    letterC[j]=letterB[i];
                }
            }

        }

        for (int j = 0; j < message.length(); j++) {
            System.out.print(letterC[j]);
        }
        System.out.println("  -- done");
    }
}
于 2013-09-13T04:27:17.453 に答える