
, so I have this calc code, its accepts strings then calculates it. Can anyone explain what does the function. I can understand the bool check function though!
double value_of_num(const string &Expr) and double Value_Of_Expr(const string &Expr)
Code:
class Calculator : protected base
{
enum {PLUS='+',MINUS='-',MUL='*',DIV='/'}; // Enumeration declaration : User defined type of a set of constants called enumerators
int precision;
double Value_Of_Num(const string &Expr)
{
istringstream is(Expr);
double value=0.0;
is >> value;
cout << setprecision(precision) << value;
}
double Value_Of_Expr(const string &Expr)
{
int i=0,p=0,pos_mul=0,pos_div=0;
if(Expr.at(0)=='('&&Expr.at(Expr.length()-1)==')')
{
for(i=0;i < Expr.length();i++)
{
if(Expr.at(i)=='(') p++;
else if(Expr.at(i)==')') p--;
if(p==0) break;
}
if(i==Expr.length()-1)
return Value_Of_Expr(Expr.substr(1,Expr.length()-2));
}
for(i=0;i < Expr.length();i++)
{
if(Expr.at(i)=='(') p++;
else if(Expr.at(i)==')') p--;
else if(p==0&&ispunct(Expr.at(i)))
{
switch(Expr.at(i))
{
case PLUS:
return Value_Of_Expr(Expr.substr(0,i))+Value_Of_Expr(Expr.substr(i+1,Expr.length()-i-1));
case MINUS:
return Value_Of_Expr(Expr.substr(0,i))-Value_Of_Expr(Expr.substr(i+1,Expr.length()-i-1));
case MUL: pos_mul=i;
break;
case DIV: pos_div=i;
break;
}
}
}
if(pos_mul)
return Value_Of_Expr(Expr.substr(0,pos_mul))*Value_Of_Expr(Expr.substr(pos_mul+1,Expr.length()-pos_mul-1));
if(pos_div)
return Value_Of_Expr(Expr.substr(0,pos_div))/Value_Of_Expr(Expr.substr(pos_div+1,Expr.length()-pos_div-1));
return Value_Of_Num(Expr);
}
// several important validation checks on the input
bool Check(string input_string)
{
// Checks for repeated usage of '+', '-', '*', '/' operators
for (int r = 0; r < input_string.length(); r++)
{
if((input_string[r]=='+')||(input_string[r]=='-')||(input_string[r]=='*')||(input_string[r]=='/'))
{
if((input_string[r+1]=='+')||(input_string[r+1]=='-')||(input_string[r+1]=='*')||(input_string[r+1]=='/'))
{
return false;
}
}
}
// Checks for the last character of the string equation
int g = input_string.length() ;
if(input_string[g-1] == '*' || input_string[g-1] =='/' || input_string[g-1] == '-' || input_string[g-1] == '+')
{
return false;
}
string array="0123456789+-*/()";
int count=0;
for (int s=0; s < input_string.length(); s++)
{
for(int z=0; z < array.length(); z++)
{
//Compares each number/operator with elements from 'array'
if(input_string[s]==array[z])
{
count++;
}
}
}
//every number/operator approved should be equals to input
if (count == input_string.length())
{
return true;
}
else
{
return false;
}
}
public :
Calculator()
{
string expression;
system("CLS");
cout << " Welcome to the calculator function!" << endl;
cout << "" << endl;
cout << "" << endl;
cout << "With this calculator, your problem solving is made simple." << endl;
cout << "You do not have to calculate each part of an expression one at a time \n";
cout << "like you do with you simple calculators." << endl;
cout << "All you have to do is simply input an expression \n";
cout << "and the calculator will give you the answer." << endl;
cout << "" << endl;
cout << "Enter your expression:";
cin >> expression;
cout << "How many decimal places would you want your answer to be in?" << endl;
cin >> precision;
if(Check(expression)==true)
{
cout << Value_Of_Expr(expression)<<endl;
}
else
{
cout << "" <<endl;
cout << "Error in the input" << endl;
}
cout << endl << endl << endl;
Calculator_1:
base calculator1;
calculator1.display();
}
};