⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 expression.cpp

📁 任意的表达式求解! 包括函数。
💻 CPP
字号:
#include <string>
#include <iostream>

using namespace std;

class expression
{
public:
	expression();
	int evaluation();
	void showvalue();
	~expression();
private:
	char *appearance;
	double value;
};

expression::expression()
{
	char apear[80];
	cout<<"请输入表达式: ";
	cin>>apear;
	appearance=new char[strlen(apear)+1];
	strcpy(appearance,apear);
	value=0.0;
}

expression::~expression()
{
	delete[] appearance;
}

int expression::evaluation()
{
    int digbom,dighd,symbom,symhd;      //定义两个栈,digit存放字符,symbol存放运算符
    char c,*symbol;
	double *digit;

	symbol=new char[strlen(appearance)+1];
	digit=new double[strlen(appearance)+1];
	digbom=dighd=0;                    //初始化两个栈的游标
	symbom=0;
	symhd=-1;
	digit[0]=0.0;
	int i,j,error=0;
	int flag=0; 
	double decimal=0.0;                    //输入
	for(i=0;c=appearance[i],c!='\0'&&error==0;i++)     //当输入为'e'时结束
	{
		switch(c)
		{
		case '1' :
		case '2' :
		case '3' :
		case '4' :
		case '5' :
		case '6' :
		case '7' :
		case '8' :
		case '9' :
		case '0' :
			if(flag==0)
				digit[dighd]=digit[dighd]*10+c-48;
			else
			{
				flag++;
				decimal=c-48;
				for(j=1;j<flag;j++)
					decimal/=10;
				digit[dighd]+=decimal;
			}
			break;
		case '.' :
			flag=1;
			break;
		case ')' :
			flag=0;            //输入右括号则让符号栈中的左括号后面的
			while(symbol[symhd]!='(')      //符号依次进字符栈中
			{
				   if(symbol[symhd]=='+')
					   digit[dighd-1]+=digit[dighd];
				   else if(symbol[symhd]=='-')
					   digit[dighd-1]-=digit[dighd];
				   else if(symbol[symhd]=='*')
					   digit[dighd-1]*=digit[dighd];
				   else if(symbol[symhd]=='/')
					   digit[dighd-1]/=digit[dighd];
				   dighd--;
				   symhd--;
			}
			symhd--;
			break;
		case '-' :                  //输入为加减时则让符号栈顶部优先级高的
		case '+' :
			flag=0;         //乘除符号依次进字符栈
			while(symbol[symhd]=='*'||symbol[symhd]=='/')
			{
				if(symbol[symhd]=='*')
					digit[dighd-1]*=digit[dighd];
				if(symbol[symhd]=='/')
					digit[dighd-1]/=digit[dighd];
				dighd--;
				symhd--;
			}
			symhd++;
			symbol[symhd]=c;            //加减号进符号栈
			dighd++;
			digit[dighd]=0.0;
			break;
		case '(' : 
			symhd++;
			symbol[symhd]=c;     //输入为乘除或左括号时进符号栈
			break;
		case '*' :
		case '/' :
			flag=0;
			symhd++;
			symbol[symhd]=c;     //输入为乘除或左括号时进符号栈
			dighd++;
			digit[dighd]=0.0;
			break;
		default :
			error=1;
			return error;
			break;
		}
	}
	while(symhd>=symbom)            
	{
		if(symbol[symhd]=='+')
			digit[dighd-1]+=digit[dighd];
		else if(symbol[symhd]=='-')
			digit[dighd-1]-=digit[dighd];
		else if(symbol[symhd]=='*')
			digit[dighd-1]*=digit[dighd];
		else if(symbol[symhd]=='/')
			digit[dighd-1]/=digit[dighd];
		dighd--;
		symhd--;
	}
	value=digit[dighd];
	delete[] digit;
	delete[] symbol;
	return error;
}

inline void expression::showvalue()
{
	cout<<"表达式的值是: "<<value<<endl;
}

void main()
{
	cout<<"——————算术表达式求值——————"<<endl<<endl;
	cout<<"           程序员:蝈蝈"<<endl<<endl;
	cout<<"本程序应ARM之须而作"<<endl<<endl;
	expression E;
	if(!E.evaluation())
		E.showvalue();
	else
		cout<<"你的输入有错误,谢谢使用"<<endl;
	system("pause");
}







⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -