数据结构课程设计中缀算术表达式求值Word格式文档下载.docx
《数据结构课程设计中缀算术表达式求值Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计中缀算术表达式求值Word格式文档下载.docx(10页珍藏版)》请在冰豆网上搜索。
(3)提交课程设计报告。
(4)提交软盘(源程序、设计报告文档)。
(5)依内容的创新程度,完善程序情况及对程序讲解情况打分。
3(进度安排
第20周:
星期一8:
00——12:
00上课
星期一14:
30——18:
30上机
星期二14:
星期三8:
00上机
附:
课程设计报告装订顺序:
封面、任务书、目录、正文、评分表、附件(A4大小的图纸及程序清单)。
正文的格式:
一级标题用3号黑体,二级标题用四号宋体加粗,正文用小四号宋体;
行距为22。
正文的内容:
一、课题的主要功能;
二、课题的功能模块的划分(要求画出模块图);
三、主要功能的实现(至少要有一个主要模块的流程图);
四、程序调试;
五、总结;
六、附件(所有程序的原代码,要求对程序写出必要的注释)。
正文总字数要求在5000字以上(不含程序原代码)。
1.1设计内容
课题三:
中缀算术表达式求值
我们很早就学习如何书写及计算表达式,诸如:
8+5*(7-3)之类的表达式,先算括号内的7减去3,得到4,然后再算5乘以4,得到20,再计算8加上20,得到28,因此该表达式的值为28。
这是人们熟悉的运算规则额:
有括号先算括号内;
无括号时,先做乘除法,后做加减法;
对于相同级别的运算按从左到右的次序运算。
而计算机是如何实现表达式的计算的呢,应用栈的相关知识,编程序实现之。
设计思路:
从键盘输入中缀表达式,然后将中缀表达式转换为后缀表达式,利用后缀表达式求值。
要求以字符序列的形式从终端输入语法正确的、不含变量的整数表达式,利用给定的算术符优先关系,实现对算数四则混合运算表达式的求值,并演示在求值过程中运算符栈、操作符栈、输入字符和主要操作的变化过程。
1.2需求分析
a.程序的功能。
该程序能够对任意的四则运算表达式进行中缀表达式向后缀表达式的转换,并得出其计算结果。
b.输入输出的要求。
输入输出均是阿拉伯数字和四则运算操作符以及括号运算符,按照程序所给提示进行标准输入输出即可。
1.3概要设计
a.程序由哪些模块组成以及模块之间的层次结构、各模块的调用关系;
每个模块的功能。
b.课题涉及的数据结构和数据库结构;
即要存储什么数据,这些数据是什么样的结构,它们之间有什么关系等。
根据问题描述和要求,系统要求能够正确求出算术表达式的值。
在进行算术表达式求值过程中,考虑到我们输入的是中缀表达式,采用后缀表达式比较容易计算,因此先将中缀表达式转换成后缀表达式。
程序应该具有:
“将算术表达式转化为后缀表达式”、“利用后缀表达式求值”等基本模块。
由于有优先级的问题,根据优先级不同的运算符运算的次序是不同的,因此更具其优先级的大小抽象的将其定义为不同的大小。
本程序的数据结构为栈。
程序的主要模块可以分为运算符栈,操作数栈,以及各类函数。
1.4详细设计
a.采用C语言定义相关的数据类型。
b(写出各模块的类C码算法。
c.画出各函数的调用关系图、主要函数的流程图。
1.4.1数据类型定义
表达式求值中运算符对应优先级的定义
struct
{charch;
intpri;
}lpri[7]={{'
='
0},{'
('
1},{'
*'
5},{'
/'
+'
3},{'
-'
)'
6}},rpri[
7]={{'
6},{'
4},{'
2},{'
1}};
//运算符优先级的定义
1.4.2将中缀表达式转换成后缀表达式
先初始化栈,然后将‘=’进栈,从exp中读取字符,若它为数字则一次存入postexp中,并以空格标志结束。
若为运算符,则和栈顶运算符比较,如果栈顶运算符优先级低则该运算符进栈。
待字符串exp扫描完毕,则将运算符栈中‘=’之前所有运算符出栈并存放带postexp中,最后得到后缀表达式postexp。
voidtrans(char*exp,charpostexp[])//将算术表达式exp转换为后缀表达式
postexp
{
charst[MaxSize];
inttop=-1;
inti=0;
//i作为postexp的下标
top++;
//'
进栈
st[top]='
;
while(*exp!
\0'
)
if(!
InOp(*exp))//为数字字符
while(*exp>
0'
&
*exp<
9'
postexp[i++]=*exp;
exp++;
}
postexp[i++]='
'
//数值串结束的标志
else//为运算符
switch(Precede(st[top],*exp))
case-1:
//栈顶运算符的优先级低
st[top]=*exp;
//进栈
//继续扫描其他字符
break;
case0:
//只有括号满足这种情况
top--;
//栈顶元素退栈
case1:
//退栈并输出到postexp中
postexp[i++]=st[top];
while(st[top]!
)//此时exp扫描完毕,退栈到'
为止
postexp[i]='
//给postexp表达式添加结束标识
1.4.3后缀表达式求值
从左到右读入后缀表达式,若读入的是一个操作数,就将它入数值栈。
若读入的是一个运算符。
就
从数值栈中连续出出栈两个元素,并将计算结果入数值栈,对整个后缀表达式读入结束时,栈顶元
素就是计算结果。
floatcompvalue(char*postexp)//计算后缀表达式postexp的值
floats[MaxSize];
//数值栈
floata,b,d;
while(*postexp!
switch(*postexp)
case'
:
a=s[top];
b=s[top];
s[top]=a+b;
//计算结果进栈
s[top]=b-a;
s[top]=a*b;
if(a!
=0)
s[top]=b/a;
else
printf("
\n\t除零错误!
\n"
);
exit(0);
//异常退出
default:
//处理数字字符
d=0;
//将连续的数字字符转换成对应的数值存到d中
while(*postexp>
*postexp<
d=d*10+*postexp-'
postexp++;
s[top]=d;
//继续处理其他的字符
returns[top];
1.4.4主要函数流程图
开始
ch!
t'
T'
Y
N
请输入:
表达式
exp
trans(exp,postexp);
将中缀表达式exp转换为后缀表达式值compvalue(postexp)表达式postexp
compvalue(postexp)函数,后缀表达式求值
输出:
中缀表达式exp
后缀表达式postexp
结束
图一主要函数流程图
1.5调试分析以及设计体会
1.5.1调试分析。
1程序的界面
2正确的执行结果
3如果选择T或是t程序终止,其他则继续运行
b.程序调试中遇到的问题以及解决问题的方法。
c.课程设计过程经验教训、心得体会。
1.5.2心得体会
完成这次数据结构的课程设计的时间虽然不长,但是我还是学到了不少东西。
在做课程设计前,我首先读懂老师给的课题,然后仔细阅读课本。
有不懂的知识点就和同学交流并向老师咨询。
这个课题最主要的是要明白栈的相关知识点,尤其是栈“后进先出”特点,在比较完运算符优先级后,将比栈顶运算符高优先级放入栈中,待表达式全部被扫描完。
在编写后缀表达式求值函数时,忘了处理数字字符,因为主函数里定义的是字符数组,所以在对表达式求值时要转换成对应的数字。
此外,在编写程序的过程中,不能心急,烦躁,遇到问题要耐心查找资料,然后解决,有时候,会因为一点小错误导致编译出现错误,而这些错误又很难被发现,这时就需要我们细心寻找,运用所学的知识,一点一点地分析问题,再去解决这些问题。
因为成功的背后必定会有辛勤和汗水。
这也让我体会到想要在软件编程方面发展并取得成功所需要付出的努力。
通过完成这次算术表达式求值的课程设计。
我对数据结构这门课又有了更加深刻的了解,也提升了自己的逻辑思维能力。
以及程序编写能力,即使有时候晚上编程到很晚,但心里还是美滋滋的,因为看到自己亲自编写的程序可以执行,达到所必须的要求,之前的苦累全都抛在脑后了。
最后,非常感谢胡瑛老师和田老师的帮助,每次问的问题都很耐心地为我讲解,即使是连我都认为很笨的问题,也都为我详细的分析。
谢谢~
(5)使用说明
用户使用手册:
说明如何使用你编写的程序,详细列出每一步的操作步骤。
(6)书写格式
a.设计报告要求用A4纸打印成册:
b.一级标题用3号黑体,二级标题用四号宋体加粗,正文用小四号宋体;
行距为
22。
(7)附录
源程序清单(带注释)
计算机与通信学院课程设计评分表
课程名称:
项目评价
设计方案的合理性与创造性
设计与调试结果
设计说明书的质量
答辩陈述与回答问题情况
课程设计周表现情况
综合成绩
教师签名:
日期:
(注:
1(此页附在课程设计报告之后;
2(综合成绩按优、良、中、及格和不及格五级评定。
内部资料
仅供参考