MFC简单计算器

合集下载

开发一个简单计算器程序-基于对话框

开发一个简单计算器程序-基于对话框

开发一个简单科学计算器(基于对话框模式的应用程序)一. 开发目标及软件功能开发一个科学计算器程序,要求采用基于对话框模式的应用程序,至少具有加、减、乘、除四个基本功能,并在此基础上扩展平方、开方、三角函数等功能。

(1)仔细阅读操作过程,学习如何根据编译信息,定位语法错误。

(2)将警告与错误一律看作是错误。

(3)学习并模仿书上的程序书写风格。

二. 编程步骤1. 启动Visual C++6.0,选择File | new 菜单项,弹出New 对话框。

单击Projects 选项卡,项目类型选择MFC AppWizard(exe),在Project name中填入工程名,在Location中填用户子目录路径(设置用户程序子目录的目的是,将所有编程时产生的中间文件和最终执行程序文件全部放在自己的目录中,以便管理)。

2. 在程序向导的第1步选择建立一个基于对话框(Dialog based)的应用程序,点击“Finish”结束向导。

3. 在对话框上添加各类控件,设计对话框的界面如图所示。

在对话框中右键点击,弹出属性设置对话框(Dialog Properties),标题(caption)中填入“迷你计算器”;其余各控件的参数设置如下表所示。

4. 为对话框中的控件添加相应的成员变量:点击菜单“View →ClassWizard”,点击“Member Variables”标签项,为对话框中的三个编辑框控件添加对应的成员变量如图所示。

添加成员变量的步骤为:选中“IDC_FIRST”,点击“Add Viarable”,在弹出的对话框中,指定成员变量名为“m_first”,分类为“Value”,变量类型为“double”,点击“OK”确定。

其余依此类推。

5. 为运算符按钮添加相应的消息映射函数:点击菜单“View →ClassWizard”,选中“Message Maps”标签,目标ID号中选择“IDC_ADD”,在“Messages”中选择“BN_CLICKED”,双击,弹出“添加成员函数”对话框,默认函数名为“OnAdd”,点击“OK”。

c面向对象程序设计MFC简单计算器实验报告

c面向对象程序设计MFC简单计算器实验报告

c面向对象程序设计M F C简单计算器实验报告Standardization of sany group #QS8QHH-HHGX8Q8-GNHHJ8-HHMHGN#计算机与信息工程学院《程序设计基础》课程设计报告题目名称:60.编写一个能实现简单功能的计算器学生姓名:刘沛东学生学号:专业班级:电子信息工程(1)班指导教师:高攀1 课程设计的题目编写一个能实现简单功能的计算器2 题目要求1. 有一个计算器图形。

2. 能实现加、减、乘、除及乘方的运算。

3. 当输入题目时,屏幕上要在指定位置上显示出相应的题目内容,且相应的数字键要改变颜色例如:输入数字1 时,在计算器图形上的1键变为红色。

4. 屏幕、图形颜色、形状自定3 总体设计总体框架图1 系统框架系统功能说明在VC++中绘制计算器界面,各控件的设置对0~9控件设定相应的ID和其他属性:图2 “1”控件设置对“+、-、*、\”控件设定相应的ID和其他属性:图2 “+”控件设置对其它控件设定相应的ID和其他属性:图3 其它控件设置主要使用到Layout菜单中的Align功能对各个按钮进行对其,使界面更加整洁。

拖出的控件有上面的一个Edit控件用于显示数字,Button控件用于处理鼠标的消息。

4 程序详细设计系统主调模块图5 程序流程图各模块详细设计建立的变量,控件的命名,对应的消息处理函数对应表double poz; 按钮的处理函数void CCalcDlg::OnPt(){point_flag=TRUE; && buffer[i+1]==0)之前那位}m_Dis=strtod(buffer,NULL);整个大的程序的实现分8个功能,每个功能都通过一个相应的函数来实现.在调试时分别进行调试,使得调试更方便些.在编写各个函数只是按着题目要求的去完成,后来经指导老师指导后,发现了很多自己欠缺的地方,又一次将程序整体进行调试.最后把程序完善了许多。

mfc单屏计算器

mfc单屏计算器

增加参数int m_nNum1; 保存“运算符+”前的数值int m_nNum2; 保存“运算符+”后的数值CString m_strNowNum; 保存当前的字符串CString m_strTem; 保存“运算符+”前多字符串CString m_strNum2; 保存“运算符+”后的字符串bool m_IsAdd; 是否运算符CEdit m_edit; 编辑框对象#include "Shlwapi.h" 不能少添加相应的lib 工程-设置-连接-Object/library modules添加函数void CCaLculatorrDlg::OnButton10() //num 0{// TODO: Add your control notification handler code here if(!m_IsAdd){m_strNowNum+='0';m_strTem=m_strNowNum;}else{m_strNum2+='0';m_strNowNum=m_strNum2;}UpdateData(false);}void CCaLculatorrDlg::OnButton1(){// TODO: Add your control notification handler code here if(!m_IsAdd){m_strNowNum+='1';m_strTem=m_strNowNum;}else{m_strNum2+='1';m_strNowNum=m_strNum2;}UpdateData(false);}void CCaLculatorrDlg::OnButton11() //+{// TODO: Add your control notification handler code here m_IsAdd=!m_IsAdd;}void CCaLculatorrDlg::OnButton12() //={// TODO: Add your control notification handler code here m_nNum1=StrToInt((LPCTSTR)m_strTem);m_nNum2=StrToInt((LPCTSTR)m_strNowNum);m_strNowNum.Format("%d",m_nNum1+m_nNum2);UpdateData(false);}void CCaLculatorrDlg::OnButton2(){// TODO: Add your control notification handler code here if(!m_IsAdd){m_strNowNum+='2';m_strTem=m_strNowNum;}else{m_strNum2+='2';m_strNowNum=m_strNum2;}UpdateData(false);}void CCaLculatorrDlg::OnButton3(){// TODO: Add your control notification handler code here if(!m_IsAdd){m_strNowNum+='3';m_strTem=m_strNowNum;}else{m_strNum2+='3';m_strNowNum=m_strNum2;UpdateData(false);}void CCaLculatorrDlg::OnButton4(){// TODO: Add your control notification handler code here if(!m_IsAdd){m_strNowNum+='4';m_strTem=m_strNowNum;}else{m_strNum2+='4';m_strNowNum=m_strNum2;}UpdateData(false);}void CCaLculatorrDlg::OnButton5(){// TODO: Add your control notification handler code here if(!m_IsAdd){m_strNowNum+='5';m_strTem=m_strNowNum;}else{m_strNum2+='5';m_strNowNum=m_strNum2;}UpdateData(false);}void CCaLculatorrDlg::OnButton6(){// TODO: Add your control notification handler code here if(!m_IsAdd){m_strNowNum+='6';m_strTem=m_strNowNum;}{m_strNum2+='6';m_strNowNum=m_strNum2;}UpdateData(false);}void CCaLculatorrDlg::OnButton7(){// TODO: Add your control notification handler code here if(!m_IsAdd){m_strNowNum+='7';m_strTem=m_strNowNum;}else{m_strNum2+='7';m_strNowNum=m_strNum2;}UpdateData(false);}void CCaLculatorrDlg::OnButton8(){// TODO: Add your control notification handler code here if(!m_IsAdd){m_strNowNum+='8';m_strTem=m_strNowNum;}else{m_strNum2+='8';m_strNowNum=m_strNum2;}UpdateData(false);}void CCaLculatorrDlg::OnButton9(){// TODO: Add your control notification handler code here if(!m_IsAdd)m_strNowNum+='9';m_strTem=m_strNowNum;}else{m_strNum2+='9';m_strNowNum=m_strNum2;}UpdateData(false);}当然你需要进一步优化添加- * / 等∙如果你添加这些只需把m_IsAdd 变为m_Is OPerator∙因为现在需要在点击运算符前显示数字1 点击运算符后显示数字2 点击等号后显示最终结果计算器不就这样吗?如果没记错的话CalculatorDlg。

vs2021 MFC计算器制作

vs2021 MFC计算器制作

vs2021 MFC计算器制作制作计算器本文采用动态创建控件的方法,使用 vs2021 MFC,仿照windows自带的计算器进行制作。

通过这个程序可以使你了解: 1 如何使用文本框、按钮2 如何通过控件的ID获取控件指针3 得到控件指针后可以对控件做些什么4 字符串如何处理(拼接、查找、转换等)5 如何给控件绑定响应事件6 如何重载原有的函数 7 其他自己体会界面分析:不要上面的菜单栏,也不要第一排的按钮,这些按钮都不要,只要一个文本框和下面右图中的按钮,布局方式也按照这个图布局。

仔细数一数,共有23个按钮和一个编辑框。

功能分析:用一下windows的计算器,可以发现: 1. 初始状态为02. 如果按下数字键,这个0就会变成相应的数字,如果按下小数点,就会变为“0.”3. 除数不能为04. 连续按下多个运算符,以最后一个计算符为准5. 每次按下运算符都会把之前的结果先经行计算,例如:你已经输入了 1+ 1 此时再按下“+”,就会先把1+1进行计算,保存结果2.6. 这个计算器分两行显示,上面一行显示算式,下面显示结果.7. 当你输入一个数字和一个运算符就按下“=”时,第二个数默认和第一个相同,例如:“3*”按下“=”,显示“9” 8. 开平方不能是负数 9. 其它异常暂不处理新建项目这里我给项目命名为:Calculator应用程序的类型选择基于对话框,点击完成完成之后,先来观察一下项目中都有哪些东西:资源视图(下面右图)是我们的界面,解决方案中的是我们的源文件(下面左图)。

我们的代码主要写在中,.h文件中主要定义一些东西,.cpp文件中写具体的东西。

和准备知识初始界面打开界面,可以看到,上面已经给我们放上去了两个按钮―确定和取消。

由于我们建立的是对话框应用程序,这两个按钮的功能就是接受Enter键和ESC键的响应。

先不要删除它,不然会造成不必要的麻烦:例如如果你删除了这两个按钮,当你在界面上按下回车时,程序找不到响应的控件,就会导致异常。

MFC计算器

MFC计算器

《C++面向对象程序设计》实验报告学院:信息科学与工程学院专业:学号:姓名:一.题目:利用MFC框架编写Windows附件中所示的简易计算器二.功能描述:1.能够实现最基本的加,减,乘,除四则基本运算。

2.界面有清空,退格按钮,方便用户计算使用。

3.此计算器具有开方,取倒数,求对数的高级运算。

三.概要设计:1.Windows消息处理机制通过对教材的阅读,对Windows程序的消息处理机制有个大致的了解。

Windows的程序都是通过消息来传送数据,并且存在异常处理等不需要用户参与的系统消息,用户消息就是鼠标的单击,双击等。

2.界面的设计如图,简易的计算器界面主要使用菜单中相关控件,并合理的布置各个按钮的位置,使得界面让用户看起来整洁简单。

3.框架描述Windows 简易计算器在资源视图画好界面添加控件的同时,通过属性修改名称为各个按钮和编辑框添加不同的函数四则运算+,-,*,/ 1/x,lgx等函数退格和清空键4.建立的变量和控件的命名,对应的消息处理函数命名表ID CAPTION Message Handler IDC_BUTTON0 0 OnButton0()IDC_BUTTON1 1 OnButton1()IDC_BUTTON2 2 OnButton2()IDC_BUTTON3 3 OnButton3()IDC_BUTTON4 4 OnButton4()IDC_BUTTON5 5 OnButton5()IDC_BUTTON6 6 OnButton6()IDC_BUTTON7 7 OnButton7()IDC_BUTTON8 8 OnButton8()IDC_BUTTON9 9 OnButton9()IDC_BUTTON10 . OnButton11()IDC_BUTTON11 = OnButtonequal() IDC_BUTTON12 + OnButtonadd()IDC_BUTTON13 - OnButtoncut()IDC_BUTTON14 * OnButtonmultiply() IDC_BUTTON15 / OnButtonremove() IDC_BUTTON16 1/x OnButton1x()IDC_BUTTON17 lg OnButtonlg()IDC_BUTTON18 sqrt OnButtonsqrt()IDC_BUTTON19 Backspace OnButtonbackspace() IDC_BUTTON20 C(清空) OnButtonclear()5.下图是基本对话框中所有的类四.详细设计:1.新建工程,选择MFC AppWizard[exe],并命名工程的名称为mycalculator2.选择基本对话框3.通过控件添加各种按钮和编辑框(对话框右边的“Controls”控件箱提供了可用于对话框的各种组建,在此次计算器中,基本上只用到上面四个控件,对话框只能通过控件来实现它们的功能,把控件中的数据保存在对话框类的数据成员中,应用程序才能通过这些数据成员获取控件中的数据)4.考虑用户们的习惯,把编辑框的显示的数字属性由靠左改成靠右(选中编辑框,右击选择属性-样式,排列文本改为向左)5.用同样的方法改变按钮的标题,其他按钮同理6.为美观改变对话框的标题为“计算器”7.右击编辑框添加类向导,添加变量m_result,且type为CString//可通过其改变类型和名称8.实现每个按钮的功能,双击按钮,为按钮添加函数,可以改变函数的名称① 0~9和小数点的函数大致类似void CMycalculatorDlg::OnButton1(){// TODO: Add your control notification handler code herem_result +=_T("1");UpdateData(FALSE);}函数_T()可以对字符串进行操作,UpdateData(FALSE)可以把数据传到文本框里面,小数点与数字同样这样处理。

可视化编程课程设计(含源码)计算器系统实现

可视化编程课程设计(含源码)计算器系统实现

设计题目:计算器系统实现1.分别用API与MFC编程来实现计算器的以下功能。

2.实现计算器的基本功能:连续数据的无优先级混合运算(加减乘除)3.可以实现其他附加功能:优先级运算,加入括号,加入其他函数运算功能等。

(不在要求范围之内)4.要求界面良好,功能完整。

一.基于MFC的简单计算器1.设计思路打开MFC应用操作界面,布局计算器界面,利用组框将计算器界面分为三个部分,一个是编辑输入,一个是数字界面,一个是功能键部分。

利用布局参考线对齐按钮,使界面美观。

然后就是对各个按钮进行属性设置,关联类设置,接着对各个按钮进行源代码编程。

最后,调试找出问题,解决问题,运行MFC成品计算器。

2.简单操作以及功能说明由于本人技术有限,所以本程序只能按照正确的计算运算顺序进行,该简单计算器能进行四则混合运算,除了加减乘除外,添加了一个括号,对于有些未知的错误,由于时间有限,并未来得及全面测试使用。

该简单计算器能实现四则运算,退格运算,清零运算,并且支持输出的结果保留给直接的下一个运算。

3.系统实现的各个模块1)编辑框模块由于编辑框模块需要连续输入字符串,所以在给编辑框建立类向导时,给编辑框定义的成员变量应该是字符串(String)变量。

编辑框模块用于运算算式的输入,以及结果的输出。

2)数字键模块数字键模块比较简单,该简单计算器数字键模块设置有0~9数字,还设置有小数点,以及正负数转换实现按钮。

数字键模块按钮在建立类向导时无需定义成员变量,但是需要定义按钮响应链接,用于实现点击按钮,在编辑框上显示点击按钮信息。

3)功能键模块功能键模块包括加减乘除基本按钮,以及一个输入错误是后能用于退格功能的退格键按钮,还有一个用于区别优先级运算的括号功能,当然有最重要的计算结果输入按钮,等于号按钮。

在编辑框附近还有一个功能键,就是清除功能键,用于清除编辑框,以便实现下一轮输入。

4.设计过程1)设计总流程图2)界面的设计3)建立的变量,控件的命名,对应的消息处理函数对应表ID CAPTION MessageHandler IDD_JISUANQI_DIALOG 简易计算器N/AIDC_NUM0 0 OnNum0IDC_NUM1 1 OnNum1IDC_NUM2 2 OnNum2IDC_NUM3 3 OnNum3IDC_NUM4 4 OnNum4IDC_NUM5 5 OnNum5IDC_NUM6 6 OnNum6IDC_NUM7 7 OnNum7IDC_NUM8 8 OnNum8IDC_NUM9 9 OnNum9IDC_OPER_ADD + OnOperAdd IDC_OPER_SUB - OnOperSub IDC_OPER_MULTI * OnOperMulti IDC_OPER_DIV / OnOperDiv IDC_ADD_SUB +/- OnAddSubIDC_POINT . OnPointIDC_EQUAL = OnEqualIDC_LBRACKET ( OnLbracket1)数字键模块void CJiSuanQiDlg::OnNum0(){if(calculated == TRUE) //已经按了等号,不让其再接受字符return;UpdateData(TRUE);//刷新编辑框界面calcutateString += "0";//存储输入的数字m_data += "0";//显示输入的数字UpdateData(FALSE);}2)功能键模块①加法功能键源程序void CJiSuanQiDlg::OnOperAdd(){if(calculated == TRUE)///其前一步按了= 号{calculated = FALSE;m_data = oldResult;double temp = atof(oldResult);//定义临时变量存储上一步结果if(temp < 0){calcutateString = "0" + oldResult;}else{calcutateString = oldResult;}calcutateString += "+";//存储做完该功能后的结果m_data += "+";//显示该步骤完成的结果UpdateData(FALSE);}else ///前一步不是={UpdateData(TRUE);calcutateString += "+";//直接存储此步操作m_data += "+";//直接显示此步操作UpdateData(FALSE);}}②退格功能键源程序void CJiSuanQiDlg::OnBackspeace(){if(calculated == FALSE){UpdateData(TRUE);int count = m_data.GetLength();if(count >= 1)//判断是否能执行退格操作{m_data = m_data.Left(count -1);count = calcutateString.GetLength();calcutateString = calcutateString.Left(count -1);UpdateData(FALSE);}}}③清除功能键源程序void CJiSuanQiDlg::OnClear(){// TODO: Add your control notification handler code herem_data = "";oldResult = "";calcutateString = "";calculated = FALSE;UpdateData(FALSE);}④括号功能键源程序void CJiSuanQiDlg::OnLbracket(){// TODO: Add your control notification handler code hereif(calculated == TRUE) ///已经按了等号,不让其再接受字符return;UpdateData(TRUE);calcutateString += "(";m_data += "(";UpdateData(FALSE);}⑤正负转换功能键源程序void CJiSuanQiDlg::OnAddSub(){// TODO: Add your control notification handler code hereif(calculated == FALSE){UpdateData(TRUE);calcutateString = calcutateString + "0" + "-";m_data += "-";UpdateData(FALSE);}}6.运行结果界面截图7.制作过程中所遇问题以及解决方法过程1)源代码编写错误通过查阅资料,请教同学,逐步一一解决。

MFC编程简单计算器

MFC编程简单计算器

第一步:设置界面,变量及函数首先打开VC,选择MFC AppWizard[exe],设定好路径和工程名(这里我设置工程名为为“My”)。

这里要注意的是在创建向导步骤1的时候,我们选择“基本对话框”。

之后我们可以点击完成便看到以下界面此时我们把当前页面上原配的控件按Delete全部清除(如下图)1、设置界面接着我们按照MFC自带的控件选项进行我们本次计算器的控件添加(以下是控件)我们在原先清空的界面中依次用上图控件画出一个基本的计算器页面(如下图)。

上图我们用按钮控件添加一共15个按钮,分别是数字“ 0 ~ 9”以及“+ - * /”。

每个控件“属性”都有属于它自己的ID,默认的按钮按键为IDC_BUTTON0,而且Cap当然我们为了“顾名思义”,对控件ID进行修改成我们容易辨认的(也可以不改),添加完控件并修改ID之后。

(如下图)这里我们把数字按钮0 设置ID为IDC_BUTTON14_NUM0,其他的依次类推2、添加变量添加3个成员变量和一个CEdit类的变量具体添加方法,就是右键主对话框CMyDlg->Add Member Variable 也可以是在菜单栏中选择“查看”->“建立类向导”这里我们把3个编辑框控件内的变量都改变为double型的(因为进行四则运算难免出现小数点)之后再在控件IDC_EDIT3中选择"Add Variable"并且数据类型选择 Control类型此时变量自动改为了 CEdit类这步的意思是说我们把编辑框控件3的设置为CEdit类并且设置一个成员对象是m_CResult。

3、添加消息相应函数完成修改ID后,就需给控件添加消息响应了,基本操作可以是直接双击控件,便会有向导提示。

MFC默认下了的响应信息都为On_开头,而且以下显示的是数字5的消息响应.之后所有的依次类推,这步骤一般不对成员函数名称做任何修改,直接点击OK即可到此为止我们基本上完成了计算器页面的前半部分预备工作,下来是我们的对控件具体实现代码的添加第2步:添加代码1、基本控件代码首先从加法开始void CMyDlg::OnButton1(){// TODO: Add your control notification handler code hereUpdateData();double n_result;n_result = m_num1 + m_num2;m_result = n_result;char sz[20];sprintf(sz,"%f",m_result);m_CResult.SetWindowText(sz);}UpdateData() 是MFC的窗口函数,用来刷新数据的由于我们进行基本运算需要更新数据所以必须添加这个函数。

visual 2015 mfc 计算器 代码

visual 2015 mfc 计算器 代码

以下是一个简单的 Visual Studio 2015 MFC 计算器的示例代码。

它包括两个窗口,一个用于输入和显示数字,另一个用于显示结果。

```cpp// MainFrm.cpp : implementation of the CMainFrame class //#include "pch.h"#include "framework.h"#include "Calculator.h"#include "MainFrm.h"#include "afxdialogex.h"#ifdef _DEBUG#define new DEBUG_NEW#endif// CMainFrameIMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)ON_WM_CREATE()ON_WM_DESTROY()ON_COMMAND(ID_APP_ABOUT,&CMainFrame::OnAppAbout)ON_COMMAND(ID_FILE_NEW, &CMainFrame::OnFileNew) ON_COMMAND(ID_FILE_EXIT, &CMainFrame::OnFileExit) ON_COMMAND(ID_EDIT_CLEAR,&CMainFrame::OnEditClear)ON_COMMAND(ID_EDIT_COPY,&CMainFrame::OnEditCopy)ON_COMMAND(ID_EDIT_PASTE,&CMainFrame::OnEditPaste)ON_COMMAND(ID_VIEW_SPLIT,&CMainFrame::OnViewSplit)ON_COMMAND(ID_VIEW_FULL,&CMainFrame::OnViewFull)ON_UPDATE_COMMAND_UI(ID_EDIT_CLEAR,&CMainFrame::OnUpdateEditClear)ON_UPDATE_COMMAND_UI(ID_EDIT_COPY,&CMainFrame::OnUpdateEditCopy)ON_UPDATE_COMMAND_UI(ID_EDIT_PASTE,&CMainFrame::OnUpdateEditPaste)END_MESSAGE_MAP()static UINT indicators[] ={ID_SEPARATOR, // status line indicatorID_INDICATOR_CAPS,ID_INDICATOR_NUM,ID_INDICATOR_SCRL,};CMainFrame::CMainFrame() : CFrameWndEx(){m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);}CMainFrame::~CMainFrame(){}int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct){if (CFrameWndEx::OnCreate(lpCreateStruct) == -1)return -1;// Create a view to host the client window. This object will be responsible for drawing the client area.// Set initial host view properties.CView* pView = new CView;if (!pView)return -1;pView->Create(_T("Calculator"), WS_CHILD | WS_VISIBLE | WS_BORDER | 500, CRect(0, 0, 200, 200), this);m_viewList.AddTail(pView);// m_pActiveView = pView;// m_bIsSplitterBar = TRUE;// m_bIsHorzSplit = TRUE;// m_bIsVerSplit = FALSE;// m_bIsDocTemplate = TRUE;// Create a toolbar control and initialize it.CToolBarCtrl mtbBarCtrl;// Create a command bar control and initialize it.CCommandBarCtrl commandBarCtrl; // Create a status bar control and initialize it. // Create a menu control and initialize it. CMenu menuBar;menuBar.CreateMenu();menuBar.AppendMenu(MF_POPUP, IDM_FILE, _T("&File"));menuBar.AppendMenu(MF_POPUP, IDM_EDIT, _T("&Edit")); menuBar.AppendMenu(MF_POPUP,IDM_VIEW, _T("&View")); menuBar.AppendMenu(MF_POPUP, IDM_INSERT, _T("&Insert")); menuBar.AppendMenu(MF_POPUP, IDM_FORMAT, _T("&Format")); menuBar.AppendMenu。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

信息科学与技术学院《程序设计基础》课程设计报告题目名称:60.编写一个能实现简单功能的计算器学生姓名:李海东学生学号:2011508154 专业班级:电子信息工程(1)班指导教师:高攀11 课程设计的题目编写一个能实现简单功能的计算器2 题目要求1. 有一个计算器图形。

2. 能实现加、减、乘、除及乘方的运算。

3. 当输入题目时,屏幕上要在指定位置上显示出相应的题目内容,且相应的数字键要改变颜色例如:输入数字1 时,在计算器图形上的1键变为红色。

4. 屏幕、图形颜色、形状自定3 总体设计3.1 总体框架图1 系统框架开始结束键入第一个按钮键入第二个按钮显 示 结 果加法减法乘法除法乘方清零3.2 系统功能说明在VC++6.0中绘制计算器界面,各控件的设置对0~9控件设定相应的ID和其他属性:图2 “1”控件设置对“+、-、*、\”控件设定相应的ID和其他属性:图2 “+”控件设置对其它控件设定相应的ID和其他属性:图3 其它控件设置12主要使用到Layout 菜单中的Align 功能对各个按钮进行对其,使界面更加整洁。

拖出的控件有上面的一个Edit 控件用于显示数字,Button 控件用于处理鼠标的消息。

4 程序详细设计4.1系统主调模块图5 程序流程图实现文件.cpp显示计算器界面开始执行工程全局对象资源文件.rc 模块定义文件.def头文件.h执行_twinmain() Afxmain()创建窗口实现窗口类注册Set window V oid clc::onpaint() V oid cal::onCE()点击鼠标发出消息V oid clce::onmouse()等待消息处理V oid clc::onMum0() V oid clc::onAdd() 文本框中显示结果程序运行结4.2各模块详细设计4.2.1 建立的变量,控件的命名,对应的消息处理函数对应表ID CAPTION Message HandlerIDD_CALC_DIALOG 简易计算器N/AIDC_NUM0 0 OnNum0IDC_NUM1 1 OnNum1IDC_NUM2 2 OnNum2IDC_NUM3 3 OnNum3IDC_NUM4 4 OnNum4IDC_NUM5 5 OnNum5IDC_NUM6 6 OnNum6IDC_NUM7 7 OnNum7IDC_NUM8 8 OnNum8IDC_NUM9 9 OnNum9IDC_NEG +/- OnNegIDC_PT .OnPtIDC_DIV / OnDivIDC_MUL * OnMulIDC_MIN - OnMinIDC_ADD + OnAddIDC_BACKSPACE BACK OnBackspaceIDC_CE CE OnCeIDC_CLEAR C OnClearIDC_EQU = OnEquIDC_DIS N/A N/AOnCal(double num)变量定义:double poz; //保存小数点的位置,初始化为1,表示poz-1个小数点。

double m_Dis; //Edit控件上需要显示的数字BOOL point_flag; //小数点表示位,判定是否是小数,是小数为1,不是小数为0。

double numfirst; //保存计算过程中的前一个数字,double numsecond;//保存计算过程中的第二个数字char op;//记录当前的计算符号,可以为’+’,’-’,’*’,’/’,’=’,’c’,’n’变量初始化:poz=1;m_Dis = 0.0;numfirst=0;numsecond=0;op=0;344.4.2 设计思路a)首先考虑对所有按键分为两类,数字类和符号类,0,1,2,3,4,5,6,7,8,9为数字类,+,-,*,/,=为符号类。

数字在计算的过程中最多需要保存两个,所以定义了两个double型变量numfirst和numsecond来进行存储。

符号需要一个char op来存储。

b)然后考虑在计算的过程中,numfirst和numsecond的存储状态有三种,一种是numfirst==0 && numsecond==0 也就是程序刚开始运行还没有开始录入数字的状态。

二种是numfirst!=0 && numsecond==0 也就是第一个数字已经录入,符号也已经录入时候把m_Dis的值直接赋值给numfirst,第三种是numfirst!=0&&numsecond!=0,表示可以通过op来把两数合并为一个数。

c)考虑到该计算器支持连续的计算,比如3.33+1.33*88/96= ?。

所以必须在点符号Button也要计算出之前的结果,通过判断op,来计算,把两个数字合并为一个数字,方便下一次运算,功能近似于点=,所以把=也划分到符号类。

d)因为数字全部使用的是double,键入的数字必须通过一定的处理达到累加的效果,加上小数和整数的处理差异性大,所以分别用point_flag来判断,分别出来小数和整数。

4.2.3 成员函数及其释义因为对OnNum0()到OnNum9()的处理函数差异仅在一个数字上,可以通过调用一个共同的函数OnCal(double num)来简化源代码长度,增加模块性。

void CCalcDlg::OnCal(double num){ //分三种状态来处理if(numfirst!=0 && numsecond!=0){if(point_flag==TRUE) //判定为小数{poz*=0.1; //小数进位m_Dis=m_Dis+poz*num;//递增UpdateData(false); //把结果从内存传递到屏幕}else{m_Dis=m_Dis*10+num;UpdateData(false);}}if(numfirst!=0 && numsecond==0){if(point_flag==TRUE){poz*=0.1;m_Dis=m_Dis+poz*num;UpdateData(false);}else//判定为整数{m_Dis=m_Dis*10+num;//递增UpdateData(false);}}if(numfirst==0 && numsecond==0){if(point_flag==TRUE){poz*=0.1;m_Dis=m_Dis+poz*num;UpdateData(false);}else{m_Dis=m_Dis*10+num;UpdateData(false);}}}4.2.4 以OnAdd()为例子讲解符号的处理函数,函数的功能是先判定之前按下字符时op的值,更具op的值来进行相应的运算。

void CCalcDlg::OnAdd(){ //根据numfirst和numsecond和op的值分为5种状态。

if(numfirst!=0 && numsecond==0&&op=='+'){numsecond=m_Dis;numfirst=numfirst+numsecond; //之前按的是加把两个数赋值到前一个数m_Dis=numfirst;//赋值给屏幕numsecond=0; //从新赋值为0,清空,不影响下一次判断UpdateData(FALSE);m_Dis=0; //屏幕的值同时清空}if(numfirst!=0 && numsecond==0&&op=='-'){numsecond=m_Dis;numfirst=numfirst-numsecond;m_Dis=numfirst;numsecond=0;UpdateData(FALSE);m_Dis=0;}if(numfirst!=0 && numsecond==0&&op=='*'){numsecond=m_Dis;numfirst=numfirst*numsecond;m_Dis=numfirst;numsecond=0;UpdateData(FALSE);m_Dis=0;}if(numfirst!=0 && numsecond==0&&op=='/'){12numsecond=m_Dis;numfirst=numfirst/numsecond;m_Dis=numfirst;numsecond=0;UpdateData(FALSE);m_Dis=0;}if(numfirst==0 && numsecond==0){ //该状态为程序启动还没有开始录入输入的状态numfirst=m_Dis; //屏幕的值赋值到numfirstUpdateData(FALSE);m_Dis=0;}op='+'; //最后记录最后一个操作是+poz=1;//小数点位置归位point_flag=FALSE;//默认小数点标志为整数,也就是0,也就是FALSE}“+/-“按钮的处理函数void CCalcDlg::OnNeg(){m_Dis=-m_Dis;//换个符号,其他都一样UpdateData(FALSE);poz=1;point_flag=FALSE;}‘.’按钮的处理函数void CCalcDlg::OnPt(){point_flag=TRUE; //把标志位改为“小数点”状态}“Backspace”按钮的处理void CCalcDlg::OnBackspace(){//主要通过_gcvt()和strtod()函数进行字符串和浮点数之间的转换char buffer[30]; //定义个装字符的数组_gcvt(m_Dis,sizeof(m_Dis),buffer); //把m_Dis存的数字转换为stringfor(int i=0;i<30;i++){if(buffer[i]=='.'&& buffer[i+1]==0)//判断是否为整数{point_flag=FALSE; //标志位设置为“整数位”break;}}if(point_flag==TRUE) //如果是小数{for(int j=0;j<30;j++){if(buffer[j]==0){buffer[j-1]=0; //把’\0’之前的字符赋值为’\0’,就相当于剪掉最后一位break;}}}else//如果是整数{buffer[i-1]=0; //剪掉’.’之前那位}m_Dis=strtod(buffer,NULL);//再用strtod弄成浮点数UpdateData(FALSE);poz=1;}‘CE’按钮处理函数void CCalcDlg::OnCe(){if(numfirst!=0 && numsecond==0)//CE只能修改第二个数字{m_Dis=0; //把屏幕的值赋值为0UpdateData(FALSE);//并显示出来}}‘C’按钮处理函数void CCalcDlg::OnClear(){op=NULL; //清空符号numfirst=0;//清空第一个数字numsecond=0;//清空第二个数字point_flag=FALSE;//改为默认整数位poz=1;//小数点归位m_Dis=0;UpdateData(FALSE); //屏幕显示归0}键盘响应:void CCalcDlg::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags){switch(nChar){case VK_NUMPAD0:OnNum0();break;case VK_NUMPAD1:OnNum1();break;case VK_NUMPAD2:OnNum2();break;case VK_NUMPAD3:OnNum3();break;case VK_NUMPAD4:OnNum4();break;case VK_NUMPAD5:OnNum5();break;case VK_NUMPAD6:OnNum6();break;case VK_NUMPAD7:OnNum7();break;case VK_NUMPAD8:34OnNum8();break;case VK_NUMPAD9:OnNum9();break;case VK_ADD:OnAdd();break;case VK_SUBTRACT:OnMin();break;case VK_MULTIPLY:OnMul();break;case VK_DIVIDE:OnDiv();break;case VK_BACK:OnBackspace();break;case VK_DECIMAL:OnPt();break;case VK_DELETE:OnBackspace();break;case VK_RETURN:OnEqu();break;}CDialog::OnKeyDown(nChar, nRepCnt, nFlags);}BOOL CCalcDlg::PreTranslateMessage(MSG* pMsg){SendMessage(pMsg->message,pMsg->wParam,pMsg->lParam);return CDialog::PreTranslateMessage(pMsg);}5 程序运行结果6 课程设计总结通过这次课程设计,我又收获到很多,平时的在做作业时,因为题形与结构都是很简单的,并且每一章的内容都是有相应的例题可以参考,所以在做题时没有遇到过很麻烦的问题,而这次不同了,一个课题拿到手时,给我的感觉是无从下手,而且要求很多,使得题目要求更大了。

相关文档
最新文档