C++ PROGRAMMING
Hi! I have to make a program that adds fractions and simplifies them. I feel like I know how to write that. What I'm having trouble with is implementing two files the professer gave us. I would appreicate any help in understanding their purpose as in if Im supposed to take information from those files or give it information. Thank you!
I have attatched the homework instructions and the two files given.
Implementation
The main program, called calculator.cpp , is provided. Your project must include a class Fraction that encapsulates all functions related to the processing of fractions. The >> and <<
operators must be overloaded and used to read and write fractions. The presence of a zero denominator in input should be handled by throwing an exception of type invalid_argument defined in <stdexcept>. The class Fraction must be defined in a source file Fraction.cpp and declared in a header file Fraction.h. The implementation of the member functions should be defined in the file Fraction.cpp. The class Fraction must include a constructor Fraction::Fraction(int a, int b). The internal representation of the fraction should be in reduced form, i.e. using a pair of numbers that have no common factors. Constructors and other member functions must ensure that the fraction is always reduced. Use Euclid's algorithm to simplify fractions to reduced form. An example of a C implementation of this algorithm is provided on the web site web.cs.ucdavis.edu/~fgygi/ecs40 in the example programs of Lecture 1. The operators '+', '-' and '=' must be overloaded and defined. Member functions getNum() and getDen() should be implemented, returning the (reduced) numerator and denominator of the fraction. It should be possible to use the class Fraction in the program useFraction.cpp which #includes the header Fraction.h. The program useFraction.cpp is provided on the web site web.cs.ucdavis.edu/~fgygi/ecs40. You should not modify that program.
//
// useFraction.cpp
//
// DO NOT MODIFY THIS FILE
//
#include "Fraction.h"
#include<iostream>
using namespace std;
void print_fraction(const Fraction& f)
{
cout << "print_fraction: " << f.getNum() << "/"
<< f.getDen() << 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;
}
//
// calculator.cpp
//
// DO NOT MODIFY THIS FILE
//
#include "Fraction.h"
#include<iostream>
#include<stdexcept>
using namespace std;
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;
}
}
The two files given by your professor are main programs to test your code.
Your code should consist of two files, Fraction.h and Fraction.cpp.
Here is my implementation of the code. You can have this as a referrence to produce your own.
Fraction.h
#ifndef Fraction_h
#define Fraction_h
#include <iostream>
using namespace std;
class Fraction
{
public:
//Functions
Fraction();
Fraction(int,int);
int getNum() const;
int getDen() const;
void setNum(int num);
void setDen(int den);
void reduce();
void signs();
friend ostream& operator<<(ostream &out,const Fraction &);
friend istream& operator>>(istream &,Fraction &);
Fraction operator+(const Fraction );
private:
int nemer;
int denom;
};
#endif
Fraction.cpp
#include "fraction.h"
#include <stdexcept>
#include <iostream>
#include <cstdlib>
using namespace std;
Fraction::Fraction()
{
setNum(0);
setDen(1);
}
Fraction::Fraction(int nem, int dem)
{
if (dem == 0)
{
throw invalid_argument("Error: denominator is zero");
}
else
{
setNum(nem);
setDen(dem);
reduce();
}
}
void Fraction::setNum(int num)
{
nemer = num;
}
void Fraction::setDen(int den)
{
denom = den;
}
int Fraction::getNum() const
{
return nemer;
}
int Fraction::getDen() const
{
return denom;
}
void Fraction::reduce()
{
signs();
int Sign = 1;
int nem = getNum();
int den = getDen();
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);
setDen(den);
}
void Fraction::signs()
{
int nem = getNum();
int den = getDen();
if (den < 0)
{
nem *= -1;
den *= -1;
}
setNum(nem);
setDen(den);
}
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.setDen(den);
frac.reduce();
return in;
}
ostream &operator<<(ostream& out, const Fraction& frac)
{
if (frac.getDen() == 1)
out << frac.getNum();
else
{
out << frac.getNum() << "/" << frac.getDen() ;
}
return out;
}
Fraction Fraction::operator+(const Fraction frac)
{
int Nsum = ((*this).getNum() * frac.getDen()) + (frac.getNum() * (*this).getDen());
int Dsum = ((*this).getDen() * frac.getDen());
Fraction frac2(Nsum, Dsum);
frac2.reduce();
return frac2;
}
//The below methods have been copy-pasted from
useFraction.cpp - This is for testing your code
void print_fraction(const Fraction& f)
{
cout << "print_fraction: " << f.getNum() << "/" << f.getDen() << endl;
}
int main()
{
Fraction x(2,3);
Fraction y(6,-2);
cout << x << endl;
cout << y << endl;
cout<<"Enter fraction: ";
cin >> y;
cout << y << endl;
print_fraction(y);
Fraction z = x + y;
cout << x << " + " << y << " = " << z << endl;
}
Get Answers For Free
Most questions answered within 1 hours.