#include <iostream>
using namespace std;
int g_c_d(int n, int d);
class Fraction
{
private:
//variables to store numerator and denominator
int num;
int denom;
public:
Fraction(){}
Fraction(int num): num(num) {}
Fraction(int num, int denom): num(num), denom(denom) {}
void set_num(int n){ num = n;}
void set_denom(int d){ denom = d;}
int get_numerator() const {return num;}
int get_denominator() const {return denom;}
};
int g_c_d(int n, int d){
return d == 0? n : g_c_d(d, n % d);
}
istream &operator>> (istream &input, Fraction &f)
{
int n, d;
char slash;
input >> n;
input >> slash;
input >> d;
if (d == 0) {n = 0;} //if denom is 0; fraction = 0/0
f = Fraction(n, d);
return input;
}
ostream &operator<<(ostream &output, const Fraction &frac)
{
return output << frac.get_numerator() << "/" << frac.get_denominator();
}
int main()
{
int n, d;
Fraction frac;
int gcd;
n = frac.get_numerator();
d = frac.get_denominator();
gcd = g_c_d(frac.get_numerator() , frac.get_denominator());
cout << "Enter a fraction" << endl;
cin >> frac;
frac.set_num(n/gcd);
frac.set_denom(d/gcd);
cout << "your fraction is: ";
cout << frac << endl;
return 0;
}
您好我试图简化用户输入的分数。但是,每当我输入要简化的分数时,返回的输出为&#34; 1/0&#34;。
有人可以帮忙,我们会非常感激!
答案 0 :(得分:2)
问题是你在要求用户输入分数之前在frac
上进行所有计算 - 然后你覆盖用户输入的任何内容。你需要移动这一点:
cout << "Enter a fraction" << endl;
cin >> frac;
更高,更高。
答案 1 :(得分:0)
当您设置代码时:
Fraction frac;
这会调用Fraction
的默认构造函数。因为您从未在构造函数中初始化成员,所以您获得int
类型的默认初始化,即0:那么:
n = frac.get_numerator();
d = frac.get_denominator();
这会使n
和d
为0.从那时起,您使用的是n
和d
的值。但是,这些值不是用户输入的值 frac
,而只是默认值中的值。在进行任何计算之前,请更改代码以读取用户输入的frac
值。
这里要学习的主要教训是确保不使用未初始化的变量。一般来说,当你编译并启用所有警告时,这就是编译器会警告的事情。
答案 2 :(得分:0)
您可能会跳零,因为默认构造函数没有为分母赋值。在分母设置为零的情况下,gcd()函数将在main
中第一次除以零。