模拟计算器程序-数据结构与算法课程设计报告
数据结构与算法课程设计 实验报告 完整版 带概要分析 详细分析 源代码 测试 参考文献等
合肥学院
计算机科学与技术系
课程设计报告
2009~2010学年第二学期
课程 课程设计名称 学生姓名 学号 专业班级 指导教师
数据结构与算法 模拟计算器程序
桂俊飞 0804012021 08计本(2)班 王昆仑 张贯虹
2010年6月
数据结构与算法课程设计 实验报告 完整版 带概要分析 详细分析 源代码 测试 参考文献等
一:问题分析和任务定义
本程序写的是模拟计算器。
要求设计一个模拟计算器的程序,要求对包含加、减、乘、除、括号运算符及SQR和ABS函数的任意整型表达式进行求解。
这里可以做一个扩展,比如实现求某数的N次方,求模,一些常用的三角函数等。这个程序实际上就是对一个表达式进行计算。而一个算术表达式中包含各种运算符,每个运算符的等级可能会不同,这就成了本程序需要解决的一个主要的问题之一了。另外计算器中需要有各种数学函数,比如:abs sqrt sin cos tan等,如何对这些函数进行处理,也是本程序能成功的一个关键。还有一个问题就是如何处理操作符和操作数之间的关系也是一个要点。例如:1+2*(3-2/1),经过怎么样的变换和处理能得出结果5。数据的输入这里应该要用字符,然后通过字符和整形之间的关系进行转换即可,这样处理的话,就方便很多了。
二:概要设计和数据结构选择
输入的时候将一个算术表达式用一个字符数组来接收,故需要对这个数组进行处理,让操作数和操作符分开,这里我想把开始的算术表达式转换成一个后缀表达式,这样在进行计算的时候就简单多了。而在转换的过程中,对运算符的处理极为重要,这里运用堆栈,用堆栈的先进后出的特点,来处理运算符优先级的问题,让其成功转换成后缀表达式。而在对后缀表达式进行处理的时候,又需要一个堆栈,这个堆栈存放操作数的。并将运算结果存入该栈中。两个堆栈的数据结构如下: struct
{ char data[Maxlen]; int top;
}optr; //定义运算符栈 struct
{ double data[Maxlen]; int top;
}opnd; //定义操作数栈
这里定义了类型,并且一起定义了两者类型的对象optr,opnd。
在将算术表达式转换成后缀表达式,定义change函数; 在对后缀表达式进行处理时,定义jisuan函数, 另外本程序有个欢迎界面,由meun函数实现。 因此主函数于各函数之间的关系为:
meun()
jisuan()
本程序实现的流程:
数据结构与算法课程设计 实验报告 完整版 带概要分析 详细分析 源代码 测试 参考文献等
这里的两个主要的函数具体算法在详细设计中有说明。
三:详细设计和编码
首先定义两个数组,p[400]用来存放算术表达式,q[400]用来存放后缀表达式。
由前面的数据结构定义两个对象optr,opnd。当输入一个表达式后,定义i作为q的下标,定义dh=1表示是负号,初始化运算符栈optr.top=-1;让后对p进行扫描,当p指向的为数字字符,则将此字符如q,后在往q中输入#, 具体为: while (*p>='0' && *p<='9')
数据结构与算法课程设计 实验报告 完整版 带概要分析 详细分析 源代码 测试 参考文献等
{q[i]=*p;i++; p++; } if (*p=='.') { q[i]='.'; i++; p++;
while (*p>='0' && *p<='9') {q[i]=*p;i++; p++;} } q[i]='#'; i++; dh=0;
p后移,继续扫描,当遇到+或-时,执行 if (dh==1) { if (*p=='-')
optr.top++;optr.data[optr.top]='@'; p++; break; } while (optr.top!=-1 && optr.data[optr.top]!='(') { q[i]=optr.data[optr.top]; optr.top--; i++; }
optr.top++;optr.data[optr.top]=*p; p++; dh=0; break;
当遇到*或/时,先查看操作符栈中是否有优秀级比它大的或者一样大的运算符,有的话就将其他的出栈,最后自己入栈。执行:
while (optr.data[optr.top]=='*' || optr.data[optr.top]=='/'|| optr.data[optr.top]=='s')
{ q[i]=optr.data[optr.top]; optr.top--; i++; } optr.top++;optr.data[optr.top]=*p; p++; dh=0; break;
当遇到(时,此时不需要别的其他的操作,只需将其入操作符栈,并将dh=0;
当遇到)时,此时需要将(之前的操作符全部出栈,具体操作如下:
while (optr.data[optr.top]!='(')
{ q[i]=optr.data[optr.top]; optr.top--; i++;} optr.top--; p++; dh=0; break; 当遇到^时,根据运算符的优先级,执行:
while (optr.data[optr.top]=='^')
{ q[i]=optr.data[optr.top]; optr.top--;i++;} optr.top++;optr.data[optr.top]=*p;p++;dh=0;break;
遇到%时的操作和^差不多,这里就不做介绍了。 当遇到数学函数的相关符号时,这里以sin 为例,当扫描s时,还需要扫描后面的两个字符,当它们是in时,说明就是sin函数的符号,此时将此函数的标志入操作符栈,当其为qrt时,说明是sqrt函数,此时将sqrt函数的标志入栈,这里的标志是自己定的。如果都不是上面两种情况,说明输入有误,跳回。具体的程序如下:
if((*(p+1)=='i' || *(p+1)=='I')&&(*(p+2)=='n' || *(p+2)=='N')) { optr.top++;optr.data[optr.top]='s'; p+=3; dh=0; break; }
数据结构与算法课程设计 实验报告 完整版 带概要分析 详细分析 源代码 测试 参考文献等
else
if((*(p+1)=='q'|| *(p+1)=='Q')&&(*(p+2)=='r' || *(p+2)=='R')&&(*(p+3)=='t' || *(p+3)=='T')) { optr.top++;optr.data[optr.top]='q'; p+=4;dh=0;break; }
else { cout<<endl<<"有错误符号"<<endl; return error; } 其他的数学函数的操作都是类似的,这里就不一一说明了。
这里值得注意的是,当将p扫描完时,操作符栈并未一定为空,故需要将操作符栈里的数据全部出栈:while (optr.top!=-1) { q[i]=optr.data[optr.top]; i++; optr.top--; }
以上是将算术表达式转换成后缀表达式。还要对后缀表达式进行计算,才能得到结果。
首先还是对表达式进行扫描,遇到数字符时,先将其转换成整形后,再判断是否有小数点存在,继续扫描直到遇到运算符,让后通过运算,将次数转换成小数,最后入栈。 具体程序实现:d=0; while (*q>='0' && *q<='9') { d=10*d+(*q-'0'); q++; } x=0.1; if (*q=='.') {q++;
while (*q>='0' && *q<='9') { d=d+x*(*q-'0'); x*=0.1; q++; } } 当遇到操作符时,为双目运算符时,只需要将操作数栈的栈顶和次栈顶数拿出来进行相应的计算,并将其压入次栈顶。为单目运算符时,只需将操作 …… 此处隐藏:8682字,全部文档内容请下载后查看。喜欢就下载吧 ……
相关推荐:
- [教学研究]2012西拉科学校团少队工作总结
- [教学研究]建筑工程公司档案管理制度
- [教学研究]小学数学人教版六年级上册圆的周长和面
- [教学研究]ERP电子行业解决方案
- [教学研究]钢支撑租赁合同范本
- [教学研究]预应力自动张拉系统用户手册Rev1.0
- [教学研究]MOOC课程:金瓶梅人物写真(每章节课后
- [教学研究]追加被执行人申请书(适用追加夫妻关系)
- [教学研究]2014年驾考科目一考试最新题库766
- [教学研究]2013-2014学年度九年级物理第15章《电
- [教学研究]新版中日交流标准日本语初级下26课-客
- [教学研究]小导管注浆施工作业指导书
- [教学研究]一般财务人员能力及人岗匹配评估表
- [教学研究]打1.2.页 小学一年级暑假口算100以内加
- [教学研究]学习贯彻《中国共产党党和国家机关基层
- [教学研究]2012年呼和浩特市中考试卷_35412
- [教学研究]最简易的电线电缆购销合同范本
- [教学研究]如何开展安全标准化建设
- [教学研究]工作分析与人岗匹配
- [教学研究]2016-2017学年高中历史第七单元现代中
- 山东省义务教育必修地方课程小学三年级
- 台湾宜兰大学互联网交换技术课程 01_In
- 思想品德:第一课《我知我家》课件(人
- SAR合成孔径雷达图像点目标仿真报告(附
- 利辛县“十三五”规划研究报告
- 2015-2020年中国手机APP行业市场发展趋
- 广告策略、创意表现、媒体方案
- 企业如何申请专利的的几点思考
- 《中国教育简史》网上作业
- 高中历史第二单元西方人文精神的起源及
- 年终晚会必备_精彩的主持稿_精心整理_
- 信息工程专业自荐书
- 2019高考历史人教版一轮练习:第十二单
- JAVA俱乐部管理系统软件需求规格说明书
- 2016-2021年中国小型板料折弯机行业市
- (人教新课标)六上_比的基本性质课件PPT
- 辽宁省公务员考试网申论备考技巧:名言
- 神经阻滞麻醉知情同意书
- 施工企业信息填报、审核和发布的相关事
- 初一(七年级)英语完形填空100篇




