沈阳航空航天大学软件课设报告(3)

2019-03-22 19:00

软件设计部分

1.任务说明

本题要求运用LISP实现简单特定形式的计算,考虑用栈来实现。建立两个栈,一个存放进行运算的数字,一个存放用于运算的符号,首先存放数字 ,存放符号用“)”为结束,当“)”出现时开始进行出栈操作,然后进行简单的加减乘除运算。运算要点如下:从左到右地扫描表达式

(1)扫描到操作数时,直接输出。

(2)第二次扫描到‘(’时进行递归调用,从头进行扫描。

(3)扫描到算术量时将其压入栈,并与前一个压入栈的算术量求和。 (4)最后的栈头元素即为所求。

2.设计过程

根据本课设题目的要求,本设计程序依据利用栈依次从里向外计算括号内数的思想设计成一个简单的LISP算术表达式计算器。该程序首先建立一个栈,通过PUSH函数和POP函数的入栈,出栈功能实现栈中元素“先进后出,后进先出”的特性。然后动态建立一大小为K的整型数组,把开辟的数组指针赋给a,从而实现栈函数的构造过程。然后再建立栈的对象,再建立一个字符型数组ch,然后向该数组输入表达式,最后进入表达式判断阶段。若LISP表达式为一操作数,则直接输出;若该表达式为运算符,则经过主函数的扫描计算,最终输出结果。

2.1栈的建立

这是一个子函数stack(int k=100),首先建立一个足够大的栈,动态定义其大小为100,然后对其置空初始化,再根据判断其是否为空返回不同的值。其设计流程图如图1。

2.1栈的建立

这是一个子函数stack(int k=100),首先建立一个足够大的栈,动态定义其大小为100,然后对其置空初始化,再根据判断其是否为空返回不同的值。其设计流程图如图1。

返回top 开始 定义栈a 初始化栈a N 是否为空? Y Top=-1 Top=big

图1:栈的建立

2.2入栈

这是一个子函数PUSH,首先赋给输入值k,再判断栈是否为非空,若为非空则将k压入栈中;若为满栈,则输出错误。其流程图如图2所示。

返回 !full()? Y a[top]=k top++ wrong push 开始 输入k值 N 图2:PUSH函数 2.3出栈

这是一个子函数POP,首先判断是否非空,若是则输出栈头元素a[top],若不是,则返回0并参与运算。其设计流程图如图3所示。

结束 !empty()? 返回a[top] top-- 返回0 开始 图3:POP函数

2.4构建函数

首先动态开辟一个大小为K的数组,然后把开辟数组的指针赋给a,然后将K-1赋给Big,将-1赋给Top,从而实现函数的构造过程,函数构造完毕,退出此进程,此段程序结束。其设计流程图如图4所示。

big=k-1 top=-1 结束 动态开辟一个大小为k的数组 把开辟数组的指针赋给a 开始 图4:构建函数 2.5主函数

这是整个程序的核心所在。首先要建立一个栈V1,将所求表达式赋值给字符变量ch。接下来就是从头扫描字符,这也是一个循环的过程。若ch[i]不是‘(’,则直接入栈,若是则跳向下下个字符,;再判断是不是‘(’?,若不是,则将

ch[i]入栈,跳向下一个字符;再判断是不是‘(’?,若还不是则入栈。这其中?若是,?若是则都要进行从头扫描。接下来进行一个总的判断“!=‘(’&&!=‘)’?”, 若成立,跳向下一字符,若不成立跳过本步;接下来判断是否为‘)’,若是则把入栈的两个元素出栈后相加再入栈,跳向下一字符。最后对此循环作一个判断,若ch[i]是0则接着进行循环,若不是则跳出循环输出栈顶元素,即为所求。其设计流程如图5所示。

三、调试过程及实验结果

3.1调试过程:

本程序在调试的过程中遇到了很多问题,首先程序中有不少的缀余成分,尤其是总循环的部分本来就是一个很复杂的逻辑问题,有缀余更是会使理解难上加难,这一部分是通过一步一步调试更正的。最后得到的程序能完成题目中所给的要求。主要的主函数的修改如下图所示。

修改前 修改后 3.2实验结果:

(1)运行程序之后,会看到一个如 图6所示的LISP计算器的界面,输入系统所需测试表达式。这也是一个待输入界面。


沈阳航空航天大学软件课设报告(3).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:驻马店市人民政府关于进一步贯彻落实房地产市场宏观调控政策促进

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: