0

我一生都无法理解为什么当我在代码中输入正常分数时会返回无限值。除了 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;
}
4

2 回答 2

6

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

从 main 开始,您实例化一个Fraction名为的类型的实例set。您通过调用set.setNum()和分配其分子和分母set.setDen()。在这种情况下,调用getNum()getDen()什么都不做,因为它们没有被分配给任何东西。

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

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

于 2013-03-15T22:59:31.117 回答
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;
}
于 2013-03-15T23:23:35.740 回答