1

我的任务是为我正在做的一门课程创建一个小型 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 '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 语句中的逻辑导致它重复的位置。

任何帮助将不胜感激。

谢谢大家,

~山姆。

4

8 回答 8

1

不要单独使用 2 if,而是将它们设为if-elseif-else if

if(birthYear == 2013 || birthYear == 2001 || birthYear == 1989 || birthYear == 1977 || birthYear == 1965 || birthYear == 1953 || birthYear == 1941){
    ....
}
else if(birthYear != 2013 || birthYear != 2001 ||...){
....
}

因为,如果您给出 a if-if,则两条if语句都将被执行,而如果您给出 a if-else if,则只有在第一个语句失败else if时才会执行第二个语句。if

于 2013-04-04T10:52:04.647 回答
1

您可以选择以下解决方案之一:

1) 使用 && 运算符而不是 || 在第二个 if 语句中

或者

2) if(){}else{} // 卡马尔的解决方案

于 2013-04-04T11:00:56.567 回答
1

最好使用集合而不是多个 if( ... == ..|| ... == .. ||...)

像这样:

List<String> wrongYears = Arrays.asList("2013", "2001", "1989", "1977", ...);

并检查:

if(wrongYears.contains(birthYear)
{
 ...
}

并且几个月的数字相同

你的逻辑错误很明显

于 2013-04-04T11:05:20.860 回答
0

尽可能使用 else 语句,因此如果您测试 2013、2001 ... 之后,请使用 else 语句

于 2013-04-04T10:56:33.843 回答
0

您应该将第二个 if where everything is != 替换为简单的“else”,因为您已经检查了任何陈述是否为真。因此,简单地写 else 将在逻辑上相等并且更具可读性。

if(birthYear == 2013 || birthYear == 2001 || birthYear == 1989 || birthYear == 1977 || birthYear == 1965 || birthYear == 1953 || birthYear == 1941){
    ....
}
else { //not snake year
    ....
}
于 2013-04-04T10:57:18.863 回答
0

问题在于

if(birthYear != 2013 || birthYear != 2001 || birthYear != 1989 || birthYear != 1977 || birthYear != 1965 || birthYear != 1953 || birthYear != 1941

如果你仔细看,我们会确保表达式总是导致 try。一次最多只能有一个为假,所有其他都为真,因此最终它总是为真(困惑?)。假设出生年份是 2013 年,这使得第一个条件 (birthyear!=2013) 为假,但所有其他条件都为真。举任何其他例子,你就会明白我想说什么。

实际上,一个小的修改将为您修复代码。您已经检查过if (birthyear is in given years),没有任何条件的简单 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);
        }
}
于 2013-04-04T10:58:05.393 回答
0

第二个 if 部分是错误的:

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) .

于 2013-04-04T11:00:05.720 回答
0

答案在你的条件下。

认为dob = 1

if(dob == 1 || dob == 2 || dob == 3 ...)

将评估为真,因为 dob == 1

if (dob != 1 || dob != 2 || dob != 3 ...)

也将评估为真,因为 dob != 2

您要使用的是AND/&&而不是OR/||

于 2013-04-04T11:00:57.243 回答