逆波兰表达式 计算器 实验报告.docx

上传人:b****1 文档编号:23101320 上传时间:2023-04-30 格式:DOCX 页数:23 大小:188.34KB
下载 相关 举报
逆波兰表达式 计算器 实验报告.docx_第1页
第1页 / 共23页
逆波兰表达式 计算器 实验报告.docx_第2页
第2页 / 共23页
逆波兰表达式 计算器 实验报告.docx_第3页
第3页 / 共23页
逆波兰表达式 计算器 实验报告.docx_第4页
第4页 / 共23页
逆波兰表达式 计算器 实验报告.docx_第5页
第5页 / 共23页
点击查看更多>>
下载资源
资源描述

逆波兰表达式 计算器 实验报告.docx

《逆波兰表达式 计算器 实验报告.docx》由会员分享,可在线阅读,更多相关《逆波兰表达式 计算器 实验报告.docx(23页珍藏版)》请在冰豆网上搜索。

逆波兰表达式 计算器 实验报告.docx

逆波兰表达式计算器实验报告

计算机科学与工程学院

综合设计报告

说明:

1、报告中的第一、二、三项由指导教师在综合设计开始前填写并发给每个学生;四、五两项(中英文摘要)由学生在完成综合设计后填写。

2、学生成绩由指导教师根据学生的设计情况给出各项分值及总评成绩。

3、指导教师评语一栏由指导教师就学生在整个设计期间的平时表现、设计完成情况、报告的质量及答辩情况,给出客观、全面的评价。

4、所有学生必须参加综合设计的答辩环节,凡不参加答辩者,其成绩一律按不及格处理。

答辩小组成员应由2人及以上教师组成。

5、报告正文字数一般应不少于5000字,也可由指导教师根据本门综合设计的情况另行规定。

6、平时表现成绩低于6分的学生,其综合设计成绩按不及格处理。

7、此表格式为武汉工程大学计算机科学与工程学院提供的基本格式(适用于学院各类综合设计),各教研室可根据本门综合设计的特点及内容做适当的

答辩记录表

 

一、综合设计目的、条件、任务和内容要求:

本次综合设计的目的是让学生单独完成一个小型软件的设计和开发过程,包括最初的方案和算法设计、功能和细节的详细设计、图形界面的设计和处理、程序的开发和调试,以及最终设计报告的撰写。

设计的编程语言为C/C++,环境可用VisualC++6.0或其他C/C++编译器。

操作系统为Windows或Linux。

设计的主要任务是要求在运行界面下输入包括+、-、*、/、^(乘方)、%(求余)、(、)的混合运算表达式(一般意义上的中缀表达式),将其转换成逆序波兰表达式(后缀表达式)并计算输出结果。

设计的过程中要求清楚理解以下细节:

中缀表达式到后缀表达式的转换算法,对操作数栈和操作符栈的进栈和出栈处理,多种运算符的优先级排序、以及根据转换后的逆波兰表达式计算整个表达式结果的处理。

逆波兰表达式又叫做后缀表达式。

在通常的表达式中,二元运算符总是置于与之相关的两个运算对象之间,所以,这种表示法也称为中缀表示。

波兰逻辑学家J.Lukasiewicz于1929年提出了另一种表示表达式的方法。

按此方法,每一运算符都置于其运算对象之后,故称为后缀表示。

后缀表达式的优点是显而易见的,编译器在处理时候按照从左至右的顺序读取逆波兰表达式,遇到运算对象直接压入堆栈,遇到运算符就从堆栈提取后进的两个对象进行计算,这个过程正好符合了计算机计算的原理。

后缀表达式比前缀表达式更加易于转换,并且它的最左面一定为数字,这一点在实际编程的时候就会体会到它的好处了。

逆波兰表达式有一个更大的优点,就是拆括号,根据运算符的级别将中缀表达式转换成逆波兰表达式后,运算顺序就已经替代了运算符的级别,这样也避免了括号提高运算级别的特殊处理。

 

指导教师签字:

 

年月日

二、进度安排:

需求分析和功能分析1天

算法设计(进栈出栈处理、优先级处理、表达式转换)2天

模块设计和功能设计2天

程序编码和调试2天

设计报告撰写与修改3天

 

三、应收集资料及主要参考文献:

1.《C语言程序设计》谭浩强著,清华大学出版社

2.《VC技术内幕》(第五版)

3.《数据结构》(第二版),清华大学出版社

4.《c++面向对象程序设计》,中国铁道出版社

5.《程序设计基础》李晓林,张俊

 

四、综合设计(课程设计)摘要(中文):

逆波兰表达式又叫做后缀表达式。

在通常的表达式中,二元运算符总是置于与之相关的两个运算对象之间,所以,这种表示法也称为中缀表示。

波兰逻辑学家J.Lukasiewicz于1929年提出了另一种表示表达式的方法。

按此方法,每一运算符都置于其运算对象之后,故称为后缀表示。

后缀表达式的优点是显而易见的,编译器在处理时候按照从左至右的顺序读取逆波兰表达式,遇到运算对象直接压入堆栈,遇到运算符就从堆栈提取后进的两个对象进行计算,这个过程正好符合了计算机计算的原理。

后缀表达式比前缀表达式更加易于转换,并且它的最左面一定为数字,这一点在实际编程的时候就会体会到它的好处了。

逆波兰表达式有一个更大的优点,就是拆括号,根据运算符的级别将中缀表达式转换成逆波兰表达式后,运算顺序就已经替代了运算符的级别,这样也避免了括号提高运算级别的特殊处理。

 

五、综合设计(课程设计)Abstract(英文):

ReversePolishNotationisalsocalledsuffixexpressions. Intheusualexpressions,binaryoperatorsarealwaysplacedinthetwooperationsassociatedwithobjects,sothisrepresentationisalsoknownasinfixsaid. PolishlogicianJ.Lukasiewiczin1929thatproposedanalternativemethodofexpression. Clickmethod,eachoperatorisplacedafteritsoperand,socalledsuffix. 

Theadvantagesofpostfixexpressionisobvious,thecompilerhandlingtheorderwhenreadfromlefttorightreversePolishexpressions,facedirectlyontotheoperandstack,thestackexperiencedoperatortoextractfromthebackwardofthetwoobjectscalculated,theprocessservestomeettheprinciplesofcomputercalculations. 

Postfixexpressioneasiertoconvertthantheprefixexpression,andcertainlyitsmostleftforthefigures,thistimeintheactualprogrammingwillappreciateitsbenefits. 

RPNhasabiggeradvantageisthatdemolitionbrackets,accordingtotheleveloftheoperatortoconvertinfixexpressionsinReversePolishNotation,theorderofoperationshasreplacedthelevelofoperators,thisalsoavoidstheincreaseinparenthesesOperationallevelofspecialtreatment. 

 

 

摘要

本课程设计将实现一个简单计算器。

在功能上尽量模仿windows的计算器。

系统界面不做牵制要求。

该程序能实现标准型中+、-、*、/、^(乘方)、%(求余)、(、)的混合运算表达式(一般意义上的中缀表达式),将其转换成逆序波兰表达式(后缀表达式)并计算输出结果。

在进行运算后可以选择继续运算或者结束当前运算。

即时准确地获得需要的计算的结果,充分降低了数字计算的难度和节约了时间,对人们的生活有一定的帮助。

在课程设计中,系统开发平台为WindowsXP,程序设计设计语言采用VisualC++,在程序设计中,采用了结构化与面向对象两种解决问题的方法。

设计的过程中通过把中缀表达式转化到后缀表达式,对操作数栈和操作符栈的进栈和出栈处理,多种运算符的优先级排序、以及根据转换后的逆波兰表达式计算整个表达式结果的处理,来实现程序的顺利运行。

关键词:

程序设计;逆波兰表达式;出栈、入栈;优先级

Abstract

Thecourseisdesignedtoimplementasimplecalculator. Trytoimitatewindowsinthefunctionsofthecalculator. Systeminterfacedoescontainrequirements. Theprogramcanachievein+,-,*,/,^(standardpower),%(remainder),(,)hybridcomputingexpressions(ageneralsenseoftheinfixexpression),toconvert ReversePolishNotation(postfixexpression)andcalculatetheoutput. Duringtheoperationcancontinueaftertheoperatorortheendofthecurrentoperation. Immediateandaccurateaccesstotheresultsofthecalculationneededtofullyreducethedifficultyofdigitalcomputingandsavingtimeonpeople'sliveswillcertainlyhelp. 

Incurriculumdesign,systemdevelopmentplatformforWindowsXP,programminglanguageusingVisualC++,inprogramming,usingbothstructuredandobject-orientedsolutiontotheproblem.Thedesignprocessthroughtheconversionofinfixexpressiontopostfixexpression,ontheoperandstackandstackintotheoperatorstackandstackprocessing,multi-operatorprioritization,andaccordingtotheconvertedinReversePolishNotationtreatmentoftheentireexpressionresultscalculatedtoachievetheprogramrunningsmoothly. 

 

Keywords:

Programdesign; ReversePolishNotation; the stack, thestack;priorit

第一章课题背景

1.1课题背景

计算器是日常生活中十分便捷有效的工具,能实现加、减、乘、除、开方、求倒数等简单运算的工具。

要实现计算功能,可以用VC++的知识编写程序来解决此问题。

该计算器大大的降低了数字计算的难度及提高了计算的准确度和精确度。

该计算器使用非常简单和方便,对广大中小学生的学习有巨大帮助作用,也对在职人员的工作有点帮助作用。

正文(小四号字宋体1.25倍行距)

1.2课程设计目的

在程序设计中,通过设计、编制、调试一个模拟计算器的程序,加深对语法及语义分析原理的理解,并实现对命令语句的灵活应用。

在程序设计中,可以用两种方法解决问题:

一是传统的结构化程序设计方法,二是更先进的面向对象程序设计方法。

通过这次课程设计,使C语言的理论知识得到巩固,同时让我们体会到C语言语句简洁,使用灵活,执行效率高等特点。

认识上机实训的重要作用。

培养同学们分析问题、解决问题的能力。

第二章设计简介及设计方案论述

2.1工作原理

逆波兰表达式又叫做后缀表达式。

在通常的表达式中,二元运算符总是置于与之相关的两个运算对象之间,所以,这种表示法也称为中缀表示。

波兰逻辑学家J.Lukasiewicz于1929年提出了另一种表示表达式的方法。

按此方法,每一运算符都置于其运算对象之后,故称为后缀表示。

后缀表达式的优点是显而易见的,编译器在处理时候按照从左至右的顺序读取逆波兰表达式,遇到运算对象直接压入堆栈,遇到运算符就从堆栈提取后进的两个对象进行计算,这个过程正好符合了计算机计算的原理。

后缀表达式比前缀表达式更加易于转换,并且它的最左面一定为数字,这一点在实际编程的时候就会体会到它的好处了。

逆波兰表达式有一个更大的优点,就是拆括号,根据运算符的级别将中缀表达式转换成逆波兰表达式后,运算顺序就已经替代了运算符的级别,这样也避免了括号提高运算级别的特殊处理。

2.2需求分析

2.2.1要求

(1)用C语言实现程序设计;

(2)利用结构体、共用体进行相关信息处理;

(3)画出查询模块的流程图;

(4)系统的各个功能模块要求用函数的形式实现;

(5)界面友好(良好的人机互交),程序要有注释。

2.2.2任务

(1)定义一个结构体类型数组,输入0~9及+、--、*等符号的信息,将其信息存入文件中;

(2)输入简单的加减乘除算术计算式,并在屏幕上显示计算结果;

(3)画出部分模块的流程图;

(4)编写代码;

(5)程序分析与调试。

 

第三章详细设计

3.1流程图

3.2设计的细节

首先定义两个栈,一个字符型,一个双精度型,程序代码如下

struct//作为存放运算表达式的栈使用

{

chardata[MaxSize];//存放表达式的字符数组

inttop;//栈顶指针

}Sym;/*符号*/

struct//作为存放运算结果的栈使用

{

doubledata[MaxSize];//存放运算结果的数组

inttop;//栈顶指针

}Num;/*数*/

存储后缀式计算器的运算数

voidNumPush()

{

if(Num.top

{

Num.data[++Num.top]=ston(expr,&i);

}

else

{

printf("Num栈满\n");

return;

}

}

定义后缀表达式的计算函数

voidNumPop()

{

if(Num.top>=0)

{

if(expr[i]!

='')

{

switch(expr[i])

{

case'+':

Num.data[Num.top-1]=Num.data[Num.top-1]+Num.data[Num.top];break;

case'-':

Num.data[Num.top-1]=Num.data[Num.top-1]-Num.data[Num.top];break;

case'*':

Num.data[Num.top-1]=Num.data[Num.top-1]*Num.data[Num.top];break;

case'/':

Num.data[Num.top-1]=Num.data[Num.top-1]/Num.data[Num.top];break;

case'%':

Num.data[Num.top-1]=(int)(Num.data[(Num.top-1)])%(int)(Num.data[Num.top]);break;

case'^':

Num.data[Num.top-1]=pow(Num.data[Num.top-1],Num.data[Num.top]);break;

}

Num.top--;

}

}

else

{

printf("Num栈空\n");

return;

}

}

3.3由后缀表达式计算中缀表达式原理

计算机处理后缀表达式求值问题是比较方便的,即将遇到的操作数暂存于一个操作数栈中,凡是遇到操作数,便从栈中pop出两个操作数,并将结果存于操作数栈中,直到对后缀表达式中最后一个操作数处理完,最后压入栈中的数就是后最表达式的计算结果。

中缀表达式转换为等价的后缀表达式

中缀表达式不方便与计算机处理,通常要讲中缀表达式转换为一个与之等价的后缀表达式。

等价是指两个表达式的计算顺序和计算结果完全相同。

中缀表达式:

0.3/(5*2+1)#

的等价后缀表达式是:

0.352*1+/#

仔细观察这两个等价的表达式可知,操作数的出现次序是相同的,但运算符的出现次序是不同的。

在后缀表达式中,运算符的出现次序是实际进行操作的次序;在中追表达式中,由于受到操作符的优先级和括号的影响,操作符出现次序与实际进行操作的次序很可能是不一样的。

3.4算法描述

将中缀表达式转换为等价的后缀表达式的过程要使用一个栈放“(”,具体可以按照下面的方式进行。

(1)从左到右一次扫描中缀表达式的每一个字符,如果是数字字符和圆点“.”则直接将它们写入后缀表达式中。

(2)如果遇到的是开括号“(”,则将它们压入一个操作符栈(不需要与栈顶操作符相比较),它表明一个新的计算层次的开始,在遇到和它匹配的闭括号“)”时,将栈中的元素弹出来并放入后缀表达式中,直到栈顶元素为“(”时,将栈顶元素“(”弹出(不需要加入后缀表达式),表明这一层括号内的操作处理完毕。

(3)如果遇到的是操作符,则将该操作符和操作符栈顶元素比较:

   a当所遇到的操作符的优先级小于或等于栈顶元素的优先级时,则取出栈顶元素放入后缀表达式,并弹出该栈顶元素,反复执行直到栈顶元素的优先级小于当前操作符的优先级;

   b、当所遇到的操作符的优先级大于栈顶元素的优先级的时则将它压入栈中。

  (4)重复上述步骤直到遇到中缀表达式的结束符标记“#”,弹出栈中的所有元素并放入后缀表达式中,转换结束。

第四章设计结果及分析

4.1输入不同表达式验证程序的正确性

式一:

式二:

式三:

当输入错误时,没有结果

 

总结

经过了两个星期的c语言程序设计,终于在老师的细心指导和同学的热情帮助下基本完成了计算器课题的设计修改任务!

虽然有些地方不尽如人意但是初步达到了对自己的要求!

刚开始设计的时候找不到头绪,不知道该从哪里下手!

通过向同学询问和向老师寻求帮助找走进了设计的门槛!

通过网上查找到很多成功的计算器程序,通过对那些已经成功地程序进行分析找到自己的设计思路,制定设计流程。

并通过比较各种程序了解各个程序的利弊,从而明确自己计算器的设计方向和如何通过技术手段达到自己的目的!

万事开头难,可是对于并不是很熟悉的c语言在下面的工作中困难处处能遇见.通过查找c语言教材去图书馆查找相关的资料和同学一起讨论终于把一个个棘手的陌生的问题解决。

测试阶段中发现了几处错误导致程序不能编译,通过耐心的分析源代码终于编好了一个完整无误的程序。

在这次的c语言程序设计实习中遇到了现实编程中必然见到的问题通过这些问题的解决积累了编程的实践经验。

在实际的编程操作中发现自己c语言知识的不足,加深了对c语言的理解。

在学习之余体验到收获的感觉。

同时认识到程序员的工作并不是我们想象的那么简单轻松的,在现在的编程中要有足够的耐心和热情,还要加强实践,多动手,才能让自己更加熟练。

 

致谢

这次C语言课程设计让我学到了很多,从编程中可以看出编写一个程序的是一件很难的事。

要想成为一名优秀的程序员,需要持久的耐心和深厚的专业知识。

虽然这次我这组的课程设计题目不是很难,但要做好也不是一件很容易的事情。

我努力使我的设计更加完美,我也有幸得到成娅辉老师的指导,使我能够顺利完成我的课程设计,我同时也要感谢其他给予我帮助的同学,他们使我认识到团队的力量。

再一次感谢所有帮助我完成这次课程设计的人。

 

参考文献

[1]张俊,张彦铎.《C++面向对象程序设计》[M].北京:

张俊,2008.1-380.

[2]严蔚敏,吴伟民.《数据结果(C语言版)》[M].北京:

严蔚敏,2007.1-334

[3]谭浩强.《C程序设计》[M].北京:

谭浩强,2005.1-378

[4]李晓林,张俊.《程序设计基础》[M].北京:

张俊,2008.1-371

[5]李翠霞.《零基础学VisualC++》[M].北京:

李翠霞,2009.1-285

 

附录:

#include/*标准输入输出头文件*/

#include/*控制台输入输出*/

#include/*数学库函数*/

#include/*系统函数,分配、释放内存等*/

#include/*字符串处理*/

#defineMaxSize99

charcalc[MaxSize],expr[MaxSize];

inti,t;

struct

{

chardata[MaxSize];/*构造了一个字符串*/

inttop;

}Sym;/*符号*/

struct

{

doubledata[MaxSize];/*构造一个双精度数组*/

inttop;

}Num;/*数*/

doubleston(charx[],int*p)/*定义一函数*/

{

intj=*p+1,i;

doublen=0;

charsign=x[*p];/*字符串*/

if(sign=='+'||sign=='-')*p=*p+1;

while(x[j]>='0'&&x[j]<='9')

{

j++;

}

for(i=*p;i

{

n=n*10+(x[i]-'0');

}

if(x[j]=='.')

{

*p=++j;

while(x[j]>='0'&&x[j]<='9')

{

j++;

}

for(i=*p;i

{

n=n+pow(0.1,i-*p+1)*(x[i]-'0');

}

}

*p=j;

if(sign=='-')return(-n);

return(n);

}

voidInitStack()

{

Sym.top=Num.top=-1;

}

voidSymPush()

{

if(Sym.top

{

Sym.data[++Sym.top]=calc[i++];

}

else

{

printf("Sym栈满\n");

return;

}

}

 

voidSymPop()

{

if(Sym.top>=0)

{

expr[++t]=Sym.data[Sym.top--];

}

else

{

printf("Sym栈空\n");

return;

}

}

voidNumPush()

{

if(Num.top

{

Num.data[++Num.top]=ston(expr,&i);

}

else

{

printf("Num栈满\n");

return;

}

}

void

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1