图5:主函数 Y Y 开始 建立栈V1 i=0 输入ch N ch[i]!=0? Y ch[i]=='('? Y 输出v1.pop() N 结束 i=i+2 ch[i]='c'? N i=i+1 N ch[i]='c'? ch[i]!=')'? 将ch[i]入栈 将ch[i]入栈 ch[i]!=')'&&ch[i]!='('?Y i=i+1 ch[i]==')'? Y v1.push(v1.pop()+v1.pop()); i++ N N
图6. 计算器界面---测试数据
图7.(+2(+58))测试结果图
图8.(+(+(+12)(+34))(+(+56)(+78)))测试结果图
四、结论
本程序十分简洁,且理解上也比较容易,完成了简单的算术表达式的计算问题,但是没能够实现其四则运算的问题,还有按照原思路应该是建立两个栈,一个存放数值,一个存放运算符,比较运算符的优先级然后对其控制的值作相应的运算。由于本人软件知识有限,所以得出的程序只是实现了片面的功能,对运算符采取了跳过的处理方式,只对表达式中的值作和,再输出。 经过了将近两周的软件课设,根据题目要求对源程序作了相当大的改动,这其中包括对缀余程序的删除,对错误程序的修正。另外程序参考了网上的模版,但其中不明白的地方有很多,问了很多人,也查阅了以前学过的关于栈的知识,最后也不是彻底的能弄明白。我对于我的程序不是很满意,因为这并不是一个简单的LISP计算器,计算器最起码能进行四则运算,但此计算器只能完成类似题目中所给的运算。虽然程序有些欠缺的地方,但毕竟是花了十多天的时间在程序上,收获还是很多的,算是对一学期的软件课作了一个总结,也从搜索资料中学会了运用图书馆和网络,总之软件课设使我受益匪浅,对以后的工作和学习都有很大的帮助。
五.程序清单: #include
intistacksize; }cstack; typedefstruct { int *ibase; int *itop;
intistacksize; }istack;
intinitstack (cstack&c) { c.cbase = new char[100]; c.ctop = c.cbase; return 0; } intinitstack (istack&i) { i.ibase = new int[100]; i.itop = i.ibase; return 0; } intcpush(cstack&c,charce)
{ *(c.ctop++) = ce; return 0; } intipush(istack&i,intie)
{ *(i.itop++) =ie; return 0; } intcpop(cstack&c,char&ce)
{ ce = *(--c.ctop); return 0; } intipop(istack&i,int&ie)
{ ie = *(--i.itop); return 0; } voidgetfun(); int result=1;
static char array[100]; voidgetfun() { intlenth=0;
printf(\请输入LISP表达式: \gets(array); } voidjisuan()