版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
简易计算器第十组运算器组成运算器数据栈存入、读取操作数运算符栈
存入、读取运算符
问题描述通过模拟一个简单的计算器来进行+、—、*、/、%、^(乘方)等运算,从键盘上输入一算术表达式(一般为中缀表达式),计算出表达式的值。第3
页设计要求分析(1)可对一实数算术表达式进行简单的数学运算;(2)可以识别带加减乘除等运算符及括号的中缀表达式;(3)按照四则运算规则,求表达式的值。一般规则如下:a.先括号内,再括号外;b.先乘方,再乘除,后加减。(4)同级运算从左到右顺序执行;(5)如表达式有误,应给出相应的提示信息。第4
页系统各部分详细设计及实现一、boolstack1empty(save1s)//判断数字栈是否为空{if(s.top==-1)return1;elsereturn0;}第5
页系统各部分详细设计及实现二、boolstack2empty(save2s)//判断运算符栈是否为空 {if(s.top==-1)return1; elsereturn0;}第6
页系统各部分详细设计及实现三、voidpush1(save1&s,doublenum)
//将数据压入数字栈{if(s.top==MAX-1) cout<<"栈已满"<<endl;else {s.top++; s.n[s.top]=num;}}第7
页系统各部分详细设计及实现四、voidpush2(save2&s,charop) //将运算符压入运算符栈{if(s.top==MAX-1)cout<<"栈已满"<<endl;else {s.top++; s.n[s.top]=op;}}第8
页系统各部分详细设计及实现五、intin(charop) //在栈内优先级的判断 {switch(op) {case'+':return2;break;case'-':return2;break;case'*':return4;break;case'/':return4;break; case'(':return-1;break;default:break;}}第9
页系统各部分详细设计及实现六、intout(charop) //在栈外优先级的判断 {switch(op) {case'+':return1;break; case'-':return1;break; case'*':return3;break; case'/':return3;break; default:break; } }第10
页系统各部分详细设计及实现七、voidcount(doublea,charop,doubleb)
//进行计算并将所得的结果压入栈顶 {doublesum;switch(op) {case'+':sum=a+b;break; case'-':sum=a-b;break; case'*':sum=a*b;break; case'/':sum=a/b;break; default:break; } push1(stack1,sum); }第11
页系统各部分详细设计及实现八、voidcal() { inti=0,j; doublea,b,c; charexpression[MAX],operate,temp[20]; cout<<"请输入表达式:"; cin>>expression; stack1.top=-1数;//清空字栈
stack2.top=-1;//清空运算符栈第12
页系统各部分详细设计及实现八、voidcal() while(expression[i]!='=')//以=号结尾
{if(isdigit(expression[i]))/*若读入的字符为数字,则继续判断下一个字符,直到下个字符不是数字或者不是小数点,即可保证该操作数是完整的小数,然后将该数入操作数栈*/ {j=0; while(isdigit(expression[i])||expression[i]=='.') {temp[j++]=expression[i];i++;} temp[j]='\0'; c=atof(temp);//char类型进行转换
push1(stack1,c);}第13
页系统各部分详细设计及实现八、voidcal() else {if(expression[i]=='('){push2(stack2,expression[i]);i++;} else{if(expression[i]==')'){while(stack2.n[stack2.top]!='('){pop1(stack1,a);pop1(stack1,b); pop2(stack2,operate);count(b,operate,a);}pop2(stack2,operate); i++;}第14
页系统各部分详细设计及实现八、voidcal() elseif(expression[i]=='-'||expression[i]=='+'||expression[i]=='*'||expression[i]=='/')//若读入的字符为运算符的情况{if(in(stack2.n[stack2.top])<out(expression[i])||stack2empty(stack2))//读入的运算符与运算符栈顶元素相比,并进行相应的操作
{push2(stack2,expression[i]);i++;}else{pop1(stack1,a);pop1(stack1,b);pop2(stack2,operate);count(b,operate,a);}
第15
页系统各部分详细设计及实现八、voidcal() while(stack2.top!=-1)//读入结束后,继续进行操作,直到运算符栈为空
{pop1(st
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 小马过河 课件
- 商购销合同模板
- 上海顺丰快递公司合同模板
- 投资矿山协议合同范例
- 建筑企业用工合同范例
- 投资亏损合同范例
- 广州番禺劳动合同范例
- 快递公司会计合同范例
- 2024年信阳考客运资格证试题题库软件
- 2024年信阳道路旅客运输从业资格考试
- 定2墙上贴着字
- 几种离子交换装置
- 交接班制度(PPT31页)
- 真想变成大大的荷叶(详案)
- db11 7912011 文物建筑消防设施设置规范
- 《unit 2 you shouldnt be late.》课件小学英语外研社版一年级起点五年级上册 (2014年6月第1版)
- 干细胞和肿瘤干细胞(20101210)
- 原生家庭与个人成长(课堂PPT)
- 一年级数学口算凑十法
- 上交叉与下交叉综合征(课堂PPT)
- 铜仁市房地产市场调查分析报告专业课件
评论
0/150
提交评论