《C++课程设计——计算器(38页).doc》由会员分享,可在线阅读,更多相关《C++课程设计——计算器(38页).doc(36页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、-面向对象程序设计语言 -课程设计 题 目 计算器设计 院 系 航空宇航学院 专 业 飞行器设计与工程 学生姓名 张权 学 号 011110320 指导教师 张德平 二零一二 年 六 月 九 日计算器设计(一)、目的与要求: 1、目的: 通过开发计算器程序,进一步熟悉C+中类和对象的定义与使用,掌握程序控制的方法,掌握C+程序设计的基本知识。2、基本要求: (1)设计计算器程序,可对实数操作; (2)可对多个基数操作的四则运算; (3)增加函数如:正弦、余弦、正切、对数、平方和平方根、完成四则混合运算,注意考虑优先级,对应增加主菜单选项; (4)根据程序的提示,可以进行正弦运算进行余弦运算、正
2、切运算、对数运算、求平方运算、混合运算、华氏温度转化为摄氏温度的运算、摄氏温度转化为华氏温度的运算、求平方根运算。使四则运算能够具有测试功能,即计算机能够自动出题,并要求用户计算,同时计算机判断用户的对错并打分,要求十题为一个单元,加减运算时最高为两位数的运算,乘法为两位数乘以一位数,除法是两位数或者三位数除以一位数,要求没有余数。 (二)、设计方法和基本原理: 1、问题描述(功能要求): 实数间的计算很复杂,它包括:相加、相减、相乘、相除、求三角函数、求对数、四则混合运算等。试设计计算器,使之能提供以下功能:1)可以连续输入运算,对于输入的表达式能够按算符优先级进行处理。如:输入4+5*3时
3、,应该输出60,而不是27。2)可以处理包含括号的表达式。如: 输入2*(3+2)时,应该输出10,而不是8。3)可以计算三角函数、对数函数、平方根以及平方。4)能够实现华氏温度与摄氏温度之间的转换。5)四则运算能够具有测试功能,即计算机能够自动出题,并要求用户计算,同时计算机判断用户的对错并打分。 6)系统以菜单方式工作。(所谓菜单指用户可以自由选择所要执行的功能)7)当使用者输入错误时要有错误提示。2、问题的解决方案: 根据系统功能要求,可以将问题解决分为以下步骤: (1)应用系统分析,建立该系统的功能模块框图以及界面的组织和设计;(2)分析系统中的各个实体及它们之间的关系包括属性和行为;
4、 (3)根据问题描述,设计系统的类层次; (4)完成类层次中各个类的描述(包括属性和方法); (5)完成类中各个成员函数的定义; (6)完成系统的应用模块; (7)功能调试; (8)完成系统总结报告。目 录1.系统需求分析12.总体设计13.详细设计24.系统调试65.结果分析错误!未定义书签。6.总结错误!未定义书签。附录:源程序清单第 30 页-1. 系统需求分析 实数间的计算很复杂,它包括:相加、相减、相乘、相除、求三角函数、求对数、四则混合运算等。试设计计算器,使之能提供以下功能:1)可以连续输入运算,对于输入的表达式能够按算符优先级进行处理。如:输入4+5*3时,应该输出60,而不是
5、27。2)可以处理包含括号的表达式。如: 输入2*(3+2)时,应该输出10,而不是8。3)可以计算三角函数、对数函数、平方根以及平方。4)能够实现华氏温度与摄氏温度之间的转换。5)四则运算能够具有测试功能,即计算机能够自动出题,并要求用户计算,同时计算机判断用户的对错并打分。 6)系统以菜单方式工作。(所谓菜单指用户可以自由选择所要执行的功能)7)当使用者输入错误时要有错误提示。学生可以通过以上功能计算实数间的加、减、乘、除、求三角函数、求平方、求平方根、求对数以及实现华氏温度和摄氏温度间的转换,除了要实现上述的基本功能之外,本系统还应该在细节上下工夫,使用户使用方便,在使用的过程中保持一个
6、愉快的心情。计算器系统有广大的用户群,这其中有老师、学生、有公司办公人员,也可以供给一般用户使用。总之,该系统可以满足用户需求,实现对实数的计算。 2. 总体设计计算器系统包含六个大的功能,分别是:四则混合运算、三角函数运算、对数运算、平方和平方根运算、摄氏温度和华氏温度的转换、测试功能。在上述六大功能中最难的是四则混合运算的实现,特别是优先级的判断,不但有加减乘除之间的优先级判断,而且还有括号夹杂其中,使得实现起来非常困难。于是,我考虑用栈和二叉树来实现。系统弹出主菜单来提示用户输入其想要实现的运算类型,然后根据用户所选的类型来调用相关的函数计算并返回结果。当系统完成运算后,会再次跳出主菜单
7、让用户选择,用户可以选择推出或者继续。当用户输入出错时,系统会提示用户。总之,用户可以方便的在系统提示下进行使用。本系统还具有测试功能,系统出题,用户输入答案,系统会判断对错并给出用户的得分。计算器系统中功能模块图:计算器测试功能华氏温度与摄氏温的转换三角函数运算对数运算平方和平方根运算四则混合运算3. 详细设计系统通过主菜单提示用户选择相应的功能。该计算器的功能主要为下列6个:(1).四则混合运算模块用户选择功能,输入要进行的多项式(不能输入空格符),实现实数的四则混合运算。开始输入多项式混合运算流程图:处理函数Mixed()结果显示结束 (2).三角函数模块用户选择功能,输入实数,实现求三
8、角函数的功能。三角函数运算流程图开始选择功能 余弦函数ccos()正切函数ctan()正弦函数csin()显示结果结束(3).对数模块用户选择功能,输入实数,实现对数的求解。对数函数流程图结果显示处理函数clog()输入实数开始结束(4).平方和平方根模块用户选择功能,输入实数,实现平方和平方根运算。选择功能开始平方函数csqure()平方根函数squreroot()平方和平方根函数流程图结束结果显示结束(5).华氏温度与摄氏温度的转换模块华氏温度转换为摄氏温度fatoce()结束结果显示摄氏温度转化为华氏温度cetofa()选择功能开始(6).测试模块系统出题,用户输入答案,系统会判断对错并
9、给出用户的得分。结果显示用户给出答案系统出题开始结束4.系统调试程序编写完成后,我进行了程序调试。调试过程中,出现了以下问题:(1).当我第一次运行程序时,出现了很多错误,大部分是定义的函数名与引用时不同,这是由于粗心引起的。还好,这个程序也就300多行代码,找起来不是很困难,但是如果是上万行的代码,那就要花很多时间。以后在编程时,我要细心些,不能把时间浪费在这种低级错误上。(2).在调试除法运算时,我发现自己没有考虑除数为零的情况,一旦输入的除数为零,系统就无法运行了。我回到除法运算的函数中,加入判断除数是否为零以及为零时的处理的代码,问题就解决了。在对数运算、求平方根运算中都有类似情况。(
10、3).当我选择运算的种类并输入要计算的实数后,系统输出答案,但马上屏幕又恢复到主菜单选项,根本来不及看清答案。 我到程序中去寻找错误,发现每一次用户输入后我都有写一个cin.ignore( ),于是我想会不会是这个出的问题。我删了一个进行调试,发现没有错误,可以运行。但是,运行起来和以前还是一样。于是,我回到代码中继续寻找,发现在menu函数中我用了一个清屏的代码,把它删掉后继续调试,这次,运行起来后不再出现问题了,我进行的所有操作都保留下来了,没有被删除。原来,每次调用menu函数时,都会执行一次清屏,用户上次的运算结果会被删除并显示新的菜单。(4).在选择菜单项时,会出现问题,例如:输入1
11、,选择正弦函数操作,但是输入12,却变成了选择正弦函数操作并且对2进行正弦计算,经过考虑并且尝试我发现只要将选择输入由字符型改成整形就可以了。5. 结果分析这次的课设,虽然老师早早的就把题目给我了,但我因为书本还没看完,就迟迟没有动手去做。从开始准备做这个题到完成也就是几天的事,所以很多地方写的不好,甚至有些地方还不是很懂。在多次调试后,有些错误依然存在,而且我想不出办法解决,实在是惭愧。现在,在这里也只能说说它的不足之处了。首先是类的问题,整个程序中,我只用了一个类,几乎所有的函数都是这个类的成员,让人感觉很臃肿,我也试图去优化它,但最终也没能想出办法来。容易在基础的东西上出错,经常忘记写“
12、;”,或者同一个函数不同地方调用时会打错名字,这些都是不应该的,必须改掉。函数参数设定不够完美,整个程序中对指针的运用比较少。对于指针的巧妙运用把握得不够。一开始挺顺利,但在如何实现四则混合运算时,我茫然了。我苦想一整天都没能想出如何去做。于是,我去百度了一下,还好,让我找到了。可是,问题又来了,在实现四则混合运算时运用了栈和二叉树的知识,这让我很头疼,这两样东西我压根不懂。跑到图书馆借了相关的书看,还是不能完全理解,只能凑合着用了。在错误提示方面我还是很不足,经常忘记,都是调试出现问题了才会想到。6.总结通过课程设计,我感觉到平时学的时候对书上的程序是看懂了,可是真正运用这些知识的时候还是有
13、点力不从心,不能很好的了解并运用到自己的程序之中。通过这次的课程设计我明白了学习程序设计语言必须要勤做实验,通过实验总结经验。平时遇到的一些小问题一定要重视,越是基础的知识越要理解透彻。比如指针与数组方面的知识,一旦没有弄清楚,在设计程序时就会吃亏。这次的课程设计中,我遇到了很多的问题,有的通过思考或查看书本解决了,有的还留在脑子里,只有通过孜孜不倦的求索我们才会有进步,不懂得思考就不能真正的掌握一门知识。像我做这个程序的时候,就感觉自己对栈的知识还很欠缺,有的地方不是很明白,多亏了上网查找的这方面知识和一些源程序才帮助我完成了这个程序的设计。可是一直到现在,对于混合运算中用到的栈和二叉树我只
14、是有些理解,真正运用还不行。之前我学的书上没有这些内容,虽然我去图书馆看了有关这些内容的书,但毕竟能力有限,短时间内无法理解的那么好,运用起来就更加捉襟见肘了。今后,我还是会去看这方面的书的,把没弄懂的东西弄懂。最后,还有一点不得不说,这个程序中,我只定义了一个类,所有的函数都包含在里面,感觉很臃肿,想要优化,可最终也没能想出办法,真是一大遗憾。附录:源程序清单 #include #include /用以产生随机数#include /定义杂项函数及内存分配函数#include /包含数学函数#include using namespace std;#define MAX 100#define
15、MIN 10double number1,number2,answer;int input;class count public:double cadd(double number1,double number2);/定义加法运算double csub(double number1,double number2);/定义减法运算double cdiv(double number1,double number2);/定义除法运算double cmult(double number1,double number2);/定义乘法运算void csqure();/定义平方函数void squreroo
16、t();/定义求平方根运算void ccos();/定义余弦函数void ctan();/定义正切函数void csin();/定义正弦函数void clog();/定义对数函数void fatoce();/定义华氏温度转化为摄氏温度void cetofa();/定义摄氏温度转化为华氏温度/定义混合运算函数void mixed(); void calcu();double calculate(char *f);void cexit();/定义退出函数void menu();/定义主菜单函数void badinput();/定义出错提示函数 void test();/定义测试函数 ;double
17、 count:cadd(double number1,double number2)/加法运算answer=number1+number2;return(answer);double count:csub(double number1,double number2)/减法运算answer = number1-number2;return(answer);double count:cdiv(double number1,double number2)/除法运算if(number2=0)/排除除数为零的情况cout除数不可为0!n;exit(0);elseanswer = number1/numb
18、er2;return(answer);double count:cmult(double number1,double number2)/乘法运算answer = number1*number2;return(answer);void count:csqure()/求平方的函数cout求平方n;coutnumber1;answer=(number1*number1);coutnumber1的平方是answerendl;cin.ignore();menu();void count:squreroot()/求平方根的函数cout 求平方根n;cout number1;if(number10)/排除
19、负数开平方根cout输入错误!不可为负数!n;cin.ignore();menu();elseanswer = sqrt(number1);cout number1 的平方根是 answer endl;cin.ignore();menu();void count:csin()/正弦函数cout求正弦n;coutnumber1;answer=sin(number1);coutnumber1的正弦是answerendl;cin.ignore();menu();void count:ccos()/余弦函数cout求余弦n;coutnumber1;answer=cos(number1);coutnum
20、ber1的余弦是answerendl;cin.ignore();menu();void count:ctan()/正切函数cout求正切n;coutnumber1;answer=tan(number1);coutnumber1的正切是answerendl;cin.ignore();menu();void count:clog()/对数函数cout求对数n;coutnumber1;if(number1=0)cout输入错误!不可为负数!n;cin.ignore();menu();elseanswer=log(number1);coutnumber1的对数是answerendl;cin.ignor
21、e();menu();void count:fatoce()/华氏温度转化为摄氏温度cout 将华氏温度转化为摄氏温度n;cout number1;answer =(number1 - 32) * 5) / 9;cout 它的摄氏温度是 answer endl;cin.ignore();menu();void count:cetofa()/摄氏温度转化为华氏温度cout 将摄氏温度转化为华氏温度n;cout number1;answer =number1 * 9 / 5 + 32;cout 它的华氏温度是 answer =0)&(*p=9);/操作数进栈s1+t1=x;/执行先遇到的加、减、乘
22、、除运算while (t2) calcu();/返回结果return s1t1;void count:mixed()/混合运算函数coutb;coutcalculate(b)endl;coutflush;/刷新缓冲区cin.ignore();menu();void count:cexit()/退出函数exit(0);void count:badinput()/出错提示函数cout 输入错误!n;cin.ignore();menu();void count:test()/测试函数cout进行测试n;int s,sum=0;float x;for(int i=1;i=10;i+)s=rand()%
23、4+1;/随机给出题目的+或-或*或/srand ( time (NULL) );switch(s)case 1:number1=rand()%MAX;number2=rand()%MAX;coutnumber1+number2=;answer=cadd(number1,number2); break;case 2:number1=rand()%MAX;number2=rand()%MAX;coutnumber1-number2=;answer=csub(number1,number2);break;case 3:number1=rand()%MAX;number2=rand()%MIN+1;
24、coutnumber1/number2=;answer=cdiv(number1,number2);break;case 4:number1=rand()%MAX;number2=rand()%MIN;coutnumber1*number2=;answer=cmult(number1,number2);break;coutx;if(answer=x)cout正确,得十分!继续加油!n;sum+=10;elsecout错误,再来一次?n;cout测试结果:答对sum/10t题!得分:sum分!; coutendl;coutflush;cin.ignore();menu();void count:
25、menu()/主菜单函数count a;cout =MENU=n;cout * 1: 进行正弦运算 *n;cout * 2: 进行余弦运算 *n;cout * 3: 进行正切运算 *n;cout * 4: 进行对数运算 *n;cout * 5: 进行求平方运算 *n;cout * 6: 进行求平方根运算 *n;cout * 7: 进行华氏温度转化为摄氏温度的运算 *n;cout * 8: 进行摄氏温度转化为华氏温度的运算 *n;cout * 9: 进行混合运算 *n;cout * 10:进行测试 *n;cout * 0:退出运算 *n; cout * 请选择: *n;cout input;sw
26、itch (input)case 1:a.csin();break;case 2: a.ccos();break;case 3: a.ctan();break;case 4:a.clog();break;case 5:a.csqure();break;case 6:a.squreroot();break;case 7:a.fatoce();break;case 8:a.cetofa();break;case 9:a.mixed();break;case 10:a.test();break;case 0:a.cexit();break;default :a.badinput();int main()count s;s.menu();return 0;