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

📄 计算器.cpp

📁 实现一个具有加、减、乘、除功能的简单的计算器
💻 CPP
字号:
#include<iostream.h>
#include<stdio.h>
#define TRUE 1
#define FALSE 0
#define MAX 100


////////////////////////////////////////////////


typedef struct Snode1{
	float data;
	struct Snode1 *next;
}Snode1,*LSnode1;


typedef struct Snode2{
	char data;
	struct Snode2 *next;
}Snode2,*LSnode2;


///////////////////////////////////////////


void InitStack1(LSnode1 &S)
{
	S=NULL;
}


void InitStack2(LSnode2 &S)
{
	S=NULL;
}


void Push1(LSnode1 &S,float e)
{
	LSnode1 p;
	p=new Snode1;
	p->data=e;
	p->next=S;
	S=p;
}


void Push2(LSnode2 &S,char e)
{
	LSnode2 p;
	p=new Snode2;
	p->data=e;
	p->next=S;
	S=p;
}

bool Pop1(LSnode1 &S,float &f)
{
	if(S)
	{
		LSnode1 p;
		p=S;
		S=S->next;
		f=p->data;
		delete p;
		return TRUE;
	}
	else return FALSE;
}



bool Pop2(LSnode2 &S,char &f)
{
	if(S)
	{
		LSnode2 p;
		p=S;
		S=S->next;
		f=p->data;
		delete p;
		return TRUE;
	}
	else return FALSE;
}

bool StackEmpty(LSnode2 S)
{
	if(!S) return TRUE;
	else return FALSE;
}


bool GetTop(LSnode2 S,char &e)
{
	if(S)
	{
		e=S->data;
		return TRUE;
	}
	else return FALSE;
}


///////////////////////////////////////////////////


bool OpMember(char ch)
{
	if(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='#'||ch=='('||ch==')')  return TRUE;
	else return FALSE;
}


float Operate(float s1,char ch,float s2)
{
	//cout<<s1<<ch<<s2<<endl<<endl;
	switch(ch)
	{
	case '+':cout<<s1<<s2<<(s1+s2)<<endl<<endl;return  (s1+s2);
	case '-':cout<<s1<<s2<<(s1-s2)<<endl<<endl;return s1-s2;
	case '*':return s1*s2;
	case '/':return s1/s2;
	}
}


bool precede(char ch1,char ch2)
{
	int a,b;
	switch(ch1)
	{
	case '#':a=-1;
	case '(':a=0;break;
	case '+':a=1;break;
	case '-':a=1;break;
	case '*':a=2;break;
	case '/':a=2;break;
	case ')':a=2;break;
	}
	switch(ch2)
	{
	case '#':b=-1;
	case '(':b=0;break;
	case '+':b=1;break;
	case '-':b=1;break;
	case '*':b=2;break;
	case '/':b=2;break;
	case ')':b=2;break;
	}
	return (a>=b);
}

///////////////////////////////////////////////////

double evaluation(char suffix[])
{
	char ch;
	char a,b,result;
	struct Snode2 *S;
	ch=*suffix++;
	InitStack2(S); 
	while(ch!='#')
	{
		if(!OpMember(ch)) Push2(S,ch);
		else
		{
			Pop2(S,b);
			Pop2(S,a);
			Push2(S,Operate(a,ch,b));
		}
		ch=*suffix++;
	}
	Pop2(S,result);
	return result;
}


void transform(char suffix[MAX],char exp[MAX])
{
	char *p;
	char ch;
	char c;
	int k;
	struct Snode2 *S;
	InitStack2(S);
	Push2(S,'#');
	p=exp;
	ch=*p;
	k=0;
	while(!StackEmpty(S)) 
	{
		if(!OpMember(ch)) suffix[k++]=ch;
		else
		{
			switch(ch)
			{
			case '(':Push2(S,ch);break;
			case ')':
				{
					Pop2(S,c);
					while(c!='(')
					{
						suffix[k++]=c;
						Pop2(S,c);
					}
					break;
				}
			default:
				{
					while(GetTop(S,c)&&(precede(c,ch)))
					{
						suffix[k++]=c;
						Pop2(S,c);
					}
					if(ch!='#')  Push2(S,ch);
					break;
				}
			}
		}
		if(ch!='#') ch=*(++p);		
	}
	suffix[k]='\0';
}


//////////////////////////////////////////////////////


void main()
{
	int i=-1;
	double result;
	char a[MAX];
	char suffix[MAX];
	cout<<"请输入计算式:";
	do 
	{
		i++;
		cin>>a[i]; //cout<<a[i];
	}while(a[i]!='#');//cout<<a<<endl<<endl<<endl;cout<<suffix<<endl<<endl;
	transform(suffix,a);cout<<suffix[0]<<suffix[1]<<suffix[2]<<suffix[3]<<suffix[4]<<suffix[5]<<suffix[6]<<suffix[7]<<suffix[8]<<suffix[9]<<suffix[10]<<suffix[11];
	result=evaluation(suffix);
	cout<<"计算结果是:"<<result<<endl;
}

/*void main()
{
	float a,b,result;
	int k,i,j,s;
	char ch,suffix[MAX],a[MAX];
	char *p,*q,d;
	float c[MAX],n,m,m1,m2,m3;
	LSnode1 S;
	//j=1;
	cin>>a[0];
	for(i=0;a[i]!='#';)	cin>>a[++i];
	a[i+1]='\0';
	k=0;s=0;m=0;m1=0;m2=0;m3=1.0;
	transform(suffix,a);p=q=suffix;
	ch=*p;
	Initstack1(S);
	while(ch!='#')
	{
		q=p;
		if(!OpMember(ch))
		{
			if(!OpMember(*++q))
			{
				d=ch;
				c[k++]=d-48;
			}
			else
			{
				d=ch;
				c[k++]=d-48;
				while(s<k)
				{
					for(i=s;c[i]!=(-15)&&c[i]!=(-2);i++)  m1=10*m1+c[i];
					if(c[i]==-2)
					{
						for(i=i+1;c[i]!=-15;i++)  {m3=m3*10;m2=m2+c[i]/m3;}
					
					}
				m=m1+m2;
				s=i+1;
				Push1(S,m);
				m2=0;m=0;m1=0;m3=1.0;
				}
			}
		ch=*++p;
		}
	    else
		{
		    Pop(S,b);Pop(S,a);
		    if(b!=0)
			{
		        Push1(S,Operate(a,ch,b));
	 	       ch=*++p;
			}
		    else
			{
			    if(ch!='/')
				{
				   Push1(S,Operate(a,ch,b));
				   ch=*++p;
				}
			else
			{
				cout<<"MessageError";
				ch='#';
				push(S,0);
			}
		}
	}
		Pop1(S,result);
		n=result;
		cout<<n<<endl;

}*/

⌨️ 快捷键说明

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