C# if else 语句和 while 循环

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/11046510/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-09 16:15:04  来源:igfitidea点击:

if else statement and while loop

c#.netif-statementc#-3.0while-loop

提问by Lemon Juice

Please have a look at the following code

请看下面的代码

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;
        }
    }
}

In here, in the generateQuestions() method, I am trying to generate some math questions.

在这里,在 generateQuestions() 方法中,我试图生成一些数学问题。

If operator in "-" and if the firstNumber < secondNumber, then should re generate numbers (first number and second number) to make sure the answer is not a minus value.

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

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

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

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.

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

采纳答案by paxdiablo

Well, it returns nothing sometimes because, other than the edge cases you're catching, you neverset resultto anything other than "".

好吧,有时它什么都不返回,因为除了您捕获的边缘情况外,您从未设置result"".

And both your whilestatements are the wrong way around. It should be:

而且你的两种while说法都是错误的。它应该是:

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

However, for efficiency, I wouldn't do that second whilesince you mayget a long run of pairs where that property holds. If the numbers are the wrong way around, just swap them.

但是,为了效率,我不会做那一秒钟,while因为您可能会在该属性持有的情况下获得长期对。如果数字是错误的,只需交换它们。

And there's precious few cases where the remainder will be zero from your number selection (9/3, 8/4, 8/2, 6/3, 6/2, 4/2, M/Mand N/1is (I think) the exhaustive list). If you want a more expanded set of equations, I would go the other way and choose two numbers to mutiply, then swap the first with the result.

并且在极少数情况下,您的号码选择(9/3, 8/4, 8/2, 6/3, 6/2, 4/2,M/MN/1(我认为)是详尽列表)中的余数为零。如果你想要一个更加扩大的方程组,我会去其他的方式,并选择两个数字mutiply,然后交换先用结果。

For example, given the two numbers a = 3and b = 7, simply do:

例如,给定两个数字a = 3and b = 7,只需执行以下操作:

a = a * b;

and you have a = 21, b = 7which is guaranteed to give an integral multiplier and deliver the equation "21 / 7".

并且你有a = 21, b = 7保证给出一个积分乘数并提供方程"21 / 7"



So this (psuedo-code) is what I would start with:

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

# 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

回答by Sergey Kudriavtsev

You have wrong conditions in your whilestatements, you should have exactly the opposite. Also you're not assigning value to result if none of your conditions matches, so the line result = firstNumber + operators + secondNumber;should be moved out of conditional statements (or just replaced with simple return):

你的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;

回答by Rob P.

while (firstNumber % secondNumber == 0)

Should be

应该

while (firstNumber % secondNumber != 0)

The whileloop will continue to execute so long as the condition you provide is true. Since you wantthe firstNumber % secondNumber to equal 0; you should loop and generate the new value so long as firstNumber % secondNumber != 0.

while只要您提供的条件是,循环就会继续执行true。由于您希望firstNumber % secondNumber 等于 0;您应该循环并生成新值,只要firstNumber % secondNumber != 0.

I believe you have the same problem with the subtraction loop as well.

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

Finally (unrelated to your question) you can use ==to compare strings in C#.

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

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

回答by Bob Vale

In both cases your while conditions are the wrong way round, you need to change it to

在这两种情况下,您的 while 条件都是错误的,您需要将其更改为

while (firstNumber % secondNumber != 0) 

and

while (firstNumber < secondNumber)

回答by Estefany Velez

Here is the solution to what I understand from your question.

这是我从你的问题中理解的解决方案。

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;
            }

回答by khalid khan

  1. Implement test cases by making two different test projects
  2. Report using MSVS unit test project containing these test cases
  3. Report Test coverage considering MCDCin first case and overall coverage in the second case and comment on the reasons why different coverage metric was found
  1. 通过制作两个不同的测试项目来实现测试用例
  2. 使用包含这些测试用例的 MSVS 单元测试项目报告
  3. 报告在第一种情况下考虑MCDC 的测试覆盖率和在第二种情况下的整体覆盖率,并评论发现不同覆盖率指标的原因

For the Below Code

对于下面的代码

    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;
        }
    }
    }