Генератор случайных паролей (ASCII - AP Computer Science) Java

Так что мой онлайн учитель 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 "); 
    }


}

Это говорит, что переменная пароль не может быть найдена, это из-за цикла? Я совершенно ошеломлен и расстроен, поскольку я отстаю в своей работе

(Это мой первый раз, когда я спрашиваю на этом сайте, извините, если его форматирование странное)

1 ответ

Есть несколько проблем.

Объем

Одним из них является понятие объема. Каждая переменная имеет область действия, которая определяет, когда к переменной можно получить доступ и как долго она хранит данные.

Каждый из ваших вариантов, 1-4, создает один пароль с другим методом, и каждый из этих методов использует цикл для добавления символов в пароль. Таким образом, каждый метод должен иметь переменную для хранения пароля при добавлении символов. В общем, структура может быть примерно такой:

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, последовательность символов, представляющих это числовое значение в десятичном виде, добавляется. Приведя к 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 переменная и т. д. Это делает ваш код короче, и если вы обнаружите ошибку, вы, скорее всего, исправите ее в одном месте, а не в каждой поддерживаемой опции.

Как узнать больше, вы найдете более эффективные способы обработки различных опций, включив генерацию персонажа в другой объект, который вы выбираете один раз, прежде чем войти в цикл. Таким образом, вам не нужно постоянно переоценивать, какой вариант был выбран.

Другие вопросы по тегам