www.pudn.com > RMS2000_C.rar > CalcuDlg.cpp


// CalcuDlg.cpp : implementation file 
// 
 
#include "stdafx.h" 
#include "drawcli.h" 
#include "CalcuDlg.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////////// 
// CCalcuDlg dialog 
 
 
CCalcuDlg::CCalcuDlg(CWnd* pParent /*=NULL*/) 
	: CDialog(CCalcuDlg::IDD, pParent) 
{ 
	//{{AFX_DATA_INIT(CCalcuDlg) 
	m_x = 0.0; 
	//}}AFX_DATA_INIT 
 
//	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); 
 
	m_first=0.0;m_second=0.0;	//该行以下为初始化 
	m_firstz=0;m_firstx=0.0; 
	m_secondz=0;m_secondx=0.0; 
	m_firx=FALSE;m_secx=FALSE; 
	m_firxw=0;m_secxw=0; 
	m_firzorf=1;m_seczorf=1; 
	m_EnterSec=FALSE;	 
	m_result=0.0; 
	m_ForS=1; 
	m_mfir=0.0;m_msec=0.0;m_mfun=0; 
	m_sfmf=FALSE;m_sfms=FALSE;m_sfmfun=FALSE; 
 
} 
 
 
void CCalcuDlg::DoDataExchange(CDataExchange* pDX) 
{ 
	CDialog::DoDataExchange(pDX); 
	//{{AFX_DATA_MAP(CCalcuDlg) 
	DDX_Control(pDX, IDC_RESULT, m_xedit); 
	DDX_Text(pDX, IDC_RESULT, m_x); 
	//}}AFX_DATA_MAP 
} 
 
 
BEGIN_MESSAGE_MAP(CCalcuDlg, CDialog) 
	//{{AFX_MSG_MAP(CCalcuDlg) 
	ON_BN_CLICKED(IDC_BACK, OnBack) 
	ON_BN_CLICKED(IDC_ON, OnOn) 
	ON_BN_CLICKED(IDC_GO, OnGo) 
	ON_BN_CLICKED(IDC_7, On7) 
	ON_BN_CLICKED(IDC_8, On8) 
	ON_BN_CLICKED(IDC_0, On0) 
	ON_BN_CLICKED(IDC_1, On1) 
	ON_BN_CLICKED(IDC_2, On2) 
	ON_BN_CLICKED(IDC_3, On3) 
	ON_BN_CLICKED(IDC_4, On4) 
	ON_BN_CLICKED(IDC_5, On5) 
	ON_BN_CLICKED(IDC_6, On6) 
	ON_BN_CLICKED(IDC_9, On9) 
	ON_BN_CLICKED(IDC_ADD, OnAdd) 
	ON_BN_CLICKED(IDC_DIV, OnDiv) 
	ON_BN_CLICKED(IDC_SUB, OnSub) 
	ON_BN_CLICKED(IDC_TIM, OnTim) 
	ON_BN_CLICKED(IDC_XSD, OnXsd) 
	ON_BN_CLICKED(IDC_ZFH, OnZfh) 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CCalcuDlg message handlers 
 
void CCalcuDlg::OnBack()  
{ 
	if(m_ForS==1)			//如果此时在输入第一个数 
	{ 
		if(m_firx==FALSE)	//如果此时在输入整数部分 
		{	if(m_firstz<10)	//如果整数部分小于10 
			{ 
				m_firstz=0;	//改为0 
				m_firzorf=1; //置符号为正 
			} 
			else 
			{ 
				int y1=(int)m_firstz;//y1为一与整数部分相等的数 
				y1/=10;			//去掉个位数	 
				m_firstz=y1; 
			} 
		} 
		else					//如果在输入小数部分 
		{ 
			if(m_firxw==1)	//此时小数部分只有一位 
			{ 
				m_firstx=0.0;m_firxw=0;m_firx=FALSE;//小数部分清为0 
			} 
			else 
			{ 
				int y2=(int)(m_firstx*pow(10,m_firxw));	//取一整数与小数点所有的数表示的整数相等,如123等于0.123的小数部分表示的数 
				y2/=10;m_firxw--;			//去掉最后一位 
				m_firstx=y2*pow(10,(-1)*m_firxw); 
			} 
		} 
		m_first=m_firzorf*(m_firstz+m_firstx);	//计算出第一个数 
		m_x=m_first;UpdateData(FALSE);			//显示它 
	} 
	else if(m_ForS==2)		//如果在输入第二个数,处理方法同第一个数 
	{ 
		if(m_secx==FALSE) 
		{	 
			if(m_secondz<10) 
			{ 
				m_secondz=0; 
				m_seczorf=1; 
			} 
			else 
			{ 
				int y3=(int)m_secondz; 
				y3/=10; 
				m_secondz=y3; 
			} 
		} 
		else 
		{ 
			if(m_secxw==1) 
			{ 
				m_secondx=0.0;m_secxw=0;m_secx=FALSE; 
			} 
			else 
			{ 
				int y4=(int)(m_secondx*pow(10,m_secxw)); 
				y4/=10;m_secxw--; 
				m_secondx=y4*pow(10,(-1)*m_secxw); 
			} 
		} 
		m_second=m_seczorf*(m_secondz+m_secondx); 
		m_x=m_second;UpdateData(FALSE); 
	} 
	 
} 
 
void CCalcuDlg::OnOn()  
{ 
	m_x=0.0;			//恢复默认值,下同 
	m_first=0.0;m_second=0.0; 
	m_firstz=0;m_firstx=0.0; 
	m_secondz=0;m_secondx=0.0; 
	m_firx=FALSE;m_secx=FALSE; 
	m_firxw=0;m_secxw=0; 
	m_firzorf=1;m_seczorf=1; 
	m_ForS=1; 
	m_mfir=0.0;m_msec=0.0; 
	m_mfun=0; 
	m_sfmf=FALSE;m_sfms=FALSE;m_sfmfun=FALSE; 
	m_EnterSec=FALSE;	 
	UpdateData(FALSE); 
	 
} 
 
void CCalcuDlg::OnGo()  
{ 
	if(m_sfmf==TRUE&&m_sfms==TRUE&&m_sfmfun==TRUE)	//如果记着第一,二个数和运算符,即上次算完后未输入数,而再次按= 
	{	 
		if(m_mfun==1)m_result=m_mfir+m_msec;	//m_fun为1,则用上次的数和符号加,下同 
		else if(m_mfun==2)m_result=m_mfir-m_msec;	//m_fun为2,则减,下同 
		else if(m_mfun==3)m_result=m_mfir*m_msec;	//为3,则乘,下同 
		else if(m_mfun==4)m_result=m_mfir/m_msec;	//为4,则除,下同 
		m_sfmf=TRUE;m_sfms=TRUE;m_sfmfun=TRUE;	//记住参加运算的数和运算符 
		m_mfir=m_result;m_msec=m_msec;m_mfun=m_mfun; 
	} 
	 
	else if(m_sfmf==TRUE&&m_sfms==FALSE&&m_sfmfun==FALSE)//只记的第一数,如算完2+3=5后按*4= 
	{ 
		if(m_fun==1)m_result=m_mfir+m_second; 
		else if(m_fun==2)m_result=m_mfir-m_second; 
		else if(m_fun==3)m_result=m_mfir*m_second; 
		else if(m_fun==4)m_result=m_mfir/m_second; 
		m_sfmf=TRUE;m_sfms=TRUE;m_sfmfun=TRUE; 
		m_mfir=m_result;m_msec=m_second;m_mfun=m_fun; 
	} 
	else if(m_sfmf=TRUE&&m_sfms==TRUE&&m_sfmfun==FALSE)	//记住了第一个数,未输入第二个数,输入了运算符.如算完2+3=5后按*=结果为5*5=25; 
	{ 
		m_second=m_mfir; 
		if(m_fun==1)m_result=m_mfir+m_second; 
		else if(m_fun==2)m_result=m_mfir-m_second; 
		else if(m_fun==3)m_result=m_mfir*m_second; 
		else if(m_fun==4)m_result=m_mfir/m_second; 
		m_sfmf=TRUE;m_sfms=TRUE;m_sfmfun=TRUE; 
		m_mfir=m_result;m_msec=m_second;m_mfun=m_fun; 
	} 
	 
	else if(m_sfmf==FALSE&&m_sfms==FALSE&&m_sfmfun==FALSE)//第一二个数和运算符都不记的,记全重新输入,如算完2+3=5后输入4*6=	 
	{		 
		if(m_EnterSec==FALSE)m_second=m_first; 
		if(m_fun==1)m_result=m_first+m_second; 
		else if(m_fun==2)m_result=m_first-m_second; 
		else if(m_fun==3)m_result=m_first*m_second; 
		else if(m_fun==4)m_result=m_first/m_second; 
		m_sfmf=TRUE;m_sfms=TRUE;m_sfmfun=TRUE; 
		m_mfir=m_result;m_msec=m_second;m_mfun=m_fun; 
	} 
	m_x=m_result; 
	UpdateData(FALSE);		//显示结果 
	m_first=0;m_second=0.0;	 
	m_firstz=0;m_firstx=0.0; 
	m_secondz=0;m_secondx=0.0; 
	m_firx=FALSE;m_secx=FALSE; 
	m_firxw=0;m_secxw=0; 
	m_firzorf=1;m_seczorf=1; 
	m_ForS=1; 
	m_EnterSec=FALSE;	 
	 
} 
 
void CCalcuDlg::On7()  
{ 
	// TODO: Add your control notification handler code here 
	AddNum(7);	 
} 
 
void CCalcuDlg::On8()  
{ 
	// TODO: Add your control notification handler code here 
	AddNum(8);	 
	 
} 
 
void CCalcuDlg::On0()  
{ 
	// TODO: Add your control notification handler code here 
	AddNum(0);	 
} 
 
void CCalcuDlg::On1()  
{ 
	// TODO: Add your control notification handler code here 
	AddNum(1);	 
	 
} 
 
void CCalcuDlg::On2()  
{ 
	// TODO: Add your control notification handler code here 
	AddNum(2);	 
	 
} 
 
void CCalcuDlg::On3()  
{ 
	// TODO: Add your control notification handler code here 
	AddNum(3);	 
	 
} 
 
void CCalcuDlg::On4()  
{ 
	// TODO: Add your control notification handler code here 
	AddNum(4);	 
	 
} 
 
void CCalcuDlg::On5()  
{ 
	// TODO: Add your control notification handler code here 
	AddNum(5);	 
	 
} 
 
void CCalcuDlg::On6()  
{ 
	// TODO: Add your control notification handler code here 
	AddNum(6);	 
	 
} 
 
void CCalcuDlg::On9()  
{ 
	// TODO: Add your control notification handler code here 
	AddNum(9);	 
	 
} 
 
void CCalcuDlg::OnAdd()  
{ 
	// TODO: Add your control notification handler code here 
	AddFun(1); 
	 
} 
 
void CCalcuDlg::OnDiv()  
{ 
	// TODO: Add your control notification handler code here 
	AddFun(4);	 
} 
 
void CCalcuDlg::OnSub()  
{ 
	// TODO: Add your control notification handler code here 
	AddFun(2);	 
} 
 
void CCalcuDlg::OnTim()  
{ 
	// TODO: Add your control notification handler code here 
	AddFun(3);	 
} 
 
void CCalcuDlg::OnXsd()  
{ 
	if(m_ForS==1)m_firx=TRUE;	//此时在输入第一个数,第一个数指示十是否该输入小数部分变量置为真 
	else if(m_ForS==2)m_secx=TRUE;	//在输入第二个数 
	 
} 
 
void CCalcuDlg::OnZfh()  
{ 
	if(m_ForS==1)			//此时在输入第一个数 
	{ 
		m_firzorf=-1;		//指示符置为-1 
		m_first*=-1; 
		m_x=m_first; 
		UpdateData(FALSE); 
	} 
	 
	else  
	{ 
		m_seczorf=-1; 
		m_second*=-1; 
		m_x=m_second; 
		UpdateData(FALSE); 
	} 
} 
 
void CCalcuDlg::AddNum(int i)		//输入数字是时的处理函数 
{	 
	if(m_ForS==1) 
	{ 
		if(m_firx==FALSE)			//整数数部分 
		{ 
			m_firstz*=10;m_firstz+=i;		 
		} 
		else						//小数部分 
		{   
			m_firxw++;m_firstx+=pow(10,(-1)*m_firxw)*i; 
		} 
		m_first=m_firzorf*(m_firstz+m_firstx); 
		m_x=m_first; m_sfmf=FALSE;m_mfir=0; 
		UpdateData(FALSE); 
	} 
	else if(m_ForS==2)			//第二个数,处理同第一个数 
	{	 
		m_EnterSec=TRUE;		//将指示是否输入第二个数的变量置为真 
		if(m_secx==FALSE) 
		{ 
			m_secondz*=10;m_secondz+=i; 
		} 
		else  
		{ 
			m_secxw++;m_secondx+=pow(10,(-1)*m_secxw)*i; 
		} 
		m_second=m_seczorf*(m_secondz+m_secondx); 
		m_sfms=FALSE;m_msec=0; 
		m_x=m_second; 
		UpdateData(FALSE); 
	}	 
} 
 
void CCalcuDlg::AddFun(int j)	//输入运算符时的处理函数 
{	 
	if(m_sfmf==TRUE&&m_sfmfun==FALSE&&m_EnterSec==TRUE) 
	{	if(m_fun==1)m_result=m_mfir+m_second; 
		else if(m_fun==2)m_result=m_mfir-m_second; 
		else if(m_fun==3)m_result=m_mfir*m_second; 
		else if(m_fun==4)m_result=m_mfir/m_second; 
		m_x=m_result;m_sfmf=TRUE;m_mfir=m_result; 
//		UpdateData(FALSE); 
		m_EnterSec=FALSE; 
		m_firstz=0;m_firstx=0;m_firxw=0;m_firzorf=1; 
		m_second=0;m_secondz=0;m_secondx=0;m_secxw=0; 
		m_ForS=2;m_seczorf=1; 
		if(j==1)m_fun=1; 
		else if(j==2)m_fun=2; 
		else if(j==3)m_fun=3; 
		else if(j==4)m_fun=4;		 
	}	 
	else if(m_sfmf==FALSE&&m_sfmfun==FALSE&&m_EnterSec==TRUE)	//如果此时第二个数存在.则运算,例如输入2+3后按*键 
	{  
		if(m_fun==1)m_result=m_first+m_second; 
		else if(m_fun==2)m_result=m_first-m_second; 
		else if(m_fun==3)m_result=m_first*m_second; 
		else if(m_fun==4)m_result=m_first/m_second; 
		m_x=m_result;m_first=m_result; 
//		UpdateData(FALSE); 
		m_EnterSec=FALSE; 
		m_sfmf=TRUE;m_mfir=m_result; 
		m_firstz=0;m_firstx=0;m_firxw=0;m_firzorf=1; 
		m_second=0;m_secondz=0;m_secondx=0;m_secxw=0; 
		m_ForS=2;m_seczorf=1; 
		if(j==1)m_fun=1; 
		else if(j==2)m_fun=2; 
		else if(j==3)m_fun=3; 
		else if(j==4)m_fun=4;			 
	} 
	else    
	{ 
		if(j==1)m_fun=1; 
		else if(j==2)m_fun=2; 
		else if(j==3)m_fun=3; 
		else if(j==4)m_fun=4; 
		m_ForS=2; 
		m_x=0; 
//		UpdateData(FALSE); 
	} 
	m_mfun=0;m_sfmfun=FALSE; 
}