#include #include #include #include void reduce(int &num, int &den){ int least, gcf, rednum, redden; int i; if(num >= den) least = num; else least = den; for(i = 1; i <= least; i++){ if((num % i == 0) && (den % i == 0)) gcf = i; } rednum = num / gcf; redden = den / gcf; num = rednum; den = redden; } void expand(int &num, int den, int &whole){ whole = num / den; num = num % den; } void frac_input(int &num1, int &den1, int &num2, int &den2, char &oper){ char nume1, nume2, dene1, dene2, trash; bool valid; do{ valid = true; cout << "Enter like this: 4 / 2 + 3 / 3: "; cin >>nume1>>trash>>dene1>>oper>>nume2>>trash>>dene2; if(dene1 == '0' || dene2 == '0'){ valid = false; cout << "Denominator is zero. please retry." << endl; } if(!(isdigit(nume1) && isdigit(nume2) && isdigit(dene1) && isdigit(dene2))){ valid = false; cout << "Please enter only numbers." << endl; } if(oper != '*' && oper != '/' && oper != '+' && oper != '-'){ valid = false; cout << "Invalid operator. please retry. " << endl; } } while (valid == false); // need to convert back to int here. // NEED TO } void multiply_frac(int num1, int den1, int num2, int den2, int &ansnum, int &ansden){ ansnum = num1 * num2; ansden = den1 * den2; } void divide_frac(int num1, int den1, int num2, int den2, int &ansnum, int &ansden){ ansnum = num1 * den2; ansden = den1 * num2; } void add_frac(int num1, int den1, int num2, int den2, int &ansnum, int &ansden){ if(den1 != den2){ num1 = num1 * den2; num2 = num2 * den1; ansden = den1 * den2; } else ansden = den1; ansnum = num1 + num2; } void subtract_frac(int num1, int den1, int num2, int den2, int &ansnum, int &ansden){ if(den1 != den2){ num1 = num1 * den2; num2 = num2 * den1; ansden = den1 * den2; } else ansden = den1; ansnum = num1 - num2; } void output(int num1, int den1, int num2, int den2, int ansnum, int ansden, int whole, char oper){ cout << num1 << "/" << den1 << " " << oper << " " << num2 << "/" << den2 << " = "; if(whole != 0 && ansnum == 0) cout << whole; else if(ansnum != 0 && whole != 0) cout << whole << " & " << abs(ansnum) << "/" << ansden; else if(ansnum != 0 && whole == 0) cout << ansnum << "/" << ansden; else if(ansnum == 0 && whole == 0) cout << "0"; cout << endl; } void act_menu(){ int num1, num2, den1, den2, ansnum, ansden, whole = 0; char oper; frac_input(num1, den1, num2, den2, oper); switch(oper){ case '*': multiply_frac(num1, den1, num2, den2, ansnum, ansden); break; case '/': divide_frac(num1, den1, num2, den2, ansnum, ansden); break; case '+': add_frac(num1, den1, num2, den2, ansnum, ansden); break; case '-': subtract_frac(num1, den1, num2, den2, ansnum, ansden); break; } expand(ansnum, ansden, whole); reduce(ansnum, ansden); output(num1, den1, num2, den2, ansnum, ansden, whole, oper); } int main(){ do act_menu(); while(1 != 0); return 0; }