1、综上,这就要求我们的程序分为主函数、表达式判断函数、结果计算函数。2、概要设计在需求分析中,我们已对程序的功能做了大致规划,但是又怎样来实现这些功能呢?在主函数中,只需要输入输出以及对各函数进行调用就行了,所以主函数是相对简单的,只是编写程序代码是注意代码的规范性就行了!在表达式判断中,函数接收由主函数传来的表达式的地址,然后对表达式中个字符扫描对左右括号配对即可。而计算函数有要分成两部分了,因为输入时按照一串字符串输入的,并不是数据,所以计算机并不能直接计算,而且计算牵扯到运算符的优先级问题,这是计算机不能直接处理的,因此,我们要首先把表达式转换成其能够识别计算的后缀表达式,这就有要求用一个
2、后缀转换来实现,其次就要对这个后缀表达式计算了,我们仍用一个函数来实现。在处理运算符优先级问题时,我们按自己定义其优先级大小并用结构体进行存储,这样即方便理解,又方便加入一些运算符!3、详细设计1、主函数(main.cpp) 由于要输如一表达式,将此表达式存于一数组,考虑到程序可循环性,故判断输入的第一个字符是否等于“q”当输入为“q”是退出程序。当不是时,调用pipei子函数对表达式进行匹配判断,不匹配是输出提示要求再次输入。在括号匹配时,调用trans(char)将表达式进行转换成对应的后缀表达式。然后再调用函数conprdue对后缀表达式进行计算,并将结果输出。主函数如下:#includ
3、e #includeusing namespace std;#define maxsize 100#includePipei.cppTrans.cppCalcu.cppint main() char expmaxsize; char postexpmaxsize=0; coutPlease input your exp:To quit with qendl; while (scanf(%s,exp)!=EOF) if (exp0=q)return 0; else if (pipei(exp) trans(exp,postexp);后缀表达式为: postexp表达式的值为: compvalue
4、(postexp) memset(postexp,0,maxsize); else couttop=-1)return (1); /栈为空时2.后缀表达式转换函数:void trans(char *exp,char postexp) /中缀转后缀 struct char datamaxsize;/存放运算符 int top; /栈指针 op; /运算符栈 /i为后缀表达式的标号 op.top=-1; op.top+; op.dataop.top= /将=进栈 while (*exp! if (!Inop(*exp) /不是运算符时即为数字时 while (*exp&*exp9)|*exp=.
5、postexpi+=*exp; /为数字时存放在后缀表达式里/数值串结束 switch (Precede(op.dataop.top,*exp) case -1: /op运算级低于exp op.dataop.top=*exp; case 0: op.top-; case 1: postexpi+=op.dataop.top; while (op.dataop.top! postexpi=3.表达式计算:/*计算后缀表达式值*/float compvalue(char *postexp) double datamaxsize; /计算的结果 st; /定义数值栈 double d,a,b,c,f
6、; /中间变量 int point=0,zhi=1,jiech=1; st.top=-1; st.datast.top=0; while (*postexp!) /后缀不为空时扫描表达式 switch (*postexp) /判断后缀式字符 /取数值a /coutb=b /取数值b c=a+b; st.top+; st.datast.top=c;/将结果进栈 c=b-a;* c=b*a;/ if (a!=0) /判断除以零无意义 c=b/a;nt除零错误! exit(0);! for (int j=1;j*postexp)|*postexp=) /处理连续数字字符 if (*postexp= point=1; postexp+; else; if (point=0) d=10*d+*postexp- /将字符转为数字 /printf(%dt,pow(10,zhi); f=f+(*postexp-)/pow(10,zhi); zhi+; point=0; /下一个数要重新验证 zhi=1; st.datast.top=d+f; /将结果进栈 return(st.datast.top);评语:成 绩: 签 名: 年 月 日
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1