All pastes #738100 Raw Edit

Stuff

public text v1 · immutable
·published 2007-10-16 00:25 UTC
rendered paste body
#include <iostream.h>
#include <math.h>
#include <ctype.h>
#include <string.h>

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;
}