C++ Programming I am having problems getting my program to cout. It compiles cor
ID: 3871229 • Letter: C
Question
C++ Programming
I am having problems getting my program to cout. It compiles correctly and there are no erros, not sure whats wrong.
Here is it the question I am working on.
Modify the class Rationa l of Programming Challenge 8 to add overloaded operators
+, - , *,and/ to be used for addition, subtraction, multiplication , and division. Test the
class by reading and processing from the keyboard (or from a file) a series of rationa l
expressions such as
2 / 3 + 2 / 8
2 / 3 * - 2 / 8
2 / 3 - 2/ 8
2 / 3 / 2 / 8
To facilitate parsing of the input, you may assume that number s and arithmetic
operators are separated by whitespace.
Here is my code.
Rational.cpp
#include <iostream>
#include <fstream>
#include "Rational.h"
using namespace std;
void Rational::assignData( int m, int n)
{
num = m;
denomination = n;
}
Rational::Rational()
{
num = 0;
denomination =0;
}
Rational operator+(Rational a, Rational b)
{
Rational result;
if (a.denomination == b.denomination)
{
result.num = a.num + b.num;
result.denomination = a.denomination;
return result;
}
else
{
a.num = a.num * b.denomination;
b.num = b.num * a.denomination;
a.denomination = a.denomination * b.denomination;
b.denomination = a.denomination * b.denomination;
result.num = a.num + b.num;
result.denomination = a.denomination + b.denomination;
return result;
}
}
Rational operator-(Rational a, Rational b)
{
Rational result;
if (a.denomination == b.denomination)
{
result.num = a.num - b.num;
result.denomination = a.denomination;
return result;
}
else
{
a.num = a.num * b.denomination;
b.num = b.num * a.denomination;
a.denomination = a.denomination * b.denomination;
b.denomination = a.denomination * b.denomination;
result.num = a.num - b.num;
result.denomination = a.denomination;
return result;
}
}
Rational operator*(Rational a, Rational b)
{
Rational result;
{
result.num = a.num * b.num;
result.denomination = a.denomination * b.denomination;
return result;
}
}
Rational operator/(Rational a, Rational b)
{
Rational result;
{
result.num = a.num * b.denomination;
result.denomination = a.denomination * b.num;
return result;
}
}
ostream& operator << (ostream& out, Rational& r)
{
out << r.num << " / " << r.denomination;
return out;
}
void Rational::reduce()
{
int rnum, i;
int rdenomination;
int count;
if ( num % denomination)
{
count = 1;
while ( count == 1)
{
rnum = num;
rdenomination = denomination;
for (i=1; i < abs(num); i++)
{
if (num % i == 0 && denomination % i == 0)
{
num = num / i;
denomination = denomination / i;
}
}
if (( rnum == num) && ( rdenomination == denomination))
count = 0;
};
}
{
num = num / denomination;
denomination = denomination / denomination;
}
}
Rational::Rational( int a, int b)
{
num = a;
denomination = b;
}
_________________________________________________
Rational.h
#include <iostream>
#include <fstream>
using namespace std;
class Rational
{
private:
int num, denomination;
public:
Rational();
Rational(int a, int b);
void assignData( int, int);
void reduce();
friend ostream& operator << (ostream& out, Rational& r);
friend Rational operator+ (Rational r1, Rational r2);
friend Rational operator* (Rational r1, Rational r2);
friend Rational operator- (Rational r1, Rational r2);
friend Rational operator/ (Rational r1, Rational r2);
};
____________________________________________________________
RationalDriver.cpp
#include <iostream>
#include <fstream>
#include "Rational.h"
using namespace std;
int main()
{
Rational t1,t2,t3,t4,r1,r2,r3,r4,r5,r6,r7,r8;
int j = 0,n[10],d[10],n1[10],d1[10],n2[10],d2[10],n3[10],d3[10];
char sign[4], temp;
ifstream infile;
infile.open("Rational.txt");
while(!infile.eof())
{
infile >> n[j];
infile >> temp;
infile >> d[j];
infile >> sign;
infile >> n2[j];
infile >> temp;
infile >> d2[j];
j = j + 1;
};
r1.assignData(n[0],d[0]);
r2.assignData(n2[0],d2[0]);
r3.assignData(n[1],d[1]);
r4.assignData(n2[1],d2[1]);
r5.assignData(n[2],d[2]);
r6.assignData(n2[2],d2[2]);
r7.assignData(n[3],d[3]);
r8.assignData(n2[3],d2[3]);
for (j = 0; j < 4; j++)
{
switch(sign[j])
{
case '+' : t1 = r1 + r2;
t1.reduce();
cout << r1 << " + " << r2 << "is ";
cout << t1 << endl;
break;
case '*' : t2 = r3 * r4;
t2.reduce();
cout << r3 << " * " << r4 << "is ";
cout << t2 << endl;
break;
case '-' : t3 = r5 - r6;
t3.reduce();
cout << r5 << " - " << r6 << "is ";
cout << t3 << endl;
break;
case '/' : t4 = r7 / r8;
t4.reduce();
cout << r7 << " / " << r8 << "is ";
cout << t4 << endl;
break;
}
}
system ("pause");
return 0;
}
Explanation / Answer
//I changed reduce function logic and it works , I just tested with one expression, I changed that files for +, - , * and / ,it //works fine.. I am just working with r1 and r2,, later pls change you main file accordingly ,, I am providing //Rational.cpp //and main file which I changed, later u can change main to include all expressions in one shot.
//Rational.cpp
#include <fstream>
#include "Rational.h"
using namespace std;
int hcf(int *num, int *den);
void Rational::assignData( int m, int n)
{
num = m;
denomination = n;
}
Rational::Rational()
{
num = 0;
denomination =0;
}
Rational operator+(Rational a, Rational b)
{
Rational result;
if (a.denomination == b.denomination)
{
result.num = a.num + b.num;
result.denomination = a.denomination;
return result;
}
else
{
a.num = a.num * b.denomination;
b.num = b.num * a.denomination;
a.denomination = a.denomination * b.denomination;
//commented below line Chegg EA
//b.denomination = a.denomination * b.denomination;
result.num = a.num + b.num;
result.denomination = a.denomination ;
return result;
}
}
Rational operator-(Rational a, Rational b)
{
Rational result;
if (a.denomination == b.denomination)
{
result.num = a.num - b.num;
result.denomination = a.denomination;
return result;
}
else
{
a.num = a.num * b.denomination;
b.num = b.num * a.denomination;
a.denomination = a.denomination * b.denomination;
b.denomination = a.denomination ;
result.num = a.num - b.num;
result.denomination = a.denomination;
return result;
}
}
Rational operator*(Rational a, Rational b)
{
Rational result;
{
result.num = a.num * b.num;
result.denomination = a.denomination * b.denomination;
return result;
}
}
Rational operator/(Rational a, Rational b)
{
Rational result;
{
result.num = a.num * b.denomination;
result.denomination = a.denomination * b.num;
return result;
}
}
ostream& operator << (ostream& out, Rational& r)
{
out << r.num << " / " << r.denomination;
return out;
}
//Changed logic of this function Chegg EA
void Rational::reduce()
{
int a, b, c;
a = num;
b = denomination;
do
{
c = a%b;
a = b;
b = c;
} while (c != 0);
num = num / a;
denomination = denomination / a;
return ;
}
Rational::Rational( int a, int b)
{
num = a;
denomination = b;
}
---------------------------------------
//main driver
//RationalDriver.cpp
#include <iostream>
#include <fstream>
#include "Rational.h"
using namespace std;
int main()
{
Rational t1, t2, t3, t4, r1, r2, r3, r4, r5, r6, r7, r8;
int j = 0, n[10], d[10], n1[10], d1[10], n2[10], d2[10], n3[10], d3[10];
char sign[4], temp;
ifstream infile;
infile.open("Rational.txt");
while (!infile.eof())
{
infile >> n[j];
infile >> temp;
infile >> d[j];
infile >> sign;
infile >> n2[j];
infile >> temp;
infile >> d2[j];
j = j + 1;
};
r1.assignData(n[0], d[0]);
r2.assignData(n2[0], d2[0]);
/*r3.assignData(n[1], d[1]);
r4.assignData(n2[1], d2[1]);
r5.assignData(n[2], d[2]);
r6.assignData(n2[2], d2[2]);
/*r7.assignData(n[3], d[3]);
r8.assignData(n2[3], d2[3]);*/
for (j = 0; j < 1; j++)
{
switch (sign[j])
{
case '+': t1 = r1 + r2;
t1.reduce();
cout << r1 << " + " << r2 << " is ";
cout << t1 << endl;
break;
case '*': t2 = r1 * r2;
t2.reduce();
cout << r1 << " * " << r2 << " is ";
cout << t2 << endl;
break;
case '-': t3 = r1 - r2;
t3.reduce();
cout << r1 << " - " << r2 << " is ";
cout << t3 << endl;
break;
case '/': t4 = r1 / r2;
t4.reduce();
cout << r1 << " / " << r2 << " is ";
cout << t4 << endl;
break;
}
}
system("pause");
return 0;
}
------------------------------------------------------------
///tested with one expression file Rational.txt, I changed sign every time to test all operations
Rational.txt
2 / 3 + 2 / 8
//for + sign
output:
2 / 3 / 2 / 8 is 11/12
//for - sign
2 / 3 - 2 / 8
output:
2 / 3 / 2 / 8 is 5 / 12
//for * sign
2 / 3 * 2 / 8
output:
2 / 3 / 2 / 8 is 1/6
//for / sign
2 / 3 / 2 / 8
outpt:
2 / 3 / 2 / 8 is 8 / 3
Related Questions
drjack9650@gmail.com
Navigate
Integrity-first tutoring: explanations and feedback only — we do not complete graded work. Learn more.