Question: I am writing a program that will add fractions. It works with four files, and I am only allowed to modify fraction.cpp. everything is working
I am writing a program that will add fractions. It works with four files, and I am only allowed to modify fraction.cpp. everything is working for me, but for some reason, every time I enter two factions, I get an error msg that says the denominator is zero. Can someone help me? Also the program is suposed to be ale to run until it reaces the end of the file. Like the user presses ctrl D. Can someone help me with this too with only modifiying fraction.cpp?
Thank you.
// // useFraction.cpp // // DO NOT MODIFY THIS FILE //
#include "fraction.h" #include
void print_fraction(const Fraction& f) { cout << "print_fraction: " << f.getNum() << "/" << f.getDem() << endl; }
int main() { Fraction x(2,3); Fraction y(6,-2);
cout << x << endl; cout << y << endl;
cin >> y; cout << y << endl; print_fraction(y); Fraction z = x + y; cout << x << " + " << y << " = " << z << endl; }
//fraction.h
#ifndef Fraction_h #define Fraction_h #include
//This is fraction.cpp
#include "fraction.h" #include
Fraction::Fraction() { setNum(0); setDem(1); }
Fraction::Fraction(int nem, int dem) { if (dem == 0) { throw invalid_argument("Error: denominator is zero"); } else { setNum(nem); setDem(dem); reduce(); }
} void Fraction::setNum(int num) { nemer = num; } void Fraction::setDem(int den) { denom = den; } int Fraction::getNum() const { return nemer; } int Fraction::getDem() const {
return denom; } void Fraction::reduce() { signs(); int Sign = 1; int nem = getNum(); int den = getDem(); if (nem < 0) { nem *= -1; Sign = -1; } for (int i = (nem * den); i > 1; i--) { if ((nem % i == 0) && (den % i == 0)) { nem /= i; den /= i; } } nem *= Sign; setNum(nem); setDem(den); } void Fraction::signs() { int nem = getNum(); int den = getDem(); if (den < 0) { nem *= -1; den *= -1; } setNum(nem); setDem(den); } Fraction &Fraction::operator=(const Fraction frac) { int num = frac.getNum(); int den = frac.getDem(); (*this).setNum(num); (*this).setDem(den); return *this; } istream &operator>>(istream &in, Fraction &frac) { int num; int den; in >> num; in >> den; if (den == 0) { throw invalid_argument("Error: denominator is zero"); exit(0); } frac.setNum(num); frac.setDem(den); frac.reduce(); return in; } ostream &operator<<(ostream& out, const Fraction& frac) { if (frac.getDem() == 1) out << frac.getNum(); else { out << frac.getNum() << "/" << frac.getDem() ;
} return out; } Fraction Fraction::operator+(const Fraction frac) { int Nsum = ((*this).getNum() * frac.getDem()) + (frac.getNum() * (*this).getDem()); int Dsum = ((*this).getDem() * frac.getDem()); Fraction frac2(Nsum, Dsum); frac2.reduce(); return frac2; }
Fraction Fraction::operator-(const Fraction frac) { int Nsum= ((*this).getNum() * frac.getDem()) - (frac.getNum() * (*this).getDem()); int Dsum = ((*this).getDem() * frac.getDem()); Fraction frac2(Nsum, Dsum ); frac2.reduce(); return frac2; }
// // calculator.cpp // // DO NOT MODIFY THIS FILE //
#include "fraction.h" #include
int main() { Fraction x,y; char op; try { cin >> x; cin >> op; while ( cin && ( op == '+' || op == '-' ) ) { cin >> y; if ( op == '+' ) x = x + y; else x = x - y; cin >> op; } cout << x << endl; } catch ( invalid_argument& e ) { cout << "Error: " << e.what() << endl; } }
Step by Step Solution
There are 3 Steps involved in it
Get step-by-step solutions from verified subject matter experts
