1、算术表达式求值数 据 结 构课程设计说明书题 目算术表达式求值学 号姓 名指导教师日 期内蒙古科技大学课程设计任务书课程名称数据结构课程设计设计题目算术表达式求值指导教师时间2013年秋学期第15周至第19周一、教学要求1. 掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力2. 初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能3. 提高综合运用所学的理论知识和方法独立分析和解决问题的能力4. 训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风二、设计资料及参数每个学生在教师提供的课程设计题目中任意选择一题,独立完成,题
2、目选定后不可更换。算术表达式求值以字符串表示算术表达式,在此基础上借助栈完成对表达式的转换和求值操作。要求设计类(或类模板)来描述算术表达式及其操作,包含必要的构造函数和析构函数,以及其他能够完成如下功能的成员函数:v输入算术表达式(中缀表示)v中缀表达式转换为后缀表达式v输出表达式v对后缀表达式求值 并设计主函数测试该类。三、设计要求及成果1. 分析课程设计题目的要求2. 写出详细设计说明3. 编写程序代码,调试程序使其能正确运行4. 设计完成的软件要便于操作和使用5. 设计完成后提交课程设计报告四、进度安排资料查阅与讨论(1天)系统分析(2天)系统的开发与测试(5天)编写课程设计说明书和验
3、收(2天)五、评分标准1. 根据平时上机考勤、表现和进度,教师将每天点名和检查2. 根据课程设计完成情况,必须有可运行的软件。3. 根据课程设计报告的质量,如有雷同,则所有雷同的所有人均判为不及格。4. 根据答辩的情况,应能够以清晰的思路和准确、简练的语言叙述自己的设计和回答教师的提问六、建议参考资料1数据结构 (C语言版)严蔚敏、吴伟民 主编 清华大学出版社 2004.112数据结构课程设计案例精编(用C/C+描述),李建学 等 编著,清华大学出版社 2007.23.数据结构:用面向对象方法与C+语言描述,殷人昆 主编,清华大学出版社 2007.6第1章 需求分析1.1 题目描述以字符串表示
4、算术表达式,在此基础上借助栈完成对表达式的转换和求值操作。要求设计类(或类模板)来描述算术表达式及其操作,包含必要的构造函数和析构函数,以及其他能够完成如下功能的成员函数:输入算术表达式(中缀表示)中缀表达式转换为后缀表达式输出表达式对后缀表达式求值 并设计主函数测试该类。1.2 设计需求分析根据题目要求,编译系统计算中缀表达式的过程分为两步:(1)将中缀表达式后缀表达式;(2)根据后缀表达式计算出表达式的值。在计算机中,算术表达式由常量、变量、运算符和括号组成。由于不同的运算符具有不同的优先级,又要考虑括号,因此,算术表达式的求值不可能严格地从左到右进行。因而在程序设计时,借助栈实现。算法输
5、入:一个算术表达式,由常量、变量、运算符和括号组成(以字符串形式输入)。为简化,规定操作数只能为正整数,操作符为+、-*、/。算法输出:输出后缀表达式和后缀运算结果。算法要点:设置运算符栈和运算数栈辅助分析算符优先关系。在读入表达式的字符序列的同时,完成运算符和运算数的识别处理,然后根据栈后进先出的特点不断进行入栈出栈转化成后缀表达式,然后再对后缀表达式进行相应运算。1.3 详细分析要对一个含有加减乘除四则运算的合法的算术表达式进行求值,首先,应了解算术表达式的四则运算的规则: (1)从左向右计算 (2)先乘除,后加减 (3)先括号内,后括号外由此可知,比如算术表达式(7+15)*(23-28
6、/4)的计算顺序,即为 (7+15)*(23-28/4)=22*(23-28/4)=22*(23-7)=22*16=352其次,应明确“算符优先法”的内容:算符优先法就是根据上述四则运算规则确定的优先关系来实现对表达式的编译或解释执行的。一个简单的四则运算表达式由操作数(operand)、运算符(operator)和界限符(delimiter)组成,其中操作数是正整数,运算符只含加、减、乘、除四种,界限符有左右括号和表达式起始、结束符“#”;而且,为了统一算法的描述,将运算符和界限符通称为算符。算符集OP=+,-,*,/,(,),#。根据上述3条运算规则,在具体的运算的每一步中,任意两个相继出
7、现的算符1和2之间的优先关系只能是如下3中关系之一:12 1的优先级高于2 下表定义了算符之间的这种优先关系。表1.1 算符之间的优先关系1 2+-*/()#+-*/(#=第2章 总体设计2.1 任务与分析中缀输入,然后中缀表达式转化成后缀形式。后缀表达式的操作数与中缀表达式的操作数先后次序相同,只是运算符的先后次序发生了改变。因此,对中缀表达式从左到右依次进行扫描,每读到一个操作数即把它作为后缀的一部分输出;每读到一个运算符就将它和下一个运算符进行比较,根据运算符的优先级来决定它是入栈还是出栈。后缀求值,通过ASC依次辨别然后计算。2.2 程序的主要功能2.2.1 中缀表达式转化成后缀表达式
8、描述:(1)输入中缀表达式;(2)扫描中缀表达式,通过调用比较运算符优先级依次输出。代码表示:/中缀转后缀void operation(vector &exp1) int mm=1; ListStack s2;/通过栈正确输出运算符顺序 s2.push(#); char c; cinc; while(c!=#) if(JudgeType(c) if(mm=2) exp1.push_back(,); exp1.push_back(c); mm=1; c=getchar(); else switch(judgeop(s2.GetTop(),c) case :s2.push(c); c=getcha
9、r(); break; case =:s2.pop(); c=getchar(); break; case : char temat=s2.pop(); exp1.push_back(,); exp1.push_back(temat); break; mm=2; char name=s2.pop(); while(name!=#) exp1.push_back(,); exp1.push_back(name); name=s2.pop(); 2.2.2 后缀表达式求值描述:(1)设置一个指针用来遍历后缀表达式;(2)通过符号的ASC码辨别数字和运算符;(3)计算。 代码表示:/计算后缀表达式v
10、oid Result(vector &exp1) ListStack s1; int mm=1; for(vector:iterator iter=exp1.begin();iter!=exp1.end();+iter) if(*iter=48&*iter=57) double num; num=(double)*iter-48; if(mm=0) double nn=s1.pop(); num=nn*10+num; s1.push(num); mm=0; else if(*iter=44) mm=1; continue; else if(*iter!=44&*iter48) double r
11、e2=s1.pop(); double re1=s1.pop(); s1.push(operate(re1,re2,*iter); mm=1; couts1.pop()endl;2.3 总体功能设计函数主体结构与功能实现如下图2.1所示:图2.1 第3章 抽象数据类型定义3.1 链表栈的抽象数据类型的设计ADT描述ADT ListStack数据对象D:D=ai| ai ElemSet,i=1,2,3,n,n0数据关系:R1=| ai-1,ai D,i=1,2,3,,n约定an端为栈顶,a1端为栈底基本操作:ListStack()操作结果:构造一个空栈。push(T ele)初始条件:栈已存在。
12、操作结果:插入新元素为栈顶。 pop()初始条件:栈已存在且非空。操作结果:删除栈顶元素。GetTop()初始条件:栈已存在且非空。操作结果:返回栈顶。 ADT ListStack第4章 详细设计4.1 工程视图一个源代码文件,截取工程文件视图,由图4.1表示 图4.1 工程视图4.2 类图视图这个文件包含类、存储结构及一些重要函数函数,下面用截图来说明。图4.2类图4.3 函数的调用关系如下图4.3所示图4.3函数调用关系4.4 主程序流程图如图4.4所示: 图4.4主程序流程图4.5 主要算法代码1中缀转化成后缀 void operation(vector &exp1) int mm=1; ListStack s2;/通过栈正确输出运算符顺序 s2.push(#); char c; cinc; while(c!=#) if(JudgeType(c) if(mm=2) exp1.push_back(,); exp1.push_back(c); mm=1; c=getchar(); else switch(judgeop(s2.GetTop(),c) case :s2.push(c); c=getchar(); break; case =:s2.pop();
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1