Ранее я написал программу, которая складывает две дроби вместе и печатает вывод, я просто знаю. Первоначально я реализовал программу, используя структуры, и теперь я пытаюсь повторно реализовать ее, используя классы, не так просто, я думаю … Проблема заключается в том, что всякий раз, когда я печатаю выходные данные, они возвращаются в виде нулей повсюду (двойные нули для знаменателя, Я тоже не знаю, почему он это делает), независимо от того, какие цифры я ввожу.
Sample output:
Enter First Numerator: 1
Enter First Denominator: 2
Enter Second Numerator: 1
Enter Second Denominator: 4
-------------------------
0/00 + 0/00 = 0/00
Пожалуйста, посмотрите на мой код и скажите, в чем проблема?
#include <iostream>
using namespace std;
class Fraction
{
private:
int numerator;
int denominator;
public:
Fraction()
{
numerator = 0;
denominator = 0;
}
public:
void set(int n, int d) {n = numerator; d = denominator;};
int getNumerator() {return numerator;};
int getDenominator() {return denominator;};
Fraction addTo(Fraction &frac2, Fraction& frac3);
int print() { cout << numerator << "/" << denominator; return 0;};
};
//Adds the value of the Fraction with the attached "addTo" method with the value of a second specified Fraction and assigns the result to a third specified Fraction.
Fraction Fraction::addTo(Fraction& frac2, Fraction& addedTo)
{
frac2.numerator = (numerator * frac2.denominator) + (denominator * frac2.numerator);
frac2.denominator = (denominator * frac2.denominator);
frac2.numerator = addedTo.numerator;
frac2.denominator = addedTo.denominator;
return addedTo;
}
int main()
{
Fraction frac1, frac2, frac3;
int n1, n2, d1, d2;
//Prompts the user for data and then assigns it to the correct variables.
cout << "Enter First Numerator: ";
cin >> n1;
cout << "Enter First Denominator: ";
cin >> d1;
cout << "Enter Second Numerator: ";
cin >> n2;
cout << "Enter Second Denominator: ";
cin >> d2;
frac1.set(n1, d1);
frac2.set(n2, d2);
frac1.addTo(frac2, frac3);
//Formats output.
cout<< "-------------------------\n"<< frac1.print() << " + " << frac2.print()<< " = " << frac3.print() << endl;
cout << "\n";
return 0;
}
Вы ошиблись здесь:
int print() { cout << numerator << "/" << denominator; /* why to hell this method returns 0?! */ return 0;};
Просто напишите так:
void print() { cout << numerator << "/" << denominator; }; // this method doesn't need to return any value
И вы ошиблись здесь:
//Formats output.
cout<< "-------------------------\n"<< frac1.print() << " + " << frac2.print()<< " = " << frac3.print() << endl;
cout << "\n";
Вы можете просто написать:
// Formats output
frac1.print();
std::cout << " + ";
frac2.print();
std::cout << " = ";
frac3.print();
Да, конечно, вы можете попытаться создать метод, который возвращает дробь в виде строки, но вы должны затем преобразовать int в строку и использовать, например, stringstream, так что моя идея проще.
@РЕДАКТИРОВАТЬ
Вы не указали здесь значение числителей и знаменателей:
//Prompts the user for data and then assigns it to the correct variables.
cout << "Enter First Numerator: ";
cin >> n1;
cout << "Enter First Denominator: ";
cin >> d1;
cout << "Enter Second Numerator: ";
cin >> n2;
cout << "Enter Second Denominator: ";
cin >> d2;
Вы должны написать так:
//Prompts the user for data and then assigns it to the correct variables.
cout << "Enter First Numerator: ";
cin >> n1;
frac1.numerator = n1;
cout << "Enter First Denominator: ";
cin >> d1;
frac1.denominator = d1;
cout << "Enter Second Numerator: ";
cin >> n2;
frac2.numerator = n2;
cout << "Enter Second Denominator: ";
cin >> d2;
frac2.denominator = d2;
@ EDIT2
Я только что нашел новую ошибку, которую вы сделали. Вы должны написать метод add следующим образом:
//Adds the value of the Fraction with the attached "addTo" method with the value of a second
specified Fraction and assigns the result to a third specified Fraction.
Fraction Fraction::addTo(Fraction& frac2, Fraction& addedTo)
{
addedTo.numerator = (numerator * frac2.denominator) + (denominator * frac2.numerator);
addedTo.denominator = (denominator * frac2.denominator);
// frac2.numerator = addedTo.numerator; // this line was a mistake because you tried to set result's numerator again
// frac2.denominator = addedTo.denominator; // the same as above
return addedTo;
}