逆波兰表达式-计算器-实验报告_第1页
逆波兰表达式-计算器-实验报告_第2页
逆波兰表达式-计算器-实验报告_第3页
逆波兰表达式-计算器-实验报告_第4页
逆波兰表达式-计算器-实验报告_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、精选优质文档-倾情为你奉上计算机科学与工程学院综合设计报告说明:1、报告中的第一、二、三项由指导教师在综合设计开始前填写并发给每个学生;四、五两项(中英文摘要)由学生在完成综合设计后填写。2、学生成绩由指导教师根据学生的设计情况给出各项分值及总评成绩。3、指导教师评语一栏由指导教师就学生在整个设计期间的平时表现、设计完成情况、报告的质量及答辩情况,给出客观、全面的评价。4、所有学生必须参加综合设计的答辩环节,凡不参加答辩者,其成绩一律按不及格处理。答辩小组成员应由2人及以上教师组成。5、报告正文字数一般应不少于5000字,也可由指导教师根据本门综合设计的情况另行规定。6、平时表现成绩低于6分的

2、学生,其综合设计成绩按不及格处理。7、此表格式为武汉工程大学计算机科学与工程学院提供的基本格式(适用于学院各类综合设计),各教研室可根据本门综合设计的特点及内容做适当的答辩记录表一、综合设计目的、条件、任务和内容要求: 本次综合设计的目的是让学生单独完成一个小型软件的设计和开发过程,包括最初的方案和算法设计、功能和细节的详细设计、图形界面的设计和处理、程序的开发和调试,以及最终设计报告的撰写。设计的编程语言为C/C+,环境可用Visual C+ 6.0或其他C/C+编译器。 操作系统为Windows或Linux。设计的主要任务是要求在运行界面下输入包括+、-、*、/、(乘方)、%(求余)、(、

3、)的 混合运算表达式(一般意义上的中缀表达式),将其转换成逆序波兰表达式(后缀表达式)并计算输出结果。设计的过程中要求清楚理解以下细节:中缀表达式到后缀表达式的转换算法,对操作数栈和操作符栈的进栈和出栈处理,多种运算符的优先级排序、以及根据转换后的逆波兰表达式计算整个表达式结果的处理。逆波兰表达式又叫做后缀表达式。在通常的表达式中,二元运算符总是置于与之相关的两个运算对象之间,所以,这种表示法也称为中缀表示。波兰逻辑学家J.Lukasiewicz于1929年提出了另一种表示表达式的方法。按此方法,每一运算符都置于其运算对象之后,故称为后缀表示。后缀表达式的优点是显而易见的,编译器在处理时候按照

4、从左至右的顺序读取逆波兰表达式,遇到运算对象直接压入堆栈,遇到运算符就从堆栈提取后进的两个对象进行计算,这个过程正好符合了计算机计算的原理。后缀表达式比前缀表达式更加易于转换,并且它的最左面一定为数字,这一点在实际编程的时候就会体会到它的好处了。逆波兰表达式有一个更大的优点,就是拆括号,根据运算符的级别将中缀表达式转换成逆波兰表达式后,运算顺序就已经替代了运算符的级别,这样也避免了括号提高运算级别的特殊处理。 指导教师签字: 年 月 日二、进度安排:需求分析和功能分析 1天算法设计(进栈出栈处理、优先级处理、表达式转换) 2天模块设计和功能设计 2天程序编码和调试 2天设计报告撰写与修改 3天

5、三、应收集资料及主要参考文献:1C语言程序设计谭浩强著,清华大学出版社2VC技术内幕(第五版)3.数据结构(第二版) ,清华大学出版社4.c+面向对象程序设计 ,中国铁道出版社5.程序设计基础李晓林,张俊 四、综合设计(课程设计)摘要(中文):逆波兰表达式又叫做后缀表达式。在通常的表达式中,二元运算符总是置于与之相关的两个运算对象之间,所以,这种表示法也称为中缀表示。波兰逻辑学家J.Lukasiewicz于1929年提出了另一种表示表达式的方法。按此方法,每一运算符都置于其运算对象之后,故称为后缀表示。后缀表达式的优点是显而易见的,编译器在处理时候按照从左至右的顺序读取逆波兰表达式,遇到运算对

6、象直接压入堆栈,遇到运算符就从堆栈提取后进的两个对象进行计算,这个过程正好符合了计算机计算的原理。后缀表达式比前缀表达式更加易于转换,并且它的最左面一定为数字,这一点在实际编程的时候就会体会到它的好处了。逆波兰表达式有一个更大的优点,就是拆括号,根据运算符的级别将中缀表达式转换成逆波兰表达式后,运算顺序就已经替代了运算符的级别,这样也避免了括号提高运算级别的特殊处理。五、综合设计(课程设计)Abstract(英文):Reverse Polish Notation is also called suffix expressions. In the usual expressions,

7、binary operators are always placed in the two operations associated with objects, so this representation is also known as infix said. Polish logician J. Lukasiewicz in 1929 that proposed an alternative method of expression. Click method, each operator is placed after its operand, so called

8、 suffix. The advantages of postfix expression is obvious, the compiler handling the order when read from left to right reverse Polish expressions, face directly onto the operand stack, the stack experienced operator to extract from the backward of the two objectscalculated, the process serves t

9、o meet the principles of computer calculations. Postfix expression easier to convert than the prefix expression, and certainly its most left for the figures, this time in the actual programming will appreciate its benefits. RPN has a bigger advantage is that demolition brackets, according

10、to the level of the operator to convert infix expressions in Reverse Polish Notation, the order of operations has replaced the level of operators, this also avoids the increase in parenthesesOperational level of special treatment. 专心-专注-专业目 录摘 要本课程设计将实现一个简单计算器。在功能上尽量模仿windows的计算器。系统界面不做牵制要求。该程序

11、能实现标准型中+、-、*、/、(乘方)、%(求余)、(、)的 混合运算表达式(一般意义上的中缀表达式),将其转换成逆序波兰表达式(后缀表达式)并计算输出结果。在进行运算后可以选择继续运算或者结束当前运算。即时准确地获得需要的计算的结果,充分降低了数字计算的难度和节约了时间,对人们的生活有一定的帮助。在课程设计中,系统开发平台为Windows XP,程序设计设计语言采用Visual C+,在程序设计中,采用了结构化与面向对象两种解决问题的方法。设计的过程中通过把中缀表达式转化到后缀表达式,对操作数栈和操作符栈的进栈和出栈处理,多种运算符的优先级排序、以及根据转换后的逆波兰表达式计算整个表达式结果

12、的处理,来实现程序的顺利运行。关键词:程序设计;逆波兰表达式;出栈、入栈;优先级 AbstractThe course is designed to implement a simple calculator. Try to imitate windows in the functions of the calculator. System interface does contain requirements. The program can achieve in +,-,*,/,( standard power),% (remainder ),(,) hybr

13、id computing expressions (a general sense of the infix expression), to convert Reverse Polish Notation (postfix expression) and calculate the output. During the operation can continue after the operator or the end of the current operation. Immediate and accurate access to the results

14、of the calculation needed to fully reduce the difficulty of digital computing and saving time on people's lives will certainly help. In curriculum design, system development platform for Windows XP, programming language using Visual C + +, in programming, using both structured and object-or

15、iented solution to the problem.The design process through the conversion of infix expression to postfix expression, on the operand stack and stack into the operator stack and stack processing, multi-operator prioritization, and according to the converted in Reverse Polish Notationtreatment of the en

16、tire expression results calculated to achieve the program running smoothly. Keywords:Program design; Reverse Polish Notation; the stack, the stack;priorit第一章 课题背景1.1 课题背景计算器是日常生活中十分便捷有效的工具,能实现加、减、乘、除、开方、求倒数等简单运算的工具。要实现计算功能,可以用VC+的知识编写程序来解决此问题。该计算器大大的降低了数字计算的难度及提高了计算的准确度和精确度。

17、该计算器使用非常简单和方便,对广大中小学生的学习有巨大帮助作用,也对在职人员的工作有点帮助作用。正文 (小四号字 宋体 1.25倍行距)1.2 课程设计目的在程序设计中,通过设计、编制、调试一个模拟计算器的程序,加深对语法及语义分析原理的理解,并实现对命令语句的灵活应用。在程序设计中,可以用两种方法解决问题:一是传统的结构化程序设计方法,二是更先进的面向对象程序设计方法。通过这次课程设计,使C语言的理论知识得到巩固,同时让我们体会到C语言语句简洁,使用灵活,执行效率高等特点。认识上机实训的重要作用。培养同学们分析问题、解决问题的能力。第二章 设计简介及设计方案论述2.1 工作原理逆波兰表达式又

18、叫做后缀表达式。在通常的表达式中,二元运算符总是置于与之相关的两个运算对象之间,所以,这种表示法也称为中缀表示。波兰逻辑学家J.Lukasiewicz于1929年提出了另一种表示表达式的方法。按此方法,每一运算符都置于其运算对象之后,故称为后缀表示。后缀表达式的优点是显而易见的,编译器在处理时候按照从左至右的顺序读取逆波兰表达式,遇到运算对象直接压入堆栈,遇到运算符就从堆栈提取后进的两个对象进行计算,这个过程正好符合了计算机计算的原理。后缀表达式比前缀表达式更加易于转换,并且它的最左面一定为数字,这一点在实际编程的时候就会体会到它的好处了。逆波兰表达式有一个更大的优点,就是拆括号,根据运算符的

19、级别将中缀表达式转换成逆波兰表达式后,运算顺序就已经替代了运算符的级别,这样也避免了括号提高运算级别的特殊处理。2.2需求分析2.2.1要求(1)用C语言实现程序设计;(2)利用结构体、共用体进行相关信息处理;(3)画出查询模块的流程图;(4)系统的各个功能模块要求用函数的形式实现;(5)界面友好(良好的人机互交),程序要有注释。2.2.2任务(1)定义一个结构体类型数组,输入09及+、-、*等符号的信息,将其信息存入文件中;(2)输入简单的加减乘除算术计算式,并在屏幕上显示计算结果;(3)画出部分模块的流程图;(4)编写代码;(5)程序分析与调试。第三章 详细设计3.1流程图3.2 设计的细

20、节首先定义两个栈,一个字符型,一个双精度型,程序代码如下struct /作为存放运算表达式的栈使用 char dataMaxSize; / 存放表达式的字符数组 int top; /栈顶指针Sym;/*符号*/struct /作为存放运算结果的栈使用 double dataMaxSize; /存放运算结果的数组 int top; /栈顶指针Num;/*数*/存储后缀式计算器的运算数void NumPush() if(Num.top<MaxSize-1) Num.data+Num.top=ston(expr,&i); else printf("Num栈满n");

21、 return; 定义后缀表达式的计算函数void NumPop() if(Num.top>=0) if(expri!=' ') switch(expri) case '+':Num.dataNum.top-1=Num.dataNum.top-1+Num.dataNum.top;break; case '-':Num.dataNum.top-1=Num.dataNum.top-1-Num.dataNum.top;break; case '*':Num.dataNum.top-1=Num.dataNum.top-1*Num.d

22、ataNum.top;break; case '/':Num.dataNum.top-1=Num.dataNum.top-1/Num.dataNum.top;break; case '%':Num.dataNum.top-1=(int)(Num.data(Num.top-1)%(int)(Num.dataNum.top);break; case '':Num.dataNum.top-1=pow(Num.dataNum.top-1,Num.dataNum.top);break; Num.top-; else printf("Num栈空n&

23、quot;); return; 3.3 由后缀表达式计算中缀表达式原理计算机处理后缀表达式求值问题是比较方便的,即将遇到的操作数暂存于一个操作数栈中,凡是遇到操作数,便从栈中pop出两个操作数,并将结果存于操作数栈中,直到对后缀表达式中最后一个操作数处理完,最后压入栈中的数就是后最表达式的计算结果。中缀表达式转换为等价的后缀表达式中缀表达式不方便与计算机处理,通常要讲中缀表达式转换为一个与之等价的后缀表达式。等价是指两个表达式的计算顺序和计算结果完全相同。中缀表达式:0.3/(5*2+1)#的等价后缀表达式是:0.3 5 2 * 1 + /#仔细观察这两个等价的表达式可知,操作数的出现次序是相

24、同的,但运算符的出现次序是不同的。在后缀表达式中,运算符的出现次序是实际进行操作的次序;在中追表达式中,由于受到操作符的优先级和括号的影响,操作符出现次序与实际进行操作的次序很可能是不一样的。3.4 算法描述将中缀表达式转换为等价的后缀表达式的过程要使用一个栈放“(”,具体可以按照下面的方式进行。(1)从左到右一次扫描中缀表达式的每一个字符,如果是数字字符和圆点“.”则直接将它们写入后缀表达式中。(2)如果遇到的是开括号“(”,则将它们压入一个操作符栈(不需要与栈顶操作符相比较),它表明一个新的计算层次的开始,在遇到和它匹配的闭括号“)”时,将栈中的元素弹出来并放入后缀表达式中,直到栈顶元素为

25、“(”时,将栈顶元素“(”弹出(不需要加入后缀表达式),表明这一层括号内的操作处理完毕。(3)如果遇到的是操作符,则将该操作符和操作符栈顶元素比较:   a 当所遇到的操作符的优先级小于或等于栈顶元素的优先级时,则取出栈顶元素放入后缀表达式,并弹出该栈顶元素,反复执行直到栈顶元素的优先级小于当前操作符的优先级;   b、当所遇到的操作符的优先级大于栈顶元素的优先级的时则将它压入栈中。  (4)重复上述步骤直到遇到中缀表达式的结束符标记“#”,弹出栈中的所有元素并放入后缀表达式中,转换结束。第四章 设计结果及分析4.

26、1输入不同表达式验证程序的正确性式一:式二:式三:当输入错误时,没有结果总 结经过了两个星期的c语言程序设计,终于在老师的细心指导和同学的热情帮助下基本完成了计算器课题的设计修改任务!虽然有些地方不尽如人意但是初步达到了对自己的要求!刚开始设计的时候找不到头绪,不知道该从哪里下手!通过向同学询问和向老师寻求帮助找走进了设计的门槛!通过网上查找到很多成功的计算器程序,通过对那些已经成功地程序进行分析找到自己的设计思路,制定设计流程。并通过比较各种程序了解各个程序的利弊,从而明确自己计算器的设计方向和如何通过技术手段达到自己的目的!万事开头难,可是对于并不是很熟悉的c语言在下面的工作中困难处处能遇

27、见.通过查找c语言教材去图书馆查找相关的资料和同学一起讨论终于把一个个棘手的陌生的问题解决。测试阶段中发现了几处错误导致程序不能编译,通过耐心的分析源代码终于编好了一个完整无误的程序。 在这次的c语言程序设计实习中遇到了现实编程中必然见到的问题通过这些问题的解决积累了编程的实践经验。在实际的编程操作中发现自己c语言知识的不足,加深了对c语言的理解。在学习之余体验到收获的感觉。同时认识到程序员的工作并不是我们想象的那么简单轻松的,在现在的编程中要有足够的耐心和热情,还要加强实践,多动手,才能让自己更加熟练。 致 谢这次C语言课程设计让我学到了很多,从编程中可以看出编写一个程序的是一件很难的事。要

28、想成为一名优秀的程序员,需要持久的耐心和深厚的专业知识。虽然这次我这组的课程设计题目不是很难,但要做好也不是一件很容易的事情。我努力使我的设计更加完美,我也有幸得到成娅辉老师的指导,使我能够顺利完成我的课程设计,我同时也要感谢其他给予我帮助的同学,他们使我认识到团队的力量。再一次感谢所有帮助我完成这次课程设计的人。参考文献1 张俊,张彦铎.C+面向对象程序设计M. 北京:张俊,2008.1-380.2 严蔚敏,吴伟民.数据结果(C语言版)M.北京:严蔚敏,2007.1-3343 谭浩强.C程序设计M.北京:谭浩强,2005.1-3784 李晓林,张俊.程序设计基础M.北京:张俊,2008.1-

29、3715 李翠霞.零基础学Visual C+M.北京:李翠霞,2009.1-285附录:#include<stdio.h>/*标准输入输出头文件*/#include<conio.h>/*控制台输入输出*/#include<math.h>/*数学库函数*/#include<stdlib.h>/*系统函数,分配、释放内存等*/#include<string.h>/*字符串处理*/#define MaxSize 99char calcMaxSize,exprMaxSize;int i,t;struct char dataMaxSize;/*

30、构造了一个字符串*/ int top;Sym;/*符号*/struct double dataMaxSize;/*构造一个双精度数组*/ int top;Num;/*数*/double ston(char x,int *p)/*定义一函数*/ int j=*p+1,i; double n=0; char sign=x*p;/*字符串*/ if(sign='+'|sign='-') *p=*p+1; while(xj>='0'&&xj<='9') j+; for(i=*p;i<j;i+) n=n*1

31、0+(xi-'0'); if(xj='.') *p=+j; while(xj>='0'&&xj<='9') j+; for(i=*p;i<j;i+) n=n+pow(0.1,i-*p+1)*(xi-'0'); *p=j; if(sign='-') return(-n); return(n);void InitStack() Sym.top=Num.top=-1;void SymPush() if(Sym.top<MaxSize-1) Sym.data+Sym.

32、top=calci+; else printf("Sym栈满n"); return; void SymPop() if(Sym.top>=0) expr+t=Sym.dataSym.top-; else printf("Sym栈空n"); return; void NumPush() if(Num.top<MaxSize-1) Num.data+Num.top=ston(expr,&i); else printf("Num栈满n"); return; void NumPop() if(Num.top>=0)

33、if(expri!=' ') switch(expri) case '+':Num.dataNum.top-1=Num.dataNum.top-1+Num.dataNum.top;break; case '-':Num.dataNum.top-1=Num.dataNum.top-1-Num.dataNum.top;break; case '*':Num.dataNum.top-1=Num.dataNum.top-1*Num.dataNum.top;break; case '/':Num.dataNum.top-1=

34、Num.dataNum.top-1/Num.dataNum.top;break; case '%':Num.dataNum.top-1=(int)(Num.data(Num.top-1)%(int)(Num.dataNum.top);break; case '':Num.dataNum.top-1=pow(Num.dataNum.top-1,Num.dataNum.top);break; Num.top-; else printf("Num栈空n"); return; int main(void) loop1: i=0,t=-1; syste

35、m("cls"); printf("中缀表达式:"); InitStack(),gets(calc); while(calci!='0'&&calci!='=') if(calci>='0'&&calci<='9') while(calci>='0'&&calci<='9')|(calci='.') loop2: expr+t=calci+; expr+t=' ' else if(calci='(') SymPush(); else if(calci=')') while(Sym.dataSym.top!='(') SymPop(); expr+t=' ' Sym.dataSym.top-='0

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论