括号运算(多重括号,double的结果)
  • 板块学术版
  • 楼主封禁用户
  • 当前回复6
  • 已保存回复6
  • 发布时间2025/1/14 19:24
  • 上次更新2025/1/15 08:23:18
查看原帖
括号运算(多重括号,double的结果)
1430277
封禁用户楼主2025/1/14 19:24

不知道你们是否想过,计算器里的括号是咋么实现的?在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;
}
2025/1/14 19:24
加载中...