教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 文库大全 > 教学研究 >

模拟计算器程序-数据结构与算法课程设计报告

来源:网络收集 时间:2026-08-28
导读: 数据结构与算法课程设计 实验报告 完整版 带概要分析 详细分析 源代码 测试 参考文献等 合肥学院 计算机科学与技术系 课程设计报告 2009~2010学年第二学期 课程 课程设计名称 学生姓名 学号 专业班级 指导教师 数据结构与算法 模拟计算器程序 桂俊飞 080401

数据结构与算法课程设计 实验报告 完整版 带概要分析 详细分析 源代码 测试 参考文献等

合肥学院

计算机科学与技术系

课程设计报告

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字,全部文档内容请下载后查看。喜欢就下载吧 ……

模拟计算器程序-数据结构与算法课程设计报告.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wenku/1582846.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)