Rationalise (Canonise) the Fractions before Sorting
Before fractions are sorted, they are rationalised;
i.e., they are put in a form where their denominators become
the same. This same denominator is the LCM of the
denominators of all the separate fractions.
After this is done, the new numerators can easily be sorted
in a preferred order.
Steps for Sorting of Fractions C++ code
The following steps will guide us in writing our code.
Let's illustrate with 5/9,
3/7, 1/2
Step 1:
Find the LCM of the denominators.
⇒ LCM of 9, 7 & 2 = 126
Step 2:
In a turn by turn fashion, divide the found LCM from Step 1
by each denominator, multiplying the quotient by the corresponding numerator.
⇒
((5 x 14), (3 x 18), (1 x 63))/126
= (70, 54, 63)/126
Step 3:
Go ahead and sort the numerators in our order of choice.
⇒ In ascending order:
54/126, 63/126,
70/126
=
3/7, 1/2,
5/9
Create a new class file;
call it SortFraction.
Type out the adjoining JavaScript code for sorting fractions in ascending and descending orders.
Note: You can comment out the SubtractFraction C++ object
code in the main class from the previous lesson or simply continue from where it stopped.
So!
Feel free to try out your own set of numerators and denominators for fractional sorting.
C++ code for SortFraction Header File
#pragma once
#include "AddFraction.h"
#include <algorithm>
class SortFraction : AddFraction {
public:
SortFraction(vector<unsigned>, vector<unsigned>);
virtual ~SortFraction();
void sortAscending();
void sortDescending();
vector<unsigned> final_numerators;
vector<unsigned> final_denominators;
private:
unsigned int index;
vector<unsigned> copy_numerators;
void introit();
void finale();
};
SortFraction Class File
#include "stdafx.h"
#include "SortFraction.h"
bool isGreater(unsigned i, unsigned j) { return i > j; }
SortFraction::SortFraction(vector<unsigned> num, vector<unsigned> denom) : AddFraction(num, denom) {
}
void SortFraction::introit() {
canonizeFraction();
for (unsigned nn : new_numerators) {
copy_numerators.push_back(nn);
}
copy_numerators.shrink_to_fit();
}
void SortFraction::finale() {
vector<unsigned>::iterator iter;
for (unsigned sorted : copy_numerators) {
iter = search(new_numerators.begin(), new_numerators.end(), &sorted, &sorted + 1);
if (iter != new_numerators.end()) {
index = iter - new_numerators.begin();
final_numerators.push_back(numerators[index]);
final_denominators.push_back(denominators[index]);
}
}
final_numerators.shrink_to_fit();
final_denominators.shrink_to_fit();
}
void SortFraction::sortAscending() {
introit();
sort(copy_numerators.begin(), copy_numerators.end());
finale();
}
void SortFraction::sortDescending() {
introit();
sort(copy_numerators.begin(), copy_numerators.end(), isGreater);
finale();
}
SortFraction::~SortFraction() {
}
main class
#include "stdafx.h"
#include "SortFraction.h"
#include <iostream>
#include <vector>
#include <exception>
using namespace std;
int main() {
cout << "\n Welcome to our demonstration sequels";
cout << "\n Hope you enjoy (and follow) the lessons.\n\n";
vector<unsigned> numerators;
vector<unsigned> denominators;
try {
numerators = { 1, 3, 5, 9 };
denominators = { 2, 4, 2, 10 };
cout << "\n Sorting in ascending order the fractions:\n";
printf("%35s", " ");
for (unsigned n : numerators) {
printf("%9u", n);
}
printf("\n%43s", " ");
for (unsigned i = 0; i < numerators.size() - 1; i++) {
cout << "- , ";
}
printf("%2s", "-");
printf("\n%35s", " ");
for (unsigned d : denominators) {
printf("%9d", d);
}
cout << "\n";
SortFraction sort_fract(numerators, denominators);
sort_fract.sortAscending();
numerators = sort_fract.final_numerators;
denominators = sort_fract.final_denominators;
printf("\n%35s", " ");
for (unsigned n : numerators) {
printf("%9u", n);
}
printf("\n%43s", "Answer = ");
for (unsigned i = 0; i < numerators.size() - 1; i++) {
cout << "- , ";
}
printf("%2s", "-");
printf("\n%35s", " ");
for (unsigned d : denominators) {
printf("%9u", d);
}
cout << "\n\n";
} catch (exception& e) {
cout << "\n" << e.what() << "\n";
}
return 0;
}