MFC计算器编程设计报告

时间:2024.3.31

MFC计算器课程设计报告

地信091

指导老师:

2010.11.15

一.题目:利用MFC框架编写简易计算器

要求使用MFC框架在Visual Studio 6.0环境下编写一个简易的计算器,支持任意位数的加减乘数,正负转换,并且实现BackSpace CE C功能。

二.设计过程

1.         Windows消息处理机制的理解
首先编写程序需要对Windows程序的消息处理机制(Message Handle)有个比较清晰的了解。Windows的程序都是通过消息来传送数据,有不需要用户参与的系统消息,比如异常处理等。还有用户消息,比如鼠标的单击,双击,键盘的键入等。

2.           界面的设计
仿照Windows附件里面的计算器,在资源视图中画好界面,如图:
  
主要使用到Layout菜单中的Align功能对各个按钮进行对其,使界面更加整洁。拖出的控件有上面的一个Edit控件用于显示数字,Button控件用于处理鼠标的消息。        

3.         建立的变量,控件的命名,对应的消息处理函数对应表

变量定义:

       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;

      

4.         设计思路

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来判断,分别出来小数和整数。

5. 成员函数及其释义

       因为对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);

         }

     }

}

以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=='/')

     {   

         numsecond=m_Dis;

         numfirst=numfirst/numsecond;

         m_Dis=numfirst;

         numsecond=0;

         UpdateData(FALSE);

         m_Dis=0;

     }

     if(numfirst==0 && numsecond==0)

     { //该状态为程序启动还没有开始录入输入的状态

         numfirst=m_Dis; //屏幕的值赋值到numfirst

         UpdateData(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存的数字转换为string

     for(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;  //把屏幕的值赋值为0

         UpdateData(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:

        OnNum8();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);

}

// CalculatorDlg.cpp : implementation file

//

#include "stdafx.h"

#include "Calculator.h"

#include "CalculatorDlg.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

/////////////////////////////////////////////////////////////////////////////

// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog

{

public:

    CAboutDlg();

   

    // Dialog Data

    //{{AFX_DATA(CAboutDlg)

    enum { IDD = IDD_ABOUTBOX };

    //}}AFX_DATA

   

    // ClassWizard generated virtual function overrides

    //{{AFX_VIRTUAL(CAboutDlg)

protected:

    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support

    //}}AFX_VIRTUAL

   

    // Implementation

protected:

    //{{AFX_MSG(CAboutDlg)

    //}}AFX_MSG

    DECLARE_MESSAGE_MAP()

};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)

{

    //{{AFX_DATA_INIT(CAboutDlg)

    //}}AFX_DATA_INIT

}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)

{

    CDialog::DoDataExchange(pDX);

    //{{AFX_DATA_MAP(CAboutDlg)

    //}}AFX_DATA_MAP

}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)

//{{AFX_MSG_MAP(CAboutDlg)

// No message handlers

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////

// CCalculatorDlg dialog

CCalculatorDlg::CCalculatorDlg(CWnd* pParent /*=NULL*/)

: CDialog(CCalculatorDlg::IDD, pParent)

{

    //{{AFX_DATA_INIT(CCalculatorDlg)

    poz=1;

    numfirst=0;

    numsecond=0;

    op=0;

    m_Dis = 0.0;

//  num=0;

    //}}AFX_DATA_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_DATA_MAP(CCalculatorDlg)

    DDX_Text(pDX, IDC_EDIT, m_Dis);

    //}}AFX_DATA_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_NEG, OnNeg)

    ON_BN_CLICKED(IDC_PT, OnPt)

    ON_BN_CLICKED(IDC_BACKSPACE, OnBackspace)

    ON_BN_CLICKED(IDC_CE, OnCe)

    ON_BN_CLICKED(IDC_CLEAR, OnClear)

    ON_BN_CLICKED(IDC_MIN, OnMin)

    ON_BN_CLICKED(IDC_MUL, OnMul)

    ON_BN_CLICKED(IDC_DIV, OnDiv)

    ON_BN_CLICKED(IDC_EOU, OnEou)

    //}}AFX_MSG_MAP

END_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_SEPARATOR);

            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 dialog

    SetIcon(m_hIcon, TRUE);         // Set big icon

    SetIcon(m_hIcon, FALSE);        // Set small icon

   

    // TODO: Add extra initialization here

   

    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 painting

       

        SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

       

        // Center icon in client rectangle

        int 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 icon

        dc.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;

}

void CCalculatorDlg::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);

        }

    }

}

void CCalculatorDlg::OnNum0()

{

    // TODO: Add your control notification handler code here

    OnCal(0);

}

void CCalculatorDlg::OnNum1()

{

    // TODO: Add your control notification handler code here

    OnCal(1);

}

void CCalculatorDlg::OnNum2()

{

    // TODO: Add your control notification handler code here

    OnCal(2);

}

void CCalculatorDlg::OnNum3()

{

    // TODO: Add your control notification handler code here

    OnCal(3);

}

void CCalculatorDlg::OnNum4()

{

    // TODO: Add your control notification handler code here

    OnCal(4);

}

void CCalculatorDlg::OnNum5()

{

    // TODO: Add your control notification handler code here

    OnCal(5);

}

void CCalculatorDlg::OnNum6()

{

    // TODO: Add your control notification handler code here

    OnCal(6);

}

void CCalculatorDlg::OnNum7()

{

    // TODO: Add your control notification handler code here

    OnCal(7);

}

void CCalculatorDlg::OnNum8()

{

    // TODO: Add your control notification handler code here

    OnCal(8);

}

void CCalculatorDlg::OnNum9()

{

    // TODO: Add your control notification handler code here

    OnCal(9);

}

void CCalculatorDlg::OnAdd()

{

    // TODO: Add your control notification handler code here

    {   //根据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=='/')

        {  

            numsecond=m_Dis;

            numfirst=numfirst/numsecond;

            m_Dis=numfirst;

            numsecond=0;

            UpdateData(FALSE);

            m_Dis=0;

           

        }

        if(numfirst==0 && numsecond==0)

        { //该状态为程序启动还没有开始录入输入的状态

            numfirst=m_Dis; //屏幕的值赋值到numfirst

            UpdateData(FALSE);

            m_Dis=0;

        }

        op='+';  //最后记录最后一个操作是+

        poz=1;//小数点位置归位

        point_flag=FALSE;//默认小数点标志为整数,也就是0,也就是FALSE

    }

   

}

void CCalculatorDlg::OnNeg()

{

    // TODO: Add your control notification handler code here

    m_Dis=-m_Dis;//换个符号,其他都一样

    UpdateData(FALSE);

    poz=1;

    point_flag=FALSE;

}

void CCalculatorDlg::OnPt()

{

    // TODO: Add your control notification handler code here

    point_flag=TRUE;  //把标志位改为"小数点"状态

}

void CCalculatorDlg::OnBackspace()

{

    // TODO: Add your control notification handler code here

    //主要通过_gcvt()和strtod()函数进行字符串和浮点数之间的转换

    char buffer[30]; //定义个装字符的数组

    _gcvt(m_Dis,sizeof(m_Dis),buffer);  //把m_Dis存的数字转换为string

    for(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;

}

void CCalculatorDlg::OnCe()

{

    // TODO: Add your control notification handler code here

    if(numfirst!=0 && numsecond==0)//CE只能修改第二个数字

    {

        m_Dis=0;  //把屏幕的值赋值为0

        UpdateData(FALSE);//并显示出来

    }

}

void CCalculatorDlg::OnClear()

{

    // TODO: Add your control notification handler code here

    op=NULL; //清空符号

    numfirst=0;//清空第一个数字

    numsecond=0;//清空第二个数字

    point_flag=FALSE;//改为默认整数位

    poz=1;//小数点归位

    m_Dis=0;

    UpdateData(FALSE); //屏幕显示归0

}

void CCalculatorDlg::OnMin()

{

    // TODO: Add your control notification handler code here

    {   //根据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=='/')

        {  

            numsecond=m_Dis;

            numfirst=numfirst/numsecond;

            m_Dis=numfirst;

            numsecond=0;

            UpdateData(FALSE);

            m_Dis=0;

           

        }

        if(numfirst==0 && numsecond==0)

        { //该状态为程序启动还没有开始录入输入的状态

            numfirst=m_Dis; //屏幕的值赋值到numfirst

            UpdateData(FALSE);

            m_Dis=0;

        }

        op='-';  //最后记录最后一个操作是+

        poz=1;//小数点位置归位

        point_flag=FALSE;//默认小数点标志为整数,也就是0,也就是FALSE

    }

}

void CCalculatorDlg::OnMul()

{

    // TODO: Add your control notification handler code here

    {   //根据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=='/')

        {  

            numsecond=m_Dis;

            numfirst=numfirst/numsecond;

            m_Dis=numfirst;

            numsecond=0;

            UpdateData(FALSE);

            m_Dis=0;

           

        }

        if(numfirst==0 && numsecond==0)

        { //该状态为程序启动还没有开始录入输入的状态

            numfirst=m_Dis; //屏幕的值赋值到numfirst

            UpdateData(FALSE);

            m_Dis=0;

        }

        op='*';  //最后记录最后一个操作是+

        poz=1;//小数点位置归位

        point_flag=FALSE;//默认小数点标志为整数,也就是0,也就是FALSE

    }

}

void CCalculatorDlg::OnDiv()

{

    // TODO: Add your control notification handler code here

    {   //根据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=='/')

        {  

            numsecond=m_Dis;

            numfirst=numfirst/numsecond;

            m_Dis=numfirst;

            numsecond=0;

            UpdateData(FALSE);

            m_Dis=0;

           

        }

        if(numfirst==0 && numsecond==0)

        { //该状态为程序启动还没有开始录入输入的状态

            numfirst=m_Dis; //屏幕的值赋值到numfirst

            UpdateData(FALSE);

            m_Dis=0;

        }

        op='/';  //最后记录最后一个操作是+

        poz=1;//小数点位置归位

        point_flag=FALSE;//默认小数点标志为整数,也就是0,也就是FALSE

    }

}

void CCalculatorDlg::OnEou()

{

    // TODO: Add your control notification handler code here

    {   //根据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=='/')

        {  

            numsecond=m_Dis;

            numfirst=numfirst/numsecond;

            m_Dis=numfirst;

            numsecond=0;

            UpdateData(FALSE);

            m_Dis=0;

           

        }

        if(numfirst==0 && numsecond==0)

        { //该状态为程序启动还没有开始录入输入的状态

            numfirst=m_Dis; //屏幕的值赋值到numfirst

            UpdateData(FALSE);

            m_Dis=0;

        }

        op='=';  //最后记录最后一个操作是+

        poz=1;//小数点位置归位

        point_flag=FALSE;//默认小数点标志为整数,也就是0,也就是FALSE

    }

   

}

总结:

本次MFC计算器的制作,学习到了MFC基本的编程方法,增加了小组开发的团结协作能力。对OOP编程的理解进一步加深。但是程序仍然没存在一定的问题,比如除数不能为0的Exception handle,符号键多次点击结果混乱。由于时间仓促,如果有更多的时间,必定这些问题会迎刃而解。通过这次课程设计,以后Windows 应用程序势必会轻车熟路。

更多相关推荐:
计算器程序设计报告

JAVA课程设计报告设计题目学院班级学号姓名计算器计算机学院胡松311090120xx214344Java课程设计报告IJava课程设计报告1需求分析1课程设计目的1复习巩固java语言的基础知识进一步加深对j...

课程设计报告——计算器

北京化工大学20xx20xx课程设计报告计算机科学与技术计算器程序的设计与实现数据结构课程设计班级计科1001北京化工大学信息科学与技术学院计算机科学与技术专业北京化工大学20xx20xx课程设计报告计算机科学...

成品计数器设计报告

1实验报告20xx至20xx学年度第1学期课程名称数字电子课程设计系别电气工程系班级电气工程及其自动化二班学号1109141117姓名吕辉指导教师王开全12233445566778899101011111212...

C++简单计算器课程设计报告

武汉理工大学专业课程设计2课程设计说明书目录1基本功能描述12设计思路13软件设计431设计步骤44结论与心得体会127附设计中的关键源代码1472测试结果15简单计算器1基本功能描述简单计算器包括双目运算和单...

计算器程序设计报告

计算器程序设计报告一设计分析编写一个计算器程序要求1界面类似于windows系统中提供的计算器界面2能实现加减乘除乘方开方等功能界面类似于windows系统中提供的计算器界面则数字的输入和功能的执行都通过按键来...

计算器设计报告

QT程序设计报告之简易计算器作者lovelycc126com我的处女作哦一需求分析当今社会是信息社会科技经济高速发展的社会为了更方便人们的工作生活和加速人们处理信息的速度计算器应运而生然而电脑已经成为当代人生活...

java计算器设计报告

摘要本计算器是由java语言所编程设计的标准计算器可以进行十进制下的四则运算加减乘除开平方求余求倒数还可以实现二进制与十进制之间的转换通过本课程设计使学生能够较全面的掌握面向对象程序设计的有关概念和开发方法以便...

mfc计算器的设计报告

MFC计算器课程设计题目MFC计算器设计学院计算机学院姓名学号指导教师20xx年5月20日目录1概述311课程设计目的312课程设计内容32系统需求分析421系统目标422主体功能423开发环境43系统概要设计...

安卓计算器设计报告

科信学院通信终端创新课程设计项目说明书20xx20xx学年第二学期课程名称通信终端创新课程设计题目android计算器专业班级通信工程092学生姓名戴维松学号090312245指导教师马小进陈湘国赵欣崔冬设计周...

简易计算器的设计报告

陕西理工学院课程设计引言当今时代是一个新技术层出不穷的时代在电子领域尤其是自动化智能控制领域传统的分立元件或数字逻辑电路构成的控制系统正以前所未见的速度被单片机智能控制系统所取代单片机具有体积小功能强成本低应用...

Matlab课程设计报告(简单计算器)

1设计目的运用MATLAB实现MATLAB的GUI程序设计2题目分析21课程设计的基本要求A熟悉和掌握MATLAB程序设计方法B掌握MATLABGUI程序设计22课程设计的内容要求利用MATLABGUI设计实现...

计算器程序设计报告

计算机科学与技术学部面向对象程序课程设计题目计算器学部计算机科学与技术班级指导教师姓名20xx年6月16日课程设计任务分配表VisualC的课程设计成绩表计算器摘要摘要随着当今社会的发展越来越多的人开始使用电子...

计算器设计报告(36篇)