c++编写的计算器实现源码介绍c++编写的计算器源码下载。



c++编写的计算器实现源码介绍c++编写的计算器源码下载。

// CalculatorDemoDlg.cpp : implementation file
//

#include “stdafx.h”
#include “TestCalculatorDemo.h”
#include “CalculatorDemoDlg.h”
#include “math.h”
#include “string”

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CCalculatorDemoDlg dialog

CCalculatorDemoDlg::CCalculatorDemoDlg(CWnd* pParent /*=NULL*/)
 : CDialog(CCalculatorDemoDlg::IDD, pParent)
{
 //{{AFX_DATA_INIT(CCalculatorDemoDlg)
  // NOTE: the ClassWizard will add member initialization here
 //}}AFX_DATA_INIT
}
void CCalculatorDemoDlg::DoDataExchange(CDataExchange* pDX)
{
 CDialog::DoDataExchange(pDX);
 //{{AFX_DATA_MAP(CCalculatorDemoDlg)
 DDX_Control(pDX, IDC_EDIT_SHOW, m_edit_show);
 //}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CCalculatorDemoDlg, CDialog)
 //{{AFX_MSG_MAP(CCalculatorDemoDlg)
 ON_BN_CLICKED(IDC_BTN_NO1, OnBtnNo1)
 ON_BN_CLICKED(IDC_BTN_NO2, OnBtnNo2)
 ON_BN_CLICKED(IDC_BTN_NO3, OnBtnNo3)
 ON_BN_CLICKED(IDC_BTN_NO4, OnBtnNo4)
 ON_BN_CLICKED(IDC_BTN_NO5, OnBtnNo5)
 ON_BN_CLICKED(IDC_BTN_NO6, OnBtnNo6)
 ON_BN_CLICKED(IDC_BTN_NO7, OnBtnNo7)
 ON_BN_CLICKED(IDC_BTN_NO8, OnBtnNo8)
 ON_BN_CLICKED(IDC_BTN_NO9, OnBtnNo9)
 ON_BN_CLICKED(IDC_BTN_NO0, OnBtnNo0)
 ON_BN_CLICKED(IDC_BTN_PORT, OnBtnPort)
 ON_BN_CLICKED(IDC_BTN_ADD, OnBtnAdd)
 ON_BN_CLICKED(IDC_BTN_SUB, OnBtnSub)
 ON_BN_CLICKED(IDC_BTN_MUL, OnBtnMul)
 ON_BN_CLICKED(IDC_BTN_DIV, OnBtnDiv)
 ON_BN_CLICKED(IDC_BTN_EQUEL, OnBtnEquel)
 ON_BN_CLICKED(IDC_BTN_PERCENT, OnBtnPercent)
 ON_BN_CLICKED(IDC_BTN_DOWN, OnBtnDown)
 ON_BN_CLICKED(IDC_BTN_NEQUA, OnBtnNequa)
 ON_BN_CLICKED(IDC_BTN_SPACE, OnBtnSpace)
 ON_BN_CLICKED(IDC_BTN_C, OnBtnC)
 ON_BN_CLICKED(IDC_BTN_SQRT, OnBtnSqrt)
 //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CCalculatorDemoDlg message handlers

// 1
void CCalculatorDemoDlg::OnBtnNo1()
{
 // TODO: Add your control notification handler code here
 PutIntoNum(1);
}

// 2
void CCalculatorDemoDlg::OnBtnNo2()
{
 // TODO: Add your control notification handler code here
 PutIntoNum(2);
}

// 3
void CCalculatorDemoDlg::OnBtnNo3()
{
 // TODO: Add your control notification handler code here
 PutIntoNum(3);
}

// 4
void CCalculatorDemoDlg::OnBtnNo4()
{
 // TODO: Add your control notification handler code here
 PutIntoNum(4);
}

// 5
void CCalculatorDemoDlg::OnBtnNo5()
{
 // TODO: Add your control notification handler code here
 PutIntoNum(5);
}

// 6
void CCalculatorDemoDlg::OnBtnNo6()
{
 // TODO: Add your control notification handler code here
 PutIntoNum(6);
}

// 7
void CCalculatorDemoDlg::OnBtnNo7()
{
 // TODO: Add your control notification handler code here
 PutIntoNum(7);
}

// 8
void CCalculatorDemoDlg::OnBtnNo8()
{
 // TODO: Add your control notification handler code here
 PutIntoNum(8);
}

// 9
void CCalculatorDemoDlg::OnBtnNo9()
{
 // TODO: Add your control notification handler code here
 PutIntoNum(9);
}

// 0
void CCalculatorDemoDlg::OnBtnNo0()
{
 // TODO: Add your control notification handler code here
    //如果第一次输入数字
    if (cs_Num[m_i]==”0″)
    {
        return ;
    }
    cs_Num[m_i]+=”0″;
    SetDlgItemText(IDC_EDIT_SHOW,cs_Num[m_i]);

 // 判断是否已使用了小数点,来确定是否追加显示小数点
    if (!b_Hasport)
    {
        CString temp;
        GetDlgItemText(IDC_EDIT_SHOW,temp);
        temp+=”.”;
        SetDlgItemText(IDC_EDIT_SHOW,temp);
    }
}

//  .
void CCalculatorDemoDlg::OnBtnPort()
{
    //已有小数点时
    if (b_Hasport)
    {
        return;
    }
    //无小数点
    cs_Num[m_i]+=”.”;
    b_Hasport=TRUE;
    b_Start=TRUE;
    SetDlgItemText(IDC_EDIT_SHOW,cs_Num[m_i]);
}
//四则运算符
// +
void CCalculatorDemoDlg::OnBtnAdd()
{
    if (!b_Start)
    {
  en_LastSignl=en_add;     //防止 按键顺序为:123+-×/   的情况出现
        return;
    }
    if (en_LastSignl==en_none)
    {
        en_LastSignl=en_add;     //即 第一次按符号键
    }
 // 调用符号运行方法
    RunOperation(en_LastSignl);
    en_LastSignl=en_add;
}

// -
void CCalculatorDemoDlg::OnBtnSub()
{
    if (!b_Start)
    {
  en_LastSignl=en_sub;   //防止 按键顺序为:123+-×/   的情况出现
        return;
    }
   
 // TODO: Add your control notification handler code here
    if (en_LastSignl==en_none)
    {
        en_LastSignl=en_sub;
    }

 // 调用符号运行方法
 RunOperation(en_LastSignl);
    en_LastSignl=en_sub;
}
// ×
void CCalculatorDemoDlg::OnBtnMul()
{
    if (!b_Start)
    {
  en_LastSignl=en_mul;   //防止 按键顺序为:123+-×/   的情况出现
        return;
    }
    if (en_LastSignl==en_none)
    {
        cs_Num[1]=”1″;         //乘除的特殊考虑
        en_LastSignl=en_mul;
    }

    // 调用符号运行方法
 RunOperation(en_LastSignl);
    en_LastSignl=en_mul;
}


// /
void CCalculatorDemoDlg::OnBtnDiv()
{
 if (!b_Start)
    {
  en_LastSignl=en_div;   //防止 按键顺序为:123+-×/   的情况出现
        return;
    }
    if (en_LastSignl==en_none)
    {
        cs_Num[1]=”1″;     //乘除的特殊考虑
        en_LastSignl=en_div;
    }
 // 调用符号运行方法
 RunOperation(en_LastSignl);
    en_LastSignl=en_div;
}

// =
void CCalculatorDemoDlg::OnBtnEquel()
{
 // TODO: Add your control notification handler code here

 //防止多次按等号键
 if (en_LastSignl==en_none)
 {
  return;
 }
    // 用已保存的运算符,调用符号运行方法
 RunOperation(en_LastSignl);
    //****等号特殊考虑****
    en_LastSignl=en_none;
    b_Start=TRUE;
}

BOOL CCalculatorDemoDlg::OnInitDialog()
{
 CDialog::OnInitDialog();
 // TODO: Add extra initialization here
 //初始化全部变量
 InitAllDate();
 return TRUE;  // return TRUE unless you set the focus to a control
               // EXCEPTION: OCX Property Pages should return FALSE
}

// 按数字键调用的函数
void CCalculatorDemoDlg::PutIntoNum(int n)
{
    CString tem_i;
    tem_i.Format(“%d”,n);
    CString temp;
    //当是第一次输入,直接追加
    if (!b_Start)
 {
        cs_Num[m_i]=tem_i;
        b_Start=TRUE;
        SetDlgItemText(IDC_EDIT_SHOW,cs_Num[m_i]+”.”);
        /*
  第一次输入数据 无点
  if (!b_Hasport)
        {
            GetDlgItemText(IDC_EDIT_SHOW,temp);
            temp+=”.”;
            SetDlgItemText(IDC_EDIT_SHOW,temp);
        }
  */
        return;
 }
    cs_Num[m_i]+=tem_i;
    SetDlgItemText(IDC_EDIT_SHOW,cs_Num[m_i]);

 // 判断是否已使用了小数点,来确定是否追加显示小数点
    if (!b_Hasport)
    {
        GetDlgItemText(IDC_EDIT_SHOW,temp);
        temp+=”.”;
        SetDlgItemText(IDC_EDIT_SHOW,temp);
    }
}

// 初始化变量
void CCalculatorDemoDlg::InitAllDate()
{
    en_LastSignl=en_none;
    b_Hasport=FALSE;
    b_Start=FALSE;
    b_Hasmul=FALSE;
    b_Hasdiv=FALSE;
    cs_Num[0]=”0″;
    cs_Num[1]=”0″;
    m_i=0;
    SetDlgItemText(IDC_EDIT_SHOW,cs_Num[m_i]+”.”);
}

// 按符号键调用的函数
void CCalculatorDemoDlg::RunOperation(enum eum_signl e_signl)
{
    // TODO: Add your control notification handler code here
 double sum;
 double nAdd1;
    double nAdd2;
    nAdd1=atof(cs_Num[0]);
    nAdd2=atof(cs_Num[1]);

    //确定符号,进行运算
    switch(e_signl)
    {
    case en_add:
        sum=nAdd1+nAdd2;
        break;
    case en_sub:
        sum=nAdd1-nAdd2;
        break;
    case en_mul:
        sum=nAdd1*nAdd2;
        break;
    case en_div:
 case en_percent:
  sum=nAdd1/nAdd2;
  break;
    }
    cs_Num[0].Format(“%.16g”,sum);

 //对百分号和其他运算符分开处理
 if (e_signl==en_percent)
 {                                     
  //百分号进行运算只进行显示的出来百分数,不改变实际值
  CString temp;
  sum=sum*100;
  temp.Format(“%32.16g”,sum);
  SetDlgItemText(IDC_EDIT_SHOW,temp);
 }else
 {
  SetDlgItemText(IDC_EDIT_SHOW,cs_Num[0]);

  // 判断是否已使用了小数点,并且操作数中有无小数点,来确定是否追加显示小数点
  if (!b_Hasport && -1==cs_Num[0].Find(‘.’))
  {
   CString temp;
   GetDlgItemText(IDC_EDIT_SHOW,temp);
   temp+=”.”;
   SetDlgItemText(IDC_EDIT_SHOW,temp);
  }
 }
   
    m_i = 1;               //改变操作数
    b_Hasport=FALSE;
    b_Start=FALSE;         //改变为 非输入数据状态
    cs_Num[m_i]=”0″;      
}

// 清空键
void CCalculatorDemoDlg::OnBtnC()
{
 // TODO: Add your control notification handler code here
 InitAllDate();
}

// 根号
void CCalculatorDemoDlg::OnBtnSqrt()
{
 // TODO: Add your control notification handler code here
 if (!b_Start)
    {
        return;
    }
    double num;
    CString temp;
    GetDlgItemText(IDC_EDIT_SHOW,temp);
    num=atof(temp);
    num=sqrt(num);
    temp.Format(“%32.16g”,num);

 cs_Num[m_i]=temp;             //改变当前的实际操作数
   
 //确定是否进行小数点的显示
 if (temp.Find(‘.’)==-1)
        SetDlgItemText(IDC_EDIT_SHOW,temp+”.”);
    else
        SetDlgItemText(IDC_EDIT_SHOW,temp);
}
// %
void CCalculatorDemoDlg::OnBtnPercent()
{
 // TODO: Add your control notification handler code here
 //输入未开始和输入的运算符不是除号时,不进行运算
 if (!b_Start && en_LastSignl!=en_div)
    {
        return;
    }

 //防止多次按等号键
 if (en_LastSignl==en_none)
 {
  return;
 }
 RunOperation(en_percent);   //传入百分号
    //****特殊****
    en_LastSignl=en_none;
    b_Start=TRUE;
}

// 1/x
void CCalculatorDemoDlg::OnBtnDown()
{
 // TODO: Add your control notification handler code here
 if (!b_Start)
    {
        return;
    }
    double num;
    CString temp;
    GetDlgItemText(IDC_EDIT_SHOW,temp);
    num=atof(temp);
    num=1/num;
    temp.Format(“%.16g”,num);
 cs_Num[m_i]=temp;             //改变当前的实际操作数

 //确定是否进行小数点的显示
    if (temp.Find(‘.’)==-1)
        SetDlgItemText(IDC_EDIT_SHOW,temp+”.”);
    else
        SetDlgItemText(IDC_EDIT_SHOW,temp);
}

// +-
void CCalculatorDemoDlg::OnBtnNequa()
{
 // TODO: Add your control notification handler code here

 //正负符号的操作同上变得单目操作符相似
 if (!b_Start)
    {
        return;
    }
    double num;
    CString temp;
    GetDlgItemText(IDC_EDIT_SHOW,temp);
    num=atof(temp);
    num=0-num;
    temp.Format(“%g”,num);
    cs_Num[m_i].Format(“%.16g”,num);

 //确定是否进行小数点的显示,想出来的的一种优化
    SetDlgItemText(IDC_EDIT_SHOW , b_Hasport ? temp:temp+”.”);
}

// 退格键
void CCalculatorDemoDlg::OnBtnSpace()
{
 // TODO: Add your control notification handler code here
 if (!b_Start)
    {
        return;
    }
    double num;
    CString temp;
    int len;
    CHAR temp_ch[32];           //使用字符数组,对操作数进行退格操作
    GetDlgItemText(IDC_EDIT_SHOW,temp);
 num=atof(temp);
    sprintf(temp_ch,”%.16g”,num);
    num=0;
    len=strlen(temp_ch);
    int te_i=len-1;
    //////////////////////////////////////////////////////////////////////////
 //如果数组最后一个字符(’\0′的前一个)是小数点时,将点前的数字消掉
 if(temp_ch[te_i]==’.')
        te_i-=1,b_Hasport=FALSE;
    temp_ch[te_i]=’\0′;
 
 //当整个操作数全部都被消掉时,再点退格时的操作,此步后再输入时显示会有些问题
    if (strlen(temp_ch)==0)
    {
        temp_ch[0]=’0′;
        temp_ch[1]=’\0′;
    }
    sscanf(temp_ch,”%32.16g”,&num);
    temp.Format(“%s”,temp_ch);
 cs_Num[m_i]=temp;                //改变当前的实际操作数

 //确定是否进行小数点的显示
    SetDlgItemText(IDC_EDIT_SHOW,b_Hasport?cs_Num[m_i]:cs_Num[m_i]+”.”);
}