Sample Solution to Lab #3


/////////////////////////////////////////////////////////////////////////////
//  Student name: Nigel Tufnel
//    Student ID: 123-45-6789
//        Course: CS161 Summer 97
//    Assignment: #3
//      Due date: 7-22-97
//
//   Description: evaluate.cpp
//
//                This program prompts the user for an expression,
//                then evaluates it and displays the result. The
//                expression must be in the form:
//
//                       number operator number operator number
//
//                Ex:      5       -       2       *       4
//
//                In the example above, 5-2*4 evaluates to -3.
//
///////////////////////////////////////////////////////////////////////////

#include <iostream.h>  // for cin/cout   
#include <iomanip.h>   // for setprecision()
// some definitions for Booleans
typedef int Boolean;
const int TRUE = 1;
const int FALSE = 0;

/////////////////////////////////////////////////////////////////////////////
// Function: getExpression
//           This function prompts the user for an expression and returns
//           the operands and operators to the caller. The user's input
//           is of the form:  number operator number operator number
//
//   Inputs: None
//
//  Outputs: a float representing the first operand    (reference)
//           a char representing the first operator    (reference)
//           a float representing the second operand   (reference)
//           a char representing the second operator   (reference)
//           a float representing the third operand    (reference)
//
void getExpression(float &operand1,
                   char &operator1,
                   float &operand2,
                   char &operator2,
                   float &operand3);


/////////////////////////////////////////////////////////////////////////////
// Function: evaluateExpression
//           This function evaluates the expression that the user inputted.
//           It checks to see in which order the expression should be
//           evaluated (left to right, right to left)
//
//  Inputs:  a float representing the first operand     (value)
//           a char representing the first operator     (value)
//           a float representing the second operand    (value)
//           a char representing the second operator    (value)
//           a float representing the third operand     (value)
//
//  Outputs: a single float representing the result of
//           evaluating the expression
//
float evaluateExpression(float operand1, 
                         char operator1,
                         float operand2,
                         char operator2,
                         float operand3);


/////////////////////////////////////////////////////////////////////////////
// Function: performOperation
//           This function evaluates a simple expression containing
//           a left operand, an operator, and a right operand
//
//  Inputs:  a float representing the left operand   (value)
//           a char representing the operator        (value)
//           a float representing the right operand  (value)
//
//  Outputs: a single float representing the result
//           of evaluating the simple expression
//
float performOperation(float operand1, char operater, float operand2);


/////////////////////////////////////////////////////////////////////////////
// Function: operatorsAreValid
//           This function verifies that the two operators input by
//           the user are valid. Valid operators are:  +  -  *  /
//
//  Inputs:  a char representing the first operator     (value)
//           a char representing the second operator    (value)
//
//  Outputs: a Boolean representing the outcome of the verification
//              TRUE  - both operators are valid
//              FALSE - either one or both operators are invalid
//
Boolean operatorsAreValid(char operator1, char operator2);


////////////////////////////////////////////////////////////////////////////////
// Function: printResults
//           This function prints the expression entered by the user
//           and also the results of evaluating the expression
//
//  Inputs:  a float representing the first operand     (value)
//           a char representing the first operator     (value)
//           a float representing the second operand    (value)
//           a char representing the second operator    (value)
//           a float representing the third operand     (value)
//           a float representing the result            (value)
//
//  Outputs: None
//
void printResult(float operand1, 
                 char operator1,
                 float operand2,
                 char operator2,
                 float operand3,
                 float result);


// program entry point
void main(void)
{
	char operator1, operator2;          // operators input by the user
	float operand1, operand2, operand3; // operands input by the user
	float result;                       // result after evaluating expression
	Boolean valid;                      // indicates valid/invalid operators

	// get expression from the user
	getExpression(operand1, operator1, operand2, operator2, operand3);

	// check to see if the operators are valid
	valid = operatorsAreValid(operator1, operator2);

	// if they are valid, continue with program
	if (valid == TRUE)
	{
		// evaluate the expression, assigning the value to result
		result = evaluateExpression(operand1, operator1, operand2, 
                                             operator2, operand3);

		// display expression and result
		printResult(operand1, operator1, operand2, operator2, operand3, result);
	}
}

void getExpression(float &operand1, char  &operator1, float &operand2,
                   char  &operator2, float &operand3)
{
	// prompt the user for an expression in the appropriate form
	cout << "Enter an expression in the form: ";
	cout << "num op num op num (ex. 5 * 3 - 8)" << endl;

	// read the user's expression into the proper variables
	cin >> operand1 >> operator1 >> operand2 >> operator2 >> operand3;
}

float evaluateExpression(float operand1, char operator1, float operand2, 
                         char operator2, float operand3)
{
	float tempResult;    // holds the intermediate result
	float finalResult;   // holds the final result

	// if the second operator is multiply or divide, and the
	// first operator is addition or subtraction, then it is safe
	// to evaluate the expression from right to left
	// The code in BOLD was added after the class on Tuesday night
	if ( (operator2 == '*' || operator2 == '/') &&
             (operator1 == '+' || operator1 == '-') )
	{
		// evaluate second operator first
		tempResult = performOperation(operand2, operator2, operand3);

		// now, evaluate first operator using tempResult as second operand
		finalResult = performOperation(operand1, operator1, tempResult);
	}
	// otherwise, we should evaluate from left to right
	else
	{
		// evaluate first operator first
		tempResult = performOperation(operand1, operator1, operand2);

		// now, evaluate second operator using tempResult as first operand
		finalResult = performOperation(tempResult, operator2, operand3);
	}

	// return the value of the final result to the caller
	return finalResult;
}

float performOperation(float operand1, char operater, float operand2)
{
	// This will hold the value of the expression so we can
	// pass it back to the caller
	float result;

	// Depending on what 'operater' is, we will perform 1 of the 4
	// possible operations
	switch (operater)
	{
		// multiplication: multiply the two operands together
		case '*':
			result = operand1 * operand2;
			break;

		// addition: add the two operands together
		case '+':
			result = operand1 + operand2;
			break;

		// subtraction: subtract the second operand from the first operand
		case '-':
			result = operand1 - operand2;
			break;

		// division: divide the first operand by the second operand
		case '/':

			// If the denominator is 0, we will display an error message
			// and set the result to 0.0
			if (operand2 == 0.0f)
			{
				cout << "ERROR! Attempting to divide by 0" << endl;
				result = 0.0f;
			}
			else
				result = operand1 / operand2;

			break;

		// If we get anything other than the 4 valid operators,
		// display a message showing the invalid operator, and set
		// the result to 0.0
		default:
			cout << "Invalid operator: " << operater << endl;
			result = 0.0f;
			break;
	}

	// return the result of the evaluation to the caller
	return result;
}

Boolean operatorsAreValid(char operator1, char operator2)
{
	// check if the first operator is a valid one
	if ( (operator1 != '*') && (operator1 != '/') &&
             (operator1 != '+') && (operator1 != '-') )
	{
		// display message
		cout << "ERROR: " << operator1 << " is not a valid operator" << endl;

		// return result to caller
		return FALSE;
	}

	// check if the second operator is a valid one
	if ( (operator2 != '*') && (operator2 != '/') &&
             (operator2 != '+') && (operator2 != '-') )
	{
		// display message
		cout << "ERROR: " << operator2 << " is not a valid operator" << endl;

		// return result to caller
		return FALSE;
	}

	// both are valid, so return TRUE
	return TRUE;
}

void printResult(float operand1, char operator1, float operand2,
                 char operator2, float operand3, float result)
{
	// display the expression that the user inputted as well as
	// the result of evaluating it
	cout << "The expression " << setprecision(5);
	cout << operand1 << " " << operator1 << " ";
	cout << operand2 << " " << operator2 << " " << operand3;
	cout << " evaluates to " << setprecision(5) << result << endl;
}

Back to Outline