没有合适的资源?快使用搜索试试~ 我知道了~
首页十进制四则运算计算器的设计与实现
十进制四则运算计算器的设计与实现
需积分: 10 13 下载量 12 浏览量
更新于2023-06-22
2
收藏 156KB DOC 举报
数据结构,十进制四则运算计算器的设计与实现.,实验报告c语言,内有实验结果截图,实验感想
资源详情
资源推荐
本科生课程设计任务书
2010 — 2011 学年 夏季学期
信息与电气工程学院 学院 计算机科学与技术 专业
课程设计名称: 数据结构
设计题目: 十进制四则运算计算器的设计与实现
完成期限:自 2011 年 6 月 27 日至 2011 年 7 月 1 日 共 1 周
(1)问题描述
在以二叉树表示算术表达式的基础上,设计一个十进制的四则运算计算器。
(2) 需求分析:
该程序实现的是实数型的浮点运算,该程序是将整个表达式都存入一个二叉
树中,然后读出表达式,同时将表达式利用栈求出表达式的值:
(1) 实现表达式的以二叉树的形式存放;
(2) 读出二叉树中的表达式
(3) 利用栈求出表达式的值
(3)概要设计
系统用到的抽象数据类型定义:
ADT SNode_s{
数据对象 V:具有相同类型及后进先出特性的数据元素集合
数据关系 R:相邻数据元素具有前驱和后继的关系
基本操作:
InitStack_s(&S)
初始条件:无
操作结果:构造一个空栈 S
Push_s(&S)
初始条件:栈 S 已经存在
操作结果:用 e 返回 S 的新栈顶元素
Pop_s(&S,&e):
初始条件:栈 S 已经存在且非空
操作结果:删除 S 的栈顶元素,并用 e 返回其值
GetTop_s(S,&e)
初始条件:栈 S 已经存在
操作结果:用 e 返回 S 的栈顶元素
}ADT
ADT SNode_f{
数据对象 D:具有相同类型及后进先出特性的数据元素集合
数据关系 R:相邻数据元素具有前驱和后继的关系
基本操作:
InitStack_f(&S)
初始条件:无
操作结果:构造一个空栈 S
Push_f(&S)
初始条件:栈 S 已经存在
操作结果:用 e 返回 S 的新栈顶元素
Pop_f(&S,&e):
初始条件:栈 S 已经存在且非空
操作结果:删除 S 的栈顶元素,并用 e 返回其值
GetTop_f(S,&e)
初始条件:栈 S 已经存在
操作结果:用 e 返回 S 的栈顶元素
}ADT
ADT BiTNode{
数据对象 T:具有相同类型及后进先出特性的数据元素集合
标志位 F:根据每个元素是运算符号还是括号或者数据设置标志位
数据关系 R:若 D 为空,则为空树。
CreateBiTree(BT)
初始条件:输入表达式
操作结果:1.不输入任何则是空数
2.不是空树且没有输入’#’.则判断左子树不为空
(1)判断左子树的左子树是否为空,不为空则将左子树的数给左子树
的左子树
(2)并设置标志位 BT->flag[i]=2, BT->flag[i]=1。一直延续。
3.若遇到+-*/,将该字符给树根,则 BT->flag[i]=3;
}ADT
OrderBitree(BT, Sf, Ss){
1. 用中序遍历读出表达式的值,根据标志位将符号位和数据压栈
2. 根据标志位判断是符号则读出,再到符号栈中压栈,左右孩子不空
则 判 断 是 否 遇 到 ‘ ( ’ 若 遇 到 则 则 调 用 函 数
Putin(m,e,Sf,Ss);Putout(e,Sf,Ss);计算括号中的值,直到遇到‘)’则跳
出。将括号中的值压栈
3. 再按没遇到‘(’时,则按*/优先级,+-后算,一直计算。。
(4)调试分析
(1)问题 1:开始的时候不知道怎么以二叉树的形式存进去
解决:将老师给的要测试的数据用笔画下来,然后比较得到较好的存储方法,
决
定用中序遍历,将数据和括号存在叶子结点,+-*/的符号存在中心节点。
问题 2:怎么处理括号
解决:设置标志位追踪括号,+-*/。一旦遇到括号,则调用函数计算括号里面
数,将括号里面的结果压栈,否则一直调用函数根据优先级高低先计算*/,
计算+-。
体会:理解思绪很难,过程就处理了几天,一直在考虑遍历的方法。写程序时
错误跟多,都不知道怎么处理遇到括号的事,*/的优先级比+-高,也需要处理。
考虑了好多比较优先级的方法。这个程序有点难,写程序也写了好久。但是收
获好多。做啥事都得不断的琢磨,多下功夫。
(5)详细设计
(1)算法设计及其重要语句注释:
int Prio(char ch){
//判断符号的优先级
switch(ch){
case '+':
case '-':return 1;break;
case '*':
case '/':return 2;break;
case '(':
case ')':return 3;break;
default:
Error("输入符号仅限于加减乘除(+,-,*,/,(,))");
}
}
void Putin(char &ch,float fl,LinkStack_f &Sf, LinkStack_s &Ss){
//把多项式中的乘除先计算好,然后放到符号栈和数字栈中
int p;
char pre;
float mid;
for(;ch=='#';){
p=Prio(ch); //得到当即输入符号的优先级
GetTop_f(Sf,pre); //获得符号栈的顶元素
if(p>Prio(pre)){ //比较两者优先级,当输入乘除时,先计算
Pop_s(Ss,mid);
switch(ch){
case '*':mid=mid*fl;break;
case '/':mid=mid/fl;break;
}
Push_s(Ss,mid);
}
else {
Push_f(Sf,ch);
cin>>fl;
Push_s(Ss,fl);
}
cin>>ch;
}
}
float Putout(float totle,LinkStack_f &Sf,LinkStack_s &Ss){
//把栈中的数字和符号计算出来
float mid;
char pre;
for(totle=0;Sf->next!=NULL;){
Pop_s(Ss,mid);
Pop_f(Sf,pre);
switch(pre){
case '+':totle=totle+mid;break;
case '-':totle=totle-mid;break;
}
}
return totle;
}
//判断符号的优先级
switch(ch){
case '+':
case '-':return 1;break;
case '*':
case '/':return 2;break;
case '(':
case ')':return 3;break;
default:
Error("输入符号仅限于加减乘除(+,-,*,/,(,))");
}
}
void Putin(char &ch,float fl,LinkStack_f &Sf, LinkStack_s &Ss){
//把多项式中的乘除先计算好,然后放到符号栈和数字栈中
int p;
char pre;
float mid;
for(;ch=='#';){
p=Prio(ch); //得到当即输入符号的优先级
GetTop_f(Sf,pre); //获得符号栈的顶元素
if(p>Prio(pre)){ //比较两者优先级,当输入乘除时,先计算
剩余16页未读,继续阅读
xiaomo1133
- 粉丝: 0
- 资源: 39
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- zigbee-cluster-library-specification
- JSBSim Reference Manual
- c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf
- 建筑供配电系统相关课件.pptx
- 企业管理规章制度及管理模式.doc
- vb打开摄像头.doc
- 云计算-可信计算中认证协议改进方案.pdf
- [详细完整版]单片机编程4.ppt
- c语言常用算法.pdf
- c++经典程序代码大全.pdf
- 单片机数字时钟资料.doc
- 11项目管理前沿1.0.pptx
- 基于ssm的“魅力”繁峙宣传网站的设计与实现论文.doc
- 智慧交通综合解决方案.pptx
- 建筑防潮设计-PowerPointPresentati.pptx
- SPC统计过程控制程序.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功