#include
#include
#include
#include
using namespace std;
class Fraction{
int numer, denom;
int find_gcd(int a, int b){
return a==0?b:find_gcd(b%a, a);
}
public:
void setNum(int num){
numer = num;
}
void setDen(int num){
denom = num;
}
int getNum(){
return numer;
}
int getDen(){
return denom;
}
Fraction operator +(const Fraction& fr){
Fraction f;
if(this->denom!=fr.denom){
f.setDen(this->denom*fr.denom);
f.setNum(this->numer*fr.denom + this->denom*fr.numer);
}else{
f.setDen(this->denom);
f.setNum(this->numer+fr.numer);
}
f.reduce_fraction();
return f;
}
Fraction operator -(const Fraction& fr){
Fraction f;
if(this->denom!=fr.denom){
f.setDen(this->denom*fr.denom);
f.setNum(this->numer*fr.denom - this->denom*fr.numer);
}else{
f.setDen(this->denom);
f.setNum(this->numer-fr.numer);
}
f.reduce_fraction();
return f;
}
Fraction operator *(const Fraction& fr){
Fraction f;
f.setNum(this->numer*fr.numer);
f.setDen(this->denom*fr.denom);
f.reduce_fraction();
return f;
}
Fraction operator /(const Fraction& fr){
Fraction f;
f.setNum(this->numer*fr.denom);
f.setDen(this->denom*fr.numer);
f.reduce_fraction();
return f;
}
Fraction operator %(const Fraction& fr){
Fraction f;
if(this->denom!=fr.denom){
f.setDen(this->denom*fr.denom);
f.setNum(this->numer*fr.denom % this->denom*fr.numer);
}else{
f.setDen(this->denom);
f.setNum(this->numer%fr.numer);
}
f.reduce_fraction();
return f;
}
void power(int power){
this->numer = pow(this->numer,power);
this->denom = pow(this->denom,power);
this->reduce_fraction();
}
void reduce_fraction(){
int gcd = find_gcd(numer, denom);
this->numer/=gcd;
this->denom/=gcd;
}
void print_fraction(){
if(numer==denom){
cout << numer << endl;
}else{
cout << numer << "/" << denom << endl;
}
}
};
void printMenu(){
system("cls");
cout << "1. Addition (+)" << endl;
cout << "2. Substraction (-)" << endl;
cout << "3. Multiplication (*)" << endl;
cout << "4. Division (/)" << endl;
cout << "5. Modulo (%)" << endl;
cout << "6. Fraction to the power n" << endl;
cout << "7. Exit" << endl;
cout << "Enter the operation: " << endl;
}
void getFraction(Fraction& first, Fraction& second){
int temp;
cout << "Enter first fraction numerator and denominator" << endl;
cin >> temp; first.setNum(temp);
cin >> temp; first.setDen(temp);
cout << "Enter the second fraction numerator and denominator" << endl;
cin >> temp; second.setNum(temp);
cin >> temp; second.setDen(temp);
}
int main(){
Fraction first, second, result;
int input, temp, p;
do{
printMenu();
cin >> input;
switch(input){
case 1:
getFraction(first, second);
result = first+second;
break;
case 2:
getFraction(first, second);
result = first-second;
break;
case 3:
getFraction(first, second);
result = first*second;
break;
case 4:
getFraction(first, second);
result = first/second;
break;
case 5:
getFraction(first, second);
result = first%second;
break;
case 6:
cout << "Enter fraction numerator and denominator" << endl;
cin >> temp; result.setNum(temp);
cin >> temp; result.setDen(temp);
cout << "Enter the power (integer): ";
cin >> p;
result.power(p);
break;
case 7:
cout << "Exiting...";
exit(0);
break;
default:
cout << "Only 1 - 6 allowed! Restarting..." << endl;
sleep(1);
continue;
}
cout << "Result : ";
result.print_fraction();
cout << endl;
system("pause");
}while(true);
return 0;
}