检查字母== Java中的指定字母

时间:2014-10-16 22:11:25

标签: java variables while-loop

我正在尝试检查以确保用户输入的字母介于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);
}
}

4 个答案:

答案 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                                                                                 
  }

}