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]+”.”);
}