All pastes #740484 Raw Edit

Stuff

public text v1 · immutable
·published 2007-10-17 23:09 UTC
rendered paste body
// The following program is basically a fraction calculator.  the user will enter
// in their query in the form (x1/y1 [oper] x2/y2).  the program will then read
// the input, put the numbers into the appropriate variables, and read in the 
// operator.  then the program will evaluate it, through the switch function in 
// the main function.  if the result is an improper fraction, it will convert it
// into a mixed fraction. then the program will reduce the fraction, if possible.
// finally the program will output the fraction in the correct form, and wait for
// a new query.  the program will exit once 'x' is used for the operator.
// 		input:  x1/y1 [oper] x2/y2
// 		output: the result of the input
#include <iostream.h>
#include <math.h>

// function reduces fractions, passed by reference
//   input:  fraction numerator (num) and denominator (den)
//   output: reduced numerator and denominator  
void reduce(int &num, int &den){
	int i = 1, least, gcf, rednum, redden;

	if(num >= den)
		least = num;
	else
		least = den;
	
	for(i; i <= least; i++){
		if((num % i == 0) && (den % i == 0))
			gcf = i;
	}

	num = num / gcf;
	den = den / gcf;
}

// function expands an inproper fraction to mixed, num and whole passed by reference
//   input:  numerator, denominator, and whole number
//   output: numerator and whole number passed back by reference
void expand(int &num, int den, int &whole){
	whole = num / den;
	num = num % den;
}

// function gets the values for both fractions and the operator
//   input:  nothing, except placeholder variables
//     both fraction's numerators and denominators, and the operator
//   output: fraction's numerators and denominators, and the operator passed back by reference
void frac_input(int &num1, int &den1, int &num2, int &den2, char &oper){
	char trash;
	bool valid;
	do{
        valid = true;
		cout << "::>  ";
		cin >>num1>>trash>>den1>>oper>>num2>>trash>>den2;
		if(den1 == 0 || den2 == 0){
			valid = false;
			cout << "Denominator is zero.  please retry." << endl;
		}
		if(oper != '*' && oper != '/' && oper != '+' && oper != '-' && oper != 'x'){
			valid = false;
			cout << "Invalid operator.  please retry. " << endl;
		}
	} while (valid == false);
}

// function multiplies fractions
//   input:  both fractions numerators and denominators
//   output: result numerator and denominator passed by reference
void multiply_frac(int num1, int den1, int num2, int den2, int &ansnum, int &ansden){
	ansnum = num1 * num2;
	ansden = den1 * den2;
}

// function divides fractions
//   input:  both fractions numerators and denominators
//   output: result numerator and denominator passed by reference
void divide_frac(int num1, int den1, int num2, int den2, int &ansnum, int &ansden){
	ansnum = num1 * den2;
	ansden = den1 * num2;
}

// function adds fractions
//   input:  both fractions numerators and denominators
//   output: result numerator and denominator passed by reference
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;
}

// function subtracts fractions
//   input:  both fractions numerators and denominators
//   output: result numerator and denominator passed by reference
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;
}

// function outputs original query, and result that is reduced and expanded
//   input:  both fraction numerators and denominators, the answer fraction,
//     whole number if mixed fraction, and the operator
//   output: nothing except text
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;
}
	
// main function.  function initializes all fraction variables, and acts upon user
// input.  calls the input function, then a switch to evaluate the user query then
// expands, reduces, and outputs the result unless the exit operator ('x') is used
int main(){
	int num1, num2, den1, den2, ansnum, ansden, whole = 0;
	char oper;
	cout << "Welcome.  enter your query in the following form: 4/3 + 3/5." <<
        endl << "Put 'x' in the operator (4/3 x 3/3) to exit." << endl;
	do{
		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;
		}
		if(oper != 'x'){
			expand(ansnum, ansden, whole);
			reduce(ansnum, ansden);
			output(num1, den1, num2, den2, ansnum, ansden, whole, oper);
		}		
	} while(oper != 'x');
	return 0;
}