if else语句和while循环

时间:2012-06-15 07:39:35

标签: c# .net if-statement c#-3.0 while-loop

请查看以下代码

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()方法中,我试图生成一些数学问题。

如果运算符在“ - ”中,并且如果firstNumber&lt; secondNumber,然后应重新生成数字(第一个数字和第二个数字),以确保答案不是负值。

并且,如果运算符是“/”并且布尔值为false,则它应该再次重新生成数字以确保答案(这意味着计算,例如2/1 = 2)不包含任何数字浮点(这意味着它不应该生成像2/3这样的问题,因为答案包含浮点数。)

在我的尝试中,上述两点都没有发生。它仍会产生意想不到的答案,有时甚至没有。这是为什么?请帮忙

请注意,我是Java开发人员,这是我的第一个主要C#项目。

6 个答案:

答案 0 :(得分:6)

好吧,它有时没有返回任何内容,因为除了你捕获的边缘情况之外,你从不result设置为""以外的任何其他内容。

你的while陈述都是错误的。它应该是:

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

但是,为了提高效率,我不会那么做第二个while,因为你可能获得该属性所在的长对子。如果数字是错误的,只需交换它们。

在极少数情况下,余数从您的号码选择中归零(9/38/48/26/36/2,{ {1}},4/2M/M是(我认为)详尽的清单)。如果你想要一组更加扩展的方程式,我会采用另一种方式选择两个数字 mutiply ,然后将第一个与结果交换。

例如,给定两个数字N/1a = 3,只需执行:

b = 7

并且您a = a * b; 保证提供整数乘数,并提供等式a = 21, b = 7


所以这个(伪代码)就是我要开始的:

"21 / 7"

答案 1 :(得分: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;

答案 2 :(得分:1)

while (firstNumber % secondNumber == 0)

应该是

while (firstNumber % secondNumber != 0)

只要您提供的条件为whiletrue循环就会继续执行。因为你想要 firstNumber%secondNumber等于0;你应该循环并生成新值,只要firstNumber % secondNumber != 0

我相信减法循环也有同样的问题。

最后(与您的问题无关),您可以使用==来比较C#中的字符串。

if ((operators == "/") && (enableDouble == false))

答案 3 :(得分:1)

在这两种情况下,你的条件是错误的方式,你需要将它改为

while (firstNumber % secondNumber != 0) 

while (firstNumber < secondNumber)

答案 4 :(得分: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;
            }

答案 5 :(得分:-1)

  1. 通过制作两个不同的测试项目来实施测试用例
  2. 使用包含这些测试用例的MSVS单元测试项目进行报告
  3. 报告第一个案例中考虑 MCDC 的测试覆盖率和第二个案例中的总体覆盖率以及对发现不同覆盖率指标的原因的评论
  4. 以下代码

        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;
            }
        }
        }
    
相关问题