MFC简单计算器设计正文
简单MFC程序设计(编写一个小型计算器)

if(dotflag==1) {
quan= quan*10; m_Num += 0 / (double)quan; } else { if(numflag==1) {
m_Num = m_Num * 10 + 0; } else m_Num = 0; } numflag = 1; mark=1; UpdateData(FALSE); } void CTestDlg::OnButtonZhengfu() { UpdateData(); m_Num = 0-m_Num; UpdateData(FALSE); } void CTestDlg::OnButtonDengyu()
m_Num = m_Num * 10 + 8; } else m_Num = 8; } numflag = 1; mark=1; UpdateData(FALSE); } void CTestDlg::OnButtonNum9()
5
{ if(dotflag==1) { quan= quan*10; m_Num += 9 / (double)quan; } else { if(numflag==1) { m_Num = m_Num * 10 + 9; } else m_Num = 9; } numflag = 1; mark=1; UpdateData(FALSE);
是否为数字的 int 型标志 mark。
c) 然后考虑到在计算过程中 num1 和 num2 的储存状态有三种,num1==0 和
num2==0,也就是程序开始运行还没有开始录入数字的状态;num1!=0 和
num2==0,也就是第一个数字已经录入,第二个数字还没有录入的状态这时
mfc计算器程序设计详细

mfc计算器程序设计详细
MFC是Microsoft基础类的缩写,用于Windows下的GUI程序开发,封装了许多常用的功能,其中包括控件、多线程、消息传递等等。
下面我们将基于MFC来编写一个简单的计算器程序。
首先,我们需要创建一个MFC应用程序并添加一个对话框。
然后,我们需要在对话框中添加各种控件,比如按钮、文本框、标签等等。
在这个例子中,我们需要添加数字按钮、运算符按钮和一个显示结果
的文本框。
接着,我们需要定义各种事件函数,比如数字按钮的点击事件、
运算符按钮的点击事件等等。
在这些事件函数中,我们需要根据相应
的操作完成对应的计算,并将结果显示到文本框中。
当然,我们还需
要处理一些特殊情况,比如输入非法字符、除以0等等。
最后,我们需要将所有的控件和事件函数进行绑定,使得程序能
够正常地运行。
这个过程中,我们将使用MFC提供的消息映射机制来
处理鼠标和键盘事件,以及相应的消息传递机制来更新界面。
总之,在MFC的帮助下编写一个计算器程序不仅方便快捷,而且
代码逻辑清晰,可读性好。
mfc计算器的设计报告

MFC计算器课程设计题目: MFC计算器设计学院:计算机学院姓名:学号:指导教师:2015年5月20日目录1概述 (3)1.1课程设计目的 (3)1.2课程设计内容 (3)2系统需求分析 (4)2.1系统目标 (4)2.2主体功能 (4)2.3开发环境 (4)3系统概要设计 (4)3.1系统功能划 (4)4系统详细设计 (7)4.1 设计步骤 (7)4.2 界面设计 (9)5测试 (11)5.1 测试方案 (11)5.2 测试结果 (12)6小结 (14)参考文献 (14)附录 (15)附录1源程序清单 (15)计算器的设计1概述1.1 课程设计目的1、巩固并加深学生对C++语言程序设计知识的理解;2、培养学生面向对象的程序设计思想,使学生认识面向过程和面向对象两种设计方法的区别;3、进一步掌握和应用VC++ 6.0集成开发环境;4、提高运用C++语言解决实际问题的能力;5、初步掌握开发小型实用软件的基本方法,能独立设计、实现基本的MIS系统;6、掌握书写程序设计开发文档的能力(书写课程设计实验报告)。
1.2 课程设计内容课题名称:计算器的实现说明:实现一个计算器。
要求:用“计算器”的标准视图执行简单的计算。
32系统需求分析2.1 系统目标我们在学习生活中,常会遇到一些繁杂的数值运算,这时候我们就必须用到科学计算器,所以便着手开发了这个计算器程序,以便用于自己的学习工作。
要计算功能有以下几个方面:加法,减法,乘法,除法,乘方。
2.2 主体功能十进制数的加、减、乘、除、乘方简单计算。
2.3 开发环境W indows操作系统,VC++ 6.0, OFFICE WORD3 系统概要设计3.1 系统功能划表3-1 系统功能表1)假设执行操作“+”,先输入一个数,再输入“+”,再输入另一个数,最后输入“+”。
整个功能“+”就执行完毕。
4四则代码如下void CCALDlg::OnButtonequal(){// TODO: Add your control notification handler code here UpdateData(TRUE);num2 =m_str;if(num2==0&&ope==3){m_str1="除数不能为零";m_str =0;num1 = 0;num2 = 0;UpdateData(FALSE);}else{// int f = 0;switch (ope){//加case 0:m_str = num1 + num2;break;//减case 1:m_str = num1 - num2;break;5case 2:m_str = num1 * num2;break;case 3:m_str = num1 / num2;break;case 4:m_str = num1 * num1;}UpdateData(FALSE);}64系统详细设计4.1 设计步骤打开Microsoft Visual C++ 6.0,在文件中点击新建,在弹出框内选择MFC AppWizard[exe]工程,输入工程名yeyahui及其所在位置,点击确定,如图4-1所示。
计算器程序设计.C++_MFC

课程设计报告课程名称:VC++课程设计设计题目:计算器专业班级:通信工程1202班*名:**学号:*********时间:2015年7月14日指导教师:***目录1.课程设计的要求 (3)2.功能描述 (3)3.设计步骤 (3)4.运算流程图 (7)5.运行效果与不足 (8)6.总结 (9)7.参考文献及开发环境 (9)附录:程序代码 (9)简易计算器(MFC)1.课程设计的要求多功能计算器:要求所编写的的计算器能够完成加、减、乘、除、基本函数的运算,类似于Windows附件中的计算器。
2.功能描述(1)包含的功能有:加、减、乘、除运算,开方、倒数、求余等功能。
(2)计算器上数字0—9为一个控件数组,加、减、乘、除为一个控件数组,其余为单一的控件。
(3)输入的原始数据、运算中间数据和结果都显示在窗口顶部的同一个标签中。
(4)计算功能基本上是用系统内部函数。
(5)“0”不能做除数。
(6)“Backspace”按钮可以清除上一次输入的数据,“Clear”按钮可以清除所有已输入的数据从头计算。
3. 设计步骤(1)选择FileNewlProject命令,选择MFC AppWizard(exe)创建Project名为“计算器”,按确定。
在弹出界面选择创建对话框,单击“完成”按钮。
(2)在生成的设计界面中加入控件,得到计算器应用界面。
如图:(3)为控件编辑框编辑ID,如图:按钮名称ID 用途0 IDC_BUTTON_0 按键01 IDC_ BUTTON_1 按键12 IDC_ BUTTON_2 按键23 IDC_ BUTTON_3 按键34 IDC_ BUTTON_4 按键45 IDC_ BUTTON_5 按键56 IDC_ BUTTON_6 按键67 IDC_ BUTTON_7 按键78 IDC_ BUTTON_8 按键89 IDC_ BUTTON_9 按键9. IDC_ BUTTONpt 按键.(4)进入ClassWizard界面选择Message Maps为控件插入消息映射,插入消息函数,实现控件命令功能。
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)可以把数据传到文本框里面,小数点与数字同样这样处理。
基于mfc的计算器设计文档

工程名称:calculator学院:信息科学与工程学院班级:计本08-1班姓名:明康注学号:3081817131开始时间:2010-11-13完成时间:2010-12-04一、需求分析使用面向对象编程语言(MFC)设计一个计算器,点击各按钮将按钮所对应的信息显示在编辑框中,可以进行十进制下的四则运算(加、减、乘、除)和清零及删减等功能,当遇到错误输入时(即不能形成一个算术表达式时或其他情况下),提示错误信息。
二、项目概要与详细设计1、项目概要添加类CCalculatorDlg来为各个按钮添加响应函数,完成对算术表达式的输入,添加类CCalculate分析所输入的表达式,完成十进制下的四则运算(加、减、乘、除),内包含小数点,括号等符号,含有清零,删减等功能。
2、详细设计本程序采用MFC编程语言开发,利用MFC编程语言的布局管理器设计所需要的界面,并利用MFC的事件监听处理机制对用户请求的事件进行处理,以及响应用户的操作。
代码简洁,易维护,易扩展,可读性强。
主界面如下:此界面风格简洁,为科学计算,实现功能清晰明了,对于一般运算均能胜任,为用户基本运算所用。
三、关键函数或功能的实现步骤或思路1、关键函数(1)、按钮响应函数:void CCalculatorDlg::OnBadd() //按下+按钮void CCalculatorDlg::OnBdiv() //按下÷按钮void CCalculatorDlg::OnBflo() //按下. 按钮void CCalculatorDlg::OnBmul() //按下×按钮void CCalculatorDlg::OnBsub() //按下- 按钮void CCalculatorDlg::OnBval() //按下= 按钮void CCalculatorDlg::OnButton0() //按下数字0按钮void CCalculatorDlg::OnButton1() //按下数字1按钮void CCalculatorDlg::OnButton2() //按下数字2按钮void CCalculatorDlg::OnButton3() //按下数字3按钮void CCalculatorDlg::OnButton4() //按下数字4按钮void CCalculatorDlg::OnButton5() //按下数字5按钮void CCalculatorDlg::OnButton6() //按下数字6按钮void CCalculatorDlg::OnButton7() //按下数字7按钮void CCalculatorDlg::OnButton8() //按下数字8按钮void CCalculatorDlg::OnButton9() //按下数字9按钮void CCalculatorDlg::OnBclear() //按下“清零”按钮void CCalculatorDlg::OnBbackspace() //按下“←”按钮void CCalculatorDlg::OnButton10() //按下“(“按钮void CCalculatorDlg::OnButton11() //按下“)”按钮(2)、字符串处理函数:void CCalculate::init() //初始化编辑框int CCalculate::yylex() // 词法分析,读入一个记号void CCalculate::Match(int t) // 匹配函数,若当前记号与参数相//则读入下一个记号2、实现步骤(简易步骤)按下“等号”按钮响应void CCalculatorDlg::OnBval()函数,判断编辑框中的输入串是否为空,若为空,则按下“等号”按钮后,编辑框消息映射变量m_result赋为空,若不为空,则调用E(),E()、E_()、T()、S()、T_()、G()、S_()、F()、G_()、Match()、yylex()等函数嵌套、递归调用来分析输入串,判断输入算术表达式是否有错误,若有错误,则在编辑框中输出“ERROR!!!”,若无错误,则输入运算结果显示到编辑框中。
MFC_的简易计算器程序设计

MFC 课程设计——简易计算器程序设计FCL指导老师:东南大学机械工程学院2009-10-12目录摘要 (3)Abstract (4)第一章绪论 (5)1.1 引言 (5)1.2 MFC主要的界面风格 (6)1.3 基于对话框设计的技术 (6)第二章程序设计 (7)2.1 计算器基本功能的需求 (7)2.2 计算器具体功能介绍 (7)2.3 详细设计的类 (8)第三章程序具体实现代码及步骤 (11)3.1 开始步骤 (11)3.2 对话框设计,变量关联 (11)3.3 加入的代码 (13)第四章运行实例 (31)结论 (34)致谢 (34)参考文献(References) (34)附录 (35)简易计算器程序设计摘要摘要内容(中文):通过MFC Windows 可以设计出许多的应用程序。
计算器是其中一个简单的,也是非常实用的应用程序。
此计算器可以进行+、-、×、÷、、sin、cos、tan、arcsin、arccos、arctan(输入,输出结果以度为单位)、、、、log、ln、。
关键词(中文):MFC,计算器,基本运算The Design of a Simple and Easy CalculatorAbstractAbstract (English):Through MFC, many programs can be designed. Calculator is just a simple and practical program. This calculator can operate +、-、×、÷、、sin、cos、tan、arcsin、arccos、arctan、、、、log、ln、、vector operations and imaginary number operations.Key words:MFC, Calculator, Basic operations, Vector operations, Imaginary number operations第一章绪论1.1 引言MFC,微软基础类(Microsoft Foundation Classes),是一种Application Framework,随微软Visual C++ 开发工具发布。
MFC实现简易计算器

MFC实现简易计算器©Free Copy操作简便,还有帮助提示,支持double类型的数据进行运算,显示清除无效0. By: 杜运福计算器类结构如下:class CCalculatorDlg : public CDialog{// Constructionpublic:CCalculatorDlg(CWnd* pParent = NULL); // standard constructor// Dialog Data//{{AFX_DA TA(CCalculatorDlg)enum { IDD = IDD_CALCULA TOR_DIALOG };double m_Num;//}}AFX_DA TAdouble num1,num2; //第一、二操作数char cal; //运算符号BYTE dotflag; //小数点标志BYTE numflag; //键入数字标志long quan2; //小数部分权值// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CCalculatorDlg)protected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL// Implementationprotected:HICON m_hIcon;// Generated message map functions//{{AFX_MSG(CCalculatorDlg)virtual BOOL OnInitDialog();afx_msg void OnSysCommand(UINT nID, LPARAM lParam);afx_msg void OnPaint();afx_msg HCURSOR OnQueryDragIcon();afx_msg void OnNum0();afx_msg void OnNum1();afx_msg void OnNum2();afx_msg void OnNum3();afx_msg void OnNum4();afx_msg void OnNum5();afx_msg void OnNum6();afx_msg void OnNum7();afx_msg void OnNum8();afx_msg void OnNum9();afx_msg void OnAdd();afx_msg void OnSub();afx_msg void OnMul();afx_msg void OnDiv();afx_msg void OnEqual();afx_msg void OnSign();afx_msg void OnInv();afx_msg void OnMod();afx_msg void OnSqrt();afx_msg void OnDot();afx_msg void OnClear();afx_msg void OnBackspace();afx_msg void OnHelp();//}}AFX_MSGDECLARE_MESSAGE_MAP()};完整实现代码如下:// CalculatorDlg.cpp : implementation file///****************************************************************************** *********** 简易计算器***** by 追梦2011-4-18******************************************************************************* *****/#include "stdafx.h"#include "Calculator.h"#include "CalculatorDlg.h"#include "math.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif/////////////////////////////////////////////////////////////////////////////// CAboutDlg dialog used for App Aboutclass CAboutDlg : public CDialog{public:CAboutDlg();// Dialog Data//{{AFX_DA TA(CAboutDlg)enum { IDD = IDD_ABOUTBOX };//}}AFX_DA TA// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CAboutDlg)protected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support//}}AFX_VIRTUAL// Implementationprotected://{{AFX_MSG(CAboutDlg)//}}AFX_MSGDECLARE_MESSAGE_MAP()};CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD){//{{AFX_DA TA_INIT(CAboutDlg)//}}AFX_DA TA_INIT}void CAboutDlg::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);//{{AFX_DA TA_MAP(CAboutDlg)//}}AFX_DA TA_MAP}BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)//{{AFX_MSG_MAP(CAboutDlg)// No message handlers//}}AFX_MSG_MAPEND_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// CCalculatorDlg dialogCCalculatorDlg::CCalculatorDlg(CWnd* pParent /*=NULL*/): CDialog(CCalculatorDlg::IDD, pParent){//{{AFX_DA TA_INIT(CCalculatorDlg)m_Num = 0.0;//}}AFX_DA TA_INIT// Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);}void CCalculatorDlg::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);//{{AFX_DA TA_MAP(CCalculatorDlg)DDX_Text(pDX, IDC_Num, m_Num);//}}AFX_DA TA_MAP}BEGIN_MESSAGE_MAP(CCalculatorDlg, CDialog) //{{AFX_MSG_MAP(CCalculatorDlg)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_Num0, OnNum0)ON_BN_CLICKED(IDC_Num1, OnNum1)ON_BN_CLICKED(IDC_Num2, OnNum2)ON_BN_CLICKED(IDC_Num3, OnNum3)ON_BN_CLICKED(IDC_Num4, OnNum4)ON_BN_CLICKED(IDC_Num5, OnNum5)ON_BN_CLICKED(IDC_Num6, OnNum6)ON_BN_CLICKED(IDC_Num7, OnNum7)ON_BN_CLICKED(IDC_Num8, OnNum8)ON_BN_CLICKED(IDC_Num9, OnNum9)ON_BN_CLICKED(IDC_Add, OnAdd)ON_BN_CLICKED(IDC_Sub, OnSub)ON_BN_CLICKED(IDC_Mul, OnMul)ON_BN_CLICKED(IDC_Div, OnDiv)ON_BN_CLICKED(IDC_Equal, OnEqual)ON_BN_CLICKED(IDC_Sign, OnSign)ON_BN_CLICKED(IDC_Inv, OnInv)ON_BN_CLICKED(IDC_Mod, OnMod)ON_BN_CLICKED(IDC_Sqrt, OnSqrt)ON_BN_CLICKED(IDC_Dot, OnDot)ON_BN_CLICKED(IDC_Clear, OnClear)ON_BN_CLICKED(IDC_Backspace, OnBackspace) ON_BN_CLICKED(IDC_Help, OnHelp)//}}AFX_MSG_MAPEND_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// CCalculatorDlg message handlers//////////////////////////////////////////////////////////////////////////// BOOL CCalculatorDlg::OnInitDialog(){CDialog::OnInitDialog();// Add "About..." menu item to system menu.// IDM_ABOUTBOX must be in the system command range.ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX < 0xF000);CMenu* pSysMenu = GetSystemMenu(FALSE);if (pSysMenu != NULL){CString strAboutMenu;strAboutMenu.LoadString(IDS_ABOUTBOX);if (!strAboutMenu.IsEmpty()){pSysMenu->AppendMenu(MF_SEPARA TOR);pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);}}// Set the icon for this dialog. The framework does this automatically// when the application's main window is not a dialogSetIcon(m_hIcon, TRUE); // Set big iconSetIcon(m_hIcon, FALSE); // Set small icon// TODO: Add extra initialization herequan2 = 1;dotflag = 0;numflag = 0;return TRUE; // return TRUE unless you set the focus to a control}void CCalculatorDlg::OnSysCommand(UINT nID, LPARAM lParam){if ((nID & 0xFFF0) == IDM_ABOUTBOX){CAboutDlg dlgAbout;dlgAbout.DoModal();}else{CDialog::OnSysCommand(nID, lParam);}}// If you add a minimize button to your dialog, you will need the code below// to draw the icon. For MFC applications using the document/view model,// this is automatically done for you by the framework.void CCalculatorDlg::OnPaint(){if (IsIconic()){CPaintDC dc(this); // device context for paintingSendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);// Center icon in client rectangleint cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;// Draw the icondc.DrawIcon(x, y, m_hIcon);}else{CDialog::OnPaint();}}// The system calls this to obtain the cursor to display while the user drags// the minimized window.HCURSOR CCalculatorDlg::OnQueryDragIcon(){return (HCURSOR) m_hIcon;}//键入0void CCalculatorDlg::OnNum0(){UpdateData();if(dotflag){quan2 *= 10;m_Num += 0 / (double)quan2;}else{if(numflag){m_Num = m_Num * 10 + 0;}else m_Num = 0;}numflag = 1;UpdateData(FALSE);}//键入 1void CCalculatorDlg::OnNum1(){UpdateData();if(dotflag){quan2 *= 10;m_Num += 1 / (double)quan2;}else{if(numflag){m_Num = m_Num * 10 + 1;}else m_Num = 1;}numflag = 1;UpdateData(FALSE);}//键入 2void CCalculatorDlg::OnNum2(){UpdateData();if(dotflag){quan2 *= 10;m_Num += 2 / (double)quan2;}else{if(numflag){m_Num = m_Num * 10 + 2;}else m_Num = 2;}numflag = 1;UpdateData(FALSE);}//键入 3void CCalculatorDlg::OnNum3(){UpdateData();if(dotflag){quan2 *= 10;m_Num += 3 / (double)quan2;}else{if(numflag){m_Num = m_Num * 10 + 3;}else m_Num = 3;}numflag = 1;UpdateData(FALSE);}//键入 4void CCalculatorDlg::OnNum4(){UpdateData();if(dotflag){quan2 *= 10;m_Num += 4 / (double)quan2;}else{if(numflag){m_Num = m_Num * 10 + 4;}else m_Num = 4;}numflag = 1;UpdateData(FALSE);}//键入 5void CCalculatorDlg::OnNum5(){UpdateData();if(dotflag){quan2 *= 10;m_Num += 5 / (double)quan2;}else{if(numflag){m_Num = m_Num * 10 + 5;}else m_Num = 5;}numflag = 1;UpdateData(FALSE);}//键入 6void CCalculatorDlg::OnNum6(){UpdateData();if(dotflag){quan2 *= 10;m_Num += 6 / (double)quan2;}else{if(numflag){m_Num = m_Num * 10 + 6;}else m_Num = 6;}numflag = 1;UpdateData(FALSE);}//键入7void CCalculatorDlg::OnNum7(){UpdateData();if(dotflag){quan2 *= 10;m_Num += 7 / (double)quan2;}else{if(numflag){m_Num = m_Num * 10 + 7;}else m_Num = 7;}numflag = 1;UpdateData(FALSE);}//键入8void CCalculatorDlg::OnNum8(){UpdateData();if(dotflag){quan2 *= 10;m_Num += 8 / (double)quan2;}else{if(numflag){m_Num = m_Num * 10 + 8;}else m_Num = 8;}numflag = 1;UpdateData(FALSE);}//键入9void CCalculatorDlg::OnNum9(){UpdateData();if(dotflag){quan2 *= 10;m_Num += 9 / (double)quan2;}else{if(numflag){m_Num = m_Num * 10 + 9;}else m_Num = 9;}numflag = 1;UpdateData(FALSE);}//键入+void CCalculatorDlg::OnAdd(){UpdateData();num1 = m_Num;cal = '+';numflag = 0;dotflag = 0;quan2 = 1;}//键入-void CCalculatorDlg::OnSub(){UpdateData();num1 = m_Num;cal = '-';numflag = 0;dotflag = 0;quan2 = 1;}//键入*void CCalculatorDlg::OnMul(){UpdateData();num1 = m_Num;cal = '*';numflag = 0;dotflag = 0;quan2 = 1;}//键入/void CCalculatorDlg::OnDiv(){UpdateData();num1 = m_Num;cal = '/';numflag = 0;dotflag = 0;quan2 = 1;}//键入%void CCalculatorDlg::OnMod(){UpdateData();num1 = m_Num;cal = '%';numflag = 0;dotflag = 0;quan2 = 1;}//键入=void CCalculatorDlg::OnEqual(){UpdateData();num2 = m_Num;switch(cal){case '+': m_Num = num1 + num2; break;case '-': m_Num = num1 - num2; break;case '*': m_Num = num1 * num2; break;case '/': m_Num = num1 / num2; break;case '%': m_Num = (int)num1 % (int)num2; break;}numflag = 0;dotflag = 0;quan2 = 1;UpdateData(FALSE);}//键入+/-void CCalculatorDlg::OnSign(){UpdateData();m_Num = 0 - m_Num;UpdateData(FALSE);}//键入1/xvoid CCalculatorDlg::OnInv(){UpdateData();m_Num = 1 / m_Num;numflag = 0;dotflag = 0;quan2 = 1;UpdateData(FALSE);}//键入sqrtvoid CCalculatorDlg::OnSqrt(){UpdateData();m_Num = sqrt(m_Num);numflag = 0;dotflag = 0;quan2 = 1;UpdateData(FALSE);}//键入'.' 小数点void CCalculatorDlg::OnDot(){UpdateData();dotflag = 1;m_Num += 0.0;UpdateData(FALSE);}void CCalculatorDlg::OnClear(){UpdateData();m_Num = 0;num1 = 0;num2 = 0;numflag = 0;dotflag = 0;quan2 = 1;UpdateData(FALSE);}//撤销之前键入的数,可以依次撤销所有整数位或小数位void CCalculatorDlg::OnBackspace(){UpdateData();static int dotquan = quan2; //一次初始化long temp;if(dotflag && numflag) //撤销小数部分{if(dotquan >= 10){temp = (long)(m_Num * dotquan);m_Num= (double)(temp/10);dotquan /= 10;m_Num= m_Num / dotquan;}}else //撤销整数部分{if(numflag && m_Num){ m_Num = (long)m_Num /10;}}UpdateData(FALSE);}//帮助提示void CCalculatorDlg::OnHelp(){const char tipname[]="简易计算器帮助by 追梦";MessageBox("\t简易计算器\tby追梦\n\n 只用一个文本编辑框,用于输入和输出,接受粘贴或键盘输入。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
}
7、表达式求值函数
voidCfengwanjincalculatorDlg::calculator();
flagdian=1;
}
flaglast=0;
}
UpdateData(FALSE);
}
voidCfengwanjincalculatorDlg::sincos()
{
if(nextdata[2*(int)nextdata[0]-1]==Sin)
break;
case33:
num[0]++;
num[(int)num[0]]=nextdata[2*(int)nextdata[0]];
nextdata[2*(int)nextdata[0]-1]=0;
nextdata[0]--;
mystr=()-1);
break;
case94:
mizhi[mizhi[0]]=0;
1、Windows编程中可能会遇到可能会遇到各种编译问题,例如编译环境的设置,具体函数的调用。同时Windows为程序员提供了大量的库函数,在具体实践的过程中,要充分利用书籍和网络查阅相关函数和环境设置,减轻编程负担。
2、考虑到编程的难度,首先编写了未设置优先级的表达式运算,后又通过在原先程序的基础上,编写了设置优先级的程序。由于两种方式在算法设计上有很大不同,导致了程序改进的困难。
bool
错误标志位
Jiajian
int
存储加减运算符的位置
4)添加事件处理程序
MFC应用程序是通过消息响应来进行各项操作的,必须在对话类中加入消息处理函数来处理这些事件。当点击相应控件,在进入WinMain函数之前,每个可以响应消息的MFC类都生成了一个消息映射表,程序运行时通过查询该表判断是否需要响应某条消息。
5、从本次编程的结果来看,此次编程需要提高的方面还很多,人机交互界面的设计、程序算法的统一性、可读性都有待提高。在程序的设计过程中主要参考了Windows10参做系统自带的计算器,交互界面如图8所示:
图8Windows10计算器
仅从界面看,差距还很大。但是任何一个程序都不可能是完美的,这款计算器在调试的过程中也发现了一些bug,所以在日后更加重要的学习和工作中的编程过程中,要注意程序的调试和检查,完善任何一个优秀程序都是需要细致耐心的打磨。
5.思考题
1、程序如何实现小数的显示和运算?
首先,数值数组采用float类型,可以实现整形和浮点型的统一运算。在读取数值的过程中要加入小数点的判断,如果出现了小数点,则在之后读取的每一个数值需要将相应的倍数每次除以10乘以读出的数值与原数值相加得到。例如changevalue函数:
voidCfengwanjincalculatorDlg::changevalue()
BEGIN_MESSAGE_MAP
******
END_MESSAGE_MAP
界面设计
图5向对话框添加控件
在项目的资源视图中找到位于Dialog下的对话框,如图4所示。添加相应控件,完成用户界面设计。
图6用户界面设计
其中编辑框行为下Multiline属性设置为True,作为多行编辑框。第一行显示算式,第二行结果。整体上将控件分为四组,数值控件区NUM,加减乘除一般运算控件区NORMAL,阶乘、乘幂、正余弦科学运算控件区SCIENCE以及清零退格控件。设计完成后的界面如图7所示。
编程环境采用VisualStudio2017提供的MFC建立对话框应用程序,设计界面要简单大方,并提供程序所有功能的接口。
2.设计思路
表1操作符优先级设计
优先级
操作符
1
阶乘、正弦、余弦
2
乘幂
3
乘、除
4
加、减
对对话框编辑框关联一个变量从中读取数据,按下数字键时对数据数组num[]进行更新,其中num[0]表示的是当前已经存储变量的个数。由于算法设计为四层优先级,且单目运算的优先级最高。当按下相应单目运算符,首先将当前数据数组的最后一个存储(防止按下Backspace退格发生错误),并将此位数据执行运算后重新赋值。但按下双目运算符相应按键后,将计数num[0]++,同时将运算符的类型和位置记录。当按下等于之前,这样就将一个单目双目混合的运算表达式转化为双目运算。如果没有按下等号键,则继续执行循环。在按下等号按钮之后,按照先乘幂、再乘除、后加减的运算顺序执行运算,将最后结果保存并显示。(在实际的计算器中,执行完运算之后,按下运算符的操作键,最终结果将按照左操作数的形式出现,故需要保存变量。)如果用户没有结束程序,在运行初始化程序,进行下一次运算,否则直接退出。
图7用户界面
设计的界面中只有编辑框关联Cstring类型变量mystr。其余控件关联相应的消息处理函数。
关键功能的实现
程序主要分为数值、单目运算、双目运算、清除等。
1)数值控件消息处理函数
voidCfengwanjincalculatorDlg::OnBnClickedButton1()
{
shuzihanshu(L'1',1);
}
考虑到0~9数字的处理函数有很大的相似处,所以都采用调用shuzhihanshu函数的方法执行。shuzhihanshu包含两个参数,分别是数值对应字符和相应数值。其具体实现如下:
voidCfengwanjincalculatorDlg::shuzihanshu(charshuzi,intshuzhi)论与心得体会
}
else
{
num[0]--;
switch(temp)
{
case43:
case45:jiajia来自[jiajian[0]]=0;
jiajian[0]--;
mystr=()-1);
break;
case42:
case47:
chengchu[chengchu[0]]=0;
chengchu[0]--;
mystr=()-1);
mizhi[0]--;
mystr=()-1);
break;
case110:
num[0]++;
num[(int)num[0]]=nextdata[2*(int)nextdata[0]];
nextdata[2*(int)nextdata[0]-1]=0;
nextdata[0]--;
mystr=()-3);
图1程序流程图
3.软件设计
设计步骤
1)创建基于对话框的程序
利用AppWizard建立应用程序框架,创建一个基于对话框的MFC工程,命名为“fengwanjincalculator”,如图2所示。在图3显示的应用程序类型中选择基于对话框。创建成功后,系统自动生成相应程序文件。
图2创建MFC工程图
图3应用程序类型选择图
{
nextdata[2*(int)nextdata[0]]=num[(int)num[0]];
num[(int)num[0]]=sin(num[(int)num[0]]);
nextdata[2*(int)nextdata[0]-1]==-Sin;
}
if(nextdata[2*(int)nextdata[0]-1]==Cos)
图10键入数值并执行运算
2、点击加号后可以继续执行运算。
图11点击加号继续运算
3、按下数值9,清屏屏显示数值9
图12按下数值9
4、清屏
图13清屏
5、错误提示
图14错误提示
关键源代码
1、文件中自定义变量和函数的相应声明:
public:
intjiajian[10];
{
flagdian=0;
mystr=()-1);
3、由于在编程思想方面并没有参照网上的先例,也没有采取堆栈的方式进行优先级的运算,在具体编程的过程中遇到了很多细节问题。所以在日后的编程中要注意,算法与数据结构的结合。
4、相较于传统的C++编程,MFC的编程不仅要考虑算法和数据结构的问题,还需要考虑环境、用户界面的美观便捷等问题,编程的难度更大,出现的问题也更多,在编程的过程中渐渐提高了自己的耐性和对于新事物的应用能力。
2)定义成员变量
添加相应变量和标志位,以方便程序的编写,主要变量如表2所示:
表2成员变量表
变量名
变量类型
变量作用
mystr
CString
编辑框关联变量
m_editFont
CFont
设置编辑框字体
num
float
存储操作数
flagdian
bool
点号标志位
flagdengyu
bool
等号标志位
flagerror
2、结果错误问题
此类问题在本次编程过程中遇到的情况较多,采用的自己模拟程序执行流程发现问题,如果不能通过这种方式发现,则通过设置断点,单步执行观察变量在每一步中的变化,并于自己的设想相比较发现问题。
测试结果
1、键入表达式125+6*5-8!+7^3点击等号得到表达式的结果,与实际相一致,如图10所示。
实用计算器程序
1.基本功能描述
计算器是人们日常生活中非常实用的计算工具。预期设计目标与实际计算器为标准,Windows10系统提供的计算器为范例进行设计。
实用计算器要实现单目运算和双目运算。单目运算主要包括阶乘、正弦、余弦;双目运算主要包括加、减、乘、除、乘幂等。计算器要能够对输入的各种数据进行处理,包括小数、整数、负数等数据进行操作。实际过程中要能够对不同的数据灵活判断执行。同时要能够对不满足运算符的操作数,提示出错信息以方便用户进行处理。用户的修改包括清屏和退格。程序设计的重点和难点在于:第一,能够对于不同的操作数和操作符进行连续运算,运算过程中要有优先级的判断,根据优先级执行不同的运算顺序;第二,能够用一个编辑框实现运算表达式的显示和结果的输出。