MFC简单计算器
- 格式:doc
- 大小:120.50 KB
- 文档页数:12
开发一个简单科学计算器(基于对话框模式的应用程序)一. 开发目标及软件功能开发一个科学计算器程序,要求采用基于对话框模式的应用程序,至少具有加、减、乘、除四个基本功能,并在此基础上扩展平方、开方、三角函数等功能。
(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面向对象程序设计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个功能,每个功能都通过一个相应的函数来实现.在调试时分别进行调试,使得调试更方便些.在编写各个函数只是按着题目要求的去完成,后来经指导老师指导后,发现了很多自己欠缺的地方,又一次将程序整体进行调试.最后把程序完善了许多。
增加参数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,仿照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键的响应。
先不要删除它,不然会造成不必要的麻烦:例如如果你删除了这两个按钮,当你在界面上按下回车时,程序找不到响应的控件,就会导致异常。
《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)源代码编写错误通过查阅资料,请教同学,逐步一一解决。
第一步:设置界面,变量及函数首先打开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 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、单击File(文件)菜单,选中New(新建),创建新工程。
2、选择工程栏中MFC AppWizard[exe]应用程序,并命名工程名称为calculator.(如图)3、选择MFC应用程序为“基于对话框”类型,其他选项默认。
单击完成(如图)4、修改界面。
经过前3步骤,VC6.0生成的工作界面如图所示。
先将对话框中的“TODO:在这里设置对话控制”静态文字控件和“确定”按钮控件删除,再使用工具箱将界面拖动控件修改为如图所示的界面。
该图所示是使用工具箱的控件拖放制作的计算器初始界面。
由于这些控件都有默认的名字,所以我们要对控件进行改名,右击Button1按钮,选中Properties(属性)选项以修改控件的属性,如图所示。
在弹出的对话框中,将Button1按钮的Caption(标题)属性修改为“+”,此时初始界面同时变成相应的“+”如下图所示。
修改后的界面如图所示,控件的Caption属性就是控件显示出来的值。
按照前文所讲述的方式,将界面上的按钮控件和静态文本控件的Caption属性都做相应的修改,修改后的界面如图所示。
5、为Edit(编辑)控件添加类的成员变量。
首先,右击Edit控件,选择ClassWizard(建立类向导)选项,如下图所示。
在弹出的对话框中,选择上方MemberVariables选项卡,选中DIC_EDIT1,然后单击单击右侧的Add Variable按钮,如图所示。
单击Add Variable按钮后会跳出,如图所示的对话框,该对话框是设置成员变量的命名和数据类型,在此可以命名为m_data1.注意:控件的ID只是标记一个控件,程序中不能直接控制ID,只能通过修改变量来改变控件的状态。
00相应的,再将另外两个Edit控件命名,本项目就将这3个Edit控件命名为:●IDC_EDIT1:m_data1,类型为double.●IDC_EDIT2:m_data2,类型为double.●IDC_EDIT3:m_result,类型为double.6、添加按钮控件的消息处理函数。
MFC下的科学计算器MFC (Microsoft Foundation Classes) 是Microsoft在windows上用于构建图形用户界面 (GUI) 的一套类库。
在MFC下开发一个科学计算器,可以实现基本的数学运算,包括加、减、乘、除,以及科学计数、平方、开方等功能。
首先,我们需要创建一个新的MFC应用程序项目。
在Visual Studio中选择“新建项目”,然后选择“MFC应用程序”。
在项目向导中,选择“单文档”视图,点击“完成”创建项目。
在代码视图中,我们可以使用Class Wizard来添加的响应函数。
打开Class Wizard,切换到“消息映射”选项卡,在列表中选择“控件”和“消息”,然后点击“添加函数”来添加事件处理函数。
除了基本的加减乘除功能,我们还可以添加其他的科学计算功能,例如平方、开方、三角函数等。
这些功能使用C++的数学库函数实现。
在完成功能的设计和实现后,我们可以进行调试和优化。
在调试期间,我们可以使用断点来跟踪代码的执行过程,检查变量的值和程序的状态。
如果遇到错误或异常情况,可以使用调试工具和日志功能来定位和解决问题。
同时,我们还可以根据用户的反馈和需求,对功能和界面进行优化和改进。
最后,我们可以将应用程序编译成可执行文件,方便用户安装和使用。
可以使用发布功能来生成安装程序,然后将可执行文件和相关文件打包,发布给用户。
总结一下,使用MFC开发一个科学计算器需要以下几个步骤:创建MFC应用程序项目、设计用户界面、实现计算功能、调试和优化、发布应用程序。
通过这个过程,我们可以了解和掌握MFC开发的基本流程和技巧,进一步提升编程能力和开发经验。
基于对话框实验,写一个计算器,实验结果:工具:VS2010遇到的问题:编译遇到字符串不能转换为char *,在字符串前面加_T解决了。
1.首先新建一个MFC项目,在工具框里面拖出工具,摆好布局,修改caption和ID栏2.在头文件添加CString num1;CString num2;CStringm_result;boolisresult;int witch;在初始化函数里面初始化// TODO: 在此添加额外的初始化代码num1="";num2="";isresult=false;witch=0;3.数字键代码voidCcalculatorDlg::OnBnClickednum1(){// TODO: 在此添加控件通知处理程序代码if(isresult==false){num1+="1";m_result=num1;UpdateData(false);}if(isresult==true){num2+="1";m_result=num2;UpdateData(false);}}运算符键代码:voidCcalculatorDlg::OnBnClickedjia(){// TODO: 在此添加控件通知处理程序代码isresult=true;witch=1;}等于键代码:voidCcalculatorDlg::OnBnClickeddengyu(){// TODO: 在此添加控件通知处理程序代码UpdateData(true);double number1=_ttof(num1);double number2=_ttof(num2);double result=0.0;switch(witch){ case 1: result=number1+number2;break;case 2: result=number1+number2;break;case 3: result=number1+number2;break;case 4: result=number1+number2;break;}m_result="";m_result.Format(_T("%lf"),result);UpdateData(false);}点号代码:voidCcalculatorDlg::OnBnClickeddot(){if(isresult==false){num1+=".";m_result=num1;UpdateData(false);}if(isresult==true){num2+=".";m_result=num2;UpdateData(false);}}3.这些函数是双击相应键添加框架,自己完善细节的。
// 计算器Dlg.cpp : implementation file//#include "stdafx.h"#include "计算器.h"#include "iostream.h"#include "计算器Dlg.h"#include "stdlib.h"#include "math.h"#ifdef _DEBUGvoid CMyDlg::OnButtonR(){// TODO: Add your control notification handler code hereif(flag==false){int i;double current;cur2d=atof(m_result);if(opp=="+")m_final=cur1d+cur2d;elseif(opp=="-")m_final=cur1d-cur2d;elseif(opp=="*")m_final=cur1d*cur2d;elseif(opp=="/"){if(cur2d!=0.0)m_final=cur1d/cur2d;elsem_final=cur1d;}elseif(opp=="^"){for(i=1,current=cur1d;i<cur2d;i++)cur1d*=current;m_final=cur1d;}opp="";cur1d=m_final;m_result="";}else//当选项为扩展的计算器时{pushs(cur1);while(c_top!=-1){if(Topc()!="("){pushs(Topc());popc();}else{m_result="输入有误!!!";UpdateData(false);return;}}while(s_top!=-1){if(Tops()=="")pops();else{pushc(Tops());pops();}}//c_stack中存放的是后缀表达式;while(c_top!=-1){pushs(Topc());popc();if(Tops()=="+"){pops();CString a="";cur2d=atof(Tops());pops();cur1d=atof(Tops());pops();cur1d+=cur2d;a.Format("%f",cur1d);pushs(a);}elseif(Tops()=="-"){pops();CString a="";cur2d=atof(Tops());pops();cur1d=atof(Tops());pops();cur1d-=cur2d;a.Format("%f",cur1d);pushs(a);}elseif(Tops()=="*"){pops();CString a="";cur2d=atof(Tops());pops();cur1d=atof(Tops());pops();cur1d*=cur2d;a.Format("%f",cur1d);pushs(a);}elseif(Tops()=="/"){pops();CString a="";cur2d=atof(Tops());pops();cur1d=atof(Tops());pops();cur1d/=cur2d;a.Format("%f",cur1d);pushs(a);}}/////////////////////////////////if(s_top!=0){m_result="输入有误!!!";UpdateData(false);return;}elsem_final=atof(Tops());}//======================================================= UpdateData(FALSE);}void CMyDlg::OnButton1(){// TODO: Add your control notification handler code hereif(flag==false)m_result+="1";else{m_String+="1";cur1+="1";}UpdateData(FALSE);}void CMyDlg::OnButton2(){// TODO: Add your control notification handler code hereif(flag==false)m_result+="2";else{m_String+="2";cur1+="2";}UpdateData(FALSE);}void CMyDlg::OnChangeEdit1(){// TODO: If this is a RICHEDIT control, the control will not// send this notification unless you override the CDialog::OnInitDialog()// function and call CRichEditCtrl().SetEventMask()// with the ENM_CHANGE flag ORed into the mask.// TODO: Add your control notification handler code here}void CMyDlg::OnButton4(){// TODO: Add your control notification handler code here if(flag==false)m_result+="3";else{m_String+="3";cur1+="3";}UpdateData(FALSE);}void CMyDlg::OnButton5(){// TODO: Add your control notification handler code here if(flag==false)m_result+="4";else{cur1+="4";m_String+="4";}UpdateData(FALSE);}void CMyDlg::OnButton6(){// TODO: Add your control notification handler code here if(flag==false)m_result+="5";else{cur1+="5";m_String+="5";} UpdateData(FALSE);}void CMyDlg::OnButton7(){// TODO: Add your control notification handler code here if(flag==false)m_result+="6";else{m_String+="6";cur1+="6"; }UpdateData(FALSE);}void CMyDlg::OnButton8(){// TODO: Add your control notification handler code here if(flag==false)m_result+="7";else{cur1+="7";m_String+="7";}UpdateData(FALSE);}void CMyDlg::OnButton9(){// TODO: Add your control notification handler code here if(flag==false)m_result+="8";else{cur1+="8";m_String+="8";}UpdateData(FALSE);}void CMyDlg::OnButton10(){// TODO: Add your control notification handler code here if(flag==false)m_result+="9";else{m_String+="9";cur1+="9";}UpdateData(FALSE);}void CMyDlg::OnButton11(){ if(flag==false){ count++;if(count==1)cur1d=atof(m_result);opp="+";m_result="";}//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ else//扩展运算中操作符的作用{m_String+="+";pushs(cur1);//转换为后缀表达式if(c_top==-1)pushc("+");elseif(Topc()=="(")pushc("+");else{while(true){if(c_top==-1)break;if(Topc()=="(")break;pushs(Topc());popc();}pushc("+");}cur1="";}// TODO: Add your control notification handler code hereUpdateData(FALSE);}//----------------------------------------------------------------------------------------- void CMyDlg::OnButton12(){if(flag==false){count++;if(count==1)cur1d=atof(m_result);opp="-";m_result="";}else{m_String+="-";pushs(cur1);//转换为后缀表达式if(c_top==-1)pushc("-");elseif(Topc()=="(")pushc("-");else{while(true){if(Topc()=="(")break;if(c_top==-1)break;pushs(Topc());popc();}pushc("-");}cur1="";}UpdateData(FALSE);// TODO: Add your control notification handler code here}//*********************************************************** void CMyDlg::OnButton13(){if(flag==false){count++;if(count==1)cur1d=atof(m_result);opp="*";m_result="";}else{m_String+="*";pushs(cur1);if(c_top==-1)pushc("*");else //符号栈不为空的情况while(true){if(Topc()=="+"){pushc("*");break;}if(Topc()=="-"){pushc("*");break;}if(Topc()=="*"){pushs(Topc());popc();}if(Topc()=="/"){pushs(Topc());popc();}if(c_top==-1||Topc()=="("){pushc("*");break;}}cur1="";}UpdateData(FALSE);// TODO: Add your control notification handler code here}///////////////////////////////////////////////////////////////////////////////////////////// void CMyDlg::OnButton14(){if(flag==false){count++;if(count==1)cur1d=atof(m_result);opp="/";m_result="";}else{m_String+="/";pushs(cur1);if(c_top==-1)pushc("/");elsewhile(true){if(Topc()=="+"){pushc("/");break;}if(Topc()=="-"){pushc("/");break;}if(Topc()=="*"){pushs(Topc());popc();}if(Topc()=="/"){pushs(Topc());popc();}if(c_top==-1||Topc()=="("){pushc("/");break;}}cur1="";}UpdateData(FALSE);// TODO: Add your control notification handler code here }void CMyDlg::On_Pot(){if(flag==false)m_result+=".";else{cur1+=".";m_String+=".";}UpdateData(false);// TODO: Add your control notification handler code here }void CMyDlg::On_0(){if(flag==false)m_result+="0";else{ cur1+="0";m_String+="0";}UpdateData(false);// TODO: Add your control notification handler code here }void CMyDlg::Ongenhao(){if(flag==false){count++;if(count==1)cur1d=atof(m_result);m_result="";if(cur1d>=0.0){m_final=double(sqrt(cur1d));cur1d=m_final;}elsem_final=cur1d;}UpdateData(false);// TODO: Add your control notification handler code here }void CMyDlg::OnMiOption(){if(flag==false){count++;if(count==1)cur1d=atof(m_result);opp="^";m_result="";}UpdateData(false);// TODO: Add your control notification handler code here}//CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC void CMyDlg::OnClear() //清空所有变量{m_final=0.0;count=0;cur1d=0.0;cur2d=0.0;cur1="";cur2="";m_String="";c_top=-1;s_top=-1;UpdateData(false);m_result="";// TODO: Add your control notification handler code here }void CMyDlg::OnR1(){// TODO: Add your control notification handler code hereflag=false;UpdateData(false);}void CMyDlg::OnR2(){// TODO: Add your control notification handler code here flag=true;UpdateData(false);}CString CMyDlg::Topc(){return c_stack[c_top];}CString CMyDlg::Tops(){return S[s_top];}void CMyDlg::pushc(CString in){ c_top++;c_stack[c_top]=in;}void CMyDlg::pushs(CString in){ s_top++;S[s_top]=in;}void CMyDlg::popc(){c_top--;}void CMyDlg::pops(){s_top--;}void CMyDlg::OnL()//输入左括号{if(flag==true)//为扩展的计算器时方为有效{m_String+="(";pushc("(");cur1="";}UpdateData(false);// TODO: Add your control notification handler code here }void CMyDlg::OnR(){if(flag==true){m_String+=")";pushs(cur1);int count=0;for(int i=0;i<c_top;i++){if(c_stack[i]=="(")break;}if(i==c_top)//没有找到左括号{m_result="输入错误!!!";UpdateData(false);return;}else{while(Topc()!="("){pushs(Topc());popc();}popc();//弹出左括号cur1="";}}UpdateData(false);// TODO: Add your control notification handler code here }。
Windows程序设计作业报告设计题目:MFC计算器系别:信息与自动化工程专业:电子与通信工程姓名:高小雨学号:2013704011一、设计目的及要求1.1设计目的能够熟练掌握MFC中的各个控件,消息的处理与添加,能够独立完成一些简单的算法,并且能够具体实现一些功能,真正可以利用功能比较强大的MFC 编译出较好的程序代码。
本设计完成的是一个具有比较齐全运算功能的计算器。
1.2设计要求利用Microsoft Visual C++的MFC制作一个多功能计算器,要求:(1)能够实现最基本的加、减、乘、除四则基本运算;(2)添加了计算类型,分别是弧度制、度数制;(3)界面有正负、清空、等于方便用户计算使用;(4)重点是此计算器具有倒数、多次方、开方、三角函数、反三角函数、指数、阶乘等高级运算。
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视图中画好界面,主要使用的菜单中的相关控件,并合理布置各个按钮的位置,使界面更加整洁。
在各个控件的属性里依次定义好名称,之后屏幕显示的就是如图一样的可视计算器界面:三、课程设计内容3.1 概要设计依次将各个功能按钮设置相关的ID和控件类,一下为各类按键的一个举例,以下为数字0的属性设置,及其ID和标题名称,其余数字键属性设置与其相似。
计算器实验报告2013年6月11日星期二系统设计要求用MFC制作一个计算器,它能在实数范围内进行加、减、乘、除运算。
在运算时要考虑运算符的优先顺序。
要求能显示输入的算式和输出的结果。
设计思路充分利用CString 的功能:1.读入表达式在该过程中,只需要考虑会输入哪些算式,不需要考虑算式的合理性。
2.解析表达式2.1 将CString类的表达式转化为易操作的char类字符数组。
2.2 在运算时,要区分运算符和数字,将它们分别存到两个数组中,由于加减乘除运算符都是二元的,所以数字的个数一定比运算符的个数多一个。
3. 运算3.1 在运算时,第i 个运算符要做的是将第i 个数字与第i+1个数字相运算,运算完后将值赋给第i 个数字,而i 后面的每一个数字都可以往前面挪一个;运算符自运算过的运算符后的每一个都可以往前挪一个。
形象地表示为:在进行一次运算后,若后面补过来的运算符是与它同等级的,则此时的i 依旧没变,所以再对该i 进行运算。
3.2 运算符的优先级。
乘除的优先级大于加减,所以先对乘除进行以上的计算,同样同等级的i 不变,若变化后的b[i]不为乘除,则i++,看下一个运算符。
4.附加功能4.1 括号括号采用递归运算。
运算的函数得到一个CString类型的形参,返回一个float 型的值。
要处理括号,则截取括号里的字符串,递归调用运算的函数,将返回的值存到float 型的数组中去。
4.2 三角函数,指数函数,对数函数采用和括号相类似的方式,在解析时,若读到有三角函数,则递归计算三角函数括号内的式子,将返回的值用<cmath>中的函数计算。
4.3十进制与十六进制的转换将十六进制转化为十进制,只要从左向右,第i个数字乘以16的i-1次幂即可;将十进制转化为十六进制,则要将对16取模,再将得到的char数组倒置一下。
系统功能模块图系统流程图类的层次图关键程序代码1.显示输入UpdateData(true);m_strInput+="0";UpdateData(false);2.将CString转化为字符数组const int len=m_strInput.GetLength();char m[100];memcpy(m,m_strInput,len);3.将存在字符数组的数字转为float型数字存在float型的数组里for(i=0;i<len;){int c=0,j=i;if(m[j]>='0'&&m[j]<='9'){while(m[j]>='0'&&m[j]<='9'){num[countNum]=num[countNum]*10+(m[j]-'0');j++;c++;} //没有小数点的读法if(m[j]=='.'){c++;float t=static_cast<float>(0.1);j++;while((m[j]-'0'>=0)&&(m[j]-'0'<=9)){num[countNum]+=t*static_cast<float>(m[j]-'0');t*=static_cast<float>(0.1);j++;c++;}} //有小数点countNum++;}//取数字4.取运算符if(m[i]=='+'||m[i]=='-'||m[i]=='*'||m[i]=='/'){op[countOperator]=m[i];c++;countOperator++;} //取运算符5.运算(以乘法为例)for(i=0;i<countOperator;) //先计算乘除{if(op[i]=='*'||op[i]=='/'){if(op[i]=='*'){count1++;num[i]*=num[i+1];op[i]=op[i+1];int j;for(j=i+1;j<countNum-1;j++) //每算完一次后该数字后面的数字都往前挪一个,运算符也都往前挪一个{num[j]=num[j+1];}num[j]=0;for(j=i+1;j<countOperator-1;j++){op[j]=op[j+1];}op[j]='0';}}elsei++;6.遇括号和cmath中的函数递归(以括号为例)CString b=a;b = b.Left(b.Find(')'));b = b.Right(b.GetLength()-1-b.ReverseFind('('));num[countNum]=Processing(b);c+=2+b.GetLength();countNum++;7.左右括号不符合报错if(m_strInput.Find('(')*m_strInput.ReverseFind(')')<0)AfxMessageBox("Syntax Error!");总结1.功能:该计算器能在实数范围内进行加减乘除四则混合运算,并通过加括号改变运算次序,能计算三角函数值(弧度制),能计算指数函数和对数函数(以e为底),能将数字在十进制与十六进制间进行转化。
信息科学与技术学院《程序设计基础》课程设计报告题目名称: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 课程设计总结通过这次课程设计,我又收获到很多,平时的在做作业时,因为题形与结构都是很简单的,并且每一章的内容都是有相应的例题可以参考,所以在做题时没有遇到过很麻烦的问题,而这次不同了,一个课题拿到手时,给我的感觉是无从下手,而且要求很多,使得题目要求更大了。