逆波兰表达式 计算器 实验报告Word格式文档下载.docx
《逆波兰表达式 计算器 实验报告Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《逆波兰表达式 计算器 实验报告Word格式文档下载.docx(23页珍藏版)》请在冰点文库上搜索。
逆波兰表达式有一个更大的优点,就是拆括号,根据运算符的级别将中缀表达式转换成逆波兰表达式后,运算顺序就已经替代了运算符的级别,这样也避免了括号提高运算级别的特殊处理。
指导教师签字:
年月日
二、进度安排:
需求分析和功能分析1天
算法设计(进栈出栈处理、优先级处理、表达式转换)2天
模块设计和功能设计2天
程序编码和调试2天
设计报告撰写与修改3天
三、应收集资料及主要参考文献:
1.《C语言程序设计》谭浩强著,清华大学出版社
2.《VC技术内幕》(第五版)
3.《数据结构》(第二版),清华大学出版社
4.《c++面向对象程序设计》,中国铁道出版社
5.《程序设计基础》李晓林,张俊
四、综合设计(课程设计)摘要(中文):
五、综合设计(课程设计)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工作原理
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];
//存放运算结果的数组
}Num;
/*数*/
存储后缀式计算器的运算数
voidNumPush()
if(Num.top<
MaxSize-1)
{
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;
-'
Num.data[Num.top-1]=Num.data[Num.top-1]-Num.data[Num.top];
*'
Num.data[Num.top-1]=Num.data[Num.top-1]*Num.data[Num.top];
/'
Num.data[Num.top-1]=Num.data[Num.top-1]/Num.data[Num.top];
%'
Num.data[Num.top-1]=(int)(Num.data[(Num.top-1)])%(int)(Num.data[Num.top]);
^'
Num.data[Num.top-1]=pow(Num.data[Num.top-1],Num.data[Num.top]);
Num.top--;
else
Num栈空\n"
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<
stdio.h>
/*标准输入输出头文件*/
conio.h>
/*控制台输入输出*/
math.h>
/*数学库函数*/
stdlib.h>
/*系统函数,分配、释放内存等*/
string.h>
/*字符串处理*/
#defineMaxSize99
charcalc[MaxSize],expr[MaxSize];
inti,t;
struct
/*构造了一个字符串*/
/*构造一个双精度数组*/
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<
j;
i++)
n=n*10+(x[i]-'
if(x[j]=='
.'
*p=++j;
n=n+pow(0.1,i-*p+1)*(x[i]-'
*p=j;
)return(-n);
return(n);
voidInitStack()
Sym.top=Num.top=-1;
voidSymPush()
if(Sym.top<
Sym.data[++Sym.top]=calc[i++];
Sym栈满\n"
voidSymPop()
if(Sym.top>
expr[++t]=Sym.data[Sym.top--];
Sym栈空\n"
void