所以我的在线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 ");
}
}
它说无法找到变量密码,这是因为循环吗?因为我落后于工作,我感到非常难过和沮丧
(这是我第一次在这个网站上询问,如果格式化的话很抱歉)
答案 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
变量的提示,输入和输出处理,声明和初始化等。它会缩短您的代码,如果您发现错误,则更有可能修复它在一个地方,而不是在每个支持的选项中。
了解更多信息,您可以找到更好的方法来处理不同的选项,方法是在进入循环之前将角色生成分解为您选择的另一个对象。这样您就不必经常重新评估选择了哪个选项。