1

そのため、オンラインの AP Comp Sci の先生から応答がなく、プログラムで問題が発生しています。このリストからのユーザー入力に従って、ランダムなパスワード ジェネレーターを作成する必要があります。

  System.out.println("※※※※※※※※※※※※※※※※※※※ | Password Generation Menu | ※※※※※※※※※※※※※※※※※※※");
  System.out.println("※|==========================================================================|※");
  System.out.println("※|    [1] Lowercase Letters                                                 |※");
  System.out.println("※|    [2] Lowercase and Uppercase Letters                                   |※");
  System.out.println("※|    [3] Lowercase, Uppercase and Numbers                                  |※");
  System.out.println("※|    [4] Lowercase, Uppercase, Numbers and Symbols                         |※");
  System.out.println("※|    [5] Quit                                                              |※");
  System.out.println("※|==========================================================================|※");
  System.out.println("※※※※※※※※※※※※※※※※※※※※※※ | Your selection? | ※※※※※※※※※※※※※※※※※※※※※※※");

これまでのところ、私は問題に直面しています

int selection = in.nextInt();

   if (selection ==1)
    {
        System.out.println("How many characters will me used in the password? (1 - 14)");
        int chars = in.nextInt();
        while ( count <= chars)
          {
              int password;
              password += rand.nextInt((122 - 97) + 1)+ 97;
              count++;
          }
        System.out.println("Password: " + password);  
    }
   else if (selection ==2)
    {
        System.out.println("How many characters will me used in the password? (1 - 14)");
        int chars = in.nextInt();
        while ( count <= chars)
          {
             while( !(randNum>=65 && randNum<=90)&& !(randNum>=97 && randNum<=122))
                 {
                     randNum = randNumList.nextInt();
                     int password;
                     password += randNum;
                 }
              count++;
           } 
        System.out.println("Password: " + password);   
    }
   else if (selection ==3)
    {
        System.out.println("How many characters will me used in the password? (1 - 14)");
        int chars = in.nextInt();
        while ( count <= chars)
          {
              while( !(randNum>=65 && randNum<=90)&& !(randNum>=97 && randNum<=122)&& !(randNum>=48 && randNum<=57))
                 {
                     randNum = randNumList.nextInt();
                     int password;
                     password += randNum;
                 }
              count++;
           }  
        System.out.println("Password: " + password);   
    }
   else if (selection ==4)
    {
        System.out.println("How many characters will me used in the password? (1 - 14)");
        int chars = in.nextInt();
        while ( count <= chars)
          {
              int password;
              password += rand.nextInt((126 - 35) + 1)+ 35;
              count++;
           }  
        System.out.println("Password: " + password);   
    }
   else if (selection ==5)
    {}
   else 
    {
        System.out.println(" ERROR: " + selection + " is not on the menu "); 
    }


}

変数 password が見つからないと言っていますが、これはループが原因ですか? 私は自分の仕事に遅れをとっているので、完全に困惑し、イライラしています

(このサイトで質問するのはこれが初めてで、フォーマットがおかしい場合は申し訳ありません)

4

1 に答える 1

2

問題はほとんどありません。

範囲

1つはスコープの概念です。各変数にはスコープがあり、変数にいつアクセスできるか、および変数がデータを保存する期間を定義します。

オプション 1 ~ 4 のそれぞれは、異なる方法で 1 つのパスワードを作成しており、これらの方法はそれぞれ、ループを使用してパスワードに文字を追加しています。したがって、各メソッドには、文字が追加されている間、パスワードを格納するための変数が必要です。一般に、構造は次のようになります。

if (selection == 1) {
   System.out.println("How many characters?");
   int chars = in.nextInt();
   StringBuilder password = new StringBuilder(chars);
   for (int count = 0; count < chars; ++count) {
     password.append((char) ('A' + rand.nextInt(26)));
   }
   System.out.println("Your password is: " + password);
} else if (selection == 2) {
   ...

ここで注意すべき点は、文字を追加するループの外でpassword変数を定義したことです。これはpassword、ループの反復ごとに の値が維持されることを意味します。

ただし、囲んでいるブロック ( if (selection == 1) { ...) が終了すると、変数passwordは存在しなくなり、その内容にアクセスできなくなります。これは、次のオプションを処理するブロック内で名前が付けられた別の変数を宣言できることを意味します。これは、最初のブロックpasswordの とはまったく関係ありません。password同じタイプである必要さえありません。

これがスコープの仕組みです。スコープで定義された変数は、その中にネストされたスコープから見えますが、スコープが終了すると、変数は存在しなくなります。

データ型

文字、数字、および記号 (一連の文字) を使用してパスワードを生成しようとしていると思います。Java でテキストを表現する方法はいくつかありますが、この問題に対する最も便利なオプションであるStringBuilder. キャラクターごと(char)にキャスト , を使用していることに気付くでしょう。append()これは、整数を加算した結果が整数になるためです。には、さまざまなデータ型を取るStringBuilder多くのメソッドがあります。append()を追加するcharと、その文字が追加されます。ただし、 を追加するintと、その数値を 10 進数で表す一連の文字が追加されます。にキャストすることcharで、正しいバージョンの を選択しappend()ます。

ファクタリング

多くのコードを繰り返します。より良い構造は、サブブロックから共通コードを「巻き上げる」ことにより、それを回避します。

int selection = in.nextInt();
System.out.println("How long?");
int chars = in.nextInt();
StringBuilder password = new StringBuilder(chars);
for (int count = 0; count < chars; ++count) {
  if (selection == 1) {
    password.append((char) ('A' + rand.nextInt(26));
  } else if (selection == 2) { 
    ...
  }
}
System.out.println("Your password is: " + password);

これにより、プロンプト、入力と出力の処理、変数の宣言と初期化などを繰り返す必要がなくなりpasswordます。コードが短くなり、バグを見つけた場合は、すべてではなく 1 か所で修正する可能性が高くなります。サポートされているオプション。

詳細を学習すると、ループに入る前に一度選択した別のオブジェクトにキャラクター生成を分解することで、さまざまなオプションを処理するより良い方法を見つけることができます。そうすれば、どのオプションが選択されたかを常に再評価する必要がなくなります。

于 2016-02-18T23:20:04.343 に答える