如何完全减少/简化分数(C ++)

时间:2013-03-15 22:42:59

标签: c++ class struct fractions

我不能为我的生活付出为什么当我在代码中输入正常分数时,我得到了无限值。除了GCD(最大公约数)之外的所有东西似乎都在起作用。

在这个范围内是否存在明显明显的逻辑错误?

我已经完成了我的研究,并找到了问题的各种答案,我的意思是维基百科甚至给你编写代码,但是我想弄清楚如何使它按照我编码的方式工作现在是。

#include <iostream>
#include <stdlib.h>
#include <cmath>
#include <math.h>

using namespace std;

class Fraction
{
private:
   double num;
   double den;
   double fraction;
   double temp;
public:
   void setNum();
   void setDen();
   int getNum();
   int getDen();
   void lcdOutput();
   void decOutput();
   int gcd();
};

void Fraction::setNum(){
   cout << "Enter a value for your numerator: " << endl;
   cin >> num;
}

void Fraction::setDen(){
    cout << "Enter a value for your denominator: " << endl;
    cin >> den;
}

int Fraction::getNum(){
    return num;
 }

 int Fraction::getDen(){
     return den;
  }

int Fraction::gcd(){

    Fraction set;
    if(num > den){
       if(fmod(num, den) == 0){
          den = temp;
          return temp;
       }
       else{
          den = fmod(num, den);
          set.gcd();
       }
    }
    else{
       if(fmod(den, num) == 0){
          num = temp;
          return temp;
       }
       else{
          num = fmod(den, num);
          set.gcd();
       }
    }
 }

void Fraction::lcdOutput(){
    Fraction set;
    set.gcd();
    num = num / temp;
    den = den / temp;
    cout << "Fraction in lowest terms: " << num << "/" << den << endl;
}

void Fraction::decOutput(){
   double decimal = num / den;
   cout.precision(4);
   cout << "The fraction in decimal form is: " << decimal << endl;
}

int main(){

    Fraction set;

    set.setNum();
    set.setDen();
    set.getNum();
    set.getDen();
    set.lcdOutput();
    set.decOutput();

return 0;
}

2 个答案:

答案 0 :(得分:6)

这是我可以通过单步执行代码来确定的。

从main开始,实例化名为Fraction的{​​{1}}类型的实例。您可以通过调用setset.setNum()来分配其分子和分母。在这种情况下,对set.setDen()getNum()的调用不执行任何操作,因为它们未被分配给任何内容。

然后你致电getDen(),让我们开始逐步完成。 首先,实例化一个LOCAL的Fraction实例(不知道为什么要这样做,在我看来这可能是一个概念上的错误),然后为该本地实例调用lcdOutput()。调用set.gcd()将调用THAT INSTANCE的方法,在我看来,您真正想要的是set.gcd()或只是this->gcd()

您可以通过设置gcd()num = num / temp进行跟进,但此时den = den / temp仍然未初始化。如果变量未初始化,它可以(通常是)指向temp。这可能解释了为什么要返回无意义的值。

答案 1 :(得分:0)

我回去自己想出来了。我看到了一些评论,并注意到我非常大的概念和逻辑错误。这是任何有同样问题的人!

int gcd(double num, double den){
    if(den == 0){
       return num;
    }
return gcd(den, fmod(num, den));
}

void Fraction::lcdOutput(){
    double temp = gcd(num, den);
    cout << "Fraction in lowest terms: " << num / temp << "/" << den / temp << endl;
}