不知道你们是否想过,计算器里的括号是咋么实现的?在DEV-c++中括号是无法输入的,所以本蒟蒻立下了一个输入括号的思想,最后感觉非常简单,**我不会告诉你我用了1个月**
整体是什么效果呢?
输入:
2+(2*7.3)-1
输出:
15.6
过程:
1.头文件(万能头请跳)
#include<iostream>
#include<string>
#include<cctype>
#include<cmath>
2.定义类,class计算:
public:
double evaluate(const std::string& expresion){
this->expr=expresion;
this->index=0;
return parseExpression();
}
intdex为双指针,parseExpression是分析表达式函数 3.parseExpression函数
private:
std::string expr;
size_t index;
double parseExpression(){
double 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;
}
这里的while是级数判断,是一级就退出,是二级就进入parseTerm()函数;
4.parseTerm()函数 解决乘除,加减呢?加减函数在后面,先乘除后加减
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;
}
5.parseFactor()函数 加减函数,与乘除一样,就不赘述了
6.数字函数
不想多说,上代码
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));
}
7.main()函数
不想多说,下代码
8.完整代码,就是为5和7而建
#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=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;
}