-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathFraction.cpp
136 lines (114 loc) · 3.26 KB
/
Fraction.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
#include <iostream>
#include "Fraction.h"
#include "DivisionByZero.h"
int Fraction::count{0};
// Default Constructor
Fraction::Fraction() {
numerator = 1;
denominator = 1;
count++;
}
// Parametrized Constructor
Fraction::Fraction(double num, double denom) {
numerator = num;
denominator = denom;
count++;
}
// Copy Constructor
Fraction::Fraction(const Fraction& RHS) {
numerator = RHS.numerator;
denominator = RHS.denominator;
count++;
}
// Destructor
Fraction::~Fraction() {
count--;
}
// Assignment Operator
Fraction Fraction::operator=(const Fraction& RHS) {
numerator = RHS.numerator;
denominator = RHS.denominator;
return *this;
}
// Stream insertion operator overload
std::ostream& operator<<(std::ostream& output, const Fraction& fraction) {
output << fraction.numerator << "/" << fraction.denominator;
return output;
}
// stream extraction operator overload
std::istream& operator>>(std::istream& input, Fraction& fraction) {
char ch{ };
try {
input >> fraction.numerator;
input >> ch; // skip the /
input >> fraction.denominator;
if (fraction.denominator == 0) {
throw DivisionByZero();
}
if (fraction.numerator == 0) {
throw "Numerator is zero";
}
}
catch (DivisionByZero&) {
while (fraction.denominator == 0) {
std::cout << "\nDivision by 0 is invalid\n";
// Loop for valid input
std::cout << "\nEnter the fraction in the form X / Y :\n";
input >> fraction.numerator;
input >> ch; // skip the /
input >> fraction.denominator;
}
}
catch (std::string) {
std::cout << "\n***Note: A fraction with a numerator of zero will always result in zero\n";
}
catch (...) {
std::cout << "\nThe default handler was executed\n";
}
return input;
}
// Returns an object of type Fraction (the sum in fraction form)
Fraction Fraction::operator+(Fraction& RHS) {
Fraction temp;
int LCM{ 0 };
if (denominator == RHS.denominator) {
temp.numerator = numerator + RHS.numerator;
temp.denominator = denominator;
}
else {
// Find Least Common Multiple
LCM = findLCM(denominator, RHS.denominator);
// Add numerators and set the new denominator to the LCM
temp.numerator = numerator * (LCM / denominator)
+ RHS.numerator * (LCM / RHS.denominator);
temp.denominator = LCM;
}
return temp;
}
//Add comments on functionality and make it more generic/modular
int Fraction::findLCM(int leftDenom, int rightDenom) {
int LCM;
for (LCM = (leftDenom > rightDenom) ? leftDenom : rightDenom; !((LCM % leftDenom == 0) && (LCM % rightDenom == 0)); LCM++);
return LCM;
// Another Algorithm
/*
int max { 0 };
max = (leftDenom > rightDenom) ? leftDenom : rightDenom;
while(true){
if((max % leftDenom == 0) && (max % rightDenom == 0)){
return max;
}
else{
max++;
}
}
*/
}
void Fraction::printFraction() {
std::cout << "(" << numerator << " / "
<< denominator << ")";
}
void Fraction::printSum() {
std::cout << "Sum: " << numerator << " / " << denominator
<< std::endl;
}