湖南人文科技学院计算机科学技术系课程设计说明书课程名称:数据结构课程代码:408024题目: 表达式求值年级/专业/班:08级计算机科学与技术二班学生姓名: 黄胜李业芝黄自强黄沅涛姚洋学号:08408210 08408211 0840821208408213 08408215指导教师: 袁辉勇开题时间: 2009 年12 月21日完成时间: 2010 年 1 月 1 日目录摘要 (1)一、引言 (3)二、设计目的与任务 (3)1、课程设计目的 (3)2、课程设计的任务 (4)三、设计方案 (4)1、需求分析 (4)2、概要设计 (4)3、详细设计 (6)4、程序清单 (13)四、调试分析与体会 (17)五、运行结果 (18)六、结论 (20)七、致谢 (21)八、参考文献 (21)摘要在高级语言环境中算术表达上的结果是通过语言环境预设的算法的思想计算出来的,然而高级语言初学者并不了解表达式的计算过程和方法。
本文采用算符优先分析和堆栈的方法给出了算术表达式的计算过程。
所以本次课程设计的程序是在Windows系统上为用户解决包括加、减、乘、除以及括号在内的四则混合运算。
用户可通过键盘输入四则运算,经过程序运行之后,可以判断出用户所输入的表达式是否正确。
如果正确,就给出表达式的值;如果不正确,就提示输入有误。
关键词:四则混合运算;高级语言;栈AbstractThe arithmetic expression result is the algorithm thought which supposes in advance through the language environment calculatesin the higher order language environment,however the higher order language beginner does not understand the expression the computationprocess and the method. This article used the operator first to analyze and the storehouse method has given the arithmetic expression computa-tion process.Therefore, the procedure in this curriculum design is the solution for users on Windows systems, including add, subtract, multiply, divide and brackets, including four hybrid operation. Users can enter via the keyboard 4 operation, after a program is running, you can determine the user entered expression is correct. If correct, it gives the value of the expression; if not correct, it prompted an error.Key words: Four mixed operating;High-level programming language;Stack《数据结构》课程设计——表达式求值一、引言随着我国进一步的开放,我们需要扩大国际交流,加强学习国外的先进经验。
掌握国际的领先技术是我们的首要任务。
计算机技术发展异常迅速,内容更新很快,我们对计算机的了解程度也直接影响了我国的现代化和信息化的程度。
《数据结构》是计算机程序设计的重要理论技术基础,它不仅是计算机学科的核心课程,而且是其他理工专业的热门选修课。
数据结构研究的是世界上所有非数值量的信息结构及其处理方法,它不仅是计算机科学与技术相关专业十分重要的核心课程,也是应用数学、管理科学、环境规划等很多专业的一门重要基础课。
所有的计算机系统软件和应用软件都要用到各种类型的数据结构。
因此,对于所有想更好地运用计算机来解决实际问题得人们而言,仅掌握几种计算机程序设计语言是难以应付众多复杂的课题的。
要想有效地使用计算机、充分发挥计算机的性能,还必须学习和掌握好数据结构的有关知识。
打好《数据结构》这门课程的扎实基础,对于学习计算机专业的其他课程,如操作系统、编译原理、数据库管理系统、软件工程、人工智能等都是十分有益的。
本次课程设计的课题是表达式求值。
在表达式中我们必须考虑的运算符的优先性,而能够实现这一功能的就是栈了。
栈是一种重要的数据结构,是只能在某一端插入和删除的特殊线性表。
它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据。
本次课程设计的实例虽然比较简单,程序设计也不是很复杂,但是在课程设计之前我们还是做了很多准备的。
例如,在网上和一些资料上查找栈的应用。
由此我们觉得本次程序的设计过程也是一个学习过程,更是对复杂程序的一个学习过程,还能培养我们的数抽象能力。
因此,我们觉得这次课程设计是非常有意义的,能为我们今后学习面向过程的程序设计作一些铺垫。
二、设计目的与任务1、课程设计目的本次课程设计教学所要求达到的目的:通过栈来实现表达式求值,并通过此次课程设计的训练,使学生巩固和加深对栈的理解,利用所学到的计算科学的理论知识,提高解决实际问题的能力,增强运算、编程和使用技术资料的技能,通过实际问题的分析设计、编程和调试,掌握应用软件的分析方法和工程设计方法,能正确阐述设计和实验结果。
2、课程设计的任务问题描述: 输入一个带加、减、乘、除以及含有括号的数学表达式以#结尾。
输出此表达式的值。
通过这次课程设计,达到更加灵活的运用所学的理论和知识和方法,以及独立分析和解决问题的能力;培养实事求是、认真、严谨的科学态度和刻苦钻研不断创新的精神,逐步建立正确的全局观念。
三、设计方案1、需求分析1)本程序实现表达式的求值。
用户在约定的条件下,正确输入表达式,经过程序的运行之后,给出表达式的值。
2)本程序不仅能够实现正整数表达式的求值,还可以实现负数以及小数表达式的值。
且数据的上限没有限制。
3)但是本程序中,由于某些程序段要判断操作符的优先性,在这些程序段之中,由于用了“=”来表示操作符的优先是相同的。
因此在表达式中,我们用“#”代替“=”。
也就是说:用户在输入表达式之后,必须要用“#”结束。
2、概要设计1)堆栈数据类型(ADT)如下:ADT stack{ 数据对象:D={a i|a i∈Elemset,i=1,2,…,n, n≧0}数据关系:R1={<a i-1,a i>|a i-1,a i∈D,1=2,…,n}约定a n端为栈顶,a i端为栈底。
基本操作:(1)InitStack(&S)函数功能:构造一个空栈S。
(2)GetTop(S,&e)函数功能:取栈顶元素。
(3)Push(&S,e)函数功能:元素入栈。
(4)Pop(&S,Se)函数功能;元素出栈。
}ADT Stack2)存储结构typedef struct{int top;double array[N];}NumStack; //存放实数的栈typedef struct{int top;char array[N];}OpStack; //存放操作符的栈3)3、详细设计在本次课程设计中,我们用到了栈这个重要的数据结构。
在实现程序的功能的时候,有很多重要的程序段是涉及栈方面的:有栈的结构建立,入栈,出栈。
另外还有就是对表达式进行运算,判断运算符的优先级,对表达式的主体进行处理。
重要的程序段如下。
1)栈的结构typedef struct{int top;double array[N];}NumStack;typedef struct{int top;char array[N];}OpStack;本课程设计是通过栈为载体来实现程序的功能的,因此栈结构的建立是必不可少的。
以上两个程序段就是建立栈。
第一个是用来存放数字的栈,第二个是用来存放操作符的栈。
2)把字符转化为相应的整数int Cint(char mychar){return (mychar-48);}上面的函数就是把字符转化为相应的整数。
由于在ASCLL编码中,字符与其相对应的数字之差48,所以函数值就要return(mychar-48)。
3)数字进栈和操作符进栈void PushNum(NumStack *numstack,double num){numstack->top++;numstack->array[numstack->top-1]=num;}void PushOp(OpStack *opstack,char op){opstack->top++;opstack->array[opstack->top-1]=op;}数字和操作符在输入先放在栈里面。
而在入栈的时候,栈顶元素的指针先增加以增加存储的空间用来存放数字和操作符,之后才把数字和操作符存放到栈中。
第一个函数是数字的入栈,第二个函数是操作符的入栈。
4)数字出栈和操作符出栈void PopNum(NumStack *numstack,double *num){*num=numstack->array[numstack->top-1];numstack->top--;}void PopOp(OpStack *opstack,char *op){*op=opstack->array[opstack->top-1];opstack->top--;}数字和操作符存放在栈中,由于运算的需要,此时就必须把数字和操作符从栈中取出来,即出栈。
数字和操作符的出栈,是先取出栈顶元素a n。
由于取出元素之后,原先的栈顶元素的位置为空了。
此时a n-1就成了栈顶元素了,所以原先的栈顶指针就减一,指向现在的栈顶元素a n-1。
第一个函数是数字的出栈,第二个函数是操作符的出栈。
5)进行运算的函数double Calc(double a,double b,char c){double result;switch(c){case '+':result=a+b;break;case '-':result=a-b;break;case '*':result=a*b;break;case '/':result=a/b;break;}return result;}当程序在遇到运算符的时候,就要进行运算。