2017-10-12 87 views
0

我有一些代码在这里,我试图让用户输入一个字母, 数字或符号,我让他们都工作,但是当我输入一个字母,它打印出“你已经输入了一个字母”和“你已经输入了一个 符号”。但是事情是,我从来没有在第一个地方输入一个符号,只是一个 字母。继承人如何看起来:程序停止打印这两个邮件

输入一个字符:

d

你所输入的字母!

您输入了SYMBOL!

import static java.lang.System.*; 
import java.util.*; 

public class Java1304 
{ 
    public static void main(String[] args) 
    { 
    new Problem(); 
    } 
} 

class Problem 
{ 
    char letter; 

    public Problem() 
    { 
     input(); 
     process(); 
     output(); 
    } 

    void input() 
    { 
     Scanner scan = new Scanner(in); 

     out.println("Enter a SINGLE character:"); 
     letter = scan.nextLine().charAt(0); 
    } 

    void process() 
    { 
     if(Character.isLetter(letter)) 
     { 
      out.println("You entered a LETTER!"); 
     } 
     if(Character.isDigit(letter)) 
     { 
      out.println("You entered a NUMBER!"); 
     } 
     if(!Character.isLetter(letter) || !Character.isDigit(letter)) 
     //else 
      out.println("You entered a SYMBOL!"); 

    } 

    void output() 
    { 
     out.println(); 
     out.println(); 
     out.println(); 

    } 
} 

回答

1

您希望的行为未反映在您所写的代码中。如果字符不是字母或不是数字(因为||是or的逻辑运算符),则语句!Character.isLetter(letter) || !Character.isDigit(letter)的计算结果为true。回到您的示例,如果您键入“A”,Character.isDigit(letter)的计算结果为false,因此!Character.isDigit(letter)的计算结果为true,因此!Character.isLetter(letter) || !Character.isDigit(letter)的计算结果为true。

根据你的榜样,你如果块可以更好地写为:

if(Character.isLetter(letter)){ 
     out.println("You entered a LETTER!"); 
} else if(Character.isDigit(letter)){ 
     out.println("You entered a NUMBER!"); 
} else { 
     out.println("You entered a SYMBOL!"); 
} 
0

你的第二个,如果因为!Character.isLetter(letter)是真实的说法是正确的。 ||是逻辑or。这意味着如果其中一个陈述是真实的,它将进入if子句。

所以,只要改变最后一个,如果对于别人,你应该没问题。

0

De Morgan's laws再次罢工! ||是你的罪魁祸首。它需要为您的案件&&

0

你的问题是,如果最后让陈述书的通过你的使用情况步骤有:

你进入D

isLetter('D')true所以它打印

isDigit('D')false使得不打印

!isLetter('D') && !isDigit('D')相同

! true || ! false(评价方法调用),其是相同 false || true (评估!'s),其与 true相同(评估||)所以它打印。

要解决该问题,您可以将||更改为&&,或将您注释掉的else条款恢复原样。我个人认为else条款是一个更好的解决方案,因为它明确表达了你的想法,即不是一个字母而不是一个数字必须是一个符号,而不必明确检查每一个。

0
if(!Character.isLetter(letter) || !Character.isDigit(letter)) 

您已使用或代替AND,所以当你检查!Character.isDigit(letter)

在过去的if语句,改变字母“d”将传递||到& &。