我看了上期评论,说无法处理负号,因为不是算法上的问题,所以本蒟蒻很快就干掉了
添了这个
double result=0.0;
bool inNegative=false;
while(index<expr.length()&&expr[index]=='-'){
inNegative=!inNegative;
index++;
}
if(inNegative){
result=-parseTerm();
}else{
result=parseTerm();
}
inNegative表示负号状态,false为假,true为真这样写-1+1甚至-(-3)就不会出BUG了
#include<iostream>
#include<string>
#include<cctype>
#include<cmath>
class Calculator{
public:
double evaluate(const std::string& expresion){
this->expr=expresion;
this->index=0;
return parseExpression();
}
private:
std::string expr;
size_t index;
double parseExpression(){
double result=0.0;
bool inNegative=false;
while(index<expr.length()&&expr[index]=='-'){
inNegative=!inNegative;
index++;
}
if(inNegative){
result=-parseTerm();
}else{
result=parseTerm();
}
while(index<expr.length() && (expr[index]=='+' || expr[index]=='-')){
char op=expr[index++];
double right=parseTerm();
if(op=='+') result+=right;
else result-=right;
}
return result;
}
double parseTerm(){
double result=parseFactor();
while(index<expr.length() && (expr[index]=='*' || expr[index]=='/')){
char op=expr[index++];
double right=parseFactor();
if(op=='*') result*=right;
else result/=right;
}
return result;
}
double parseFactor(){
if(expr[index]=='('){
index++;
double result=parseExpression();
index++;
return result;
}else{
return parseNumber();
}
}
double parseNumber(){
size_t start=index;
while(index<expr.length() && (std::isdigit(expr[index]) || expr[index]=='.')){
index++;
}
return std::stod(expr.substr(start,index-start));
}
};
int main(){
Calculator calc;
std::string expression;
std::getline(std::cin,expression,'=');
double result=calc.evaluate(expression);
std::cout<<result;
return 0;
}
后面啥也没变