1、4. 调试分析65. 核心源程序清单和执行结果61.需求分析1.1 程序的功能本程序是一个计算器小程序,利用算符优先关系,实现对算术四则混合运算表达式的求值并输出结果。1.2 输入输出的要求 输入的形式:算术表达式,以井号“#”结束。例如2*(3+4)#; 包含的运算符只能有+ 、-*/(、 );输出的形式:运算结果,例如Answer is:14;1.3 测试数据 第一组: 输入 3*(9-4)# 输出 Answer is:15 第二组: 输入140/(57+13)# 输出 Answer is:2第三组: 输入 56*(12-10)# 输出 Answer is:1122.概要设计3.详细设计
2、主要部分详细流程: (1)设置两个工作栈,分别存放操作数和运算结果 (2)判断字符的优先级 4.调试分析错误提示1:错误原因 :在中文输入法下输入的“;”,导致程序不能识别。调试方法 :调到英文输入法下输入即可。错误提示2:错误原因: 在Init_OPND,Init_OPTR后边都忘加了“&”符号, 导致程序不识别。调试方法:在 Init_OPND,Init_OPTR后边加上“&”即可。5.核心源程序清单和执行结果全部源代码如下:#include stdlib.h#define MAX 100 typedef struct /*定义一个栈存放运算数*/ int aMAX;int top;OPN
3、D;typedef struct /*定义一个栈存放运算符*/ char aMAX;OPTR;void Init_OPND(OPND *s) /*初始化运算数栈*/ s-top =0; void Init_OPTR(OPTR *s) /*初始化运算符栈*/ void Push_OPND(OPND *s,int x) /*压入一个运算数*/ top +;a s-top =x;void Push_OPTR(OPTR *s,char x) /*压入一个运算符*/ int Pop_OPND(OPND *s) /*取出一个运算数*/ int x;x=s-top;top -;return x;char P
4、op_OPTR(OPTR *s) /*取出一个运算符*/ char x;int GetTop_OPND(OPND *s) /*取栈顶运算数*/ return (s-as-top);char GetTop_OPTR(OPTR *s) /*取栈顶运算符*/ int IsOpr(char c) /*判断输入字符是否为运算符*/ if (c=|c=#) return 1;else return 0;char Precede(char s,char c) /*判断字符的优先级*/ switch(s) case :if(c= return ; else if (c= else if(c= else bre
5、ak;return =int Operate(int x,char opr,int y) /*计算*/ int result;switch (opr) case result = x + y; break; result = x - y; result = x * y; result = x / y;return result;void main() OPND sdata;OPTR soper;int a,b,result,i;char ch,theta;Init_OPND(&sdata);Init_OPTR(&soper);Push_OPTR(&soper,);ch=getchar();wh
6、ile(ch!|GetTop_OPTR(&soper)!) /当读入的字符和OPTR栈顶的字符均为#时结束运算*/ if(!IsOpr(ch) /*是运算数的情况*/ i=atoi(&ch); /*将字符型转为整型*/ ch=getchar(); /*使得可以输入几位数*/ while(!IsOpr(ch) i=i*10+atoi(& Push_OPND(&sdata,i); switch(Precede(GetTop_OPTR(&soper),ch) /*比较栈顶运算符和刚输入运算符的优先级*/ Push_OPTR(&soper,ch); theta=Pop_OPTR(& b=Pop_OPND(& a=Pop_OPND(& result=Operate(a,theta,b);sdata,result);printf(Anwser is: %dn,GetTop_OPND(&sdata);
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1