VC MFC计算器课程设计

风云魄888

贡献于2013-04-13

字数:9917 关键词: C/C++开发

 Windows程序设计作业报告 设计题目:MFC多功能计算器 学 院: 宿迁学院 专业班级: 软件工程(1)班 学生姓名: 孙 磊 学生学号: 20090307139 指导教师: 郑步芹 提交时间: 2011年 12月 15日 成 绩: 目录 1. 课程设计目的及要求 …………………………………………3 1.1设计目的及问题描述 ……………………………………3 1.2设计要求………………………………………………………3 1.3软件、硬件环境………………………………………………3 2. 课程设计步骤………………………………………………………3 2.1 Windows消息处理机制的理解………………………………3 2.2界面的设计……………………………………………………4 3. 课程设计内容………………………………………………………5 3.1 概要设计………………………………………………………5 3.1.1 程序总体框架描述…………………………………………8 3.1.2程序常用类声明……………………………………………8 3.2主要技术………………………………………………………11 3.3系统设计结果 (界面截图、操作流程)………………………22 4.课程设计总结………………………………………………………23 4.1遇到的问题及如何解决……………………………………………23 一、课程设计目的及要求 1.1设计目的及问题描述 能够熟练掌握MFC中的各个控件,消息的处理与添加,并且能够具体实现一些功能,真正可以利用功能比较强大的MFC编译出较好的程序代码。 此次本人设计的是一个具有比较齐全运算功能的计算器。 1.2设计要求 利用Microsoft Visual C++的MFC制作一个多功能计算器,要求: (1) 能够实现最基本的加、减、乘、除四则基本运算; (2) 计算机界面设置有A、B、C、D、E、F多功能按键; (3) 设置了运算结果转换功能,分别是十进制、八进制、二进制、十六进制; (4) 添加了计算类型,分别是弧度制、度数制; (5) 界面有清空、退格按钮,方便用户计算使用; (6) 重点是此计算器具有多次方、开方、三角函数、反三角函数、取模等高级运算。 1.3软件、硬件环境 本程序采用Microsoft Visual C++6.0的英文版本进行编译。VisualC++6.0是Microsoft公司推出的基于Windows操作系统的可视化C++编程工具,尽管Microsoft公司推出了.NET平台的集成开发环境,但由于其良好的界面和可操作性,加上支持标准C/C++规范,但仍有相当多的编程人员使用VisualC++6.0进行应用系统的开发。 一、 课程设计步骤 2.1 Windows消息处理机制的理解 首先编写程序需要对Windows程序的消息处理机制有个比较清晰的了解。Windows的程序都是通过消息来传送数据,有不需要用户参与的系统消息,比如异常处理等。 2.2界面的设计 仿照Windows附件里面的计算器,在Dialog视图中画好界面,如图: 主要使用的菜单中的相关控件,并合理布置各个按钮的位置,使界面更加整洁。在各个控件的属性里依次定义好名称,之后屏幕显示的就是如图一样的可视计算器界面。 以及关于本人和该MFC多功能计算器的相关介绍与信息。 三、课程设计内容 3.1 概要设计 依次将各个功能按钮设置相关的ID和控件类 以上为数字0~9的属性设置,及其ID和标题名称 以上为功能A、B、C、D、E、F中的A的属性,及其ID和标题名称 以上为四则运算加、减、乘、除中“*”的ID和标题名称 以上为计算器中结果转换和计算类型的属性设置 以上为计算器中的次方运算的属性设置 以上为计算器中三角函数和反三角函数的属性设置 以上是做的一个简单的运算,结果如图中的显示,为double型。 3.1.1 程序总体框架描述 MFC多功能计算器 计算器的主要功能 四 则 运 算 三角函数、 三角反函数运算的实现 二次方、三次方、多次方功能实现 结果转换(二、八、十、十六) 计算类型(弧度、度数) 按键 0~9 按键 A~F 3.1.2程序常用类声明 按键0~9的ID设置 IDC_BUTTON0 IDC_BUTTON1 IDC_BUTTON2 IDC_BUTTON3 IDC_BUTTON4 IDC_BUTTON5 IDC_BUTTON6 IDC_BUTTON7 IDC_BUTTON8 IDC_BUTTON9 按键A~F的ID设置 IDC_BUTTONA IDC_BUTTONB IDC_BUTTONC IDC_BUTTOND IDC_BUTTONE IDC_BUTTONF 结果转换的ID设置 十进制:IDC_BTN_DEC 二进制:IDC_BTN_BIN 八进制:IDC_BTN_OCT 十六进制:IDC_BTN_HEX 计算类型的ID设置 弧度:IDC_BTN_RADIANS 度数:IDC_BTN_DEGRESS 次方的ID设置 x^y:IDC_BTN_XY x^3:IDC_BTN_CUBE x^2:IDC_BTN_SQUARE 三角函数的ID设置 Sin:IDC_BTN_SIN Cos:IDC_BTN_COS Tan:IDC_BTN_TAN Cot:IDC_BTN_COT 反三角函数的ID设置 arcSin:IDC_BTN_ARCSIN arcos:IDC_BTN_ARCCOS arcTan:IDC_BTN_ARCTAN arcCot:IDC_BTN_ARCCOT 四则运算的ID设置 +:IDC_BTN_ADD -:IDC_BTN_DECREASE *:IDC_BTN_MULTI /:IDC_BTN_DIV 清空、等于、正负号、取模、退格ln、Log的ID设置 +/—:IDC_BTN_SIGN =:IDC_BTN_EQUAL 清空:IDC_BTN_AC 取模:IDC_BTN_MOD 退格: IDC_BTN_BACK 开方:IDC_BTN_EXT Ln: IDC_BTN_LN Log:IDC_BTN_LOG 下图是在基本对话框中的所有类 3.2主要技术 计算器主要功能的实现 0~9数字的代码(如下) void CMy7139Dlg::OnButton0() { //TODO: Add your control notification handler code here m_EDIT=m_EDIT+"0"; SetDlgItemText(IDC_EDIT1,m_EDIT); } void CMy7139Dlg::OnButton1() { //TODO: Add your control notification handler code here m_EDIT=m_EDIT+"1"; SetDlgItemText(IDC_EDIT1,m_EDIT); } void CMy7139Dlg::OnButton2() { //TODO: Add your control notification handler code here m_EDIT=m_EDIT+"2"; SetDlgItemText(IDC_EDIT1,m_EDIT); } ……………………………………………………………… ……………………………………………………………… ……………………………………………………………… void CMy7139Dlg::OnButton9() { //TODO: Add your control notification handler code here m_EDIT=m_EDIT+"9"; SetDlgItemText(IDC_EDIT1,m_EDIT); } 加减乘除法的实现: void CMy7139Dlg::OnBtnAdd() { // TODO: Add your control notification handler code here temp=m_EDIT; op='+'; m_EDIT=_T(""); point=false; } void CMy7139Dlg::OnBtnDecrease() { // TODO: Add your control notification handler code here temp=m_EDIT; op='-'; m_EDIT=_T(""); point=false; } void CMy7139Dlg::OnBtnDecrease() { // TODO: Add your control notification handler code here temp=m_EDIT; op='*'; m_EDIT=_T(""); point=false; } void CMy7139Dlg::OnBtnDecrease() { // TODO: Add your control notification handler code here temp=m_EDIT; op='/'; m_EDIT=_T(""); point=false; } 次方的实现: void CMy7139Dlg::OnBtnXy() { // TODO: Add your control notification handler code here po temp=m_EDIT; op='^'; m_EDIT=_T(""); int=false; } 三次方的实现(二次方的实现同理): void CMy7139Dlg::OnBtnCube() { // TODO: Add your control notification handler code here char ch2[50]; int squ3; int squ4; double temp3; double temp4; switch(form) { case 'H': squ3=_tcstoul(m_EDIT, 0, 16); squ4=pow(squ3,3); m_EDIT.Format("%X",squ4); SetDlgItemText(IDC_EDIT1,m_EDIT); break; case 'D': temp3 = atof((LPCTSTR)m_EDIT); temp4=pow(temp3,3); m_EDIT.Format("%f",temp4); SetDlgItemText(IDC_EDIT1,m_EDIT); point=true; break; case 'O': squ3=_tcstoul(m_EDIT, 0, 8); squ4=pow(squ3,3); m_EDIT.Format("%o",squ4); SetDlgItemText(IDC_EDIT1,m_EDIT); break; case 'B': squ3=_tcstoul(m_EDIT, 0, 2); squ4=pow(squ3,3); itoa(squ4,ch2,2); m_EDIT.Format("%s",ch2); SetDlgItemText(IDC_EDIT1,m_EDIT); break; default: return; } 三角函数的实现: void CMy7139Dlg::OnBtnSin() { // TODO: Add your control notification handler code here double sintemp; switch(degngra) { case 1:sintemp=atof((LPCTSTR)m_EDIT); m_EDIT.Format("%f",sin(sintemp * PI/180)); SetDlgItemText(IDC_EDIT1,m_EDIT); break; case 2:sintemp=atof((LPCTSTR)m_EDIT); m_EDIT.Format("%f",sin(sintemp)); SetDlgItemText(IDC_EDIT1,m_EDIT); break; } void CMy7139Dlg::OnBtnCos() { // TODO: Add your control notification handler code here double costemp; switch(degngra) { case 1:costemp=atof((LPCTSTR)m_EDIT); m_EDIT.Format("%f",cos(costemp * PI/180)); SetDlgItemText(IDC_EDIT1,m_EDIT); break; case 2:costemp=atof((LPCTSTR)m_EDIT); m_EDIT.Format("%f",cos(costemp)); SetDlgItemText(IDC_EDIT1,m_EDIT); break; } void CMy7139Dlg::OnBtnTan() { // TODO: Add your control notification handler code here double tantemp; switch(degngra) { case 1:tantemp=atof((LPCTSTR)m_EDIT); if(tantemp!=90) { m_EDIT.Format("%f",tan(tantemp * PI/180)); SetDlgItemText(IDC_EDIT1,m_EDIT); } else { MessageBox("操作数范围错误","ERROR!"); m_EDIT=_T(""); point=false; SetDlgItemText(IDC_EDIT1,m_EDIT); } break; case 2:tantemp=atof((LPCTSTR)m_EDIT); if(tantemp!=PI/2) { m_EDIT.Format("%f",tan(tantemp)); SetDlgItemText(IDC_EDIT1,m_EDIT); } else { MessageBox("操作数范围错误","ERROR!"); m_EDIT=_T(""); point=false; SetDlgItemText(IDC_EDIT1,m_EDIT); } break; } void CMy7139Dlg::OnBtnCot() { // TODO: Add your control notification handler code here double cottemp; switch(degngra) { case 1:cottemp=atof((LPCTSTR)m_EDIT); if(cottemp!=0) { m_EDIT.Format("%f",1/tan(cottemp * PI/180)); SetDlgItemText(IDC_EDIT1,m_EDIT); } else { MessageBox("操作数范围错误","ERROR!"); m_EDIT=_T(""); point=false; SetDlgItemText(IDC_EDIT1,m_EDIT); } break; case 2:cottemp=atof((LPCTSTR)m_EDIT); if(cottemp!=0) { m_EDIT.Format("%f",1/tan(cottemp)); SetDlgItemText(IDC_EDIT1,m_EDIT); } else { MessageBox("操作数范围错误","ERROR!"); m_EDIT=_T(""); point=false; SetDlgItemText(IDC_EDIT1,m_EDIT); } break; } 反函数的实现: void CMy7139Dlg::OnBtnArcsin() { // TODO: Add your control notification handler code here double arcsintemp; arcsintemp=atof((LPCTSTR)m_EDIT); if(arcsintemp>=-1 && arcsintemp<=1) { switch(degngra) { case 1:m_EDIT.Format("%f",asin(arcsintemp)*180/PI); SetDlgItemText(IDC_EDIT1,m_EDIT); break; case 2:m_EDIT.Format("%f",asin(arcsintemp)); SetDlgItemText(IDC_EDIT1,m_EDIT); break; } } else { MessageBox("操作数范围应为-1到1!","ERROR!"); m_EDIT=_T(""); point=false; SetDlgItemText(IDC_EDIT1,m_EDIT); } void CMy7139Dlg::OnBtnArccos() { // TODO: Add your control notification handler code here double arccostemp; arccostemp=atof((LPCTSTR)m_EDIT); if(arccostemp>=-1 && arccostemp<=1) { switch(degngra) { case 1:m_EDIT.Format("%f",acos(arccostemp)*180/PI); SetDlgItemText(IDC_EDIT1,m_EDIT); break; case 2:m_EDIT.Format("%f",acos(arccostemp)); SetDlgItemText(IDC_EDIT1,m_EDIT); break; } } else { MessageBox("操作数范围应为-1到1!","ERROR!"); m_EDIT=_T(""); point=false; SetDlgItemText(IDC_EDIT1,m_EDIT); } void CMy7139Dlg::OnBtnArctan() { // TODO: Add your control notification handler code here double arctantemp; arctantemp=atof((LPCTSTR)m_EDIT); switch(degngra) { case 1:m_EDIT.Format("%f",atan(arctantemp)*180/PI); SetDlgItemText(IDC_EDIT1,m_EDIT); break; case 2:m_EDIT.Format("%f",atan(arctantemp)); SetDlgItemText(IDC_EDIT1,m_EDIT); break; } void CMy7139Dlg::OnBtnArccot() { // TODO: Add your control notification handler code here double arccottemp; arccottemp=atof((LPCTSTR)m_EDIT); switch(degngra) { case 1:m_EDIT.Format("%f",1/atan(arccottemp)*180/PI); SetDlgItemText(IDC_EDIT1,m_EDIT); break; case 2:m_EDIT.Format("%f",1/atan(arccottemp)); SetDlgItemText(IDC_EDIT1,m_EDIT); break; } Log、ln:的实现 void CMy7139Dlg::OnBtnLog() { // TODO: Add your control notification handler code here double logtemp; int logt; char logch[50]; switch(form) { case 'H': logt=_tcstoul(m_EDIT, 0, 16); if(logt>0) { m_EDIT.Format("%X",(int)log10(logt)); SetDlgItemText(IDC_EDIT1,m_EDIT); } else { MessageBox("操作数应大于零","ERROR!"); m_EDIT=_T(""); point=false; UpdateData(false); } break; case 'D': logtemp=atof((LPCTSTR)m_EDIT); if(logtemp>0) { m_EDIT.Format("%f",log10(logtemp)); SetDlgItemText(IDC_EDIT1,m_EDIT); } else { MessageBox("操作数应大于零","ERROR!"); m_EDIT=_T(""); point=false; UpdateData(false); } break; case 'O': logt=_tcstoul(m_EDIT, 0, 8); if(logt>0) { m_EDIT.Format("%o",(int)log10(logt)); SetDlgItemText(IDC_EDIT1,m_EDIT); } else { MessageBox("操作数应大于零","ERROR!"); m_EDIT=_T(""); point=false; UpdateData(false); } break; case 'B': logt=_tcstoul(m_EDIT, 0, 2); if(logt>0) { itoa(log10(logt),logch,2); m_EDIT.Format("%s",logch); SetDlgItemText(IDC_EDIT1,m_EDIT); } else { MessageBox("操作数应大于零","ERROR!"); m_EDIT=_T(""); point=false; UpdateData(false); } break; default: return; } void CMy7139Dlg::OnBtnLn() { // TODO: Add your control notification handler code here double lntemp; int lnt; char lnch[50]; switch(form) { case 'H': lnt=_tcstoul(m_EDIT, 0, 16); if(lnt>0) { m_EDIT.Format("%X",(int)log(lnt)); SetDlgItemText(IDC_EDIT1,m_EDIT); } else { MessageBox("操作数应大于零","ERROR!"); m_EDIT=_T(""); point=false; UpdateData(false); } break; case 'D': lntemp=atof((LPCTSTR)m_EDIT); if(lntemp>0) { m_EDIT.Format("%f",log(lntemp)); SetDlgItemText(IDC_EDIT1,m_EDIT); } else { MessageBox("操作数应大于零","ERROR!"); m_EDIT=_T(""); point=false; UpdateData(false); } break; case 'O': lnt=_tcstoul(m_EDIT, 0, 8); if(lnt>0) { m_EDIT.Format("%o",(int)log(lnt)); SetDlgItemText(IDC_EDIT1,m_EDIT); } else { MessageBox("操作数应大于零","ERROR!"); m_EDIT=_T(""); point=false; UpdateData(false); } break; case 'B': lnt=_tcstoul(m_EDIT, 0, 2); if(lnt>0) { itoa(log(lnt),lnch,2); m_EDIT.Format("%s",lnch); SetDlgItemText(IDC_EDIT1,m_EDIT); } else { MessageBox("操作数应大于零","ERROR!"); m_EDIT=_T(""); point=false; UpdateData(false); } break; default: return; } 3.3系统设计结果 (界面截图、操作流程) 运行进入界面,下图是一个运算例子,在运算时可以将结果转换选择“十进制”,计算类型可以选择“度数”、“弧数”都可以 计算sin30°,界面如下: 依次键入3和0,即30 接着按一下 sin键 界面的编辑框中既是得到的结果0.500000(double型) 四、课程设计总结 4.1遇到的问题及如何解决 本次MFC计算器的制作,学习到了MFC基本的编程方法,增加了自己独立制作程序的能力。对MFC编程的理解进一步加深。经过一个多星期的仔细研究,认真揣摩代码,在网上也查阅了不少相关资料,终于能够完整的编译出一套不错的计算器源程序,同时使其具备了很多高级的功能,让每一个尝试运行该程序的人给予较高的评价。 当然其中也遇到了许多问题,比如在自己写代码时发现,当除数为0的时候,程序出错, 才想起来,除数不能为0,遂经过一番思索与多次尝试解决了这样的一个问题…………等等。 希望本人自身以后能够多多练习一些与之相关的知识,让自己在这方面的水平越来越高,达到一种轻车熟路的较高层次。

下载文档,方便阅读与编辑

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 6 金币 [ 分享文档获得金币 ]
0 人已下载

下载文档

相关文档