C++课程设计计算器.docx
《C++课程设计计算器.docx》由会员分享,可在线阅读,更多相关《C++课程设计计算器.docx(22页珍藏版)》请在冰豆网上搜索。
C++课程设计计算器
面向对象程序设计语言
--课程设计
题目计算器设计
院系航空宇航学院
专业飞行器设计与工程
学生权
学号011110320
指导教师德平
二零一二年六月九日
计算器设计
〔一〕、目的与要求:
1、目的:
通过开发计算器程序,进一步熟悉C++中类和对象的定义与使用,掌握程序控制的方法,掌握C++程序设计的根本知识。
2、根本要求:
〔1〕设计计算器程序,可对实数操作;
〔2〕可对多个基数操作的四如此运算;
〔3〕增加函数如:
正弦、余弦、正切、对数、平方和平方根、完成四如此混合运算,注意考虑优先级,对应增加主菜单项选择项;
〔4〕根据程序的提示,可以进展正弦运算进展余弦运算、正切运算、对数运算、求平方运算、混合运算、华氏温度转化为摄氏温度的运算、摄氏温度转化为华氏温度的运算、求平方根运算。
使四如此运算能够具有测试功能,即计算机能够自动出题,并要求用户计算,同时计算机判断用户的对错并打分,要求十题为一个单元,加减运算时最高为两位数的运算,乘法为两位数乘以一位数,除法是两位数或者三位数除以一位数,要求没有余数。
〔二〕、设计方法和根本原理:
1、问题描述〔功能要求〕:
实数间的计算很复杂,它包括:
相加、相减、相乘、相除、求三角函数、求对数、四如此混合运算等。
试设计计算器,使之能提供以下功能:
1).可以连续输入运算,对于输入的表达式能够按算符优先级进展处理。
如:
输入4+5*3时,应该输出60,而不是27。
2).可以处理包含括号的表达式。
如:
输入2*〔3+2〕时,应该输出10,而不是8。
3).可以计算三角函数、对数函数、平方根以与平方。
4).能够实现华氏温度与摄氏温度之间的转换。
5).四如此运算能够具有测试功能,即计算机能够自动出题,并要求用户计算,同时计算机判断用户的对错并打分。
6).系统以菜单方式工作。
〔所谓菜单指用户可以自由选择所要执行的功能〕
7).当使用者输入错误时要有错误提示。
2、问题的解决方案:
根据系统功能要求,可以将问题解决分为以下步骤:
〔1〕应用系统分析,建立该系统的功能模块框图以与界面的组织和设计;
〔2〕分析系统中的各个实体与它们之间的关系包括属性和行为;
〔3〕根据问题描述,设计系统的类层次;
〔4〕完成类层次中各个类的描述〔包括属性和方法〕;
〔5〕完成类中各个成员函数的定义;
〔6〕完成系统的应用模块;
〔7〕功能调试;
〔8〕完成系统总结报告。
附录:
源程序清单
1.系统需求分析
实数间的计算很复杂,它包括:
相加、相减、相乘、相除、求三角函数、求对数、四如此混合运算等。
试设计计算器,使之能提供以下功能:
1).可以连续输入运算,对于输入的表达式能够按算符优先级进展处理。
如:
输入4+5*3时,应该输出60,而不是27。
2).可以处理包含括号的表达式。
如:
输入2*〔3+2〕时,应该输出10,而不是8。
3).可以计算三角函数、对数函数、平方根以与平方。
4).能够实现华氏温度与摄氏温度之间的转换。
5).四如此运算能够具有测试功能,即计算机能够自动出题,并要求用户计算,同时计算机判断用户的对错并打分。
6).系统以菜单方式工作。
〔所谓菜单指用户可以自由选择所要执行的功能〕
7).当使用者输入错误时要有错误提示。
学生可以通过以上功能计算实数间的加、减、乘、除、求三角函数、求平方、求平方根、求对数以与实现华氏温度和摄氏温度间的转换,除了要实现上述的根本功能之外,本系统还应该在细节上下工夫,使用户使用方便,在使用的过程中保持一个愉快的心情。
计算器系统有广阔的用户群,这其中有教师、学生、有公司办公人员,也可以供应一般用户使用。
总之,该系统可以满足用户需求,实现对实数的计算。
2.总体设计
计算器系统包含六个大的功能,分别是:
四如此混合运算、三角函数运算、对数运算、平方和平方根运算、摄氏温度和华氏温度的转换、测试功能。
在上述六大功能中最难的是四如此混合运算的实现,特别是优先级的判断,不但有加减乘除之间的优先级判断,而且还有括号夹杂其中,使得实现起来非常困难。
于是,我考虑用栈和二叉树来实现。
系统弹出主菜单来提示用户输入其想要实现的运算类型,然后根据用户所选的类型来调用相关的函数计算并返回结果。
当系统完成运算后,会再次跳出主菜单让用户选择,用户可以选择推出或者继续。
当用户输入出错时,系统会提示用户。
总之,用户可以方便的在系统提示下进展使用。
本系统还具有测试功能,系统出题,用户输入答案,系统会判断对错并给出用户的得分。
计算器系统中功能模块图:
3.详细设计
系统通过主菜单提示用户选择相应的功能。
该计算器的功能主要为如下6个:
〔1〕.四如此混合运算模块
用户选择功能,输入要进展的多项式〔不能输入空格符〕,实现实数的四如此混合运算。
混合运算流程图:
〔2〕.三角函数模块
用户选择功能,输入实数,实现求三角函数的功能。
三角函数运算流程图
〔3〕.对数模块
用户选择功能,输入实数,实现对数的求解。
对数函数流程图
〔4〕.平方和平方根模块
用户选择功能,输入实数,实现平方和平方根运算。
平方和平方根函数流程图
〔5〕.华氏温度与摄氏温度的转换模块
〔6〕.测试模块
系统出题,用户输入答案,系统会判断对错并给出用户的得分。
程序编写完成后,我进展了程序调试。
调试过程中,出现了以下问题:
〔1〕.当我第一次运行程序时,出现了很多错误,大局部是定义的函数名与引用时不同,这是由于粗心引起的。
还好,这个程序也就300多行代码,找起来不是很困难,但是如果是上万行的代码,那就要花很多时间。
以后在编程时,我要细心些,不能把时间浪费在这种低级错误上。
〔2〕.在调试除法运算时,我发现自己没有考虑除数为零的情况,一旦输入的除数为零,系统就无法运行了。
我回到除法运算的函数中,参加判断除数是否为零以与为零时的处理的代码,问题就解决了。
在对数运算、求平方根运算中都有类似情况。
〔3〕.当我选择运算的种类并输入要计算的实数后,系统输出答案,但马上屏幕又恢复到主菜单项选择项,根本来不与看清答案。
我到程序中去寻找错误,发现每一次用户输入后我都有写一个cin.ignore(),于是我想会不会是这个出的问题。
我删了一个进展调试,发现没有错误,可以运行。
但是,运行起来和以前还是一样。
于是,我回到代码中继续寻找,发现在menu函数中我用了一个清屏的代码,把它删掉后继续调试,这次,运行起来后不再出现问题了,我进展的所有操作都保存下来了,没有被删除。
原来,每次调用menu函数时,都会执行一次清屏,用户上次的运算结果会被删除并显示新的菜单。
〔4〕.在选择菜单项时,会出现问题,例如:
输入1,选择正弦函数操作,但是输入12,却变成了选择正弦函数操作并且对2进展正弦计算,经过考虑并且尝试我发现只要将选择输入由字符型改成整形就可以了。
5.结果分析
这次的课设,虽然教师早早的就把题目给我了,但我因为书本还没看完,就迟迟没有动手去做。
从开始准备做这个题到完成也就是几天的事,所以很多地方写的不好,甚至有些地方还不是很懂。
在屡次调试后,有些错误依然存在,而且我想不出方法解决,实在是惭愧。
现在,在这里也只能说说它的不足之处了。
首先是类的问题,整个程序中,我只用了一个类,几乎所有的函数都是这个类的成员,让人感觉很臃肿,我也试图去优化它,但最终也没能想出方法来。
容易在根底的东西上出错,经常忘记写“;〞,或者同一个函数不同地方调用时会打错名字,这些都是不应该的,必须改掉。
函数参数设定不够完美,整个程序中对指针的运用比拟少。
对于指针的巧妙运用把握得不够。
一开始挺顺利,但在如何实现四如此混合运算时,我茫然了。
我苦想一整天都没能想出如何去做。
于是,我去XX了一下,还好,让我找到了。
可是,问题又来了,在实现四如此混合运算时运用了栈和二叉树的知识,这让我很头疼,这两样东西我压根不懂。
跑到图书馆借了相关的书看,还是不能完全理解,只能凑合着用了。
在错误提示方面我还是很不足,经常忘记,都是调试出现问题了才会想到。
通过课程设计,我感觉到平时学的时候对书上的程序是看懂了,可是真正运用这些知识的时候还是有点力不从心,不能很好的了解并运用到自己的程序之中。
通过这次的课程设计我明白了学习程序设计语言必须要勤做实验,通过实验总结经验。
平时遇到的一些小问题一定要重视,越是根底的知识越要理解透彻。
比如指针与数组方面的知识,一旦没有弄清楚,在设计程序时就会吃亏。
这次的课程设计中,我遇到了很多的问题,有的通过思考或查看书本解决了,有的还留在脑子里,只有通过孜孜不倦的求索我们才会有进步,不懂得思考就不能真正的掌握一门知识。
像我做这个程序的时候,就感觉自己对栈的知识还很欠缺,有的地方不是很明白,多亏了上网查找的这方面知识和一些源程序才帮助我完成了这个程序的设计。
可是一直到现在,对于混合运算中用到的栈和二叉树我只是有些理解,真正运用还不行。
之前我学的书上没有这些容,虽然我去图书馆看了有关这些容的书,但毕竟能力有限,短时间无法理解的那么好,运用起来就更加捉襟见肘了。
今后,我还是会去看这方面的书的,把没弄懂的东西弄懂。
最后,还有一点不得不说,这个程序中,我只定义了一个类,所有的函数都包含在里面,感觉很臃肿,想要优化,可最终也没能想出方法,真是一大遗憾。
附录:
源程序清单
#include
#include//用以产生随机数
#include//定义杂项函数与存分配函数
#include//包含数学函数
#include
usingnamespacestd;
#defineMAX100
#defineMIN10
doublenumber1,number2,answer;
intinput;
classcount
{
public:
doublecadd(doublenumber1,doublenumber2);//定义加法运算
doublecsub(doublenumber1,doublenumber2);//定义减法运算
doublecdiv(doublenumber1,doublenumber2);//定义除法运算
doublecmult(doublenumber1,doublenumber2);//定义乘法运算
voidcsqure();//定义平方函数
voidsqureroot();//定义求平方根运算
voidccos();//定义余弦函数
voidctan();//定义正切函数
voidcsin();//定义正弦函数
voidclog();//定义对数函数
voidfatoce();//定义华氏温度转化为摄氏温度
voidcetofa();//定义摄氏温度转化为华氏温度
//定义混合运算函数
voidmixed();
voidcalcu();
doublecalculate(char*f);
voidcexit();//定义退出函数
voidmenu();//定义主菜单函数
voidbadinput();//定义出错提示函数
voidtest();//定义测试函数
};
doublecount:
:
cadd(doublenumber1,doublenumber2)//加法运算
{
answer=number1+number2;
return(answer);
}
doublecount:
:
csub(doublenumber1,doublenumber2)//减法运算
{
answer=number1-number2;
return(answer);
}
doublecount:
:
cdiv(doublenumber1,doublenumber2)//除法运算
{
if(number2==0)//排除除数为零的情况
{
cout<<"除数不可为0!
\n";
exit(0);
}
else
answer=number1/number2;
return(answer);
}
doublecount:
:
cmult(doublenumber1,doublenumber2)//乘法运算
{
answer=number1*number2;
return(answer);
}
voidcount:
:
csqure()//求平方的函数
{
cout<<"求平方\n";
cout<<"请输入一个数:
";
cin>>number1;
answer=(number1*number1);
cout<cin.ignore();
menu();
}
voidcount:
:
squreroot()//求平方根的函数
{
cout<<"求平方根\n";
cout<<"请输入一个非负数:
";
cin>>number1;
if(number1<0)//排除负数开平方根
{
cout<<"输入错误!
不可为负数!
\n";
cin.ignore();
menu();
}
else
answer=sqrt(number1);
cout<cin.ignore();
menu();
}
voidcount:
:
csin()//正弦函数
{
cout<<"求正弦\n";
cout<<"请输入一个数:
";
cin>>number1;
answer=sin(number1);
cout<cin.ignore();
menu();
}
voidcount:
:
ccos()//余弦函数
{
cout<<"求余弦\n";
cout<<"请输入一个数:
";
cin>>number1;
answer=cos(number1);
cout<cin.ignore();
menu();
}
voidcount:
:
ctan()//正切函数
{
cout<<"求正切\n";
cout<<"请输入一个数:
";
cin>>number1;
answer=tan(number1);
cout<cin.ignore();
menu();
}
voidcount:
:
clog()//对数函数
{
cout<<"求对数\n";
cout<<"请输入一个正数:
";
cin>>number1;
if(number1<=0)
{
cout<<"输入错误!
不可为负数!
\n";
cin.ignore();
menu();
}
else
answer=log(number1);
cout<cin.ignore();
menu();
}
voidcount:
:
fatoce()//华氏温度转化为摄氏温度
{
cout<<"将华氏温度转化为摄氏温度\n";
cout<<"请输入一个华氏温度:
";
cin>>number1;
answer=((number1-32)*5)/9;
cout<<"它的摄氏温度是"<cin.ignore();
menu();
}
voidcount:
:
cetofa()//摄氏温度转化为华氏温度
{
cout<<"将摄氏温度转化为华氏温度\n";
cout<<"请输入一个摄氏温度:
";
cin>>number1;
answer=number1*9/5+32;
cout<<"它的华氏温度是"<cin.ignore();
menu();
}
constinta=30;
doubles1[a+1];//操作数栈
chars2[a+1];//运算符栈
intt1,t2;
voidcount:
:
calcu()//一次计算
{
doublex1,x2,x;
charp;
p=s2[t2--];//弹出一个运算符
x2=s1[t1--];//弹出两个操作数
x1=s1[t1--];
switch(p)//进展一次运算
{
case'+':
x=cadd(x1,x2);
break;
case'-':
x=csub(x1,x2);
break;
case'*':
x=cmult(x1,x2);
break;
case'/':
x=cdiv(x1,x2);
break;
}
s1[++t1]=x;//结果压入操作数栈
}
doublecount:
:
calculate(char*f)
{
doublex;
char*p=f;
t1=t2=0;//设置空栈
while(*p!
='\0')
switch(*p)
{
case'+':
case'-':
while(t2&&(s2[t2]!
='('))
//执行先遇到的加、减、乘、除运算
calcu();
//当前运算符进栈
s2[++t2]=*p;
//读下一个字符
p++;
break;
case'*':
case'/':
if(t2&&(s2[t2]=='*')||(s2[t2]=='/'))
//执行先遇到的乘、除运算
calcu();
//当前运算符进栈
s2[++t2]=*p;
//读下一个字符
p++;
break;
case'(':
//左括号进栈
s2[++t2]=*p;
//读下一个字符
p++;
break;
case')':
while(s2[t2]!
='(')
//执行括号的加、减、乘、除运算
calcu();
//弹出左括号
t2--;
//读下一个字符
p++;
break;
default:
//把字符串转换成整数值
x=0;
do
{
x=10*x+*p-'0';
p++;
}while((*p>='0')&&(*p<='9'));
//操作数进栈
s1[++t1]=x;
};
//执行先遇到的加、减、乘、除运算
while(t2)calcu();
//返回结果
returns1[t1];
}
voidcount:
:
mixed()//混合运算函数
{
cout<<"混合运算函数,请输入要计算的表达式:
\n";
charb[100];
cin>>b;
cout<cout<cin.ignore();
menu();
}
voidcount:
:
cexit()//退出函数
{
exit(0);
}
voidcount:
:
badinput()//出错提示函数
{
cout<<"输入错误!
\n";
cin.ignore();
menu();
}
voidcount:
:
test()//测试函数
{
cout<<"进展测试\n";
ints,sum=0;
floatx;
for(inti=1;i<=10;i++)
{
s=rand()%4+1;//随机给出题目的+或-或*或/
srand(time(NULL));
switch(s)
{
case1:
number1=rand()%MAX;
number2=rand()%MAX;
cout<answer=cadd(number1,number2);
break;
case2:
number1=rand()%MAX;
number2=rand()%MAX;
cout<answer=csub(number1,number2);
break;
case3:
number1=rand()%MAX;
number2=rand()%MIN+1;
cout<answer=cdiv(number1,number2);
break;
case4:
number1=rand()%MAX;
number2=rand()%MIN;
cout<answer=cmult(number1,number2);
break;
}
cout<<"\n请写出答案:
\n";
cin>>x;
if(answer==x)
{
cout<<"正确,得十分!
继续加油!
\n";
sum+=10;
}
else
{
cout<<"错误,再来一次?
\n";
}
}
cout<<"测试结果:
答对"<得分:
"<";
cout<cout<cin.ignore();
menu();
}
voidcount:
:
menu()//主菜单函数
{
counta;
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<<"==================================================\n";
cin>>input;
switch(input)
{
case1:
a.csin();
break;
case2:
a.ccos();
break;
case3:
a.ctan();
break;
case4:
a.clog();
break;
case5:
a.csqure();
brea