2012-06-15 257 views
2

请看看下面的代码如果else语句和while循环

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()方法,我想产生一些数学问题。

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

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

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

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

+0

它的C#,您可以用==比较字符串:如果(运营商==“/”) – zmbq

+0

使用调试运行(比如说)工具的Visual Studio A和弄清楚在几分钟 – Tigran

+0

不是应该同时'firstnumber%lastnumber!= 0'你想循环,直到找到一个没有余数的数字.... –

回答

6

好,有时没有返回,因为比边缘情况等你捕捉,你从未设置result""其他任何东西。

而你的while陈述是错误的方式。它应该是:

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

然而,为了提高效率,我不会做第二while因为你可以弄了半天对,其中,物业持有的运行。如果数字是错误的,只需交换它们即可。

而且还有珍贵稀少的情况下,其余的将是零,从你的电话号码的选择(9/38/48/26/36/24/2M/MN/1是(我认为)详尽的清单)。如果你想要一个更加扩展的方程组,我会以另一种方式选择两个数字到多个,然后交换第一个结果。

例如,给定两个数字a = 3b = 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 
+1

+1用于解释空白结果并提示交换。 –

+0

非常感谢您的帮助。我无法相信我在循环和条件oO中犯了错误。从未发生过!非常感谢您的帮助和建议。我真的很感激:) –

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; 
+0

+ +1更快:-)附加说明:在原始版本的代码中,第二个'while'永远不会被执行,因为循环条件与周围的if条件相反。 –

+0

@PéterTörök:刚才改变了 - 外部条件是多余的。 –

+0

我的意思是OP中的代码,不是你的:-)但是你说的是多余的条件。 –

1
while (firstNumber % secondNumber == 0) 

应该是

while (firstNumber % secondNumber != 0) 

只要您提供的条件是truewhile循环将继续执行。既然你 firstNumber%secondNumber等于0;你应该循环并生成新的值,只要firstNumber % secondNumber != 0

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

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

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

在这两种情况下,你虽然条件是南辕北辙,你需要将其更改为

while (firstNumber % secondNumber != 0) 

while (firstNumber < secondNumber) 
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; 
      } 
-1
  1. 使用含有这些测试用例
  2. 报告测试覆盖率MSVS单元测试项目考虑MCDC在第二第一种情况和整体的覆盖使得两个不同的测试项目
  3. 报告实现测试用例并对发现不同覆盖率的原因进行了评论

对于以下代码

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

这并没有真正回答这个问题。 –