我正在尝试检查以确保用户输入的字母介于A和E之间。我尝试了几种不同的方式,但似乎没有任何效果。任何帮助,将不胜感激。主要问题是,它只检查一次。在它告诉我之后我需要在A和E之间输入一个字母,并且我放了g,它允许程序继续运行。
System.out.println("Please enter a letter indicating your tax category: A is no tax deduction, B is 10% of gross pay, \nC is 20% of gross pay, D is 29% of gross pay, E is 35% of gross pay");
//use ASCII of letters to compare
int A_ASCII = (int)'A';
int E_ASCII = (int)'E';
int ASCIIletter = 0;
// ask user for letter
letter = in.next().charAt(0);
// convert letter to uppercase and find ASCII value
if(Character.isLetter(letter)){
letter = Character.toUpperCase(letter);
ASCIIletter = (int) letter;
while (ASCIIletter>=A_ASCII&&ASCIIletter<=E_ASCII) {
if(ASCIIletter>=A_ASCII&&ASCIIletter<=E_ASCII){
if (ASCIIletter=='A'||ASCIIletter=='a'){
letter = letter;
gross = gross;
}
else if (ASCIIletter=='B'||ASCIIletter=='b'){
letter = letter;
deduct = (gross*0.1);
tax = gross - deduct;
}
else if (ASCIIletter=='C'||ASCIIletter=='c'){
letter = letter;
deduct = (gross*0.2);
tax = gross - deduct;
}
else if (ASCIIletter=='D'||ASCIIletter=='d'){
letter = letter;
deduct = (gross*0.29);
tax = gross - deduct;
}
else if (ASCIIletter=='E'||ASCIIletter=='e'){
letter = letter;
deduct = (gross*0.35);
tax = gross - deduct;
}
}
else {
System.out.println("You must enter a letter between A and E.");
letter = in.next().charAt(0);
}
}
答案 0 :(得分:1)
我不知道具体如何不起作用。但是,处理无效条目的代码肯定存在问题。
如果您想比较letter
以查看它是否等于两个或更多字符中的一个,您可以说
if (letter == 'A' || letter == 'a')
但是,如果您要确保 ,除了将||
更改为&&
:
==
原因是该语言将按字面意思采用您的代码。在英语中,我们可能会说“如果字母不是A或B或C”。但是在一个程序中,如果你说
!=
假设if (letter != 'A' && letter != 'a')
为if (letter != 'A' || letter != 'a')
。现在,第一个操作数letter
为'A'
。但第二个操作数letter != 'A'
为false
,因为letter != 'a'
。对于true
,如果任一操作数为'A' != 'a'
,则整个结果为||
。实际上,无论true
是什么,此true
语句都为if
。那不是你想要的。所以要么使用true
,要么像这样写:
letter
将整个&&
括在括号中并用if (!(letter == 'A' || letter == 'a'))
取消它,你可以保证得到相反的结果
||
更多信息:要回答评论中的问题:您处于无限循环中的原因是:您要求用户提供一封信。然后你说,基本上,
!
if (letter == 'A' || letter == 'a')
的工作方式是:它检查条件是否为真。如果它是假的,它跳过while (letter [is one of the valid ones]) {
if (letter is A) {
...
}
else if (letter is B) {
...
} ... then all the other letters
else
... try to get the user to enter another letter ------B
}
[past the end of the while] ------A
的末尾,到上面的A点。如果是真的,它会执行循环中的所有代码,然后返回到顶部,并再次检查条件。
因此,如果用户输入了无效的字母,程序将跳过整个循环,转到A点。它将永远不会到达您告诉用户再次尝试的代码。如果该字母有效,该程序将执行您计算税收的所有逻辑 - ,然后返回到顶部,并且由于while
未更改,条件仍然是正确的,它再次循环,再次,......
如果第一个字母无效,看起来你想让循环让用户输入另一个字母。既然如此,那么当字母有效时,你需要一个停止的while
循环,当字母无效时,继续。这意味着您需要letter
条件来测试字母是否无效,以便在有效时退出循环 - 然后,在退出循环后,您希望执行所有税务逻辑,这意味着计算必须在 while
循环结束后发生。类似的东西:
while
我试图以一种方式回答这个问题,这种方式可以说明您的代码无法正常工作的原因,以及您可以对其进行哪些小修改。但请阅读其他建议,了解其他可以改进代码的方法。
答案 1 :(得分:1)
您最好使用switch-case
声明:
char letter = in.next().charAt(0);
boolean isValid = true;
switch (letter) {
case 'A': case 'a':
break;
case 'B': case 'b':
deduct = gross*0.1;
break;
case 'C': case 'c':
deduct = gross*0.2;
break;
case 'D': case 'd':
deduct = gross*0.29;
break;
case 'E': case 'e':
deduct = gross*0.35;
break;
default:
System.out.println("You must enter a letter between A and E.");
isValid = false;
break;
}
if (isValid) {
tax = gross - deduct;
}
关于您的考试letter != 'A' || letter != 'a'
...试图否定letter == 'A' || letter == 'a'
...,请记住De Morgan's laws:
“not(A或B)”与“(不是A)和(不是B)”相同。
或者
相同
!(A || B)
与(!A) && (!B)
因此letter == 'A' || letter == 'a'
...的否定是letter != 'A' && letter != 'a'
...
答案 2 :(得分:1)
那里有一些不必要的代码。我首先要编写一个处理用户输入和验证的方法来清理它:
private static char readTax(Scanner in) {
while (true) {
System.out.println("Please enter a letter indicating your tax category: A is no tax deduction, B is 10% of gross pay, \nC is 20% of gross pay, D is 29% of gross pay, E is 35% of gross pay");
char letter = in.next().charAt(0);
letter = Character.toUpperCase(letter);
if (letter >= 'A' && letter <= 'E')
return letter;
}
return ' '; // needed to compile
}
除非用户输入有效的字母,否则此方法不会返回,并以大写字母返回。
一旦你完成并使用它,你就可以通过删除主循环来清理你的主代码(因为你知道你有有效的输入),如下所示:
char letter = readTax(in);
double tax = 0; // tax for 'A'
switch (letter) {
case 'B': tax = 0.1; break;
case 'C': tax = 0.2; break;
case 'D': tax = 0.29; break;
case 'E': tax = 0.35;
}
deduct = gross * tax;
gross -= deduct;
答案 3 :(得分:0)
有一种简单的方法可以解决您的问题。 首先,您可以将字母转换为大写或小写,而不是在检查中没有重复。 其次使用ASCII表示来比较'A'和'E':
System.out.println("Please enter a letter indicating your tax category: A is no tax deduction, B is 10% of gross pay, \nC is 20% of gross pay, D is 29% of gross pay, E is 35% of gross pay");
int A_ASCII = (int)'A';
int E_ASCII = (int)'E';
int letterInASCII = -1;
letter = in.next().charAt(0);
if(Character.isLetter(letter)){
letter = Character.toUpperCase(letter);
letterInASCII = (int) letter;
if(letterInASCII >= A_ASCII && letterInASCII <= E_ASCII){ // your letter is between A and E
// do your stuff here
}else{ // your letter is not between A and E
// do your stuff here
}
}