hey guys,
I have written a calculator program in C++. It suppose to get the input from the user which is a string. Some thing like ((5+3)/2)*5. If you input that expression it gives 20, which is the correct answer. The problem i am having is that it cannot compute the expression if i input a negative number. like if i input ((5+3)/-2)*5 or ((5+3)/2)*-5, it will throw an error. I really cant seem to figure out where the problem is.
If some1 can tell me what to change to fix the problem, it would be a great help
here is the code...
#include<iostream>
#include<sstream>
#include<string>
#include<cctype>
#include<cmath>
using namespace std;
enum {PLUS='+',MINUS='-',MUL='*',DIV='/'};
double Value_Of_Num(string &Expr)
{
istringstream is(Expr);
double value=0.0;
is >> value;
return value;
}
double Value_Of_Expr(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)
{
for (int r = 0; r < input_string.length(); r++)
{
if((input_string[r]=='+')||(input_string[r]=='-'))
{
if((input_string[r+1]=='+')||(input_string[r+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++)
{
if(input_string[s]==array[z])
{
count++;
}
}
}
if (count == input_string.length())
{
return true;
}
else
{
return false;
}
}
int main()
{
string expression;
string rerun = "y";
cout << " Welcome to Rajat's calculator!" << 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 \nlike you do with you simple calculators." << endl;
cout << "All you have to do is simply input an expression \nand the calculator will give you the answer." << endl;
do
{
cout << "" << endl;
cout << "Enter your expression:";
cin >> expression;
if(Check(expression)==true)
{
cout << Value_Of_Expr(expression)<<endl;
}
else
{
cout << "" <<endl;
cout << "Error in the input" << endl;
}
cout << "Would you like to solve another expression? If yes, the press \"y\" and enter or press \"n\" if you want to quit." << endl;
cin >> rerun;
}while (rerun == "y");
return 0;
}