当总和值为“8”时的结果应该是偶数,但它说奇数 [更新:“else”分支似乎不起作用,当总和为奇数时,它是 nt wrkg] [已关闭]

Result when the sum value is '8' should be even, yet it says odd [Update : the 'else' branch seems not working, when the sum is odd, it's nt wrkg] [closed]

提问人:Jabri Juhinin 提问时间:11/18/2021 最后编辑:Jabri Juhinin 更新时间:11/20/2021 访问量:114

问:


这个问题是由一个错别字或一个无法再重现的问题引起的。虽然类似的问题可能在这里成为主题,但这个问题的解决方式不太可能帮助未来的读者。

2年前关闭。

我已经看了几个小时我写的代码了。我尝试查看其他人的解决方案,比较并应用于我的代码,但我的代码仍然无法正常工作。我尝试检查缩进,更改 with ,但我的代码仍然无法按预期工作。你能看看我的代码吗?name2.equals()name2.equalsIgnoreCase()

import java.util.*;
import java.util.Scanner;

public class OddsAndEvens {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        System.out.println("Let's play a game called \"Odds and Evens\"");
        System.out.println("What is your name? ");
        String name = input.next();
        System.out.println("Hi "+name+", which do you choose? (O)dds or (E)vens?");
        String name2 = input.next();

        if (name2.equals("O")) {
            System.out.println(name+" has picked "+name2+"! The computer will be evens.");
        } else if (name2.equals("E")) {
            System.out.println(name+" has picked "+name2+"! The computer will be odds.");
            }
        else {
            System.out.println("Please pick either odds or evens!");
        }
        
        System.out.println("-----------------------------------------------------------");
        System.out.println("How many \"fingers\" do you put out?");
        int userNumber = input.nextInt();

        Random rand = new Random();
        int computer = rand.nextInt(6);
        System.out.println("The computer plays number "+computer);
        System.out.println("-----------------------------------------------------------");
        int sum = computer + userNumber;
        System.out.println("The sum is "+ sum);

        boolean oddOrEven = sum % 2 == 0;

        if (oddOrEven) {
            if (name2.equals("E")) {
                System.out.println(sum+" is even..!");
                System.out.println(name+" wins!");
            } else if (name2.equals("O")) {
                System.out.println(sum+" is odd..!");
                System.out.println("The computer wins!");
            }
        else {
                System.out.println(sum+" is odd..!");
                if (name2.equals("E")) {
                    System.out.println("The computer wins!");
                } else if (name2.equals("O")) {
                    System.out.println(name+" wins!");
                 }
            }
        }
        System.out.println("-----------------------------------------------------------");
    }
}
java if 语句 逻辑

评论

4赞 11/18/2021
真正的分支既有 和 在其中,这不可能是对的。你把嵌套的 if 弄混了。if (oddOrEven) {sum+" is even"sum+" is odd"
2赞 MC Emperor 11/18/2021
此外,您的一些变量名称至少令人困惑。变量是 if is even,所以它应该重命名为类似 .oddOrEventruesumsumIsEven
3赞 MC Emperor 11/18/2021
你的对齐方式仍然很糟糕。仔细看看你的区块属于哪个分支。else
0赞 Zabuzard 11/18/2021
生活建议:使用IDE的“自动格式化”功能,那么这些事情就不会再发生在你身上了。

答:

2赞 maloomeister 11/18/2021 #1

在评估游戏结果时,您会遇到多个问题。

缩进和大括号

首先,您在整个结构中放置大括号是错误的。这意味着您的块属于(如果格式正确)内部子句。(另一个答案在这里更详细,因此我不会进一步详细说明这个问题)ifelseif (name2.equals("E"))

要解决此问题,请在整个外部子句的末尾添加一个右大括号,并删除一个大括号。elseif

打印不正确的输出

此外,您的块中有一个问题:if

if (oddOrEven) {
    ...
}

是在游戏结果为“数”的情况下执行的代码。(你绝对应该重命名你的 ,例如,因为你只是把自己和当前的变量名混淆了)...booleanisEven

因此,详细地,以下代码片段中评论了该问题:

if (name2.equals("E")) {
    System.out.println(sum+" is even..!");
    System.out.println(name+" wins!");
} else if (name2.equals("O")) {
    System.out.println(sum+" is odd..!"); // <--- this is incorrect
    System.out.println("The computer wins!");
}

所以你实际上在做正确的事情,但你的输出是不正确的。 根据以下逻辑更新此代码片段:else

System.out.println(sum+" is even..!");
if (name2.equals("E")) {
    System.out.println(name+" wins!");
} else if (name2.equals("O")) {
    System.out.println("The computer wins!");
}

结论

将所有建议汇总到一个代码片段中:

if (isEven) {
    System.out.println(sum + " is even..!");
    if (name2.equals("E")) {
        System.out.println(name + " wins!");
    } else if (name2.equals("O")) {
        System.out.println("The computer wins!");
    }
} else {
    System.out.println(sum + " is odd..!");
    if (name2.equals("E")) {
        System.out.println("The computer wins!");
    } else if (name2.equals("O")) {
        System.out.println(name + " wins!");
    }
}

评论

0赞 Jabri Juhinin 11/20/2021
感谢您提出的解决方案。我已将其应用于我的代码。它运行良好,但是当添加的数字为奇数时,似乎存在一个问题。“else”分支似乎未执行。我无法找到解决方案。
0赞 maloomeister 11/22/2021
@JabriJuhinin在这种情况下,请随时提出新问题,并附上您更新的代码和问题描述。
4赞 MC Emperor 11/18/2021 #2

仔细看看你的缩进:

if (oddOrEven) {
    if (name2.equals("E")) {
        System.out.println(sum+" is even..!");
        System.out.println(name+" wins!");
    }
else if (name2.equals("O")) {
        System.out.println(sum+" is odd..!");
        System.out.println("The computer wins!");
    }
else {
        System.out.println(sum+" is odd..!");
        if (name2.equals("E")) {
            System.out.println("The computer wins!");
        } else if (name2.equals("O")) {
            System.out.println(name+" wins!");
            }
    }
}

如果我们正确地重新缩进它,问题就会变得更加明显:

if (oddOrEven) {
    if (name2.equals("E")) {
        System.out.println(sum+" is even..!");
        System.out.println(name+" wins!");
    }
    else if (name2.equals("O")) {
        System.out.println(sum+" is odd..!");
        System.out.println("The computer wins!");
    }
    else {
        System.out.println(sum+" is odd..!");
        if (name2.equals("E")) {
            System.out.println("The computer wins!");
        }
        else if (name2.equals("O")) {
            System.out.println(name+" wins!");
        }
    }
}

仅当 既不是 也不是 时,才执行分支。然后在分支中,表示为奇数,但当总和为偶数时,父语句为 为 true。然后再次与 和 进行比较,但这已经完成了。elsename2EOelsesumifif (oddOrEven)name2EO

这一切都非常令人困惑。你应该停止写一个很长的方法,因为这些东西很容易混淆,而是利用方法

例如,您可以创建一个方法,该方法同时接受计算机输入和用户输入,如果总和为偶数,则返回:true

public static boolean isEven(int userInput, int computerInput) {
    int sum = userInput + computerInput;
    boolean sumIsEven = sum % 2 == 0;
    return sumIsEven;
}

然后,您可以创建另一个方法,该方法接受选定的奇偶校验(奇数或偶数)和用户输入,然后返回用户是否获胜。它也可以利用上述方法:

// Capture the selected parity and set the boolean to the corresponding
// value.
// If the user enters neither 'E' or 'O', the program should not continue,
// instead, the user should be asked again to enter a correct parity.
boolean userSelectedParityIsEven = ...;

Random r = new Random();
int computer = rand.nextInt(6);
// Capture user-provided number here.
int userInput = ...;

boolean sumIsEven = isEven(userInput, computer);
if (sumIsEven) {
    System.out.println("The sum is even!");
}
else {
    System.out.println("The sum is odd!");
}

boolean match = (sumIsEven == userSelectedParityIsEven);
if (match) {
    System.out.println(name + " wins!");
}
else {
    System.out.println("The computer wins!");
}