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 "); 
    }


}

它说找不到变量密码,这是因为循环吗?当我在工作上落后时,我完全被难住和沮丧

(这是我第一次在这个网站上询问它的格式是否很奇怪)

4

1 回答 1

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()采用不同数据类型的方法。如果附加 a char,则附加该字符。但是,如果您附加一个int,则会附加一系列以十进制表示该数值的字符。通过转换为 a 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变量的声明和初始化等。它使您的代码更短,并且如果您发现一个错误,您更有可能在一个地方修复它,而不是在每个地方支持的选项。

随着了解的更多,您将找到更好的方法来处理不同的选项,方法是将角色生成分解到另一个对象中,然后在进入循环之前选择一次。这样您就不必不断地重新评估选择了哪个选项。

于 2016-02-18T23:20:04.343 回答