2014-11-29 5 views
-1
#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».Как реализовать наибольший общий делитель для упрощения фракций

Может кто-нибудь, пожалуйста, помогите, это будет очень ценится!

+2

Вы использовали отладчик? Отладчики действительно полезны в этих обстоятельствах. –

+0

Вы пытались найти StackOverflow для подобных вопросов, например, используя «класс фракций C++» –

+1

Вам нужно инициализировать числитель и знаменатель в конструкторе по умолчанию. –

ответ

2

Проблема заключается в том, что вы делаете все ваши вычисления на fracперед предлагающее пользователю ввести фракцию —, а затем вы перезаписать независимо от конкретных данных, вводимых пользователем. Вам нужно переместить этот бит:

cout << "Enter a fraction" << endl; 
    cin >> frac; 

много, намного выше.

+0

Спасибо! Вы абсолютно правы! –

+0

@ fragr33f: Добро пожаловать! – ruakh

0

При настройке кода у вас есть:

Fraction frac; 

Это вызывает конструктор по умолчанию для Fraction. Потому что вы никогда не инициализируется членов в конструкторе вы получаете initizliation по умолчанию для int типа, который 0. Тогда:

n = frac.get_numerator(); 
d = frac.get_denominator(); 

Это делает n и d 0. С этого момента вы используете эти значения из n и d. Однако эти значения не являются значениями пользователя , введенногоfrac, но это только значения, которые вы получаете от значений по умолчанию. Измените свой код, чтобы читать в введенном пользователем значении для frac, прежде чем выполнять какие-либо вычисления.

Главный урок для изучения здесь - убедиться, что вы не используете неинициализированные переменные. Вообще говоря, когда вы компилируете все предупреждения, это то, о чем сообщают компиляторы.

0

Возможно, вы погружаетесь на ноль, потому что конструктор по умолчанию не присваивает значение знаменателю. В случае, когда знаменатель установлен на ноль, функция gcd() будет делить на ноль, в первый раз в main.