【问题标题】:Checking if a letter == a specified letter in Java检查字母是否== Java中的指定字母
【发布时间】:2014-10-16 22:11:24
【问题描述】:

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

【问题讨论】:

  • letterchar 还是 String
  • 您是否尝试过使用等号?例如: letter.equals("A");?!
  • @TiagoBarreto 我应该在哪个部分忘记等号?
  • 这怎么行?无论如何,像letter = letter 这样的语句没有任何用处,但我不知道你是否试图通过这个语句完成其他事情,或者有其他原因。
  • (letter &gt;= 'A' &amp;&amp; letter &lt;= 'E') || (letter &gt;= 'a' &amp;&amp; letter &lt;= 'e')

标签: java variables while-loop


【解决方案1】:

我不知道具体是怎么做到的。但是,处理无效条目的代码肯定存在问题。

如果你想比较letter看它是否等于两个或多个字符之一,你可以说

if (letter == 'A' || letter == 'a')

但是,如果您想确保它等于任何,除了更改==之外,您还必须将||更改为&amp;&amp;!=

if (letter != 'A' && letter != 'a')

原因是该语言会从字面上理解您的代码。在英语中,我们可能会说“如果字母不是 A 或 B 或 C”。但是在一个程序中,如果你说

if (letter != 'A' || letter != 'a')

假设letter'A'。现在第一个操作数letter != 'A'false。但是第二个操作数letter != 'a'true,因为'A' != 'a'。对于||,如果任一操作数为true,则整个结果为true。事实上,无论letter 是什么,这个if 语句都会是true。那不是你想要的。所以要么使用&amp;&amp;,要么这样写:

if (!(letter == 'A' || letter == 'a'))

通过将整个|| 放在括号中并用! 否定它,您肯定会得到相反的结果

if (letter == 'A' || letter == 'a')

更多: 回答 cmets 中的问题:您处于无限循环中的原因是:您向用户询问一封信。然后你说,基本上,

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

while 的工作方式是这样的:它检查条件是否为真。如果它是假的,它会跳过while 的末尾,到达上面的 A 点。如果为真,则执行循环中的所有代码,然后返回顶部,再次检查条件。

因此,如果用户输入了无效字母,程序将跳过整个循环,到达点 A。它永远不会到达您告诉用户重试的代码。如果这封信是有效的,程序会执行你所有的逻辑来计算税收等等——然后它回到顶部,因为letter没有改变,条件是仍然正确,它再次循环,又一次,...

看起来您希望循环只是为了让用户在第一个字母无效时输入另一个字母。既然是这种情况,您需要一个while 循环,当字母有效时停止,而当字母无效时继续。这意味着您需要一个while 条件来测试该字母是否无效,以便您在它有效时退出循环——然后,在您退出循环后,您想要执行所有税务逻辑,这意味着计算必须在while 循环结束后进行。比如:

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");
letter = in.next().charAt(0);
while (letter!='A'&&letter!='a'&&letter!='B'...) { // WHILE THE LETTER IS INVALID 
    System.out.println("You must enter a letter between A and E.");
    letter = in.next().charAt(0);
}
NOW DO ALL THE COMPUTATION

我试图以一种方式回答这个问题,向您展示为什么您的代码无法正常工作,以及您可以进行哪些小的更改来修复它。但请阅读其他建议,了解其他改进代码的方法。

【讨论】:

    【解决方案2】:

    里面有一些不必要的代码。我会首先通过编写一个处理用户输入和验证的方法来清理:

    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】:

      你最好使用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 or B)" 与 "(not A) and (not B)" 相同。

      或者

      !(A || B)(!A) &amp;&amp; (!B) 相同

      所以letter == 'A' || letter == 'a' ...的否定是letter != 'A' &amp;&amp; letter != 'a' ...

      【讨论】:

        【解决方案4】:

        有一种简单的方法可以解决您的问题。 首先,您可以将字母转换为大写或小写,而不是在检查中重复。 其次使用 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                                                                                 
          }
        
        }
        

        【讨论】:

        • 我试过了,但又出现只检查一次的问题
        • 是的,当然。我只给你一些改进,而不是整个解决方案。当然你必须添加一个while循环等。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-04-30
        • 1970-01-01
        • 2012-04-23
        • 2011-07-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多