防止非整数除法

时间:2015-07-26 17:09:03

标签: c++ qt validation

我正在编写一个Qt应用程序作为一种兴趣,它提示用户使用add,minus,multiply和divide运算符来回答基本算术问题。生成问题,每次正确回答问题时,都会生成新的操作数并使用新的操作符。

在某些情况下,可能会出现一个问题:' 4/5'或者' 3/2'这意味着答案是要输入的非整数值。我设定的要求是程序中根本没有无理数:这意味着没有不合理的答案,操作数,操作符或诸如此类的东西。

在我的课堂上,我有一个验证器功能,可以验证生成的每个问题。

void ArQuestion::validate()
{
    int answer = getActualAnswer();

    if ((pOperand2 % 2 != 0) ||
         pOperator == operators::DIVIDE)
    {
        if (static_cast<int>(answer) != answer)
        {
            generate();
        }
    }
}

getActualAnswer()检索问题的实际答案。

不幸的是,我的验证器不起作用,大概static_cast诀窍也不起作用。当我运行该程序时,仍有一些问题会提出不合理的分组问题(产生不合理答案的问题)。我希望验证者做的是以一种方式起作用,以防止问题(仅在分组问题下)无理性地提出问题,例如&#39; 3/4&#39;或者&#39; 7/9&#39;。如果问题不合理,那么它应该产生一个新问题。

我的问题是:我有什么算法来防止被问到非整数除法问题?

2 个答案:

答案 0 :(得分:1)

您正在寻找的是一种确定除法问题是否返回整数答案的方法,这是一个很小的功能。

#include <iostream>
#include <cmath>
#include <limits>

bool check(double l, double r)
{
   double real_answer = l / r;
   int target_answer = static_cast<int>(real_answer);
   double checked_answer = target_answer;

   if(std::fabs(real_answer - checked_answer) > std::numeric_limits<double>::min())
   {
      std::cout << "Invalid.\n";
      return false;
   }

   return true;
}

答案 1 :(得分:1)

这应该相当可靠,

bool quotient_is_integral(double n, double d)
{
    double dummy;
    return std::modf(n/d, &dummy) == 0.0;
}