, 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();
                
                
                        
      }
};