#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;
}
Привет я пытаюсь упростить дроби, введенные пользователем. Однако каждый раз, когда я вношу дробь, которая должна быть упрощена, возвращаемое значение равно «1/0».
Может кто-нибудь, пожалуйста, помогите, это будет очень цениться!
Проблема в том, что вы делаете все свои вычисления на frac
до попросить пользователя ввести дробь, а затем перезаписать все, что вводит пользователь. Вам нужно переместить этот бит:
cout << "Enter a fraction" << endl;
cin >> frac;
намного выше.
Когда вы настраиваете код, который у вас есть:
Fraction frac;
Это вызывает конструктор по умолчанию для Fraction
, Поскольку вы никогда не инициализировали элементы в конструкторе, вы получаете инициализацию по умолчанию для int
тип, который равен 0. Тогда:
n = frac.get_numerator();
d = frac.get_denominator();
Это делает n
а также d
0. С этого момента вы используете эти значения n
а также d
, Эти значения, однако, не являются значениями из введенный пользователем frac
но это просто значения, которые вы получаете по умолчанию. Измените свой код, чтобы прочитать введенное пользователем значение для frac
прежде чем делать какие-либо расчеты.
Основным уроком, который необходимо извлечь, является то, что вы не должны использовать неинициализированные переменные. Вообще говоря, когда вы компилируете со всеми включенными предупреждениями, компиляторы будут предупреждать об этом.
Вы можете погружаться на ноль, потому что конструктор по умолчанию не присваивает значение знаменателю. В случае, когда знаменатель установлен в ноль, функция gcd () будет делиться на ноль в первый раз в main
,