目录一.设计题目。
(1)二.设计目的和内容。
(1)三.基本功能描述。
(2)四.设计思路。
(2)五.软件设计:设计步骤、界面设计、关键功能的实现。
(3)a)设计步骤。
(3)b)界面设计。
(4)c)关键功能的实现。
(5)六.附录。
(8)一.设计题目。
小型计算器程序的编写.二.设计目的和内容。
【设计目的】1学习Visual C++的MFC开发程序的步骤。
2综合运用所学的类、继承和多态的知识。
3进一步掌握程序的调试方法。
【设计内容】1利用MFC的向导,创建基于对话框的应用程序,添加按钮、编辑框等控件;第1页2实现算术加、减、乘、除等运算;3选做:三角函数的运算、对数运算、指数运算、进制转换等。
三.基本功能描述。
具备整型数据、浮点型数据的算术(加、减、乘、除)运算功能。
依次输入第一个运算数、运算符(+,-,*,/)、第二个运算数,然后输出结果,按‘C E’键清屏。
四.设计思路。
a)首先考虑对所有按键分为两类,数字类和符号类。
0,1,2,3,4,5,6,7,8,9为数字类,+,-,*,/为符号类。
数字在计算过程中最多需要保存两个,所以定义了两个double型变量num1和num2来进行存储,符号需要一个char型变量cal来存储。
b)为显示数字的编辑框设立一个double型的关联变量m_Num,为显示符号的编辑框设立一个CString型的关联变量m_result,设立一个int型的小数点标志dotflag,设立一个int型的键入数字标志numflag,设立一个long型的小数部分权值quan,最后为了防止用户输入错误,设立一个判断输入是否为数字的int型标志mark。
c)然后考虑到在计算过程中num1和num2的储存状态有三种,num1==0和num2==0,也就是程序开始运行还没有开始录入数字的状态;num1!=0和num2==0,也就是第一个数字已经录入,第二个数字还没有录入的状态这时候把m_Num的值赋给num1,m_Num归零;num1!=0和num2!=0,把m_Num的值赋给num2,m_Num归零,令m_Num等于num1和num2合并后的值。
五.软件设计:设计步骤、界面设计、关键功能的实现。
a)设计步骤。
1.添加头文件。
将test.cpp改为test.h将其添加到计算器Dlg.cpp : implementation file中,如下:#include "test.h"。
2.成员函数及其释义。
void CAboutDlg::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);}BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)END_MESSAGE_MAP()CTestDlg::CTestDlg(CWnd* pParent /*=NULL*/): CDialog(CTestDlg::IDD, pParent){m_Num =0.0;m_result = _T("");m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);}void CTestDlg::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);DDX_Text(pDX, IDC_EDIT_DISPLAY, m_Num);DDX_Text(pDX, IDC_EDIT2_SIGNS, m_result);}BEGIN_MESSAGE_MAP(CTestDlg, CDialog)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_BUTTON_NUM1, OnButtonNum1)ON_BN_CLICKED(IDC_BUTTON_NUM2, OnButtonNum2)ON_BN_CLICKED(IDC_BUTTON_NUM3, OnButtonNum3)ON_BN_CLICKED(IDC_BUTTON_NUM4, OnButtonNum4)ON_BN_CLICKED(IDC_BUTTON_NUM5, OnButtonNum5)ON_BN_CLICKED(IDC_BUTTON_NUM6, OnButtonNum6)ON_BN_CLICKED(IDC_BUTTON_NUM7, OnButtonNum7)ON_BN_CLICKED(IDC_BUTTON_NUM8, OnButtonNum8)ON_BN_CLICKED(IDC_BUTTON_NUM9, OnButtonNum9)ON_BN_CLICKED(IDC_BUTTON_ZHENGFU, OnButtonZhengfu)ON_BN_CLICKED(IDC_BUTTON_DENGYU, OnButtonDengyu)ON_BN_CLICKED(IDC_BUTTON_NUM0, OnButtonNum0)ON_BN_CLICKED(IDC_BUTTON_CLEAR, OnButtonClear)ON_BN_CLICKED(IDC_BUTTON_MULTIPLY, OnButtonMultiply)ON_BN_CLICKED(IDC_BUTTON_DIVIDE, OnButtonDivide)ON_BN_CLICKED(IDC_BUTTON_PLUS, OnButtonPlus)ON_BN_CLICKED(IDC_BUTTON_MINUS, OnButtonMinus)ON_BN_CLICKED(IDC_BUTTON_DOT, OnButtonDot)//}}AFX_MSG_MAPEND_MESSAGE_MAP()b)界面设计。
1.仿照Windows附件里面的计算器,在资源视图中画好界面,如图1:图12.修改每个button的属性,如图2:图23.修改每个button的处理机制,如图:在类向导Classwizard窗口中进行,如下图3:图3其他button按钮的修改类似。
4.修改每个edit的类型和名称,如图4:在类向导Classwizard窗口中进行:图4单击Add Variable按钮,在如下窗口中进行修改,如图5:图5另一个edit的修改类似。
c)关键功能的实现。
1.OnButtonNum8()按钮的处理函数。
void CTestDlg::OnButtonNum8(){if(dotflag==1){quan= quan*10;m_Num += 8 / (double)quan;}else{if(numflag==1){m_Num = m_Num * 10 + 8;}else m_Num = 8;}numflag = 1;mark=1;UpdateData(FALSE);}其他数字按钮的处理函数均与其类似。
2.OnButtonMultiply()按钮的处理函数。
void CTestDlg::OnButtonMultiply(){UpdateData();num1 = m_Num;cal = '*';numflag = 0;dotflag = 0;quan = 1;m_result='*';mark=0;UpdateData(FALSE);}其他符号按钮的处理函数均与其类似。
3.OnButtonDot()按钮的处理函数。
void CTestDlg::OnButtonDot(){UpdateData();dotflag = 1;m_Num += 0.0;m_result='.';}4.OnButtonClear()按钮的处理函数。
void CTestDlg::OnButtonClear(){UpdateData();m_Num =0;m_result=' ';num1 = 0;num2 = 0;numflag=0;dotflag=0;quan=1;mark=0;UpdateData(FALSE);}5.OnButtonDengyu()按钮的处理函数。
void CTestDlg::OnButtonDengyu(){if(mark==1){num2 = m_Num;switch(cal){case '+': m_Num = num1 + num2;cal=0;break;case '-': m_Num = num1 - num2;cal=0; break;case '*': m_Num = num1 * num2;cal=0;break;case '/': m_Num = num1 / num2;cal=0; break;}numflag = 0;dotflag = 0;quan = 1;UpdateData(FALSE);}elseMessageBox("error");}6.OnButtonZhengfu()按钮的处理函数。
void CTestDlg::OnButtonZhengfu(){UpdateData();m_Num = 0-m_Num;}六.附录。
1.调试。
图6图724/62.测试结果。
图8结果=4.3.关键源代码。
void CTestDlg::OnButtonNum1(){if(dotflag==1){quan=10*quan;m_Num += 1 / (double)quan;}else{if(numflag==1){m_Num = 10*m_Num+ 1;}else m_Num =1;}numflag = 1;mark=1;UpdateData(FALSE);}void CTestDlg::OnButtonNum2(){if(dotflag==1){quan = quan*10;m_Num += 2 / (double)quan;}else{if(numflag==1){m_Num = m_Num * 10 + 2;}else m_Num = 2;}numflag = 1;mark=1;UpdateData(FALSE);}void CTestDlg::OnButtonNum3(){if(dotflag==1){quan= quan*10;m_Num += 3 / (double)quan;}else{if(numflag==1){m_Num = m_Num * 10 + 3;}else m_Num = 3;}numflag = 1;mark=1;UpdateData(FALSE);}void CTestDlg::OnButtonNum4(){if(dotflag==1){quan= quan*10;m_Num += 4 / (double)quan;}else{if(numflag==1){m_Num = m_Num * 10 + 4;}else m_Num = 4;}numflag = 1;mark=1;UpdateData(FALSE);}void CTestDlg::OnButtonNum5(){if(dotflag==1){quan= quan*10;m_Num += 5 / (double)quan;}else{if(numflag==1){m_Num = m_Num * 10 + 5;}else m_Num = 5;}numflag = 1;mark=1;UpdateData(FALSE);}void CTestDlg::OnButtonNum6(){if(dotflag==1){quan= quan*10;m_Num += 6 / (double)quan;}else{if(numflag==1){m_Num = m_Num * 10 + 6;}else m_Num = 6;}numflag = 1;mark=1;UpdateData(FALSE);}void CTestDlg::OnButtonNum7(){if(dotflag==1){quan= quan*10;m_Num += 7 / (double)quan;}else{if(numflag==1){m_Num = m_Num * 10 + 7;}else m_Num = 7;}numflag = 1;mark=1;UpdateData(FALSE);}void CTestDlg::OnButtonNum8(){if(dotflag==1){quan= quan*10;m_Num += 8 / (double)quan;}else{if(numflag==1){m_Num = m_Num * 10 + 8;}else m_Num = 8;}numflag = 1;mark=1;UpdateData(FALSE);}void CTestDlg::OnButtonNum9(){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);}void CTestDlg::OnButtonNum0(){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(){if(mark==1){num2 = m_Num;switch(cal){case '+': m_Num = num1 + num2;cal=0;break;case '-': m_Num = num1 - num2;cal=0; break;case '*': m_Num = num1 * num2;cal=0;break;case '/': m_Num = num1 / num2;cal=0; break;}numflag = 0;dotflag = 0;quan = 1;UpdateData(FALSE);}elseMessageBox("error"); }void CTestDlg::OnButtonClear() {UpdateData();m_Num =0;m_result=' ';num1 = 0;num2 = 0;numflag=0;dotflag=0;quan=1;mark=0;UpdateData(FALSE);}void CTestDlg::OnButtonMultiply() {UpdateData();num1 = m_Num;cal = '*';numflag = 0;dotflag = 0;quan = 1;m_result='*';mark=0;UpdateData(FALSE);}void CTestDlg::OnButtonDivide() {UpdateData();num1 = m_Num;cal = '/';numflag = 0;dotflag = 0;quan = 1;m_result='/';mark=0;UpdateData(FALSE);}void CTestDlg::OnButtonPlus() {UpdateData();num1 = m_Num;cal = '+';numflag = 0;dotflag = 0;quan = 1;m_result='+';mark=0;UpdateData(FALSE);}void CTestDlg::OnButtonMinus() {UpdateData();num1 = m_Num;cal = '-';numflag = 0;dotflag = 0;quan = 1;m_result='-';mark=0;UpdateData(FALSE);}void CTestDlg::OnButtonDot() {UpdateData();dotflag = 1;m_Num += 0.0;m_result='.';UpdateData(FALSE);}class CTestDlg : public CDialog {public:int mark;long quan;int numflag;int dotflag;char cal;double num2;double num1;CTestDlg(CWnd* pParent = NULL); // standard constructor enum { IDD = IDD_TEST_DIALOG };double m_Num;CString m_result;protected:virtual void DoDataExchange(CDataExchange* pDX);// Implementationprotected:HICON m_hIcon;virtual BOOL OnInitDialog();afx_msg void OnSysCommand(UINT nID, LPARAM lParam);afx_msg void OnPaint();afx_msg HCURSOR OnQueryDragIcon();afx_msg void OnButtonNum1();afx_msg void OnButtonNum2();afx_msg void OnButtonNum3();afx_msg void OnButtonNum4();afx_msg void OnButtonNum5();afx_msg void OnButtonNum6();afx_msg void OnButtonNum7();afx_msg void OnButtonNum8();afx_msg void OnButtonNum9();afx_msg void OnButtonZhengfu();afx_msg void OnButtonDengyu();afx_msg void OnButtonNum0();afx_msg void OnButtonClear();afx_msg void OnButtonMultiply();afx_msg void OnButtonDivide();afx_msg void OnButtonPlus();afx_msg void OnButtonMinus();afx_msg void OnButtonDot();DECLARE_MESSAGE_MAP()};。