我终其一生都无法理解为什么当我在代码中输入一个正常的分数时,我得到了无穷大的返回值。除了 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;
}
最佳答案
这是我通过单步执行您的代码可以确定的内容。
从 main 开始,您实例化了一个名为 set
的 Fraction
类型的实例。您可以通过调用 set.setNum()
和 set.setDen()
为其分配分子和分母。在这种情况下,对 getNum()
和 getDen()
的调用没有任何作用,因为它们没有被分配给任何东西。
然后调用 lcdOutput()
,让我们开始逐步执行。
您首先实例化 Fraction 的 LOCAL 实例(不确定为什么要这样做,在我看来这可能是概念上的错误),然后为该本地调用 set.gcd()
实例。调用 set.gcd()
将调用该实例的方法,在我看来你真正想要的是 this->gcd()
或者只是 gcd()
。
您通过设置 num = num/temp
和 den = den/temp
来跟进,但是此时 temp
仍未初始化。如果变量未初始化,它可能(而且通常是)指向垃圾
。这可能解释了为什么您会返回无意义的值。
关于c++ - 如何完全减少/简化分数 (C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15443266/