VC++ 多功能计算器.docx
- 文档编号:16482657
- 上传时间:2023-07-14
- 格式:DOCX
- 页数:21
- 大小:531.83KB
VC++ 多功能计算器.docx
《VC++ 多功能计算器.docx》由会员分享,可在线阅读,更多相关《VC++ 多功能计算器.docx(21页珍藏版)》请在冰点文库上搜索。
VC++多功能计算器
多功能计算器
1、课程设计的目的
本课程设计以《VC++程序设计》课程为基础,目的是进一步培养学生综合应用VC++的各种编程知识和技巧进行程序设计的能力,最终掌握面向对象的编程技术。
通过本次课程设计,学生应能达到具备设计功能较为复杂的Windows应用程序的能力,同时培养学生自主学习和独立创新的精神。
系统地学习面向对象编程思想,了解MFC架构,逐步熟悉可视化编程环境VisualC++,加深对面向对象编程的思想的认识。
能够独立的完成一个简单的编程,实现一个简单计算器的编程和应用,从而更深入的了解VisualC++的工作原理。
2、功能描述
在VisualC++环境下设计并实现一个简单计算器系统,该计算器应能实现如下功能:
1)、二进制、八进制、十进制及十六进制数的加、减、乘、除、乘方、取模等简单计算
2)、科学计算函数,包括(反)正弦、(反)余弦、(反)正切、(反)余切、开方、指数等函数运算
3)、以角度、弧度两种方式实现上述部分函数
4)、具备历史计算的记忆功能
5)、对不正确的表达式能指出其错误原因
3、案论论证
3.1、可行性分析
本设计是简单计算器。
日常计算机使用中,常常涉及到一些有关计算的问题,一个小型的计算器软件变得非常有用,该校型计算器需要空间资源较少,对电脑其他程序的应用影响较小。
它的设计按软件工程的方法进行,系统具有良好的界面、必要的交互信息和较好的健壮性;醒目美观的软件封面。
使用人员能快捷简单地进行操作。
即时准确地获得需要的计算的结果,充分降低了数字计算的难度和节约了时间,对人们的生活有一定的帮助
3.2、需求分析
本软件主要用于计算机windows2000/XP以上版本的用户的使用,这次课程设计一般是实现简单计算器的功能。
要程序能实现:
加,减,乘,除,开方,倒数等运算功能;还要实现数据的输入,输出,计算,显示及程序退出等功能。
另外还可以实现多种科学计算的功能,如:
三角函数的计算,弧度与角度间的转换,对数指数的计算等等。
3.3、总体方案设计
(1)功能框架
图1功能框架图
(2)主要功能原理:
①正弦、余弦、正切、余切函数:
制度的选择,程序运行默认制度选中角度,当选项中“角度”按钮时,则需将其转换为角度计算,由公式:
弧度=PI*角度/180,可将表达式中角度转换为弧度既s[ll-1]=PI*s[ll-1]/180。
对于反、正余弦和反正余切,由于C++math.h库函数提供的计算结果是弧度的,所以当选中默认的“弧度”按钮时可不必将计算结果转换,当选中“角度”按钮时,则由公式:
角度=弧度*180/PI,既可计算出来。
②实现进制间浮点数的转换
对不同进制的输入,将其转换为十进制数后出入,显示时转换为所选择的进行输出。
所以进制间的转换输出,其实只是将已存的那个十进制数转换为其他进制输出。
③历史计算的记忆功能
对(和),使用一个运算符栈和一个操作数栈存储。
按(时,进栈保存;按)时,出栈运算。
对MC、MR、MS、M+,使用一个浮点数存储中间值,MC为将其清零,MR为读取其值,MS为保存、M+为在原有值的基础上加当前值。
3.4、详细设计
(1)进行开始编程前的数据结构分析:
doublem_mem;//中间值
boolm_IsHudu;//弧度、角度判断
voidinit();
CRectrectSmall;
CRectrectLarge;
doublebase;//进制基数
doublem_operand;//存储当前输入的操作数
doublem_accum;//存储当前的计算处理结果
boolm_bCoff;//表示当前输入是否是小数
doublem_coff;//小数输入是的系数
Operatorm_operator;//当前运算符
CalcErrorm_errorState;//当前运算状态
boolm_bOperandAvail;//表示当前是否是新输入数字
(2)界面设计,将要实现的按键添加入:
(3)添加按键函数:
voidCCalculatorDlg:
:
OnAdd()//加
voidCCalculatorDlg:
:
OnAddMi()//+/-
voidCCalculatorDlg:
:
OnBackspace()//Backspace
voidCCalculatorDlg:
:
OnClear()//清除
voidCCalculatorDlg:
:
OnClearE()//清除当前
voidCCalculatorDlg:
:
OnDivid()//除
voidCCalculatorDlg:
:
OnEqual()//等于
voidCCalculatorDlg:
:
OnMimus()//减
voidCCalculatorDlg:
:
OnMod()//取模
voidCCalculatorDlg:
:
OnMultiply()//乘
voidCCalculatorDlg:
:
OnPoint()//小数点
voidCCalculatorDlg:
:
OnX2()//平方
voidCCalculatorDlg:
:
OnSin()//sin函数
voidCCalculatorDlg:
:
OnTan()//tan函数
voidCCalculatorDlg:
:
OnMs()//覆盖记忆
voidCCalculatorDlg:
:
OnMr()//读记忆
voidCCalculatorDlg:
:
OnMc()//清零记忆
voidCCalculatorDlg:
:
OnMadd()//增加记忆
voidCCalculatorDlg:
:
OnLog()//log函数
voidCCalculatorDlg:
:
OnLn()//ln函数
voidCCalculatorDlg:
:
OnCot()//cot函数
voidCCalculatorDlg:
:
OnCos()//cos函数
voidCCalculatorDlg:
:
OnSqrt()//开方
voidCCalculatorDlg:
:
OnXy()//X的Y次方
等等…
(4)完善功能:
增加如下函数实现进制转换:
charchange(inta)//将整数转换为字符
{
if(a<10)
return'0'+a;
else
return'A'+a-10;
}
CStringToCString(intbase,doublem_operand)//将double(根据基数base)转换为CString
{
CStringtemp="",temp2;
if(m_operand==0)
return"0";
__int64operand=(__int64)m_operand;
m_operand=m_operand-operand;
//整数部分
while(operand){
temp2.Format("%c",change((int)(operand%base)));
temp=temp2+temp;
operand/=base;
}
temp=temp+".";
//小数部分
while(m_operand>10e-10){
m_operand*=base;
operand=(__int64)m_operand;
temp2.Format("%c",change((int)operand));
temp=temp+temp2;
m_operand=m_operand-operand;
}
returntemp;
}
doublechange2(chara)//将字符转换为浮点数
{
if(a>='0'&&a<='9')
return(double)(a-'0');
else
return(double)(a-'A');
}
doubleToDouble(doublebase,CStringstr,int&k)//将CString(根据基数base)转换为double
//k为标志是否删除了小数点
{
doublenum=0.0;
doubletemp=1.0/base;
intlen=str.GetLength(),i=0;
k=0;
//整数部分
while(i if(str.GetAt(i)=='.') break; num=num*base+change2(str.GetAt(i)); i++; } i++; if(i>=len) k=1; //小数部分 while(i num=num+change2(str.GetAt(i))*temp; temp*=1.0/base; i++; } returnnum; } 加入出错处理: if(m_errorState! =ErrNone){ if(m_errorState==ErrDivideByZero) m_Edit="除数不能为零"; elseif(m_errorState==ErrModFloat) m_Edit="浮点数不能取mod"; elseif(m_errorState==ErrTanMax) m_Edit="tan为无穷大"; elseif(m_errorState==ErrCotMin) m_Edit="cot为无穷大"; elseif(m_errorState==ErrLogSign) m_Edit="不可以对负数取对数"; } (5)增加方便用户功能: 加入加速键: 图2增加控件图 4、运行结果 (1)基本计算器的运行效果如图3所示 图3基本计算器的运行图 (2)科学计算器的运行效果如图4所示 图4科学计算器运行效果图 (3)不可以对浮点数进行取模运算,例如9.2mod9.2=? 。 运行结果如图5所示 图5浮点数不能取摸示意图 (4)不可以对90度角进行正切操作。 Tan90=? 。 运行结果如图6所示。 图690度角不能进行正切操作示意图 (5)不可以对0度角进行取余切操作。 Cot0=? 。 运行结果如图7所示 图70度角不能取余示意图 (6)不可以对负数求对数。 例如Ln-9=? 。 运行结果如图8所示 图8对数不可求对数示意图 (7)不可以对负数进行开方。 运行结果如图9所示 图9负数不能开方示意图 5、心得体会 C++是一种面对对象的编程语言,它跟我们大一学习的面向过程语言C++有很大的不同。 在C语言中完全没有类这个概念,平时用的最多的就是数组和结构体。 但面向对象的语言就不同了,在软件的开发过程中,我们可以通过编写各种各样不同功能的类去实现我们所想要的功能。 而且我们还可以把这些类保存起来,这样,当我们以后要用到的时候把它加入到工程里面就可以用了。 而且,对于以前的一些类,加入它有一些功能我们想拿来用,但是又想在此基础上增加一些新的功能,这怎么办呢? 我们可以通过重载这个类,然后加入我们想要的东西,那么在软件开发功能中就可以节省很多的时间,提高软件开发的效率。 刚看到这个课程设计题目的时候,我认为要实现起来并不难。 但当我开始做的时候,发现这远没有我想的那么简单,反而是越做越难。 这并不是摆一些控件,添加响应就可以实现的了。 就拿最简单的加、减、乘、除来说吧。 在进行设计的时候,我除了要实现基本的两个数进行简单的四则运算外,还要实现他们连加、连减等。 对于除法还要考虑除数不能为零这种情况。 在进行科学计算这些功能设计的时候,我发现用常规的方法并不能满足我的要求。 为了判断一个表达式的正误还有运算的优先级,我必须用到一个堆栈。 为了实现堆栈这个数据结构,我花了不少时间在上面。 而对于个别的功能,我是手工写出函数处理的。 在此次实验,我掌握面向对象技术相关的一些软件开发技术。 利用MFC类库开发Windows应用程序,消息映射是如何工作的。 代码编写能力又有了进一步的提高。 参考文献 [1]刘於勋等.C++程序设计.[M].科学出版社,2007 [2]荣钦科技.VisualC++游戏编程基础.[M].电子工业出版社,2004 [3]揣锦华.面向对象程序设计与VC++实践.[M].西安电子科技大学出版社,2005 [4]罗伟坚.VisualC++经典游戏程序设计.[M].人民邮电出版社,2006 [5]《VisualC++程序设计—基础与实例分析》,朱晴婷,黄海鹰,陈莲君,[M].清华大学出版社 [6]《VisualC++面向对象与可视化程序设计(第2版)》,黄维通,[M].清华大学出版社 [7]刘振安、刘燕君、孙忱,《C++语言课程设计》,[M].机械工业出版社,2007年 [8]严华峰.VisualC++课程设计案例精编.[M].北京: 中国水利水电出版社,2002 [9]张宏军,党留群,赵天巨.VisualC++6.0编程案例精解.[M].北京: 电子工业出版社,2005 附录: 部分程序源代码 //stack.h标准的堆栈模板程序(头文件) #if! defined(STACK_H) #defineSTACK_h #include #include usingnamespacestd; constintMaxStackSize=50; template classStack { private: Tstacklist[MaxStackSize];//堆栈的最大尺寸 inttop; public: Stack(); voidPush(constT&item);//压栈 TPop();//出栈 voidClearStack();//清空堆栈 TPeek()const;//输出堆栈顶部元素(计算结果) intStackEmpty()const;//判断堆栈是否为空 intStackFull()const;//判断堆栈是否已满 }; //构造函数,将top置-1 template Stack : Stack(): top(-1){} //压栈 template voidStack : Push(constT&item) { if(StackFull())//判断堆栈是否已满 { cerr<<"Stackoverflow! "< exit (1); } top++; stacklist[top]=item;//不满则压栈 } //出栈 template TStack : Pop() {Ttemp;//判断是否为空栈 if(StackEmpty()) { cerr<<"Attempttopopanemptystack! "< exit (1); } temp=stacklist[top];//弹出 top--; returntemp; } //清栈 template voidStack : ClearStack() {top=-1; } //返回栈顶元素 template TStack : Peek()const { if(top==-1)//判断top是否有效 { cerr<<"attempttopeekatanemptystack! "< exit (1); } returnstacklist[top]; } //判断堆栈是否为空 template intStack : StackEmpty()const { returntop==-1; } //判断堆栈是否已满 template intStack : StackFull()const { returntop==MaxStackSize-1; } #endif //calculator.h计算器模板类的头文件 } //四则运算函数 template voidCalcualator : Run(void) { cout<<"输入要进行的四则运算(后缀法): \n"; charc; Tnewoperand; while(cin>>c,c! ='=') { switch(c) { case'+': case'-': case'*': case'/': case'^': Compute1(c); break; default: //非运算符,则必为操作数,将字符送回 cin.putback(c); //读入操作数并将其存入栈中 cin>>newoperand; Enter(newoperand); break; } } //答案已在栈顶,用peek输出之 if(! S.StackEmpty()) cout<<"结果是: "< cout<<"^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^"< } template voidCalcualator : Compute2(chard) { Tdata,N; cout<<"请输入角度"< cin>>data; N=data*(PI/180);//把输入的角度转换成弧度 S.ClearStack(); cout<<"\n"; Enter(N);//将N存放到栈中 switch(d) { case'T': S.Push(tan(N));//正切计算 break; case'S': S.Push(sin(N));//正弦计算 break; case'c': S.Push(cos(N));//余弦计算 break; default: S.ClearStack(); break; } f(! S.StackEmpty()) cout<<"结果是: "< cout<<"************************************"< } //三角函数界面选择函数 template voidCalcualator : trangle(void) {intflag=0; chard do {flag=0; cout<<"#######################################"< cout<<"请选择: \n";//选择语句 cout<<"T正切#"< cout<<"S正弦#"< cout<<"c余弦#"< cin>>d; if(d! ='T'&&d! ='S'&&d! ='c'&&d! ='y')//判断选择代码的输入是否有误,输入错误时,重新输入 {cout<<"Errornode,pleasechooseagain! "< flag=1; } else Compute2(d);//各类三角函数的具体操作函数 }while(flag==1); } //乘方,开方,阶乘运算函数 template voidCalcualator : com(void) {Calcualator intd;chary; do {cout<<"#######################################"< cout<<"请选择: \n";//选择语句 cout<<"1.乘方#"< cout<<"2.开方#"< cout<<"3.阶乘#"< cin>>d; switch(d) { case1: chengfang(A);//乘方的具体运算函数 break; case2: kaifang(A);//开方的具体运算函数 break; case3: jiecheng(A);//阶乘的具体运算函数 break; default: cout<<"Continue? ………………(yorN)"< break; } cin>>y; }while(y=='y');//循环语句控制是否继续该类型的计算,否则进入主菜单 } template voidCalcualator : Clear() { S.ClearStack(); } #endif //main.cpp源文件 #include"calculator.h" intmain() { cout<<"Wellcometocalculatorsystem! \n"; cout<<"\n"; chark; do {cout<<"*************************************************\n"; cout<<"*请输入所选择的运算: **"< cout<<"*a.普通四则运算**"< cout<<"*s.三角函数的运算**"< cout<<"*k.乘方开方阶乘运算**"< charh; cin>>h; Calcualator if(h=='k') CALC.com();//进入乘方开方阶乘运算 if(h=='a') CALC.Run();//进入普通四则运算 if(
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VC+ 多功能计算器 VC 多功能 计算器