d2jsp
Log InRegister
d2jsp Forums > Off-Topic > Computers & IT > Programming & Development > Operator Overload
Add Reply New Topic New Poll
Member
Posts: 10,884
Joined: Jul 7 2007
Gold: 316.00
Dec 4 2012 09:16pm
Hey guys having some trouble with my program was wondering if anyone can shed some light.

Operator Overload

I'm suppose to overload the addition,subtraction,division, multiplication, >, <, >>, <<

The client file will be reading in a data file that has values on it



Errors that I'm receiving

Code
rational.h: In function 'std::istream& operator>>(std::istream&, int&)':
rational.h:121: warning: control reaches end of non-void function
rational.h: In function 'int Rational(int, int)':
rational.h:22: warning: control reaches end of non-void function





This is the H File
Code
using namespace std;

class Rational {
public:
  Rational( int pn = 1, int pd = 1 );        
  Rational& operator+(Rational& robj);      
  Rational& operator-(Rational& robj);      
  Rational& operator*(Rational& robj);      
  Rational& operator/(Rational& robj);      
 
  bool operator>(Rational& robj);  
  bool operator<(Rational& robj);  
 
  friend ostream& operator<<(ostream& output, Rational& robj);
  friend istream& operator>>(istream& input, Rational& robj);
 
 
private:
  int numerator;
  int denominator;
  void reduce(  );
};






This is the CPP file
Code
Rational::Rational( int pn, int pd )
{
  if (pd)
  {
 numerator = pn;
 denominator = pd;
  }
  else
  {
 numerator = 1;
 denominator = 1;
  }
}



void Rational::reduce(  )
{
  int largest, gcd = 1;  // greatest common divisor;

  largest = ( numerator > denominator ) ? numerator: denominator;

  for ( int loop = 2; loop <= largest; ++loop )
      if ( numerator % loop == 0 && denominator % loop == 0 )
         gcd = loop;

  numerator /= gcd;
  denominator /= gcd;
}

Rational Rational::operator+(Rational& robj)
{
Rational Temp=*this;
Temp.pn = (numerator * robj.denominator) + (robj.numerator * denominator);
Temp.pd = denominator * robj.denominator;
return Temp;
}


Rational Rational::operator-(Rational& robj)
{
Rational Temp=*this;
Temp.pn = (numerator * robj.denominator) - (robj.numerator * denominator);
Temp.pd = denominator * robj.denominator;
return Temp;
}

Rational Rational::operator*(Rational& robj)
{
Rational Temp=*this;
Temp.pn = numerator * robj.numerator;
Temp.pd = denominator * robj.denominator;
return Temp;
}

Rational Rational::operator/(Rational& FractB)
{
Rational Temp=*this;
Temp.pn = numerator * robj.denominator;
Temp.pd = denominator * robj.numerator;
return Temp;
}

bool Rational::operator>(Rational& robj)
{
if ( pn/pd > robj.pn/robj.pd)
 return true;
else
 return false;
}

bool Rational::operator<(Rational& robj)
{
if ( pn/pd < robj.pn/robj.pd)
 return true;
else
 return false;
}

ostream& operator<<(ostream& output, Rational& robj)
{
output<< robj.numerator << '/' << robj.denominator;
return output;
}

istream& operator>>(istream& input, Rational& robj)
{
input >> robj.numerator;
cin.ignore();
input >> robj.denominator;
cin.ignore();
return input;

}
Member
Posts: 23,862
Joined: Aug 16 2006
Gold: 20.00
Dec 5 2012 02:08am
edit nvm

This post was edited by Eep on Dec 5 2012 02:08am
Member
Posts: 13,425
Joined: Sep 29 2007
Gold: 0.00
Warn: 20%
Dec 5 2012 10:19am
your int int rational function is not returning a value. either return a value or change that function to void. as for the other warning im not sure ive never messed around with c++ stream. its saying its not returning at some point in the function but it doesnt seem so. try setting up a break point and stepping through the function. it should compile even though its throwing a warning.
Member
Posts: 10,884
Joined: Jul 7 2007
Gold: 316.00
Dec 5 2012 04:32pm
I've fixed that problem but apparently I'm not getting the correct fraction results does anyone see any flaws in my addition or anything like that?

I do not get any errors so I'm assuming that it's a logical mistake
Member
Posts: 32,925
Joined: Jul 23 2006
Gold: 3,804.50
Dec 5 2012 05:47pm
Quote (SlayingWhileInt0xicated @ Dec 5 2012 05:32pm)
I've fixed that problem but apparently I'm not getting the correct fraction results


for which one?
Member
Posts: 10,884
Joined: Jul 7 2007
Gold: 316.00
Dec 5 2012 05:58pm
Quote (carteblanche @ Dec 5 2012 06:47pm)
for which one?



If someone can hint what I'm doing wrong I would really appreciate it... thanks!


Code
Rational::Rational( int pn, int pd )
{
  if (pd)
  {
 numerator = pn;
 denominator = pd;
  }
  else
  {
 numerator = 1;
 denominator = 1;
  }
}



void Rational::reduce(  )
{
  int largest, gcd = 1;  // greatest common divisor;

  largest = ( numerator > denominator ) ? numerator: denominator;

  for ( int loop = 2; loop <= largest; ++loop )
      if ( numerator % loop == 0 && denominator % loop == 0 )
         gcd = loop;

  numerator /= gcd;
  denominator /= gcd;
}

Rational Rational::operator+(Rational& robj)
{
Rational Temp=*this;
Temp.numerator = (numerator * robj.denominator) + (robj.numerator * denominator);
Temp.denominator = denominator * robj.denominator;
Temp.reduce();
return Temp;
}

Rational Rational::operator-(Rational& robj)
{
Rational Temp=*this;
Temp.numerator = (numerator * robj.denominator) - (robj.numerator * denominator);
Temp.denominator = denominator * robj.denominator;
Temp.reduce();
return Temp;
}

Rational Rational::operator*(Rational& robj)
{
Rational Temp=*this;
Temp.numerator = numerator * robj.numerator;
Temp.denominator = denominator * robj.denominator;
Temp.reduce();
return Temp;
}

Rational Rational::operator/(Rational& robj)
{
Rational Temp=*this;
Temp.numerator = numerator * robj.denominator;
Temp.denominator = denominator * robj.numerator;
Temp.reduce();
return Temp;
}

bool Rational::operator>(Rational& robj)
{
Rational Temp=*this;
if ( Temp.numerator/Temp.denominator > robj.numerator/robj.denominator)
 return true;
else
 return false;
}

bool Rational::operator<(Rational& robj)
{
Rational Temp=*this;

if ( Temp.numerator/Temp.denominator < robj.numerator/robj.denominator)
 return true;
else
 return false;
}

ostream& operator<<(ostream& output, Rational& robj)
{
output<< robj.numerator << '/' << robj.denominator;
output<< oper;
return output;
}

istream& operator>>(istream& input, Rational& robj)
{

input >> robj.numerator;
input.ignore();
input >> robj.denominator;
return input;

}




This is the output I get where it has a . it actually says null there

Code
1: 2/1.1/1 = 1/1

1: 2/1 is greater than 1/1
--------------------------------------
2: 2/1.1/1 = 1/1

2: 2/1 is greater than 1/1
--------------------------------------
3: 2/1.1/1 = 1/1

3: 2/1 is greater than 1/1
--------------------------------------
4: 2/1.1/1 = 1/1

4: 2/1 is greater than 1/1
--------------------------------------
5: 2/1.1/1 = 1/1

5: 2/1 is greater than 1/1
--------------------------------------
6: 2/1.1/1 = 1/1

6: 2/1 is greater than 1/1
--------------------------------------
7: 2/1.1/1 = 1/1

7: 2/1 is greater than 1/1
--------------------------------------



Just a sample of what the file is reading in

Code
2/14+2/3
3/6+1/7
4/8+9/18
Member
Posts: 32,925
Joined: Jul 23 2006
Gold: 3,804.50
Dec 5 2012 06:29pm
Unit test bro.

1. Find a single example where the output isn't correct
2. call a single function on it (divide, add, etc)
3. if output is wrong, debug step by step
Go Back To Programming & Development Topic List
Add Reply New Topic New Poll