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 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270
|
#include <iostream>
#include <cstdlib>
using namespace std;
class Fraction // Class for fraction values
{
private:
int WholeNumber;
int Numerator;
int Denominator;
public: // Prototypes for MEMBER functions
Fraction() // Default constructor
{
this->WholeNumber = 0;
this->Numerator = 0;
this->Denominator = 1;
}
Fraction(int w, int n, int d): WholeNumber(w), Numerator(n), Denominator(d)
{
}
Fraction(const Fraction & rhs)// Copy constructor
{
this->WholeNumber = rhs.WholeNumber;
this->Numerator = rhs.Numerator;
this->Denominator = rhs.Denominator;
}
// Accessor Functions
int getWholeNumber() const;
int getNumerator() const;
int getDenominator() const;
void getFraction() const // Show the Fraction values
{
cout << this->WholeNumber;
if (this->Numerator) // If numerator is NOT 0
cout << " " << this->Numerator
<< "/"
<< this->Denominator;
return;
}
void setFraction(int w, int n, int d)
{
this->WholeNumber = w;
this->Numerator = n;
this->Denominator = d;
}
void setFraction() // Set Fraction values
{
// Parse the input stream...
char Temp[] = " "; //EXACTLY 16 character positions (shown as SPACES
//in the literal).
char *pChr; // Pointer to the END of the Temp array
char w[8], n[8], d[8]; // Some temporary storage arrays for the fraction
// components
// Set arrays to blanks
int count;
for(count=0;count < 7; count++)
{
w[count] = ' ';
n[count] = ' ';
d[count] = ' ';
}
d[count] = '\0'; // Store null at the end of the arrays
n[count] = '\0';
w[count] = '\0';
pChr = &Temp[15]; // Start at the 'end' of the input array
cin.getline(Temp,15); // Get the fraction value
while (*pChr == ' ')
{
pChr--; // Find the last digit position
} // Put a null character there to end the 'string'
*pChr = '\0';
int NullLocation = (pChr - Temp); // Save character count of where null
// was stored
pChr--; // Skip the null
// Create three pointers to the last character position in each component part
char *pDen = &d[6];
char *pNum = &n[6];
char *pWhole = &w[6];
for(count=0;count < NullLocation; count++)
{
if (Temp[count] == '/')
break; // Found the separator in fraction, otherwise it's
// a whole number only
}
if (count >= NullLocation)
{
this->Denominator = 1;// There is no fraction
this->Numerator = 0;
} // End if
else
{ // There is a '/' separator in the fraction value
while (*pChr != '/')
{
*pDen = *pChr; // Store the digit
pDen--;
pChr--;
}
this->Denominator = atoi(d);
pChr--; // Skip the '/' character
while (*pChr != ' ')
{
*pNum = *pChr; // Store the digit
pNum--;
pChr--;
}
this->Numerator = atoi(n); // Store the numerator
} // End else
while (pChr >= &Temp[0]) // Parse the wholenumber
{
*pWhole = *pChr; // Store the digit
pWhole--;
pChr--;
}
this->WholeNumber = atoi(w); // Store the wholenumber
return;
}
void AddFractions(Fraction &, Fraction &); // Add two objects of Fraction type
void ReduceFractions();
void SubFractions(Fraction & , Fraction & ); // Reduce fraction to lowest terms
Fraction operator + (const Fraction &);
Fraction operator - (const Fraction & );
}; // End of Fraction class declaration/definition
// AddFractions - member function of the Fraction class
void Fraction::AddFractions(Fraction & One, Fraction & Two)
{
int New1;
int New2;
int NewNumerator;
int CarryOut;
this->WholeNumber = One.WholeNumber + Two.WholeNumber;
this->Denominator = One.Denominator * Two.Denominator;
New1 = One.Numerator * Two.Denominator;
New2 = Two.Numerator * One.Denominator;
NewNumerator = New1 + New2;
CarryOut = NewNumerator / this->Denominator;
this->WholeNumber += CarryOut;
this->Numerator = NewNumerator % this->Denominator;
return;
}
void Fraction::SubFractions(Fraction & One, Fraction & Two)
{
int New1;
int New2;
int NewNumerator;
int CarryOut;
this->WholeNumber = One.WholeNumber - Two.WholeNumber;
this->Denominator = One.Denominator * Two.Denominator;
New1 = One.Numerator * Two.Denominator;
New2 = Two.Numerator * One.Denominator;
NewNumerator = New1 - New2;
CarryOut = NewNumerator / this->Denominator;
this->WholeNumber -= CarryOut;
this->Numerator = NewNumerator % this->Denominator;
return;
}
// ReduceFraction - member function of Fraction class
void Fraction::ReduceFractions()
{
int First = this->Numerator;
int Second = this->Denominator;
int Temp;
if(this->Numerator == 0) // Check for 0 numerator
{
this->Denominator = 1;
return;
}
// Find greatest common denominator
while (First != Second)
{
if (First < Second) // First is not larger
{
Temp = First; // Swap values
First = Second;
Second = Temp;
}
First -= Second;
} // End while
this->Numerator /= First;
this->Denominator /= First;
return;
}
Fraction Fraction::operator + (const Fraction & rhs)
{
int New1;
int New2;
int NewNumerator;
int CarryOut;
Fraction temp;
temp.WholeNumber = WholeNumber + rhs.WholeNumber;
temp.Denominator = Denominator * rhs.Denominator;
New1 = Numerator * rhs.Denominator;
New2 = rhs.Numerator * Denominator;
NewNumerator = New1 + New2;
CarryOut = NewNumerator / this->Denominator;
temp.WholeNumber += CarryOut;
temp.Numerator = NewNumerator % this->Denominator;
return temp;
}
int main()
{
Fraction FirstOne; // A fraction value
Fraction SecondOne; // Another fraction value
Fraction Sum; // Sum of two fractions
cout << "Enter the first fraction value: ";
FirstOne.setFraction();
cout << "Enter the second fraction value: ";
SecondOne.setFraction();
Sum.AddFractions(FirstOne, SecondOne);
Sum.ReduceFractions();
cout << endl << "The sum of ";
FirstOne.getFraction();
cout << " and ";
SecondOne.getFraction();
cout << " is ";
Sum.getFraction();
cout << endl << endl;
Fraction NewSum = FirstOne + SecondOne;
cout << endl << "The sum of ";
FirstOne.getFraction();
cout << " and ";
SecondOne.getFraction();
cout << " is ";
NewSum.getFraction();
cout << endl << endl;
return 0;
}
|