我在这里有一些代码,我试图让用户输入一封信, 数字或符号,我让它们全部工作,但当我输入一封信时,它 “你已经输入了一封信”和“你已经输入了一封信” 符号“但事情是,我从来没有输入过符号,只是一个 信件。继承人看起来如何:
输入单个字符:
d
你输入了一封信!
您输入了符号!
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();
}
}
答案 0 :(得分:1)
您所希望的行为未反映在您编写的代码中。如果字符不是字母或不是数字,则语句!Character.isLetter(letter) || !Character.isDigit(letter)
的计算结果为true(因为||是或的逻辑运算符)。
回到您的示例,如果您键入“A”,Character.isDigit(letter)
的计算结果为false,那么!Character.isDigit(letter)
的计算结果为true,因此!Character.isLetter(letter) || !Character.isDigit(letter)
的计算结果为true。
根据您的示例,您的if块可以更好地编写为:
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!");
}
答案 1 :(得分:1)
De Morgan's laws再次罢工! ||
是你的罪魁祸首。对于您的案例,它必须是&&
。
答案 2 :(得分:0)
您的第二个if语句为true,因为!Character.isLetter(letter)
为真。 ||
是合乎逻辑的or
。这意味着如果其中一个陈述为真,则输入if子句。
所以只需更改最后一个if for else,你应该没问题。
答案 3 :(得分:0)
你的问题是,如果声明让我们逐步完成你的用例:
您输入D
。
isLetter('D')
为true
,因此会打印
isDigit('D')
为false
,因此无法打印
!isLetter('D') && !isDigit('D')
与
! true || ! false
(评估方法调用)与...相同
false || true
(评估!
)与...相同
true
(评估||
)以便打印。
要解决此问题,您可以将||
更改为&&
,或者将您已注释掉的else
条款放回原处。我个人认为else
条款是一个更好的解决方案,因为它清楚地传达了你的想法,即不是字母而不是数字必须是符号,而不必明确检查每一个。
答案 4 :(得分:0)
if(!Character.isLetter(letter) || !Character.isDigit(letter))
您使用的是OR而不是AND,所以字母" D"将在您检查!Character.isDigit(letter)
在最后一个if语句中,更改||到&&