




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 荆楚理工学院课程设计成果学院:计算机工程学院_班级:学号:14计算机科学与技术班学生姓名:杨悦2014404010215设计地点(单位):设计题目:模拟计算器程序完成日期:2016年6月30日指导教师评语:成绩(五级记分制):教师签名: 目录1设计任务.1.1设计目的1.2设计内容1.3设计指标或者要求2设计过程.2.1程序功能.2.2程序流程图.1.33软件运行或者测试结果4软件设计过程中遇到的问题以及解决办法5总结.4.6.6参考文献.6.7附录(程序源代码) 1设计任务1.1设计目的运用所学C+知识,完成模拟计算器程序,通过实践加强对所学知识的理解和巩固。1.2设计内容设计一个程序来模
2、拟一个简单的手持计算器。程序支持幂运算、算术运算+、-、*、/、=、以及Black(清除) 、Esc(全清除) 等操作。1.3设计指标或者要求程序运行时,显示一个窗口,等待用户输入,用户可以从键盘输入要计算的表达式,输入的表达式显示在窗口中,用户键入“=”符号回车后,窗口显示出结果。2设计过程通过对微软附件计算器软件进行调研、分析,研究,使用。我们了解到了作为一个计算器所应该的一些简单功能,我们知道了怎样使编写的计算器程序向微软附件计算器靠拢。其中计算器软件的主要功能是:1)可以进行加减乘除四则运算2)可以实现科学计算器的部分计算功能3)可以进行清零运算4)可以进行退格键运算5)可以进行连续计
3、算2.1程序功能voidmenu:/位于calculate函数后面的菜单函数声明void guide 0/位于主函数后面的指导函数的声明doubleD_Operate(double x, char op, double y/双目运算符的运算定义doubleS_Operate(char op, double x) /前缀单目运算符的运算定义char Precede(char opl, char op 2) /判断符号的优先级opl在返回的结果符的左边op 2在右边/用于判定运算符的优先级以决定是把运算符压栈还是把栈内的运算符弹出来进行计算int match(strings) /栈结构的括号匹配检
4、测函数class NUM stack/运算数栈void start() /初始化栈清空栈顶指针置底for(inti=0; i1000; i+)numi =0;top=0; class OPER stack/运算符栈(public:char oper1000 ;int top;void start(/初始化函数栈清空栈底放一”=”用于判定算式结束oper0 =;for(inti=1; i1000; i+)operi =NULL;top=1/栈顶指针置于栈底的上一位void calculate(string equation) /算式计算函数(关键函数)(NUM stack number; /定义
5、运算数栈变量numberOPER stack oper/定义运算符栈变量opernumber.start(O;oper.start(/把两个栈初始化number.numnumber.top =tt; /运算结果压回原来yuan l在栈内的位置number.lift(/提升指针templ=oper.get TopO;rep=Precede(templ, temp 2) /再判优先级rep=Precede(templ, temp 2) /双目运算符的计算if(number.num0 =ceil(number.num0 ) )coutequationnumber.num0 endl;else(cou
6、tequationfixedsetprecision(8) number.num0 go_on; /可以循环进行算式计算 2.2程序流程图运行程序进入界面,输入第一个操作数根据所选功能,选择下一个操作数选择计算算式选择,进行运算输入“=”键,输出运算结果显示运算结果 3软件运行或者测试结果进入界面CA UsersAdministratorDesktopDebug计算器cs口实数型科学算式计算器(荆楚理工学院215杨悦)欢迎使用o(n_n)o!请选择你需要的功能: (0,1或者2)-1.使用说明2.计算算式0.退出程序你的选择是:搜狗拼音输入法全:输入“1”,查看说明私“CA UsersAdmi
7、nistratorDesktopDebug计算器exe”口使用说明:输入算式时,请按照下列规则入:1.四则运算+加-减+乘/除按常规输入负号用下划线()代昔,注意将其与减号区别:可用括号()界定优先级2运算如下乘方输入xy(x的y次方)如236就是23的6次方;开方也这样输入如81(1/4)或者8170.25表示81开4次方3表示1*2*3*4*5*6:(1+3)!表示4的即3.1415926536,结果是24:1+3!表示1再加上3做阶乘的结果,是74.就本计算器利用弧度进行三角函数计算; 计算正弦请输入sin, 余弦输入cos, 正切输入tan; sin(pl/2)对应的正弦值(注意一定要
8、打括号)其他依此类推:10为底的对数请输入1og,加1og1000=3.计算以。(2.718281828)为底的自然对数请输入1n,如1ne4=4,注意指数的输入要规范5.如1ne4=4,但是(1ne)4=1,计算算式的对数要在对数符号后面把算式括起来,如1n(3+6*9),计算以其他数为底的对数可利用对数换底公式, 如以2为底, 16的对数可输入1n 16/1n 2或者log 16/1og 2结果都是 4:果异舞的有11号0.不接受中括号和大括号(),且算式一定要以等号()结束请按任意键继续.,狗拼音输入法全: 按任意键,返回界面,并输入“2”私CA UsersAdministratorDe
9、sktopDebug计算器.exe口请输入算式,以=(等号)结束:搜狗拼音输入法全:输入算式“(2+3)*10/2=”期CA UsersAdministratorDesktopDebug计+算器exe口请输入算式,以-(等号)结束:(2+3)*10/2=(2+3)*10/2=25继续使用吗?是请输入y否则输入n: 输入“y”后,继续输入算式“(1+2/3=”“CA UsersAdministratorDesktopDebug计算器e we口请输入算式,以(等号)结束:(2*3)*10/2=(2+3)*10/2=25继续使用吗?是请输入y否则输入n:y请输入算式,以=(等号)结束:(1+2/3=
10、括号输入有误继续使用吗?是请输入y否则输入ni.搜狗拼音输入法全:4软件设计过程中遇到的问题以及解决办法经过大约一个星期的设计,计算器基本完毕。在本次课程设计中困难遇到不少,比如如何对输入的一个字符数组中的单个字符进行整型运算、如何能循环菜单、如何倒叙输出等。由于设计时间较短,所以该计算器还有很多不尽如人意的地方,比如功能不够完善、函数不够完整等多方面问题。在这次系统开发的过程中,我深深体会到了做一个系统,首先要进行需求分析的重要性,也了解到了制作一个软件的不易。5总结通过本次课程设计学到了很多东西,对于c+对象的含义有了进一步的认识。学习不能只是停留在表面,此次课程设计为以后的学习积累了经验
11、,设计不比编写容易,只有一个好的规划才能写出好的程序。不过也通过本次发现了自己的不足之处。总是:本次课程设计受益匪浅,动手能力大大增强。参考文献1李素若.C+面向对象程序设计.北京:中国水利水电出版社,2013.2郑莉,傅仕星编,C+面向对象程序设计,清华大学出版社,2003年9.3谭浩强编,C+面向对象程序设计,清华大学出版社,2005年7月.4李师贤等译,C+精髓,机械工业出版社,2002年8月.5 Davis Chapman, 学用Visual c+6.0, 清华大学出版社, 2001年7月出版6郑莉,傅仕星编,C+语言面向对象程序设计习题与实验指导,清华大学出版社,2003年9月. 附
12、录(程序源代码)#include#include#include#includeusing namespace std;void menu 0/位于calculate函数后面的菜单函数声明void guide(/位于主函数后面的指导函数的声明doubleD_Operate(double x, char op, double y) /双目运算符的运算定义double a/计算结果switch(op)(case+:a=x+y; break;case-:a=x-y;break;case*:a=x*y; break;case/:a=x/y; break;case:a=pow(x, y) ; break
13、; /幂运算包括乘方和开方) /因为都是利用double进行运算因此不定义取模运算return a;)doubleS_Operate(char op, double x) /前缀单目运算符的运算定义double a/计算结果switch(op)(cases:a=sin(x) ; break;casec:a=cos(x) ; break;caset:a=tan(x) ; break;caseT:a=log10(x);break/以10为底的对数casen:a=log(x) ; break/以e(2.718281828) 为底的对数case_:a=-x; break; /取负用下划线代替负号定义为
14、一元运算return a;char Precede(char opl, char op 2) /判断符号的优先级opl在返回的结果符的左边op 2在右边/用于判定运算符的优先级以决定是把运算符压栈还是把栈内的运算符弹出来进行计算if(opl=+”lo pl=-) &(op 2=+ll op 2-=-ll op 2=) op 2=)(opl=*lo pl=/) &(op 2-=+lop 2=-T lop 2-*lop 2-=7llop 2=) lop 2=) ,I(opl=&(op 2=+”lop 2=-lop 2=*ll op 2-=/ll op 2-=) lop 2-=ll op 2=slo
15、p 2=c”lop 2-tl lop 2=_ll op 2=T|lop 2=n) ) (opl=_lo pl=slo pl-=cTl opl=topl=Tlo pl=n) &(op 2=+lop 2=- lop 2=*lop 2=7llop 2-=) lop 2=1lop 2=slop 2=clop 2=tlop 2=_T lop 2=Tl lop 2=n) ) )return; /上述情况下栈顶运算符优先级高于待定运算符需弹栈if(opl=(&op 2一) ll(opl=&op 2=) )return=;elsereturn;int illegal_char(strings, inti) /
16、非法输入字符判定函数intj=0;while(j=0&si=9)j+;elseif(si -=+llsi =-Tsj =*lsi =7llsi -.lsl i -=(ll sLi 一-) lsi =llsi =!Isi -=elsi -=_)j+;elseif(sj -=p&sj+1 =i) (si =T&sj+1 =n) )j+=2;elseif(slj -=S&sj+1 -T&sj+2 =n) ll(sj -=c&sj+1 -=o&sj+2 -=s) ll(sj -=t&sj+1 =a&sj+2-=n)ll(si=T&sj+1-=o&sj+2-g)j+=3;/以上都是标准的数字字符和运算符
17、如若存在其他形式的字符则是非法输入elsecout”程序终止, 存在非法的字符输入!”endl;return 0;return1:/没有非法字符返回1否则返回0int match(strings/栈结构的括号匹配检测函数inti=0, top=0;char stack50 ;while(si !=0)(if(si-=()(stacktop =si ;top+;)/push左括号压入栈内 if(si-=)if(stacktop-1 -=()int a=i+1;stacktop-1 =NULL;top-;)/把与右括号匹配的左括号弹掉elsecout”括号输入有误”endl;retumn0:/多了
18、右括号括号失陪返回非法) /pop(i+;if(top!=0)cout”括号输入有误”endl;retumn0:/多了左括号括号失陪返回非法return1:/返回合法class NUM stack/运算数栈public:double num1000 ;int top;void start() /初始化栈清空栈顶指针置底(for(inti=0; i1000; i+)numi =0;top=0;void push(char a) /因为有多位数的运算因此不能一压栈就提升栈顶指针(double popOtop-,double number-numtop ;numtop =0;return numbe
19、r,) /弹栈函数弹掉栈顶元素栈顶归0top指针下降double get Top(/取栈顶元素但不必弹栈 (return numtop-1 ; )void lift() /提升top指针的函数(top+; );class OPER stack/运算符栈(public:char oper1000 ;int top;void start() /初始化函数栈清空栈底放一”=”用于判定算式结束oper0 =;for(inti=1; i1000; i+)operi =NULL:top=1; /栈顶指针置于栈底的上一位void push(char a)opertop =a;top+/与数字栈不同一压栈就可
20、以提升指针char pop 0top-;char op=opertop ;opertop =NULL;return op; /弹出计算符用于计算)charge t TopOreturn opertop-1 :/取栈顶符号但不弹栈可用于判定优先级);void calculate(string equation) /算式计算函数(关键函数)(NUMstacknumber:/定义运算数栈变量numberOPER stack oper/定义运算符栈变量opernumber.star tO;oper.start(; /把两个栈初始化inti=0, len=0, k;char p, sig;double
21、yuan l, yuan 2;while(equationi !=0) len+;i+;) /计算等式长度lenif(equationlen-1 !=)cout”输入有误没有输入终止符号-等号“=”endl;retur/检测有没有结束符等号”=”intl e;le=illegal_char(equation, len-1) ;if(le-0)return/有非法字符不进行后续计算le=match(equation) ;if(le=0)return; /括号匹配非法不进行后续计算for(i=0; ilen; i+/初步确定合法后开始计算算式if(equationi -=!/阶乘是后缀单目运算符单
22、独进行计算yuan1=number.pop0:/弹出栈顶元素做阶乘if(yuan l=0)number.numnumber.top -0; /0的阶乘为0压结果入栈number.lif tO;elsenumber.numnumber.top =l;for(k=1; k=0&equationi =9)(number.push(equationi ) ; /压数字字符入栈if(equationi+1 9) &equationi+1 !=.)number.lift0:/当整个多位运算数读取完毕后, 运算数栈栈顶指针才能提升elseif(equationi -=p)number.numnumber.t
23、op =3.1415926536/pi值即xnumber.lift 0;圆周率要压入数字栈i+/pi是两个字符所以要移动扫描算式的指针往后跳一个 elseif(equationi -=e)(number.numnumber.top =2.718281828459/e自然对数底数压入运算数栈number.lif tO;elseif(equationi -=) /小数压栈代码(in tx=1;while(equationi+x =0&equationi+x =*9)number.numnumber.top +=(equationi+x -0) /pow(10, x) ) /第x位小数入栈x+;X-
24、;number.lif tO;i=i+x;elseif(equationi -=()oper.push(equationi ) /左括号无条件压栈else/数阶乘左括号判断完毕后其他运算符的分类讨论(if(oper.top=1/运算符栈为空运算符可以无条件入栈if(equationi -=T&equationi+1 =o)oper.push(T) ;elseif(equationi -=T&equationi+1 -=n)oper.push(n) ; /因为log和In都是小写字母1开头所以要分情况讨论elseoper.push(equationi ) ;else/运算符栈不为空则要进行优先级
25、判断chart empl=oper.get Top 0/取出栈顶符号char temp 2/待入栈符号if(equationi -=T&equationi+1 =o)temp 2=T;elseif(equationi -=T&equationi+1 =n)temp 2=n; /log与In的再次讨论elsetemp 2=equation ;p=Precede(templ, temp 2) ;if(p=1lp=*)char rep=p:/当栈顶符优先级不低于待入栈的符号则运算符栈不停地弹栈/进行运算直到低于待入栈符号为止rep用于记录比较结果要多次进行判断while(rep=Tlp=) &(op
26、er.top-10) )sig=oper.popO;yuan l=number.popO;yuan 2-number.get Top 0/靠前的一个运算数只要取得不要弹出来if(sig=T&yuan 1-0/yuan l是双目运算符后面的第二运算元cout”计算时出错!出现了除数为0的情况!”endl;return;if(sig=&yuan 20&yuan 11&(static_cast(l/yuan l) ) %2=0)/对负数开偶次根号的限制(cout”计算时出错!出现了负数开偶次根号的情况!”endl;retur;if(sig=_l sig=s|sig=cl sig-t sig=Tsig
27、-n) /若为前缀单目运算符double tt;tt=S_Operate(sig.yuan l) ;number.numnumber.top =tt; /运算结果压回原来yuan l在栈内的位置number.lift(; /提升指针templ=oper.get TopO;rep=Precede(templ, temp 2) /再判优先级elsenumber.num(number.top) -1 =D_Operate(yuan 2, sig.yuan l) ;templ=oper.get TopO;rep=Precede(templ, temp 2) /双目运算符的计算f(equationi -
28、=) ) /如果栈外符是右括号要把与之匹配的左括号弹出栈外oper.popO;elseif(equationi -T&equationi+1 -o)oper.push(T) /代表log的lelseif(equationi -T) &(equationi+1 -=n) )oper.push(n) /代表In的nelseoper.push(equationi ) ; if(equationi -=sl equationi -=cl equationi -tl(equationi -T&equationi+1 -=o) )i=i+2;if(equationi -=T&equationi+1 =n)
29、i+;/对于不止一个字符的运算符sin logIn等等要移动扫描算式的指针往后跳一个或两个if(number.num0 -=ceil(number.num0 ) )coutequationnumber.num0 kendl;elsefc outequationfixedsetprecision(8) number.num0 endl; ) /输出结果控制精度8位小数/调试时检查运算结束后站内情况的代码段void menu() /菜单函数cout”实数型科学算式计算器”endl;cout”(荆楚理工学院215杨悦) ”endl;coutendl;cout”欢迎使用o(n_n) o!”endl;cout”请选择你需要的功能:cout. -”endl;cout”1.使用说明”endl;cout”2.计算算式”endl;cout”0.退出程序”endl;(0, 1或者2) ”endl;cout-.-.-.”endl;coutchoice;switch(choice)(case O
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 期货资产管理协议书
- 消防主机串口协议书
- 接触兼职合同协议书
- 机械车位服务协议书
- 打球团队合作协议书
- 法人变更贷款协议书
- 港口汽修转让协议书
- 学前教育毕业设计答辩
- 张家界风光课件语文A版
- 国庆灯笼劳动课件
- 企业网络设备资产清查合同
- C语言程序设计 课件 第5章-数组
- 住家护工聘用合同协议书
- 平面向量的基本定理(说课)
- 投标担保函样式
- DL∕T 548-2012 电力系统通信站过电压防护规程
- 《一起长大的玩具》整本书阅读(教学设计)统编版语文二年级下册
- 汽车租赁价格动态调整策略研究
- 物流合伙人合同协议书
- 湖北省武汉市江汉区2023-2024学年七年级下学期期末数学试题
- DZ∕T 0270-2014 地下水监测井建设规范
评论
0/150
提交评论