Professional Documents
Culture Documents
class Fraction{
private:
int numer;
int denom;
public:
//default constructor
Fraction(){
numer = 1;
denom = 1;
}
//one parameter
Fraction(int m){
numer = m;
denom = 1;
}
//two parameters
Fraction(int m,int n){
numer = m;
denom = n;
if(n < 0){
numer = 0 - m;
denom = 0 - n;
}
if(m == 0){
numer = 0;
denom = 1;
}
if(n == 0){
exit(1);
}
}
//Copy Constructor
Fraction(const Fraction& other){
numer = other.numer;
denom = other.denom;
}
/*//Destructor
~Fraction();*/
//Copy Assignment Operator
Fraction operator =(const Fraction& fr){
numer = fr.numer;
denom = fr.denom;
return *this;
}
//Unary Arithmetic Operators
//--Unary minus operator
Fraction operator -(){
Fraction temp;
temp.numer = 0 - numer;
temp.denom = denom;
return temp;
}
//--Unary plus operator
Fraction operator +(){
Fraction temp;
temp.numer = 0 + numer;
temp.denom = 0 + denom;
return temp;
}
//Prefix pre-decrement operator for dividendo
Fraction& operator--(){
this->numer = numer - denom;
this->denom = denom;
return *this;
}
//Prefix pre-increment operator for componendo
Fraction& operator++(){
this->numer = numer + denom;
this->denom = denom;
return *this;
}
//Postfix post-decrement operator for lazy dividendo
Fraction operator--(int){
Fraction temp;
temp.numer = numer - denom;
temp.denom = denom;
return temp;
}
//Postfix post-increment operator for lazy componendo
Fraction operator++(int){
Fraction temp;
temp.numer = numer + denom;
temp.denom = denom;
return temp;
}
//GCD
int gcd(int n, int d){
int remaind;
while (d != 0)
{
remaind = n % d;
n = d;
d = remaind;
}
return n;
}
//LCM
int lcm(int x, int y){
int a;
if(x > y){
a = x;
}
else{
a = y;
}
while (true){
if (a % x == 0 && a % y == 0)
return a;
++a;
}
}
void simplify(){
if(denom < 0){
numer *= -1;
denom *= -1;
}
int d = gcd(numer,denom);
numer /= d;
denom /= d;
}
sc_fUnity = Fraction();
sc_fZero = Fraction(0);
//Addition
Fraction operator+ (const Fraction& Frac1,const Fraction& Frac2){
Fraction add;
add.numer = (Frac1.numer*Frac2.denom) + (Frac2.numer*Frac1.denom);
add.denom = Frac1.denom*Frac2.denom;
add.simplify();
return add;
}
//Subtraction
Fraction operator- (const Fraction& Frac1,const Fraction& Frac2){
Fraction sub;
sub.numer = (Frac1.numer*Frac2.denom) - (Frac2.numer*Frac1.denom);
sub.denom = Frac1.denom*Frac2.denom;
sub.simplify();
return sub;
}
//Multiplication
Fraction operator* (const Fraction& Frac1,const Fraction& Frac2){
Fraction mul;
mul.numer = Frac1.numer*Frac2.numer;
mul.denom = Frac1.denom*Frac2.denom;
mul.simplify();
return mul;
}
//Division
Fraction operator/ (const Fraction& Frac1,const Fraction& Frac2){
Fraction divi;
divi.numer = Frac1.numer*Frac2.denom;
divi.denom = Frac1.denom*Frac2.numer;
divi.simplify();
return divi;
}
return temp;
}
//I/O Operators
//Output
std::ostream& operator<< (std::ostream &out, const Fraction &Frac){
if(Frac.denom == 1){
out << Frac.numer;
}
else{
out << Frac.numer << "/" << Frac.denom;
}
return out;
}
//Input
std::istream& operator>> (std::istream &in, Fraction &Frac){
int p, q;
in >> p >> q;
validate(p, q);
Frac.numer = p;
Frac.denom = q;
Frac.simplify();
return in;
}
int main()
{
cout << "\nTest Fraction Data Type" << endl;
cout << "CONSTRUCTORS" << endl;
cout << "------------" << endl;
Fraction f1(5, 3);
Fraction f2(7.2);
Fraction f3;
cout << "Fraction f1(5, 3) = " << f1 << endl;
cout << "Fraction f2(7.2) = " << f2 << endl;
cout << "Fraction f3 = " << f3 << endl;
cout << "BINARY ARITHMETIC OPERATORS USING FRIEND FUNCTIONS" << endl;
cout << "--------------------------------------------------" << endl;
f1 = Fraction(5, 12);
f2 = Fraction(7, 18);
f3 = f1 + f2;
cout << "Binary Plus: f3 = " << f3 << ". f1 = " << f1 << ". f2 = " << f2 <<
endl;
f1 = Fraction(16, 3);
f2 = Fraction(22, 13);
f3 = f1 - f2;
cout << "Binary Minus: f3 = " << f3 << ". f1 = " << f1 << ". f2 = " << f2 <<
endl;
f1 = Fraction(5, 12);
f2 = Fraction(18, 25);
f3 = f1 * f2;
cout << "Multiply: f3 = " << f3 << ". f1 = " << f1 << ". f2 = " << f2 << endl;
f1 = Fraction(5, 12);
f2 = Fraction(7, 18);
f3 = f1 / f2;
cout << "Divide: f3 = " << f3 << ". f1 = " << f1 << ". f2 = " << f2 << endl;
f1 = Fraction(5, 12);
f2 = Fraction(7, 18);
//f3 = f1 % f2;
cout << "Residue: f3 = " << f3 << ". f1 = " << f1 << ". f2 = " << f2 << endl;
return 0;
}
New:
1st Type:
#include <iostream>
#include <cmath>
using namespace std;
class Fraction{
private:
int numer;
int denom;
public:
//default constructor
Fraction();
//one parameter
Fraction(int);
//two parameters
Fraction(int,int);
//Copy Constructor
Fraction(const Fraction&);
/*//Destructor
~Fraction();*/
//Special Operators
friend Fraction operator! (const Fraction&);
//I/O Operators
friend std::ostream& operator<< (std::ostream &out, const Fraction &Frac);
friend std::istream& operator>> (std::istream &in, Fraction &Frac);
//sc_fUnity = Fraction();
//sc_fZero = Fraction(0);
//default constructor
Fraction::Fraction(){
numer = 1;
denom = 1;
}
//one parameter
Fraction::Fraction(int m){
numer = m;
denom = 1;
}
//two parameters
Fraction::Fraction(int m,int n){
numer = m;
denom = n;
if(n < 0){
numer = 0 - m;
denom = 0 - n;
}
if(m == 0){
numer = 0;
denom = 1;
}
if(n == 0){
exit(1);
}
}
//copy constructor
Fraction::Fraction(const Fraction& other){
numer = other.numer;
denom = other.denom;
}
return *this;
}
return temp;
}
//Unary Plus
Fraction Fraction::operator+ (){
Fraction temp;
temp.numer = 0 + numer;
temp.denom = 0 + denom;
return temp;
}
//Prefix pre-decrement operator for dividendo
Fraction& Fraction::operator--(){
this->numer = numer - denom;
this->denom = denom;
return *this;
}
//Prefix pre-increment operator for componendo
Fraction& Fraction::operator++(){
this->numer = numer + denom;
this->denom = denom;
return *this;
}
//Postfix post-decrement operator for lazy dividendo
Fraction Fraction::operator--(int){
Fraction temp;
temp.numer = numer - denom;
temp.denom = denom;
return temp;
}
//Postfix post-increment operator for lazy componendo
Fraction Fraction::operator++(int){
Fraction temp;
temp.numer = numer + denom;
temp.denom = denom;
return temp;
}
//Special operators
Fraction operator! (const Fraction& Frac){
Fraction temp;
temp.numer = Frac.denom;
temp.denom = Frac.numer;
return temp;
}
//I/O Operators
//Output
std::ostream& operator<< (std::ostream &out, const Fraction &Frac){
if(Frac.denom == 1){
out << Frac.numer;
}
else{
out << Frac.numer << "/" << Frac.denom;
}
return out;
}
//Input
std::istream& operator>> (std::istream &in, Fraction &Frac){
int p, q;
in >> p >> q;
validate(p, q);
Frac.numer = p;
Frac.denom = q;
Frac.simplify();
return in;
}
int main()
{
cout << "\nTest Fraction Data Type" << endl;
cout << "CONSTRUCTORS" << endl;
cout << "------------" << endl;
Fraction f1(5, 3);
Fraction f2(7.2);
Fraction f3;
cout << "Fraction f1(5, 3) = " << f1 << endl;
cout << "Fraction f2(7.2) = " << f2 << endl;
cout << "Fraction f3 = " << f3 << endl;
cout << "BINARY ARITHMETIC OPERATORS USING FRIEND FUNCTIONS" << endl;
cout << "--------------------------------------------------" << endl;
f1 = Fraction(5, 12);
f2 = Fraction(7, 18);
f3 = f1 + f2;
cout << "Binary Plus: f3 = " << f3 << ". f1 = " << f1 << ". f2 = " << f2 <<
endl;
f1 = Fraction(16, 3);
f2 = Fraction(22, 13);
f3 = f1 - f2;
cout << "Binary Minus: f3 = " << f3 << ". f1 = " << f1 << ". f2 = " << f2 <<
endl;
f1 = Fraction(5, 12);
f2 = Fraction(18, 25);
f3 = f1 * f2;
cout << "Multiply: f3 = " << f3 << ". f1 = " << f1 << ". f2 = " << f2 << endl;
f1 = Fraction(5, 12);
f2 = Fraction(7, 18);
f3 = f1 / f2;
cout << "Divide: f3 = " << f3 << ". f1 = " << f1 << ". f2 = " << f2 << endl;
f1 = Fraction(5, 12);
f2 = Fraction(7, 18);
//f3 = f1 % f2;
cout << "Residue: f3 = " << f3 << ". f1 = " << f1 << ". f2 = " << f2 << endl;
return 0;
}
2nd Type:
#include <iostream>
using namespace std;
class Fraction{
private:
int numer;
int denom;
public:
//default constructor
Fraction(){
numer = 1;
denom = 1;
}
//one parameter
Fraction(int m){
numer = m;
denom = 1;
}
//two parameters
Fraction(int m,int n){
numer = m;
denom = n;
if(n < 0){
numer = 0 - m;
denom = 0 - n;
}
if(m == 0){
numer = 0;
denom = 1;
}
if(n == 0){
exit(1);
}
}
//Copy Constructor
Fraction(const Fraction& other){
numer = other.numer;
denom = other.denom;
}
/*//Destructor
~Fraction();*/
//Copy Assignment Operator
Fraction operator =(const Fraction& fr){
numer = fr.numer;
denom = fr.denom;
return *this;
}
//Unary Arithmetic Operators
//--Unary minus operator
Fraction operator -(){
Fraction temp;
temp.numer = 0 - numer;
temp.denom = denom;
return temp;
}
//--Unary plus operator
Fraction operator +(){
Fraction temp;
temp.numer = 0 + numer;
temp.denom = 0 + denom;
return temp;
}
//Prefix pre-decrement operator for dividendo
Fraction& operator--(){
this->numer = numer - denom;
this->denom = denom;
return *this;
}
//Prefix pre-increment operator for componendo
Fraction& operator++(){
this->numer = numer + denom;
this->denom = denom;
return *this;
}
//Postfix post-decrement operator for lazy dividendo
Fraction operator--(int){
Fraction temp;
temp.numer = numer - denom;
temp.denom = denom;
return temp;
}
//Postfix post-increment operator for lazy componendo
Fraction operator++(int){
Fraction temp;
temp.numer = numer + denom;
temp.denom = denom;
return temp;
}
//GCD
int gcd(int n, int d){
int remaind;
while (d != 0)
{
remaind = n % d;
n = d;
d = remaind;
}
return n;
}
//LCM
int lcm(int x, int y){
int a;
if(x > y){
a = x;
}
else{
a = y;
}
while (true){
if (a % x == 0 && a % y == 0)
return a;
++a;
}
}
void simplify(){
if(denom < 0){
numer *= -1;
denom *= -1;
}
int d = gcd(numer,denom);
numer /= d;
denom /= d;
}
//sc_fUnity = Fraction();
//sc_fZero = Fraction(0);
//Addition
Fraction operator+ (const Fraction& Frac1,const Fraction& Frac2){
Fraction add;
add.numer = (Frac1.numer*Frac2.denom) + (Frac2.numer*Frac1.denom);
add.denom = Frac1.denom*Frac2.denom;
add.simplify();
return add;
}
//Subtraction
Fraction operator- (const Fraction& Frac1,const Fraction& Frac2){
Fraction sub;
sub.numer = (Frac1.numer*Frac2.denom) - (Frac2.numer*Frac1.denom);
sub.denom = Frac1.denom*Frac2.denom;
sub.simplify();
return sub;
}
//Multiplication
Fraction operator* (const Fraction& Frac1,const Fraction& Frac2){
Fraction mul;
mul.numer = Frac1.numer*Frac2.numer;
mul.denom = Frac1.denom*Frac2.denom;
mul.simplify();
return mul;
}
//Division
Fraction operator/ (const Fraction& Frac1,const Fraction& Frac2){
Fraction divi;
if(Frac2.numer == 0){
throw "Exception";
}
else{
divi.numer = Frac1.numer*Frac2.denom;
divi.denom = Frac1.denom*Frac2.numer;
divi.simplify();
return divi;
}
}
return temp;
}
//I/O Operators
//Output
std::ostream& operator<< (std::ostream &out, const Fraction &Frac){
if(Frac.denom == 1){
out << Frac.numer;
}
else{
out << Frac.numer << "/" << Frac.denom;
}
return out;
}
//Input
std::istream& operator>> (std::istream &in, Fraction &Frac){
int p, q;
in >> p >> q;
validate(p, q);
Frac.numer = p;
Frac.denom = q;
Frac.simplify();
return in;
}
int main()
{
cout << "\nTest Fraction Data Type" << endl;
cout << "CONSTRUCTORS" << endl;
cout << "------------" << endl;
Fraction f1(5, 3);
Fraction f2(7.2);
Fraction f3;
cout << "Fraction f1(5, 3) = " << f1 << endl;
cout << "Fraction f2(7.2) = " << f2 << endl;
cout << "Fraction f3 = " << f3 << endl;
cout << "BINARY ARITHMETIC OPERATORS USING FRIEND FUNCTIONS" << endl;
cout << "--------------------------------------------------" << endl;
f1 = Fraction(5, 12);
f2 = Fraction(7, 18);
f3 = f1 + f2;
cout << "Binary Plus: f3 = " << f3 << ". f1 = " << f1 << ". f2 = " << f2 <<
endl;
f1 = Fraction(16, 3);
f2 = Fraction(22, 13);
f3 = f1 - f2;
cout << "Binary Minus: f3 = " << f3 << ". f1 = " << f1 << ". f2 = " << f2 <<
endl;
f1 = Fraction(5, 12);
f2 = Fraction(18, 25);
f3 = f1 * f2;
cout << "Multiply: f3 = " << f3 << ". f1 = " << f1 << ". f2 = " << f2 << endl;
f1 = Fraction(5, 12);
f2 = Fraction(7, 18);
f3 = f1 / f2;
cout << "Divide: f3 = " << f3 << ". f1 = " << f1 << ". f2 = " << f2 << endl;
f1 = Fraction(5, 12);
f2 = Fraction(7, 18);
//f3 = f1 % f2;
cout << "Residue: f3 = " << f3 << ". f1 = " << f1 << ". f2 = " << f2 << endl;
return 0;
}