2

次のコードを見てください

namespace Funny
{
    class QuesionsAndAnswers
    {
        private double firstNumber;
        private double secondNumber;
        private double userAnswer;
        private double computerAnswer;

        private string operators;

        private bool answerCorrect;
        private bool enableDouble;

        private double[] listOfNumbers;
        private string[] listOfOperators;

        private Random randomizer;

        private static QuesionsAndAnswers qa;

        private QuesionsAndAnswers()
        {
            randomizer = new Random();

            listOfNumbers = new double[] { 1,2,3,4,5,6,7,8,9 };
            listOfOperators = new string[] { "+", "-", "*", "/" };
        }

        public static QuesionsAndAnswers getQuesionsandAnswersInstance()
        {
            if (qa == null)
                qa = new QuesionsAndAnswers();
             return qa;
        }

        public string generateQuestions()
        {
            string result = "";

            operators = listOfOperators[randomizer.Next(listOfOperators.Length)];
            firstNumber = listOfNumbers[randomizer.Next(listOfNumbers.Length)];
            secondNumber = listOfNumbers[randomizer.Next(listOfNumbers.Length)];

            if ((operators.Equals("/")) && (enableDouble == false))
            {
                while (firstNumber % secondNumber == 0)
                {
                    firstNumber = listOfNumbers[randomizer.Next(listOfNumbers.Length)];
                }
                result = firstNumber + operators + secondNumber;
            }
            else if (operators.Equals("-") && (firstNumber<secondNumber))
            {
                while (firstNumber > secondNumber)
                {
                    firstNumber = listOfNumbers[randomizer.Next(listOfNumbers.Length)];
                    secondNumber = listOfNumbers[randomizer.Next(listOfNumbers.Length)];
                }
                result = firstNumber + operators + secondNumber;
            }
            return result;
        }

        public void setDoubleAnswers(bool check)
        {
            enableDouble = check;
        }
    }
}

ここでは、generateQuestions() メソッドで、いくつかの数学の問題を生成しようとしています。

If operator in "-" and if firstNumber < secondNumber, then 番号 (最初の番号と 2 番目の番号) を再生成して、答えがマイナス値にならないようにする必要があります。

And, if the operator is "/" and the boolean value is false, it should regenerate numbers again to make sure the the answer (which means the calculation, for an example 2/1 = 2) doesn't contain any floating points (which means it should not generate questions like 2/3, because the answer contains floating points).

In my attempt, both above are not happening. It still generates unexpected answers or, sometimes nothing. Why is that? Please help

Please note, I am a Java developer and this is my first major C# project.

4

6 に答える 6

6

まあ、キャッチしているエッジケースを除いresult"".

そして、あなたの両方のwhileステートメントは間違っています。そのはず:

while ((firstNumber % secondNumber) != 0)
:
while (firstNumber < secondNumber)

ただし、効率のために、そのプロパティが保持されるペアの長い実行を取得する可能性whileがあるため、その秒は実行しません。数字が間違っている場合は、それらを交換してください。

そして、数の選択から残りがゼロになる貴重なケースがほとんどありません(、 、 、 、 、および9/38/48/26/3思うに6/24/2網羅的なリストです)。より拡張された方程式のセットが必要な場合は、逆の方法で 2 つの数値を選択してmutiplyし、最初の数値を結果と交換します。M/MN/1

たとえば、a = 3との 2 つの数値が与えられた場合b = 7、単純に次のようにします。

a = a * b;

そして、あなたはa = 21, b = 7整数乗数を与え、方程式を提供することが保証されています"21 / 7".


したがって、これ(疑似コード)は私が始めるものです:

# Get the random values.

op = random_from ("+-/*")
n1 = random_from ("123456789")
n2 = random_from ("123456789")

# For subtraction, make sure n1 >= n2.

if op = "-" and n1 < n2:
    tmp = n1;
    n1 = n2;
    n2 = tmp;

# For division, make sure n1 is integral multiplier of n2.

if op = "/":
    n1 = n1 * n2

# Return expression in ALL cases.

return n1 + op + n2
于 2012-06-15T07:45:57.953 に答える
2

ステートメントに間違った条件がありますwhile。正反対の条件を指定する必要があります。また、条件が一致しない場合は結果に値を割り当てていないため、行result = firstNumber + operators + secondNumber;を条件ステートメントから移動する必要があります(または単純なリターンに置き換えるだけです):

...
        if ((operators.Equals("/")) && (enableDouble == false))
        {
            while (firstNumber % secondNumber != 0) // <-- change here
            {
                firstNumber = listOfNumbers[randomizer.Next(listOfNumbers.Length)];
            }
        }
        // second condition was repearing while condition and that was redundant.
        else if (operators.Equals("-")) 
        {
            while (firstNumber < secondNumber) // <-- change here
            {
                firstNumber = listOfNumbers[randomizer.Next(listOfNumbers.Length)];
                secondNumber = listOfNumbers[randomizer.Next(listOfNumbers.Length)];
            }
        }
        return firstNumber + operators + secondNumber;
于 2012-06-15T07:44:29.817 に答える
2
while (firstNumber % secondNumber == 0)

する必要があります

while (firstNumber % secondNumber != 0)

while指定した条件が である限り、ループは実行され続けますtrue。firstNumber % secondNumber を 0 にしたいので、ループして新しい値を生成する必要がありますfirstNumber % secondNumber != 0

減算ループにも同じ問題があると思います。

==最後に (質問とは関係ありません) 、C# で文字列を比較するために使用できます。

if ((operators == "/") && (enableDouble == false))
于 2012-06-15T07:45:05.863 に答える
1

どちらの場合も、while条件が間違っている場合は、次のように変更する必要があります。

while (firstNumber % secondNumber != 0) 

while (firstNumber < secondNumber)
于 2012-06-15T07:49:18.017 に答える
1

これがあなたの質問から私が理解したことに対する解決策です。

if ((operators.Equals("/")) && (enableDouble == false))
    {
        while (firstNumber % secondNumber != 0)
        {
            firstNumber = listOfNumbers[randomizer.Next(listOfNumbers.Length)];
        }

        result = firstNumber + operators + secondNumber;

   }
            else if (operators.Equals("-") && (firstNumber<secondNumber))
            {
                while (firstNumber < secondNumber)
                {
                    firstNumber = listOfNumbers[randomizer.Next(listOfNumbers.Length)];
                    secondNumber = listOfNumbers[randomizer.Next(listOfNumbers.Length)];
                }

                result = firstNumber + operators + secondNumber;
            }
于 2012-06-15T07:57:24.207 に答える