简单的LISP算术表达式计算器_第1页
简单的LISP算术表达式计算器_第2页
简单的LISP算术表达式计算器_第3页
简单的LISP算术表达式计算器_第4页
简单的LISP算术表达式计算器_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、沈阳航空工业学院课程设计(说明书)简单LISP算术表达式计算器班级/学号7402101-024学生姓名田青林指导教师贾亮题目分析此题目是设计一个简单的LISP算术表达式计算器。简单LISP算术表达式(以下简称表达式)概念如下:(1)一个0.9的整数;或(2)(运算符表达式表达式)例如,6,(+45),(+(+25)8)都是表达式,其值别离为6,9和15。算术表达式不同于一般的一般的表达式,不是简单的从左向右(或是从右向左)的计算,它包括了算术运算符和算术量,计算的进程确实是要依照算术运算符的优先关系将其所对应得量的每一名进行计算,最后取得结果。初步思想是成立一个栈列,将变量存储进去,通过每步中

2、对头两个算术量的求和,最后将结果存储到栈头,输出。运算的要点如下:从左到右地扫描表达式(1)扫描到操作数时,直接输出。(2)第二次扫描到'(时进行递归挪用,从头进行扫描。(3)扫描到算术量时将其压入栈,并与前一个压入栈的算术量求和。(4)最后的栈头元素即为所求。二、设计进程(程序流程图)依照本课设题目的要求,本设计程序依据利用栈依次从里向外计算括号内数的思想设计成一个简单的LISP算术表达式计算器。该程序第一成立一个栈,通过PUSH函数和POP函数的入栈,出栈功能实现栈中元素“先进后出,后进先出”的特性。然后动态成立一大小为K的整型数组,把开辟的数组指针赋给a,从而实现栈函数的构造进程

3、。然后再成立栈的对象,再成立一个字符型数组ch,然后向该数组输入表达式,最后进入表达式判按时期。假设LISP表达式为一操作数,那么直接输出;假设该表达式为运算符,那么通过主函数的扫描计算,最终输出结果。栈的成立这是一个子函数stack(intk=100),第一成立一个足够大的栈,动态概念其大小为100,然后对其置空初始化,再依照判定其是不是为空返回不同的值。其设计流程图如图lo入栈开始图1:栈的成立这是一个子函数PUSH,笫一赋给输入值k,再判定栈是不是为非空,假设为非空那么将k压入栈中;假设为满栈,那么输犯错误。其流程图如图2所示。图2:PUSH函数出栈这是一个子函数POP,第一判定是不是非

4、空,假设是那么输出栈头元素atop,假设不是,那么返回0并参与运算。其设计流程图如图3所示。开始图3:POP函数构建函数第一动态开辟一个大小为K的数组,然后把开辟数组的指针赋给a,然后将K-1赋给Big,将-1赋给Top,从而实现函数的构造进程,函数构造完毕,退出此进程,此段程序终止。其设计流程图如图4所示。开始动态开辟一个大小为k的数组把开辟数组的指针赋给abig=k-lI*I(结束图4:构建函数主函数这是整个程序的核心所在。第一要成立一个栈VI,将所求表达式赋值给字符变量ch。接下来确实是从头扫描字符,这也是一个循环的进程。假设chi不是,(',那么直接入栈,假设是那么跳向下下个字

5、符,;再判定是不是(',假设不是,那么将chi入栈,跳向下一个字符;再判定是不是(',假设还不是那么入栈。这其中假设是,假设是那么都要进行从头扫描。接下来进行一个总的判定"!='('&&!=')'?",假设成立,跳向下一字符,假设不成立跳过本步;接下来判定是不是为)',假设是那么把入栈的两个元素出栈后相加再入栈,跳向下一字符。最后对此循环作一个判定,假设chi是0那么接着进行循环,假设不是那么跳出循环输出栈顶元素,即为所求。其设计流程如图5所示。三、调试进程及实验结果调试进程:本程序在调试的进程中碰到了

6、很多问题,第一程序中有很多的缀余成份,尤其是总循环的部份本来确实是一个很复杂的逻辑问题,有缀余更是会使明白得难上加难,这一部份是通过一步一步伐试更正的。最后取得的程序能完成题目中所给的要求。要紧的主函数的修改如以下图所示。int i-0;<cout<<chl<<endl ;return;J/*while(chi0)(ul.push(chlj-ii8);i+;>.enptp()<cout«v1 .pop()«endl ;*/while(chi1=0)if(chicontinue;v1.push(chi-i48);if(chil-C)c

7、ontinue;u1.push(ch(i)-U8);>else iF(chl?-)-)ul.push(chl-48);/»if(chi="C)cout«"9998"«endl continue ;>*/cout«u1.pop()«M «u1.p(jp()«MiflF(chi v1 .push(v1 .pop()*u1 .popO);;if(chi=-C)v1.push(u1.pop()*u1 .pop();)cout<<结果,«pndl;cout<<

8、u1.pop()<<endl;> 修改前实验结果:(l)运行程序以后,会看到一个如 到题目要求、姓名、学号、指导教师等。coutva请输入.表达式数据: ujhilp(cin>>ch);int 1-0;*jhile(chrit=O)<1=1*2;if(chi=-C)continue;v1 .push(chl*-Ji8); i*;if(chij-(') continue;u1.push(chi-48);pise二)')u1 .pu5h(chi-48);i”; iF(chi(u1 .pushful.pop();cout<< 噪果 e&

9、#171;endl;cout«vl .pop()«endl;修改后图6所示的LISP计算器的界面,还能够看 这也是一个待输入界面。图5:主函数图6:计算器界面(2)每一次输入数据以后,都要回车再输入ctrl+z,然后再回车,就能够取得所需结果。这其中ctrl+z是终止流。第一计算6。如图7所示。彳C:UsersAdministatorDesktopWI叭Debugl.exeI口I叵H本程序为简单的LISP算术表达式计算器,可以实现LISP加法表达式求值正确格式的测试数据:6,(+45),(+(+25)8),(+2(+58),(*(*(*12)034)(+56)(+78)结果

10、:6,9,15,15,36设计者:张强学号:2008040201122=XiAaSSir=6人Z结果:6Pressanykeytocontinue图7:计算“6”(3)计算(+45),如图8所示。"C:UsersAdministratorDesktopVIPDebugl.exeH本程序为简单的LISP算术表达式计算器,可以实现LISP加法表达式求值正确格式的测试数据:6,(+45),(*25)8),(+2(+58),(+12)034)(+56)(+?8)结果:6,9,15,15,36设计者:张强学号:2008040201122=>iAaSSi:=45)人7结果:Pressany

11、keytocontinue图8:计算(+45)(4)计算(+(+(+12)(+34)(+(+56)(+78),计算进程如图10所示。,*C:UsersAdministratorDesktopVIPDebugl.exe"本程序为简单的LISP算术表达式计算器,可以实现LISP加法表达式求值正确格式的测试数据:6,(+45),(+25)8),(+2(+58),口(+(京2)(+34)(+56)(+78)结果:6,9,15,15,36设计者:张强学号:2008040201122葡薪大羡二(+<+<+12><+34>><+<+56><

12、;+?8>>>八Z结果:36Pressanykeytocontinue图10:计算(+(+(+12)(+34)(+(+56)(+78)四、结论本程序十分简练,且明白得上也比较容易,完成了简单的算术表达式的计算问题,可是没能够实现其四那么运算的问题,还有依照原思路应该是成立两个栈,一个寄存数值,一个寄存运算符,比较运算符的优先级然后对其操纵的值作相应的运算。由于本人软件知识有限,因此得出的程序只是实现了片面的功能,对运算符采取了跳过的处置方式,只对表达式中的值作和,再输出。通过了快要两周的软件课设,依照题目要求对源程序作了相当大的改动,这其中包括对缀余程序的删除,对错误程序的修

13、正。另外程序参考了网上的模版,但其中不明白的地址有很多,问了很多人,也查阅了以前学过的关于栈的知识,最后也不是完全的能弄明白。我关于我的程序不是很中意,因为这并非是一个简单的LISP计算器,计算器最最少能进行四那么运算,但此计算器只能完成类似题目中所给的运算。尽管程序有些欠缺的地址,但毕竟是花了十多天的时刻在程序上,收成仍是很多的,算是对一学期的软件课作了一个总结,也从搜索资料中学会了运用图书馆和网络,总之软件课设使我收成颇丰,对以后的工作和学习都有专门大的帮忙。五、程序清单#includeointy=0;classstackpublic:stack(intk=100)a=newintk;bi

14、g=k-l;top=-l;boolempty()returntop=-l;)boolfull()returntop=big;)入栈voidpush(intk)if(!fullO)a+top=k;elsecout«HwrongpushH«endl;return;)出栈intpop()if(!enipty()returnatop-;elsereturn0;使其参与运算)private:intbig;inttop;int*a;voidniain()stackvl;charch100;cout<<”本程序为简单的LISP算术表达式计算器,能够实现LISP加法表达式求值,

15、t«endl«endl;cout«f,M«endl;cout«u正确格式的测试数据:6,(+45),(+(+25)8),(+2(+58),"«endl;cout«H(+(+(+12)(+34)(+(+56)(+78)M«endl;cout«u结果:6,9,15,15,36u«endl;cout«nH«endl;cout«u设计者:张强学号:01122n«endl;cout«H='1«endl;cout«n请输入表达式数据:M«endl;while(cin»ch);inti=0;while(chi!=0)(if(chi=*(')(i=i+2;if(chi=«C)continue;(chi-48);i+;if(chi='C)continue;(chi-48);)else(chi-48);if(chi!=,)'&a

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论