patterncppMinor
Rational arithmetic calculator
Viewed 0 times
arithmeticcalculatorrational
Problem
My program is a fraction calculator that is supposed to calculate the basic operations (+, -, *, /) and is supposed to exit when I enter % as my sentinel value. This is what I have so far; any feedback is highly appreciated.
```
#include
#include
using namespace std;
enum MenuSelection{
NONE =0,
ADD =1,
SUBTRACT =2,
MULTIPLY =3,
DIVIDE =4,
QUIT =5,
END =6,
};
int menu()
{
int MenuSelection=0;
do {
cout> MenuSelection;
//
if(MenuSelection= END)
cout= END);
//
return MenuSelection;
}
void addFractions(int num1, int num2, int den1, int den2, int &NUM_result, int &DEN_result)
{ //
NUM_result= (num1 den2) +(num2den1);
//
DEN_result= den1*den2;
}
void subFractions(int num1, int num2, int den1, int den2, int &NUM_result, int &DEN_result)
{ NUM_result = (num1den2) - (num2den1);
//
DEN_result= den1*den2;
//
}
void multiplyFractions(int num1, int num2, int den1, int den2, int &NUM_result, int &DEN_result)
{ NUM_result = num1*num2;
//
DEN_result= den1* den2;
}
void divideFractions(int num1, int num2, int den1, int den2, int &NUM_result, int &DEN_result)
{ //
NUM_result = num1*den2;
//
DEN_result = den1*num2;
}
void input_values_FROM_USER(int &num1, int &num2, int &den1, int &den2)
{
cout";
cin>>num1;
cout ";
cin>>den1;
cout ";
cin>>num2;
cout ";
cin>>den2;
cout " " " " <<num1<<'/'<<den1<<'/'<<num2<<'/'<<den2<<'='<<NUM_result<<'/'<<DEN_result<<endl;
}
}
void main()
{ int MenuSelection = NONE;
int num1=0, num2=0, den1=0, den2=0;
int NUM_result=0, DEN_result=0;
cout<<"Author: Jose Soto."<<endl;
cout<<"CSCI 110-- Jose Soto's Project 2 (Basic Fraction Arithmetic)\n\n"<<endl;
do
{ MenuSelection= menu();
input_values_FROM_USER(num1,num2,den1,den2);
if(MenuSelection==ADD)
{ addFractions(num1,num2,den1,den2,NUM_result, DEN_result);
}
if(MenuSelection==SUBTRACT)
{ subFractions(num1,num2,den1,den2,NUM_result, DEN_re
```
#include
#include
using namespace std;
enum MenuSelection{
NONE =0,
ADD =1,
SUBTRACT =2,
MULTIPLY =3,
DIVIDE =4,
QUIT =5,
END =6,
};
int menu()
{
int MenuSelection=0;
do {
cout> MenuSelection;
//
if(MenuSelection= END)
cout= END);
//
return MenuSelection;
}
void addFractions(int num1, int num2, int den1, int den2, int &NUM_result, int &DEN_result)
{ //
NUM_result= (num1 den2) +(num2den1);
//
DEN_result= den1*den2;
}
void subFractions(int num1, int num2, int den1, int den2, int &NUM_result, int &DEN_result)
{ NUM_result = (num1den2) - (num2den1);
//
DEN_result= den1*den2;
//
}
void multiplyFractions(int num1, int num2, int den1, int den2, int &NUM_result, int &DEN_result)
{ NUM_result = num1*num2;
//
DEN_result= den1* den2;
}
void divideFractions(int num1, int num2, int den1, int den2, int &NUM_result, int &DEN_result)
{ //
NUM_result = num1*den2;
//
DEN_result = den1*num2;
}
void input_values_FROM_USER(int &num1, int &num2, int &den1, int &den2)
{
cout";
cin>>num1;
cout ";
cin>>den1;
cout ";
cin>>num2;
cout ";
cin>>den2;
cout " " " " <<num1<<'/'<<den1<<'/'<<num2<<'/'<<den2<<'='<<NUM_result<<'/'<<DEN_result<<endl;
}
}
void main()
{ int MenuSelection = NONE;
int num1=0, num2=0, den1=0, den2=0;
int NUM_result=0, DEN_result=0;
cout<<"Author: Jose Soto."<<endl;
cout<<"CSCI 110-- Jose Soto's Project 2 (Basic Fraction Arithmetic)\n\n"<<endl;
do
{ MenuSelection= menu();
input_values_FROM_USER(num1,num2,den1,den2);
if(MenuSelection==ADD)
{ addFractions(num1,num2,den1,den2,NUM_result, DEN_result);
}
if(MenuSelection==SUBTRACT)
{ subFractions(num1,num2,den1,den2,NUM_result, DEN_re
Solution
Had a few thoughts on your code.
Your code doesn't accept a '%' to quit. Changing the menu to accept a '%' makes the rest of it inconsistent. so making all the input match the operation and changing the enum to reflect the character values instead of arbitrary ones helps with this.
You're parsing the menu input in 2 places. It's easier to maintain if you use the menu routine just to read the input and keep any parsing of the input in the calling routine.
A
When parsing user input through a menu putting the input into a
When you're sending literal strings to the console it's usually more efficient to to add a '\n' to the end of it rather than sending
Here's some revised code which cleans up a number of issues:
Your code doesn't accept a '%' to quit. Changing the menu to accept a '%' makes the rest of it inconsistent. so making all the input match the operation and changing the enum to reflect the character values instead of arbitrary ones helps with this.
You're parsing the menu input in 2 places. It's easier to maintain if you use the menu routine just to read the input and keep any parsing of the input in the calling routine.
A
switch block improves the readability when you have to parse the user's input.When parsing user input through a menu putting the input into a
char instead of an int makes it harder for user input to break your code.When you're sending literal strings to the console it's usually more efficient to to add a '\n' to the end of it rather than sending
endl separately.Here's some revised code which cleans up a number of issues:
#include
#include
using namespace std;
enum MenuSelection
{
ADD = 43,
SUBTRACT = 45,
MULTIPLY = 42,
DIVIDE = 47,
QUIT = 37,
};
void input_values_FROM_USER(int &num1, int &num2, int &den1, int &den2)
{
cout";
cin>>num1;
cout ";
cin>>den1;
cout ";
cin>>num2;
cout ";
cin>>den2;
cout> MenuSelection;
return MenuSelection;
}
void addFractions(int num1, int num2, int den1, int den2, int &NUM_result, int &DEN_result)
{
NUM_result= (num1* den2) +(num2*den1);
DEN_result= den1*den2;
}
void subFractions(int num1, int num2, int den1, int den2, int &NUM_result, int &DEN_result)
{
NUM_result = (num1*den2) - (num2*den1);
DEN_result= den1*den2;
}
void multiplyFractions(int num1, int num2, int den1, int den2, int &NUM_result, int &DEN_result)
{
NUM_result = num1*num2;
DEN_result= den1* den2;
}
void divideFractions(int num1, int num2, int den1, int den2, int &NUM_result, int &DEN_result)
{
NUM_result = num1*den2;
DEN_result = den1*num2;
}
void outputResults(int num1, int num2, int den1, int den2, int &NUM_result, int &DEN_result, int operation)
{
cout "<<num1<<'/'<<den1<<(char)operation<<num2<<'/'<<den2<<'='<<NUM_result<<'/'<<DEN_result<<endl;
}
void main()
{
char MenuSelection = '0';
int num1=0, num2=0, den1=0, den2=0;
int NUM_result=0, DEN_result=0;
bool bad = false;
cout<<"Author: Jose Soto."<<endl;
cout<<"CSCI 110-- Jose Soto's Project 2 (Basic Fraction Arithmetic)\n\n\n";
do
{
bad = false;
MenuSelection = menu();
switch(MenuSelection)
{
case ADD:
input_values_FROM_USER(num1,num2,den1,den2);
addFractions(num1,num2,den1,den2,NUM_result, DEN_result);
break;
case SUBTRACT:
input_values_FROM_USER(num1,num2,den1,den2);
subFractions(num1,num2,den1,den2,NUM_result, DEN_result);
break;
case MULTIPLY:
input_values_FROM_USER(num1,num2,den1,den2);
multiplyFractions(num1,num2,den1,den2,NUM_result,DEN_result);
break;
case DIVIDE:
input_values_FROM_USER(num1,num2,den1,den2);
divideFractions(num1,num2,den1,den2,NUM_result,DEN_result);
break;
case QUIT:
cout<<"\nYou have chosen to exit the program\n";
bad = true;
default:
cout<<"Please pick an option as shown in the menu.\n";
bad = true;
break;
}
if(!bad)
outputResults(num1,num2,den1,den2,NUM_result,DEN_result,MenuSelection);
}
while(MenuSelection != QUIT);
cin.get();
}Code Snippets
#include <iostream>
#include <cstdlib>
using namespace std;
enum MenuSelection
{
ADD = 43,
SUBTRACT = 45,
MULTIPLY = 42,
DIVIDE = 47,
QUIT = 37,
};
void input_values_FROM_USER(int &num1, int &num2, int &den1, int &den2)
{
cout<<endl;
cout<<"Enter the numerator for first fraction-->";
cin>>num1;
cout<<"Enter denominator for first fraction--> ";
cin>>den1;
cout<<"Enter numerator for second fraction--> ";
cin>>num2;
cout<<"Enter denominator for second fraction--> ";
cin>>den2;
cout<<"-------------------------------------------\n\n\n";
}
char menu()
{
char MenuSelection = 0;
cout<<"\n+) Add\n";
cout<<"-) Subtract\n";
cout<<"*) Multiply\n";
cout<<"/) Divide\n";
cout<<"%) Quit\n";
cin>> MenuSelection;
return MenuSelection;
}
void addFractions(int num1, int num2, int den1, int den2, int &NUM_result, int &DEN_result)
{
NUM_result= (num1* den2) +(num2*den1);
DEN_result= den1*den2;
}
void subFractions(int num1, int num2, int den1, int den2, int &NUM_result, int &DEN_result)
{
NUM_result = (num1*den2) - (num2*den1);
DEN_result= den1*den2;
}
void multiplyFractions(int num1, int num2, int den1, int den2, int &NUM_result, int &DEN_result)
{
NUM_result = num1*num2;
DEN_result= den1* den2;
}
void divideFractions(int num1, int num2, int den1, int den2, int &NUM_result, int &DEN_result)
{
NUM_result = num1*den2;
DEN_result = den1*num2;
}
void outputResults(int num1, int num2, int den1, int den2, int &NUM_result, int &DEN_result, int operation)
{
cout<<"The result of the operation is--> "<<num1<<'/'<<den1<<(char)operation<<num2<<'/'<<den2<<'='<<NUM_result<<'/'<<DEN_result<<endl;
}
void main()
{
char MenuSelection = '0';
int num1=0, num2=0, den1=0, den2=0;
int NUM_result=0, DEN_result=0;
bool bad = false;
cout<<"Author: Jose Soto."<<endl;
cout<<"CSCI 110-- Jose Soto's Project 2 (Basic Fraction Arithmetic)\n\n\n";
do
{
bad = false;
MenuSelection = menu();
switch(MenuSelection)
{
case ADD:
input_values_FROM_USER(num1,num2,den1,den2);
addFractions(num1,num2,den1,den2,NUM_result, DEN_result);
break;
case SUBTRACT:
input_values_FROM_USER(num1,num2,den1,den2);
subFractions(num1,num2,den1,den2,NUM_result, DEN_result);
break;
case MULTIPLY:
input_values_FROM_USER(num1,num2,den1,den2);
multiplyFractions(num1,num2,den1,den2,NUM_result,DEN_result);
break;
case DIVIDE:
input_values_FROM_USER(num1,num2,den1,den2);
divideFractions(num1,num2,den1,den2,NUM_result,DEN_result);
break;
case QUIT:
cout<<"\nYou have chosen to exit the program\n";
bad = true;
default:
cout<<"Please pick an option as shown in the menu.\n";
bad =Context
StackExchange Code Review Q#40140, answer score: 6
Revisions (0)
No revisions yet.