Overloaded operators
  1. 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
    

  2. 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;
    }
    

  3. 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;
    }
    

  4. 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