分数游戏中的错误

问题描述

我需要一些帮助。我正在基于分数进行数学游戏。我无法解释为什么我的代码中有这个错误。我用正确答案和错误答案进行了测试。该消息框向我显示了相同的消息,即“正确!”每次我在答案框中输入一些数字都无所谓。

bool ok = true;
if (numitor1 == numitor2)
{
    numitor3 = numitor2;
    numarator3 = numarator1 + numarator2;
    if (numitor3 == numitor2 &&
    (numarator3 == numarator1 + numarator2))
    ok = true;
    else ok = false;

}
else 
{
    numitor3 = numitor1 * numitor2;
    numarator3 = numarator1 * numitor2 + numarator2 * numitor1;
    if (numarator3 > numitor3 && (numarator3 % numitor3 == 0))
    {
        numitor3 = 1;
        numarator3 = numarator3 / numitor3;
        if ((numitor3 == 1) && (numarator3 == numarator3 / numitor3))
            ok = true;
        else
            ok = false;
    }
    else if (numitor3 > numarator3 && (numitor3 % numarator3 == 0))
    {
        numitor3 = numitor3 / numarator3;
        numarator3 = 1;
        if ((numitor3 == numitor3 / numarator3) && numarator3 == 1)
            ok = true;
        else ok = false;
    }
    if (ok == 1)
        MessageBox.Show("Corect!");
    else
        MessageBox.Show("Incorect!");
}

2

3

1

解决方法

部分问题是您的逻辑有些奇怪。让我们看一下此代码块,例如:

if (numarator3 > numitor3 && (numarator3 % numitor3 == 0))
{
    numitor3 = 1;
    numarator3 = numarator3 / numitor3;
    if ((numitor3 == 1) && (numarator3 == numarator3 / numitor3))
        ok = true;
    else
        ok = false;
}

进入块时,我们设置numitor3 = 1。好的,看起来不错。但是然后我们设置numarator3 = numarator3 / numitor3。这实际上没有任何意义,因为numitor3仅被设置为1,并且除以1的任何数字都是其本身。因此,这两行应该颠倒。

接下来,我们有一个if的条件,它证明numitor3 == 1是正确的,因为我们只是将其设置为该值,所以我们再次将numarator3与自身除以{ {1}},将始终为1

这里的错误可能是我们正在比较刚设置的值而不是用户的答案。


帮助解决这些问题的一种方法是,将我们对正确答案的确定与对正确答案与用户输入的比较分开。

这是一种做到这一点的方法,除了重命名外,大部分都使用您的代码:

true

在您的主代码中,您可以像下面这样调用该函数:

/// <summary>
/// Takes in three fractional numbers that represent an addition
/// equation,and returns 'true' if the first fraction plus the 
/// second fraction equals the third fraction
/// </summary>
/// <param name="numerator1">Numerator of first fraction</param>
/// <param name="denominator1">Denominator of first fraction</param>
/// <param name="numerator2">Numerator of second fraction</param>
/// <param name="denominator2">Denominator of second fraction</param>
/// <param name="numerator3">Numerator of third fraction</param>
/// <param name="denominator3">Denominator of third fraction</param>
/// <returns>true if first plus second equals third,otherwise false</returns>
public static bool IsAnswerValid(int numerator1,int denominator1,int numerator2,int denominator2,int numerator3,int denominator3)
{
    // Determine the numerator and denominator for the correct answer
    int answerNumerator;
    int answerDenominator;

    if (denominator1 == denominator2)
    {
        answerDenominator = denominator2;
        answerNumerator = numerator1 + numerator2;
    }
    else
    {
        answerDenominator = denominator1 * denominator2;
        answerNumerator = numerator1 * denominator2 + numerator2 * denominator1;

        if (answerNumerator > answerDenominator &&
            answerNumerator % answerDenominator == 0)
        {
            answerNumerator = answerNumerator / answerDenominator;
            answerDenominator = 1;
        }
        else if (answerDenominator > answerNumerator &&
                 answerDenominator % answerNumerator == 0)
        {
            answerDenominator = answerDenominator / answerNumerator;
            answerNumerator = 1;
        }
    }

    // Compare answer numerator and denominator with the user's input
    bool isValid = denominator3 == answerDenominator &&
                   numerator3 == answerNumerator;

    return isValid;
}