专业资料整理分享
if(n=='=') return '='; else if(n==')') return ERROR; else return '<';break; default:
return ERROR;break;//其他情况,表达式有误 }
}// Precede
int Operation(int a,char theta,int b){ //运算函数 switch(theta){
case'+':return a+b;break; case'-':return a-b;break; case'*':return a*b;break; case'/':return a/b;break; case'%':return a%b;break; case'^':return pow(a,b);break; default:return ERROR;break; }
}//Operation
int EvaluateExpression(char p[]){
完美WORD格式编辑
专业资料整理分享
//主要操作函数
int a,b,t;char x,theta,temp[10]; char* num=temp;char* ex=p;//声明指针 InitStack1(OPTR);Push1(OPTR,'='); InitStack2(OPND);char c=*p; while(c!='='||GetTop1(OPTR)!='='){ if(!In(c,OP)){//不是运算符进数组 *(num++)=c;c=*(++ex);
if(In(c,OP)){//是运算符将数组压入栈 *num='\\0';
t=atoi(temp); //将temp数组转化为整型数 num=temp;//指针指回数组头元素 Push2(OPND,t); } } else
switch(Precede(GetTop1(OPTR),c)){ case '<'://栈顶元素优先级低 Push1(OPTR,c);c=*(++ex); break;
case '='://脱括号并接受下一字符 Pop1(OPTR,x);c=*(++ex);
完美WORD格式编辑
专业资料整理分享
break;
case '>'://运算并将结果入栈 Pop1(OPTR,theta);
Pop2(OPND,b);Pop2(OPND,a); Push2(OPND,Operation(a,theta,b)); break; } }
return GetTop2(OPND);返回操作数栈顶元素 }// EvaluateExpression (3)、主函数设计 int main(){ //主函数
int result;char expression[100]; //声明表达式数组 printf(\ gets(expression); //输入数组
result=EvaluateExpression(expression);
printf(\输出结果 return 0; }
四、程序调试分析
1、开始时,使用getchar函数输入,但其有较大的弊端,
完美WORD格式编辑
专业资料整理分享
只能输入0-9之间的整数,不能实现多位数及小数的计算。于是换为gets函数,将表达式作为整体存入数组中待处理。
2、第一个问题解决后,出现了第二个问题:数据结构混乱。由于gets函数得到的是char型,直接存入操作数栈后,以ASCII码形式存入,使得编译通过但运行结果错误。后来分析原因后,引入暂存数组,利用atoi函数,将数组中的数转化为整型,解决了这一问题。
3、在设计主要处理函数时,出现了多次编译错误。后发现是由于指针指向混乱造成。这主要是自己的思路不清,导致程序混乱。后仔细绘制了流程图,详尽的分析了过程后,解决了该问题。
五、用户使用说明
1、本程序的运行环境为DOS操作系统,执行文件为:Josegh.exe。
2、进入程序后,在Please input the expression:后输入待求表达式,以“=”结尾,并敲回车。
3、程序运行后即在屏幕上输出计算结果。 六、程序运行结果 1、
2、
完美WORD格式编辑
专业资料整理分享
七、程序清单
#define STACK_INIT_SIZE 100 #define STACKINCREMENT 10 #define OVERFLOW -2 #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 #include\#include\#include\typedef int Status;
char OP[]={'+','-','*','/','(',')','^','%','='}; //定义运算符数组
typedef struct{ char *base; char *top; int stacksize;
}SqStack1; //定义运算符栈数据类型 typedef struct{
完美WORD格式编辑