请查看以下代码
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#项目。
答案 0 :(得分:6)
好吧,它有时没有返回任何内容,因为除了你捕获的边缘情况之外,你从不将result
设置为""
以外的任何其他内容。
你的while
陈述都是错误的。它应该是:
while ((firstNumber % secondNumber) != 0)
:
while (firstNumber < secondNumber)
但是,为了提高效率,我不会那么做第二个while
,因为你可能获得该属性所在的长对子。如果数字是错误的,只需交换它们。
在极少数情况下,余数从您的号码选择中归零(9/3
,8/4
,8/2
,6/3
,6/2
,{ {1}},4/2
和M/M
是(我认为)详尽的清单)。如果你想要一组更加扩展的方程式,我会采用另一种方式选择两个数字 mutiply ,然后将第一个与结果交换。
例如,给定两个数字N/1
和a = 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)
只要您提供的条件为while
,true
循环就会继续执行。因为你想要 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)
以下代码
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;
}
}
}