随机密码生成器(ASCII - AP计算机科学)Java

时间:2016-02-17 14:28:10

标签: java passwords ascii computer-science password-generator

所以我的在线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 个答案:

答案 0 :(得分:2)

几乎没有问题。

范围

一个是范围的概念。每个变量都有一个范围,它定义何时可以访问变量以及存储数据的时间。

您的每个选项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()的正确版本。

你重复了很多代码。一个更好的结构将避免这种情况,通过&#34;吊装&#34;子块中的公共代码。

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变量的提示,输入和输出处理,声明和初始化等。它会缩短您的代码,如果您发现错误,则更有可能修复它在一个地方,而不是在每个支持的选项中。

了解更多信息,您可以找到更好的方法来处理不同的选项,方法是在进入循环之前将角色生成分解为您选择的另一个对象。这样您就不必经常重新评估选择了哪个选项。