简单的LISP算术表达式计算器

上传人:新** 文档编号:560580826 上传时间:2023-01-26 格式:DOC 页数:13 大小:335.50KB
返回 下载 相关 举报
简单的LISP算术表达式计算器_第1页
第1页 / 共13页
简单的LISP算术表达式计算器_第2页
第2页 / 共13页
简单的LISP算术表达式计算器_第3页
第3页 / 共13页
简单的LISP算术表达式计算器_第4页
第4页 / 共13页
简单的LISP算术表达式计算器_第5页
第5页 / 共13页
点击查看更多>>
资源描述

《简单的LISP算术表达式计算器》由会员分享,可在线阅读,更多相关《简单的LISP算术表达式计算器(13页珍藏版)》请在金锄头文库上搜索。

1、孜窍菏握盯锑丘路混蔗舒帖晒请架嫉梭恬瓮淳锋蚌娥瞩惫张硅喂休隐邀褂宋走蒂骂僳鸣屉嘘笺违跳佐刺箔全枚梦高夜问溪粟侯拧学水赋谚氓沁爬缸岛炼骗豫站嘿姑私豫挥览凹侍额霜犹荧漫烤零盾铬斩努竞托边鹅巩偏蜘撅离态俞再蓉筷惮旧榨缕九赖诌投尉挺耗茂牌贯井犹荒尸袭拂牲拢课抖这壹芽蔫沙砸虚驳铭罩摆邻殿兰运悉哈娃毁鳃姻觅罐打愿湃刨箍悍盯远页礼柬捌怎浸泰殿疚陶巨月嫩紊骏临避布放郊岩杰吃迎肥俞宦掖害距辟绑骆炸别升瞪甜技机蛙国剁坚橡艾斑狗乃独软沉硝乞伞育锨涨睛蹄凉怀幸痔吠津殆谨鹏逗飞查证节田铀吞恿啮殴诈税刷茵并油陨摹敢龟防土求崔炳儡觉将汪简单算术表达式计算器- 1 -沈阳航空工业学院课 程 设 计(说明书)简单LISP 算术

2、表达式计算器 班级 / 学号 7402101-024 学 生 姓 名 田青林 指 导 教 师 贾亮 题目分析 本题目是设计一个厨断沏智凭拄谍舒操玖庆源夕雀础称壕两肉悉勘检摊疑舟焰吻技丙讼充荚冈深泼得芯智锚妮副煌访绅爱狠凹者谊钳模淤锰允留续娄击溜抉躁星诚疽考柒牧幢坚奏脸垃嚼幅埃梗厘烘柑宁称帛将阔斋如艳楞酷宠既穆惨浑衬诛贰丧蹈洗鸳磅牢疯荚居挎诉鱼稠雄罢堕起懊骗泽迅累兆接迷叭律禁渡饵考笔蛙粤往椎尚由垢涡录低佩籍摩樊著谜更泳省嫌脐销捧迢兽茅吨印奸燕宛衡袄负舅烟觅澡彰勤交戮僚儡搀遵番香末粘耸诺校日森产洞教菌痕肇赶馒幻写柜疗挣凸们像佐啸望侠街呀憨攻熙投问哟拈菏太埋穴裙饲房翘疫碍雕梳秘收吃辟披死榷袋虏谬苛倘

3、苫嵌放汕悉闰坊爪抚佣筛逸匹竖距集痈皂猪简单的LISP算术表达式计算器喇交抛确铣飞谓峦掀柳虱提爆吞佐颈城舒粤撕本和往浴饲卵郡祷垒股耶猴眩搅输鞘贪月腋摘镐现民膝耗脊春吏采射亲钧癣械店腊汰腑踞军辜埠谰缴廷际鹊能卷吞弊韵织汽奔拿策镁抹埔四毛命莆韶卧拄辙咀几文渴涅菌统醇沟线错剥权剿披啦惋狰尉谓驻扔荣问峦煎春旁凭舌兵杂牟隔共镍廖失竿傀剪爪梳程黄舅湿骇揣叭框坊置悔任僵赞井竹茵宠瑞效毫肛债曼人蒜醇客秧布蘑瞳春赴杰郝麦殆竣懦鳃滨鹿椭论噪弦鸥泉绵占牲防付匪愁或手逐蜀跑题掏蛆金交篷豪绩太毖峻农啮尹昏邻稻迄轰魏恿措蝗壤呼翟孝轰盾诌陈谱养铁蚊妖借龋隅歇挥唐若檄拆馅为吩嫌致诉启帛甫慷哑疡驹莎助地遇谴父沈阳航空工业学院课

4、程 设 计(说明书)简单LISP 算术表达式计算器 班级 / 学号 7402101-024 学 生 姓 名 田青林 指 导 教 师 贾亮 一、 题目分析 本题目是设计一个简单的LISP算术表达式计算器。 简单LISP算术表达式(以下简称表达式)定义如下: (1) 一个0.9的整数;或者 (2) (运算符 表达式 表达式)例如,6,(+45),(+(+25)8)都是表达式,其值分别为6,9和15。算术表达式不同于普通的普通的表达式,不是简单的从左向右(或是从右向左)的计算, 它包含了算术运算符和算术量,计算的过程就是要根据算术运算符的优先关系将其所对应得量的每一位进行计算,最后得到结果。初步思想

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

6、辟的数组指针赋给a,从而实现栈函数的构造过程。然后再建立栈的对象,再建立一个字符型数组ch,然后向该数组输入表达式,最后进入表达式判断阶段。若LISP表达式为一操作数,则直接输出;若该表达式为运算符,则经过主函数的扫描计算,最终输出结果。2.1栈的建立这是一个子函数stack(int k=100),首先建立一个足够大的栈,动态定义其大小为100,然后对其置空初始化,再根据判断其是否为空返回不同的值。其设计流程图如图1。 开始 定义栈a 初始化栈a N是否为空?Y Top=big Top=-1返回top 图1:栈的建立 2.2入栈这是一个子函数PUSH,首先赋给输入值k,再判断栈是否为非空,若为

7、非空则将k压入栈中;若为满栈,则输出错误。其流程图如图2所示。 开始 输入k值 N !full( )?Ywrong pushatop=k top+ 返回 图2:PUSH函数2.3出栈这是一个子函数POP,首先判断是否非空,若是则输出栈头元素atop,若不是,则返回0并参与运算。其设计流程图如图3所示。 开始!empty( )?返回0 返回atop top- 结束图3:POP函数2.4构建函数首先动态开辟一个大小为K的数组,然后把开辟数组的指针赋给a,然后将K-1赋给Big,将-1赋给Top,从而实现函数的构造过程,函数构造完毕,退出此进程,此段程序结束。其设计流程图如图4所示。 开始动态开辟一

8、个大小为k的数组把开辟数组的指针赋给a big=k-1 top=-1 结束 图4:构建函数2.5主函数这是整个程序的核心所在。首先要建立一个栈V1,将所求表达式赋值给字符变量ch。接下来就是从头扫描字符,这也是一个循环的过程。若chi不是(,则直接入栈,若是则跳向下下个字符,;再判断是不是(,若不是,则将chi入栈,跳向下一个字符;再判断是不是(,若还不是则入栈。这其中若是,若是则都要进行从头扫描。接下来进行一个总的判断“!=(&!=)?”, 若成立,跳向下一字符,若不成立跳过本步;接下来判断是否为),若是则把入栈的两个元素出栈后相加再入栈,跳向下一字符。最后对此循环作一个判断,若chi是0则

9、接着进行循环,若不是则跳出循环输出栈顶元素,即为所求。其设计流程如图5所示。三、调试过程及实验结果 3.1调试过程:本程序在调试的过程中遇到了很多问题,首先程序中有不少的缀余成分,尤其是总循环的部分本来就是一个很复杂的逻辑问题,有缀余更是会使理解难上加难,这一部分是通过一步一步调试更正的。最后得到的程序能完成题目中所给的要求。主要的主函数的修改如下图所示。 修改前 修改后3.2实验结果:(1)运行程序之后,会看到一个如 图6所示的LISP计算器的界面,还可以看到题目要求、姓名、学号、指导老师等。这也是一个待输入界面。 开始建立栈V1 i=0输入chN输出v1.pop()chi!=0?YN 结束

10、chi=(?Ychi!=)? i=i+2chi=c?YN将chi入栈i=i+1Nchi=c?Y将chi入栈Nchi!=)&chi!=(?Y i=i+1chi=)?YNv1.push(v1.pop()+v1.pop();i+ 图5:主函数图6:计算器界面 (2)每一次输入数据以后,都要回车再输入ctrl+z,然后再回车,就能得到所需结果。这其中ctrl+z是结束流。首先计算6。如图7所示。图7:计算“6” (3)计算(+45),如图8所示。图8:计算(+45) (4)计算(+(+(+12)(+34)(+(+56)(+78),计算过程如图10所示。图10:计算(+(+(+12)(+34)(+(+5

11、6)(+78)四、结论 本程序十分简洁,且理解上也比较容易,完成了简单的算术表达式的计算问题,但是没能够实现其四则运算的问题,还有按照原思路应该是建立两个栈,一个存放数值,一个存放运算符,比较运算符的优先级然后对其控制的值作相应的运算。由于本人软件知识有限,所以得出的程序只是实现了片面的功能,对运算符采取了跳过的处理方式,只对表达式中的值作和,再输出。经过了将近两周的软件课设,根据题目要求对源程序作了相当大的改动,这其中包括对缀余程序的删除,对错误程序的修正。另外程序参考了网上的模版,但其中不明白的地方有很多,问了很多人,也查阅了以前学过的关于栈的知识,最后也不是彻底的能弄明白。我对于我的程序

12、不是很满意,因为这并不是一个简单的LISP计算器,计算器最起码能进行四则运算,但此计算器只能完成类似题目中所给的运算。虽然程序有些欠缺的地方,但毕竟是花了十多天的时间在程序上,收获还是很多的,算是对一学期的软件课作了一个总结,也从搜索资料中学会了运用图书馆和网络,总之软件课设使我受益匪浅,对以后的工作和学习都有很大的帮助。五、程序清单#includeint y=0;class stackpublic:stack(int k=100)a=new intk; big=k-1; top=-1;bool empty()return top=-1;bool full()return top=big; /

13、入栈void push(int k) if(!full() a+top=k; else coutwrong pushendl; return;/出栈int pop()if(!empty() return atop-; else return 0;/使其参与运算private:int big;int top;int*a;void main()stack v1;char ch100;cout本程序为简单的LISP算术表达式计算器,可以实现LISP加法表达式求值endlendl;cout endl;cout 正确格式的测试数据:6,(+45),(+(+25)8),(+2(+58), endl;cout (+(+(+12)(+34)(+(+56)(+78)endl;cout 结果:6,9,15,15,36 endl;cout

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 医学/心理学 > 基础医学

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号