




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、荆楚理工学院课程设计成果学院:计算机工程学院班级:14计算机科学与技术2班学生姓名:杨悦 学 号:2014404010215设计地点(单位):设计题目:模拟计算器稈序完成日期: 2016年6月30日指导教师评语:成绩(五级记分制):教师签名:1设计任务11.1设计目的11.2设计内容11.3设计指标或者要求12设计过程12程序功能12.2程序流程图33软件运行或者测试结果44软件设计过程中遇到的问题以及解决办法65总结6参考文献6附录(程序源代码)71设计任务1.1设计目的运用所学C+知识,完成模拟计算器程序,通过实践加强对所学知识的理解和巩固。1.2设计内容设计一个程序來模拟一个简单的手持计
2、算器。程序支持幕运算、算术运算+、仁/、=、以及 Black (清除)、Esc (全清除)等操作。1.3设计指标或者要求程序运行时,显示一个窗口,等待用户输入,用户可以从键盘输入要计算的表达式,输入的表达式 显示在窗口中,用户键入“=”符号回车后,窗口显示出结果2设计过程通过对微软附件计算器软件进行调研、分析,研究,使用。我们了解到了作为一个计算器所应该的 一些简单功能,我们知道了怎样便编写的计算器程序向微软附件计算器靠拢。其中计算器软件的主要功能是:1) 可以进行加减乘除四则运算2) 可以实现科学计算器的部分计算功能3) 可以进行淸零运算4) 可以进行退格键运算5) 可以进行连续计算2.1程
3、序功能void mcnu()位于calculate函数后面的菜单函数声明void guidc()y/位于主函数后而的指导函数的声明double D_Operate(doublc x,char op,double y”/双目运算符的运算定义double S_Opcrate(char op,doublc x/前缀单目运算符的运算定义char Preccdc(char op 1,char op2) 判断符号的优先级opl在返回的结果符的左边op2在右边 用于判定运算符的优先级以决定是把运算符压栈还是把栈内的运算符弹出來进行计算 int match(string s“/栈结构的括号匹配检测函数clas
4、s NUMstack/运算数栈void start()/初始化栈清空栈顶指针置底for(int i=0;i1000;i+)numi=O;top=0;class OPERslack/运算符栈public:char opcrflOOO;int top;voidstartO/初始化函数栈清空栈底放一”=”用于判定算式结束opcr0=;for(int i=l;i1000;i+)operi=NULL;lop=l栈顶指针置于栈底的上一位void calculate(string equation)/算式计算函数(关键函数)NUMstack number;/定义运算数栈变虽:numberOPERstack
5、opcr定义运算符栈变虽:opcrnumber.start();opcr.slart()y/把两个栈初始化number.numnumber.top=ity/i算结果压回原來yuanl在栈内的位置numbcr.lift()y/ 提升指针temp 1 =oper.gctT op();rcp=Prcccde(tcmp 1 ,tcmp2)y/ 再判优先级rcp=Prcccde(tcmp 1 ,temp2)/ 双目运算符的计算if(numbcr.numO=ccil(numbcr.numO)coutequaiionnumbcr.num0endl;elsecoutcquationfixedsctprccis
6、ion(8)numbcr.num0cndl;/ffl 出结果控制粘i度 8 位小数调试时检査运算结束后站内情况的代码段void mcnu()/菜单函数cingo_ony/W以循环进行算式计算2.2程序流程图显示运算结果3软件运行或者测试结果进入界而 : CAUieriYAdnMniitrMorXOesktopXDebugXiflliii.rK 实数型科学算或计棟器侨J楚理工学院215杨悅)欢迎使用o(n_n)o ns 请选择伤:需要的功跣,(0, 1或者2)1. 使用说明2. 计算轉式0.迫出程序你的选隔拽狗折昔辎入法全:输入“1”,査看说明使用说明,输入算式时,请按賠下歹嫌赠6入,1四则运算
7、+加無廨按常规输入,员号用下划圾0代普,注蹇紹其与裱号区别,可用括号0界定优先级2. *:耳运算如下垂方输入/y(x的曲方丽23飞就是2湖瞰方:开方也这样输入如8广(1/4)【或肴31P. 25裘示81开嗽方3. !阶乘:6!董示M23*4*5*创3)!表示血阶乘.給果是24 3嚴示1再加上3做觀馳结果.是7&p代殺删周率,即3.1415926536,本计算銅用3tt度进行三角胡计算,计箕正弦it输入Tn,余弦输入c”,jEWAtam 秋是二分之”煎度对应的正弦值(注息一定要打括号耳他依比真检:5.计算以1呀底拠J数请输入心,如1空1000=3,计算以。(2.718281828)为底Kl自然对
8、般请输入In,如lrw”4=4,注B扌谿的 .如lrd4=4.计弄育式的才数雯在5!熾符号若面把算戏括起来.如ln(3代血).计铮以且瞬为虑的茁数可if底公式.如以功底.16的対数可输入lnl6/ln孩者】ogl6/lo2结果都是46可宜接输入胡Bi喩值计算7.本计筛肴的括号只有才站号().不按受中培号和大姑号门,且算式一定更叹尊号(*)结朿 请技任意锂维结.拽狗折昔辐入法全:按任意键.返回界面.并输入“2” * C件UxnXAdmi丽请締入算式.以=(等号)结朿,搜狗拼音输入法全:输入算式“(2+3尸10/2=”1 X:U5er3Admir?tra,清华大学出版社,2001年7月出版6郑莉,
9、傅仕星编,C+语言而向对象程序设计习题与实验指导,淸华大学出版社,2003年9月.視(辭源代码)# include#includc#includc# includeusing namespace std;void mcnu()y/R于calculate函数后面的菜单函数声明void guidc();/位于主函数后而的指导函数的声明double D_Opcrate(double x,char op,double y)/双目运算符的运算定义double训计算结果switch(op)casc+: a=x+y;brcak;case-: a=x-y;brcak;case1*: a=x*y;brcak;c
10、ase1/*: a=x/y;brcak;cascA,: a=pow(x,y);brcak;幕运算包括乘方和开方因为都是利用double进行运算因此不定义取模运算return a;double S_Opcratc(char op,double x”/前缀单目运算符的运算定义double a;计算结果switch(op)eases*: a=sin(x);brcak;cascc: a=cos(x);brcak;casef: a=tan(x);break;cascl: a=logl0(x);break7以 10 为底的对数cascn*: a=log(x);brcak以 c (2.718281828)为
11、底的对数cascJ: a二x;brcak;取负用下划线代替负号定义为一元运算return a;char Prcccde(char op 1,char op2) /J断符号的优先级opl在返回的结果符的左边op2在右边 用于判定运算符的优先级以决定是把运算符压栈还是把栈内的运算符弹出來进行计算iR(op 1 =+*|op 1 =-*)&(op2+1|op2=T|op2=)|op2=7)|(op I =T|op 1 =/,)&(op2=,+|op2=,-|op2=*|op2=/,|op2=),|op2=,=,)|(op 1&(op2=+|op2=.I|op2=*|op2=,/,|op2=)|op2
12、=-|op2=s|op2=c|op2,l|op2=_|op2i|op2n)|(op 1 =_|op 1 =s,|op 1 =*c|op 1 =t|op 1 =T|op 1 =n)&( op2=+*| |op2-|op2=*|op2=,/,|op2)|op2=|op2=s|op2c|op2=,t|op2=,_|op2=l,|op2n*) return V;/上述情况下栈顶运算符优先级高于待定运算符需弹栈ifl(opl =,(*&op2=)|(op 1 =&op2=-)returnelsereturn *;int illcgal_char(string s,int i”/非法输入字符判定函数int
13、j=O;while(j=O&sj=9)j+;clsciHsj=F|sj=|sj=s|sj=7*|sj=T|sj=f|sj=T|sj=F|sj=f|sj=|sj=j+;else iQ(sj=p&sj+l=丫)|(sj=T&sj+l=迅)j+=2;elseif|(sj=s&sj+1 =*i&s(j+2=,iT)|(sj=C&sj+1 =8&sj+2=釣 |(sj=T&sj+l +2=,n,)|(sO)=,r&sj+1 )=o,&sj+2=)j+=3;以上都是标准的数字字符和运算符如若存在其他形式的字符则是非法输入elsecout*程序终止,存在非法的字符输入! ! ! cndl;return 0;
14、rciuml没有非法字符返回1否则返回0int malch(string s”/栈结构的括号匹配检测函数int i=0,top=0;char stack50;while(si!=*(y)nsi=V)stacktop=si;top+;/push左括号压入栈内iRsi=T)istacktop-!=()int a=i+l;stacktop-1 =NULL;top-;把与右括号匹配的左括号弹掉elsecoutV括号输入有误endl;return0;/多了右括号括号失陪返回非法/pop(i+;if(top!=0)cout*括号输入有误endl;return0;/多了左括号括号失陪返回非法return 1
15、返回合法class NUMslack/运算数栈public:double num1000;int top;void start()/初始化栈清空栈顶指针置底fbr(int i=0;i1000;i+)numi=0;top=0;void push(char a)/因为有多位数的运算因此不能一压栈就提升栈顶指针numtop=numtop* 1字符转成数因为每次入栈之前要乘10所以初始化要淸0double pop()top-;double numbcr=numtop;numtop=0;return number;/弹栈函数弹掉栈顶元素栈顶归Oiop指针下降double gclTop(”/取栈顶元素但不
16、必弹栈return numtop-l;void liR()/提升top指针的函数top+;;class OPERslack/运算符栈public:char opcr(lOOO);int top;voidstart()初始化函数栈清空栈底放一=用于判定算式结束 oper0=;for(int i=l;i 1 !=)coutM输入有误没有输入终止符号一等号“=” ”cndl;return/检测有没有结束符等号int lc;lc=illcgal_char(cquati oncn-1);if|ic=O)retum/非法字符不进行后续计算lc=match(cquation);ilc=O)return/括号
17、匹配非法不进行后续计算fbr(i=O;ilen;i+y/初步确定合法后开始计算算式iHcqualioni=T)/阶乘是后缀单目运算符单独进行计算yuan 1 =numbcr.pop();/弹出栈顶元素做阶乘if (yuan 1=0)numbcr.numnumbcr.top=0;/0 的阶乘为 0 压结果入栈number.lift();elsenumbcr.numnumbcr.top=l;for(k=l ;k=0&cquationi-9)numbcr.push(cqualioni);压数字字符入栈iR(cquationi+1 9)&cquaiioni+l !=.)number.lift()y/当
18、整个多位运算数读取完毕后,运算数栈栈顶指针才能提升else iiXcquationip)number.numnumbcr.top=3.1415926536y/pi 值即 n 圆周率要压入数字栈number.lift();i+y/pi是两个字符所以要移动扫描算式的指针往后跳一个else if(cquationic)numbcr.numnumbcr.top=2.718281828459y/c 口然对数底数压入运算数栈 number.lift();else iRcquationi=T)/小数压栈代码int x=l;whilc(equationi+x-0,&equationi+x-9,)numbcr.
19、numnumber.top+=(cquationi+x-0,)/pow(10,x);第 x 位小数入栈 x+;x-;number.lift();i=i+x;else iflcquationi=()opcr.push(equationi)y/ 括号无条件压栈else/数阶乘左括号判断完毕后其他运算符的分类讨论iRopcr.top=l)/运算符栈为空运算符可以无条件入栈i f(equationi=*l,&cquaiioni+l=o)oper.push(r);else iRcquationi=r&cquationi+1 =*n,)opcr.push(H);/因为log和In都是小写字母1开头所以要分
20、情况讨论 elseoper.push(cquationi);else/运算符栈不为空则要进行优先级判断char temp 1 =opcr.gctTop()7/JR出栈顶符号char tcmp2/待入栈符号iRcqualioni=T&cquationi+l=o)tcmp2-l;else if(cquationil&cquationi+1 =n)tcmp2=,n;/log与In的再次讨论elselcmp2=equaiioni;p=Prccedc(tcmp 1 ,temp2);inp=1lp=)char rcp=p;/当栈顶符优先级不低于待入栈的符号则运算符栈不停地弹栈 进行运算直到低于待入栈符号为
21、止rep用于记录比较结果要多次进行判断 whi le(rep=,|p=- )&(oper.ioj 1 0)sig=opcr.pop();yuan 1 =number.pop();yuan2=number.gctTop()y/前的一个运算数只要取得不要弹出來 ifsig=,/,&yuan l=0)/yuanl是双目运算符后面的第二运算元couW计算时出错! !出现了除数为0的情况! ! cndl;return;iRsig=A&yuan20&yuanl】&(static_cast ( 1 /yuan 1 )%2=0) 对负数开偶次根号的限制coutM计算时出错! !出现了负数开偶次根号的情况! !
22、 cndl;return;ifsig=,_|sig=,s,|sig=c,|sig=,t|sig=r|sig=,n)/:为前缀单目运算符double tt;it=S_Operatc(sig,yuan 1);numbcr.numnumbcr.top=n;/运算结果压回原來yuanl在栈内的位置 numbcr.liQ();提升指针tempi =oper.gctT op();rep=Prccede( temp 1 ,tcmp2)y/ 再判优先级elsenumbcr.num(numbcr.top)-1 =D_Opcratc(yuan2,sig,yuan 1);temp 1 =opcr.gctTop();
23、rep=Prccede(tcmp 1 ,tcmp2)y/ 双目运算符的计算i(cquationi)M如果栈外符是右括号要把与之匹配的左括号弹出栈外 opcr.popO;else if(cquationir&equationi+ i =o)opcr.push(T);/代表 log 的 1else ifT(cquationi=l)&(cquationi+1 =*n)opcr.push(n);/代表 In 的 nelseoper.push(cquationi);incquationi=s|cquationi=c|equationi=t|(cquationi=r&equaiioni+l=o)i=i+2
24、;ifi(equationi1&cquaiioni+l=n)i+;对于不止一个字符的运算符sin log In等等要移动扫描算式的指针往后跳一个或两个 iiTnumbcr.numO=ccil(numbcr.numO)coutcquationnumbcr.num0endl;elsecoutcquationfixedsctprecision(8)numbcr.num0cndl;/w 出结果控制稱度 8 位小数调试时检査运算结束后站内情况的代码段void mcnu(”/菜单函数cout,实数型科学算式计算器cndl;cout(荆楚理工学院215杨悦)cndl;coutendl;coul欢迎使用 o(n_n)o!cndl;cout*请选择你需要的功能:(0, 1或者2) cndl;coutendl;coulV L 使用说明cndl;cout*2 计算算式cndl;couKO.退出程序cndl;couVendl;cout*你的选择是:int choice;cinchoice;switch(choice)case 0:retum;case 1:guide();break;case 2:systcmCcls);char go_on=y;string equation;whi lc(go_ony)coutcndlcndl请输入算式,以=(等号)结束:cndl;cincqua
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 铁道机车专业教学郑州铁路单绍平75课件
- 条码技术物流工程课件
- 中医职业医师课件
- 房贷合同协议书范本
- 医师劳动合同书
- 股东出资合作合同协议
- 世纪英才文化课件藏戏
- 销售人员合同
- 设备租赁合同范本详细
- 普法宣讲【法律学堂】第十六章 行政复议申请书-ldfjxs004
- 2025年江苏宿迁经济技术开发区人力资源有限公司招聘笔试参考题库附带答案详解
- 2025-2030年中国聚氨酯产业市场风险评估规划研究报告
- 2025年四川三新供电服务公司招聘笔试参考题库含答案解析
- 2025年职教高考对口升学 护理类 专业综合模拟卷(4)(四川适用)(原卷版)
- 天然气液化技术发展-洞察分析
- 浙江省J12共同体联盟校2024-2025学年八年级上学期期中语文试题
- 高校实验室耗材管理制度
- 零售店员工管理
- 业财融合视角下的国有企业财务管理转型升级
- 《旅游市场营销》课程教案
- 24秋国家开放大学《科学与技术》终结性考核大作业参考答案
评论
0/150
提交评论