Java if语句逻辑
我的任务是为我正在学习的一门课程创建一个小型java程序,我对以下代码块有一些问题:Java if语句逻辑,java,if-statement,logic,Java,If Statement,Logic,我的任务是为我正在学习的一门课程创建一个小型java程序,我对以下代码块有一些问题: System.out.println("Please enter your first name:"); userName = sc.nextLine(); System.out.println("What year were you born in?"); birthYear = sc.nextInt(); System.out.println("In the
System.out.println("Please enter your first name:");
userName = sc.nextLine();
System.out.println("What year were you born in?");
birthYear = sc.nextInt();
System.out.println("In the 'dd.mm' format, what are the day and month of your birth?");
dayMonth = sc.nextDouble();
//Cast the user input of type double to an int for the day of Birth
dayOfBirth = dayMonth.intValue();
//Cast the double value for month and cast it to an int
dayMonth = dayMonth - dayOfBirth;
dayMonth = dayMonth * 100;
dayMonth = Math.rint(dayMonth);
monthOfBirth = dayMonth.intValue();
if(birthYear == 2013 || birthYear == 2001 || birthYear == 1989 || birthYear == 1977 || birthYear == 1965 || birthYear == 1953 || birthYear == 1941)
{
if(monthOfBirth == 9 || monthOfBirth == 10 || monthOfBirth == 11)
{
System.out.println(userName + " was born during Spring on " + monthOfBirthName + " " + dayOfBirth + " in Snake year " + birthYear);
}
else if(monthOfBirth != 9 || monthOfBirth != 10 || monthOfBirth != 11)
{
System.out.println(userName + " was born on " + monthOfBirthName + " " + dayOfBirth + " in Snake year " + birthYear);
}
}
if(birthYear != 2013 || birthYear != 2001 || birthYear != 1989 || birthYear != 1977 || birthYear != 1965 || birthYear != 1953 || birthYear != 1941)
{
if(monthOfBirth == 9 || monthOfBirth == 10 || monthOfBirth == 11)
{
System.out.println(userName + " was born during Spring on " + monthOfBirthName + " " + dayOfBirth + " " + birthYear);
}
else if(monthOfBirth != 9 || monthOfBirth != 10 || monthOfBirth != 11)
{
System.out.println(userName + " was born on " + monthOfBirthName + " " + dayOfBirth + " " + birthYear);
}
}
然而,我的输出结果如下:
Please enter your first name:
Samuel
What year were you born in?
1977
In the 'dd.mm' format, what are the day and month of your birth?
09.09
Samuel was born during Spring on September 9 in Snake year 1977
Samuel was born during Spring on September 9
我显然不希望重复输出,但是我很难看到if语句中的逻辑在哪里导致重复输出
任何帮助都将不胜感激
谢谢大家
~Sam.不要单独使用2个
if
,而是将它们设置为if else
或if else if
if(birthYear == 2013 || birthYear == 2001 || birthYear == 1989 || birthYear == 1977 || birthYear == 1965 || birthYear == 1953 || birthYear == 1941){
....
}
else if(birthYear != 2013 || birthYear != 2001 ||...){
....
}
因为,如果你给出一个
if
,两个if
语句都将被执行,而如果你给出一个if-else-if
,第二个else-if
语句只有在第一个if
语句失败的情况下才会被执行。尽可能使用else语句,因此如果你测试2013年、2001年。。。
在后面,做一个else语句如果一切都在哪里,则应该替换第二个语句!=使用简单的“else”,因为您已经检查了其中的任何语句是否为真。因此,简单地编写else在逻辑上是平等的,并且可读性更高
if(birthYear == 2013 || birthYear == 2001 || birthYear == 1989 || birthYear == 1977 || birthYear == 1965 || birthYear == 1953 || birthYear == 1941){
....
}
else { //not snake year
....
}
问题在于
if(birthYear != 2013 || birthYear != 2001 || birthYear != 1989 || birthYear != 1977 || birthYear != 1965 || birthYear != 1953 || birthYear != 1941
如果您仔细观察,我们将确保表达式总是导致try。一次最多只能有一个是假的,所有其他的都是真的,因此最后它总是真的(困惑?)。假设出生年份是2013年,这使得第一个条件(生日!=2013)为假,但所有其他条件都为真。再举个例子,你就会明白我想说什么了
实际上,一个小小的修改就能为您修复代码。您已经检查了如果(生日在给定年份中)
,那么一个没有任何条件的简单else将适用于您
if(birthYear == 2013 || birthYear == 2001 || birthYear == 1989 || birthYear == 1977 || birthYear == 1965 || birthYear == 1953 || birthYear == 1941)
{
if(monthOfBirth == 9 || monthOfBirth == 10 || monthOfBirth == 11)
{
System.out.println(userName + " was born during Spring on " + monthOfBirthName + " " + dayOfBirth + " in Snake year " + birthYear);
}
else// NO CHECK REQUIRED NOW
{
System.out.println(userName + " was born on " + monthOfBirthName + " " + dayOfBirth + " in Snake year " + birthYear);
}
}
//SEE THIS
else{
if(monthOfBirth == 9 || monthOfBirth == 10 || monthOfBirth == 11)
{
System.out.println(userName + " was born during Spring on " + monthOfBirthName + " " + dayOfBirth + " " + birthYear);
}
//AND
else
{
System.out.println(userName + " was born on " + monthOfBirthName + " " + dayOfBirth + " " + birthYear);
}
}
如果第二部分错误:
if(birthYear != 2013 || birthYear != 2001 || ....)
因为它总是真实的。
只需查看一个视图示例:
如果你有2012年,而不是2013年,那么你的表达就变成了真。
如果您选择2013年,则第一部分为假,但当您评估2013年时!=2001年,它再次成为现实
你可能想要的是
if(birthYear == 2013 || birthYear == 2001 || birthYear == 1989 || birthYear == 1977 || birthYear == 1965 || birthYear == 1953 || birthYear == 1941)
{
.....
}
else {
.....
}
顺便说一下:如果要对表达式求反(x==A | | x==B | | x==C),则逻辑求反为(x!=A&&x!=B&&x!=C)。您可以选择以下解决方案之一: 1) 在第二个if语句中使用&&运算符而不是| | 或
2) if(){}else{}//Kamal的解答案在你的条件中 假设
dob=1
if(dob == 1 || dob == 2 || dob == 3 ...)
将计算为true,因为dob==1
if (dob != 1 || dob != 2 || dob != 3 ...)
也将计算为true,因为dob!=二,
您想要使用的是
和/&&
,而不是或/| |更好地使用集合,而不是多个if(…==…=…| |…==…| |…)
像这样:
List<String> wrongYears = Arrays.asList("2013", "2001", "1989", "1977", ...);
几个月的数字都是一样的
您的逻辑错误很明显第二个sysout
是第二个if
执行的结果,即使执行了if
。因此,答案是肯定的。OP希望避免打印第二个if
。根据我的回答,else if
可以替换为else
。如果出生年不是龙年,那么就不是龙年。不需要再核对所有年份。不要重复你自己的话。@AlexanderBrevig-我在回答的第一行已经提到了这一点。但如果
,则不能假定OP在第二个处停止。如果他后来有了龙年
,而没有龙年
,那该怎么办呢?我喜欢这个网站。你们真是帮了大忙。感谢您的解决方案,该程序现在运行良好。:)对于非特殊年份的每一年,仅使用else
始终是正确的选择。(我只是读了你的第一个初步答案,我看到你现在已经更新了,虽然很可能是你当时也提到了。我错了)嗨,山姆,你和我哥哥的名字一模一样!不要把这当作侮辱,而是建设性的批评。您需要更好地格式化代码。查看一个真正的样式:。如果使用eclipse,还可以使用CTRL-SHIFT-F
自动格式化。它节省了很多时间!许多编辑器可以为您自动设置格式。调查一下,兄弟!;)
if(wrongYears.contains(birthYear)
{
...
}