- Header file
#ifndef fin_fract
#define fin_fract
extern int gcd(int,int);
class Fract {
public:
Fract(int=0, int=0, int=1); // Constructor
friend istream& operator>>(istream&, Fract&);
friend ostream& operator<<(ostream&, Fract&);
Fract operator+(Fract&);
Fract operator*(Fract&);
Fract operator/(Fract&);
protected:
int whole, numerator, denominator;
};
#endif
- Main File
#include <iostream.h>
#include <fstream.h>
#include "finfract.h"
void main()
{
Fract sum,item;
ifstream myin("c:\\fract.txt",ios::in);
while(myin >> item) {
cout << "adding " << item << " + " << sum;
sum=sum + item;
cout << " = " << sum << endl;
}
Fract a,b(1,1,2),c(1,2,3),d(2,3,4);
cout << endl << "Associative addition " << endl;
a = b + c + d;
cout << a << endl;
cout << endl << " Order of precedence" << endl;
a = b + c * d;
cout << a << endl;
Fract e(0,1,2),f(0,1,4);
a = e/f;
cout << endl << "Division" << endl;
cout << a << endl;
}
- Implementation module
#include <iostream.h>
#include <fstream.h>
#include <string.h>
#include <stdlib.h>
#include "finfract.h"
istream& operator>>(istream& s, Fract& k)
{
char *p,line[81];
int a[3]={0,0,0};
int count=0;
s.getline(line,80);
if(s.eof()) return s;
p=strtok(line," /");
do {
a[count]=atoi(p);
count++;
p=strtok(NULL," /");
} while(p);
count--;
k.whole=k.numerator=0;
k.denominator=1;
switch (count) {
case 0: k.whole=a[0]; break;
case 1: k.numerator=a[0],k.denominator=a[1]; break;
case 2: k.whole=a[0],k.numerator=a[1],k.denominator=a[2];
}
return s;
}
ostream& operator<<(ostream& s, Fract& k)
{
if(k.whole) s << k.whole << " ";
if(k.numerator) s << k.numerator << "/" << k.denominator;
if(k.whole == 0 && k.numerator == 0) s << "0";
return s;
}
Fract Fract::operator+(Fract& n)
{
Fract temp;
int a,b,z;
temp.denominator = denominator * n.denominator;
a=whole * denominator + numerator;
b=n.whole * n.denominator + n.numerator;
temp.numerator=a * n.denominator + b * denominator;
temp.whole=temp.numerator / temp.denominator;
temp.numerator = temp.numerator % temp.denominator;
z=gcd(temp.denominator,temp.numerator);
temp.numerator/=z;
temp.denominator/=z;
return temp;
}
Fract::Fract(int w,int n,int d)
{
whole=w;
numerator=n;
denominator=d;
}
Fract Fract::operator*(Fract& n)
{
Fract temp;
int a,b,z;
temp.denominator = denominator * n.denominator;
a=whole * denominator + numerator;
b=n.whole * n.denominator + n.numerator;
temp.numerator=a*b;
temp.whole=temp.numerator / temp.denominator;
temp.numerator = temp.numerator % temp.denominator;
z=gcd(temp.denominator,temp.numerator);
temp.numerator/=z;
temp.denominator/=z;
return temp;
}
Fract Fract::operator/(Fract& n)
{
Fract temp;
int a,b,z;
a=whole * denominator + numerator;
b=n.whole * n.denominator + n.numerator;
temp.denominator=b * denominator;
temp.numerator=a * n.denominator;
temp.whole=temp.numerator / temp.denominator;
temp.numerator = temp.numerator % temp.denominator;
z=gcd(temp.denominator,temp.numerator);
temp.numerator/=z;
temp.denominator/=z;
return temp;
}
int gcd(int a, int b)
{
if(b) return(gcd(b,a%b));
else return a;
}
- Running the code
adding 1 1/2 + 0 = 1 1/2
adding 2 1/4 + 1 1/2 = 3 3/4
adding 3 1/8 + 3 3/4 = 6 7/8
adding 4 1/3 + 6 7/8 = 11 5/24
adding 4 1/3 + 11 5/24 = 15 13/24
Associative addition
5 11/12
Order of precedence
6 1/12
Division
2
Press any key to continue