MFC之计算器

上学期老师曾经让我们写过一个计算器,但是那个时候对windows编程的原理还有很多东西都是不知道的 所以就是照葫芦画瓢的写了一个,最近重新在学MFC,所以就重新写了一个,界面的美化还没去做,只是将功能和主要的界面做好了。

源码下载

效果图

下面是代码:

/
// CCalculatorDlg dialog

CCalculatorDlg::CCalculatorDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CCalculatorDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CCalculatorDlg)
	m_edit1 = _T("");
	m_edit2 = 0.0;
	m_result=0.0;
	m_Count_Style=-1;
	m_temp1=0.0;
	m_temp2=0.0;
	m_Window_right=0.0;
	m_Count_type=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_EDIT1, m_edit1);
	DDX_Text(pDX, IDC_EDIT2, m_edit2);
	//}}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_RADIO2, OnRadio2)
	ON_BN_CLICKED(IDC_RADIO1, OnRadio1)
	ON_BN_CLICKED(IDC_BUTTON_EQUAL, OnButtonEqual)
	ON_BN_CLICKED(IDC_BUTTON_1, OnButton1)
	ON_BN_CLICKED(IDC_BUTTON_0, OnButton0)
	ON_BN_CLICKED(IDC_BUTTON_10X, OnButton10x)
	ON_BN_CLICKED(IDC_BUTTON_2, OnButton2)
	ON_BN_CLICKED(IDC_BUTTON_3, OnButton3)
	ON_BN_CLICKED(IDC_BUTTON_4, OnButton4)
	ON_BN_CLICKED(IDC_BUTTON_7, OnButton7)
	ON_BN_CLICKED(IDC_BUTTON_5, OnButton5)
	ON_BN_CLICKED(IDC_BUTTON_6, OnButton6)
	ON_BN_CLICKED(IDC_BUTTON_8, OnButton8)
	ON_BN_CLICKED(IDC_BUTTON_9, OnButton9)
	ON_BN_CLICKED(IDC_BUTTON_POINT, OnButtonPoint)
	ON_BN_CLICKED(IDC_BUTTON_PLUS, OnButtonPlus)
	ON_BN_CLICKED(IDC_BUTTON_SUB, OnButtonSub)
	ON_BN_CLICKED(IDC_BUTTON_MUL, OnButtonMul)
	ON_BN_CLICKED(IDC_BUTTON_DIV, OnButtonDiv)
	ON_BN_CLICKED(IDC_BUTTON_DAOSHU, OnButtonDaoshu)
	ON_BN_CLICKED(IDC_BUTTON_SQRT, OnButtonSqrt)
	ON_BN_CLICKED(IDC_BACKSPACE, OnBackspace)
	ON_BN_CLICKED(IDC_C, OnC)
	ON_BN_CLICKED(IDC_BUTTON_QUYU, OnButtonQuyu)
	ON_BN_CLICKED(IDC_BUTTON_ONOFF, OnButtonOnoff)
	ON_BN_CLICKED(IDC_BUTTON_Science, OnBUTTONScience)
	ON_BN_CLICKED(IDC_BUTTON_SIN, OnButtonSin)
	ON_BN_CLICKED(IDC_BUTTON_COS, OnButtonCos)
	ON_BN_CLICKED(IDC_BUTTON_TAN, OnButtonTan)
	ON_BN_CLICKED(IDC_BUTTON_SINH, OnButtonSinh)
	ON_BN_CLICKED(IDC_BUTTON_COSH, OnButtonCosh)
	ON_BN_CLICKED(IDC_BUTTON_TANH, OnButtonTanh)
	ON_BN_CLICKED(IDC_BUTTON_INT, OnButtonInt)
	ON_BN_CLICKED(IDC_BUTTON_X2, OnButtonX2)
	ON_BN_CLICKED(IDC_BUTTON_X3, OnButtonX3)
	ON_BN_CLICKED(IDC_BUTTON_XY, OnButtonXy)
	ON_BN_CLICKED(IDC_BUTTON_LN, OnButtonLn)
	ON_BN_CLICKED(IDC_BUTTON_N, OnButtonN)
	ON_BN_CLICKED(IDC_BUTTON_LOG, OnButtonLog)
	ON_BN_CLICKED(IDC_BUTTON_LEFT, OnButtonLeft)
	ON_BN_CLICKED(IDC_BUTTON_RIGHT, OnButtonRight)
	ON_BN_CLICKED(IDC_BUTTON_PorN, OnBUTTONPorN)
	//}}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
	CRect rectLarge;
	CRect rectSmall;
	CRect rectSeprator;

	GetWindowRect(&rectLarge);
	GetDlgItem(IDC_SEPARATOR)->GetWindowRect(&rectSeprator);
	m_Window_right=rectLarge.right-rectSeprator.right;
	
	rectSmall.left=rectLarge.left;
	rectSmall.bottom=rectLarge.bottom;
	rectSmall.top=rectLarge.top;
	rectSmall.right=rectSeprator.right;

	SetWindowPos(NULL,0,0,rectSmall.Width(),rectSmall.Height(),SWP_NOMOVE | SWP_NOZORDER);
	
	GetDlgItem(IDC_BUTTON_LEFT)->EnableWindow(FALSE);
	GetDlgItem(IDC_BUTTON_RIGHT)->EnableWindow(FALSE);
	GetDlgItem(IDC_BUTTON_PorN)->EnableWindow(FALSE);
	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::OnRadio1() 
{
	// TODO: Add your control notification handler code here
	//计算表达式
	m_Count_Style=1;
	GetDlgItem(IDC_BUTTON_QUYU)->EnableWindow(FALSE);
	GetDlgItem(IDC_BUTTON_DAOSHU)->EnableWindow(FALSE);
	GetDlgItem(IDC_BUTTON_SQRT)->EnableWindow(FALSE);
	GetDlgItem(IDC_BUTTON_LEFT)->EnableWindow(TRUE);
	GetDlgItem(IDC_BUTTON_RIGHT)->EnableWindow(TRUE);
}

void CCalculatorDlg::OnRadio2() 
{
	// TODO: Add your control notification handler code here
	m_Count_Style=2;
	GetDlgItem(IDC_BUTTON_QUYU)->EnableWindow(TRUE);
	GetDlgItem(IDC_BUTTON_DAOSHU)->EnableWindow(TRUE);
	GetDlgItem(IDC_BUTTON_SQRT)->EnableWindow(TRUE);
	GetDlgItem(IDC_BUTTON_LEFT)->EnableWindow(FALSE);
	GetDlgItem(IDC_BUTTON_RIGHT)->EnableWindow(FALSE);
	GetDlgItem(IDC_BUTTON_PorN)->EnableWindow(TRUE);
}

void CCalculatorDlg::OnBUTTONScience() 
{
	// TODO: Add your control notification handler code here
	CString str;
	if(GetDlgItemText(IDC_BUTTON_Science,str),str=="功能增强>>")
	{
		SetDlgItemText(IDC_BUTTON_Science,"基本运算<<");
	}
	else
	{
		SetDlgItemText(IDC_BUTTON_Science,"功能增强>>");
	}
	
	static CRect rectLarge;
	static CRect rectSmall;
	
	if(rectLarge.IsRectEmpty())
	{
		GetWindowRect(&rectSmall);
		
		rectLarge.left=rectSmall.left;
		rectLarge.top=rectSmall.top;
		rectLarge.right=rectSmall.right+m_Window_right;
		rectLarge.bottom=rectSmall.bottom;
	}
	if(str=="基本运算<<")
	{
		SetWindowPos(NULL,0,0,rectSmall.Width(),rectSmall.Height(),SWP_NOMOVE | SWP_NOZORDER);
	}
	else
	{
		SetWindowPos(NULL,0,0,rectLarge.Width(),rectLarge.Height(),SWP_NOMOVE | SWP_NOZORDER);
	}
}

void CCalculatorDlg::OnBackspace() 
{
	// TODO: Add your control notification handler code here
	UpdateData();

	char *ch=(LPTSTR)(LPCTSTR)m_edit1;
	int length=m_edit1.GetLength();
	ch[length-1]='\0';
	m_edit1=ch;
	
	UpdateData(FALSE);
}

void CCalculatorDlg::OnC() 
{
	// TODO: Add your control notification handler code here
	m_edit1="";
	m_edit2=0.0;
	m_result=0.0;
	UpdateData(FALSE);
}

void CCalculatorDlg::OnButtonOnoff() 
{
	// TODO: Add your control notification handler code here
	CString str;
	if(GetDlgItemText(IDC_BUTTON_ONOFF,str),str=="OFF")
	{
		SetDlgItemText(IDC_BUTTON_ONOFF,"ON");	
	}
	else
		SetDlgItemText(IDC_BUTTON_ONOFF,"OFF");
	
	if(str=="OFF")
	{
		GetDlgItem(IDC_EDIT1)->EnableWindow(FALSE);
		GetDlgItem(IDC_EDIT2)->EnableWindow(FALSE);
		m_edit1="";
		m_edit2=0.0;
		UpdateData(FALSE);
	}
	else
	{
		GetDlgItem(IDC_EDIT1)->EnableWindow(TRUE);
		GetDlgItem(IDC_EDIT2)->EnableWindow(TRUE);
	}
}

void CCalculatorDlg::OnButtonPoint() 
{
	// TODO: Add your control notification handler code here
	UpdateData();
	m_edit1+='.';
	UpdateData(FALSE);
}

void CCalculatorDlg::OnBUTTONPorN() 
{
	// TODO: Add your control notification handler code here
	UpdateData();
	if(m_edit1=="")
		MessageBox("操作不合法");
	else
	{
		if(m_edit1[0]=='-')
		{
			m_edit1.Remove('-');
		}
		else
			m_edit1="-"+m_edit1;
	}
	UpdateData(FALSE);
}

void CCalculatorDlg::OnButton0() 
{
	// TODO: Add your control notification handler code here
	UpdateData();
	m_edit1+='0';
	UpdateData(FALSE);
}

void CCalculatorDlg::OnButton1() 
{
	// TODO: Add your control notification handler code here
	UpdateData();
	m_edit1+='1';
	UpdateData(FALSE);
}

void CCalculatorDlg::OnButton2() 
{
	// TODO: Add your control notification handler code here
	UpdateData();
	m_edit1+='2';
	UpdateData(FALSE);
}

void CCalculatorDlg::OnButton3() 
{
	// TODO: Add your control notification handler code here
	UpdateData();
	m_edit1+='3';
	UpdateData(FALSE);
}

void CCalculatorDlg::OnButton4() 
{
	// TODO: Add your control notification handler code here
	UpdateData();
	m_edit1+='4';
	UpdateData(FALSE);
}

void CCalculatorDlg::OnButton5() 
{
	// TODO: Add your control notification handler code here
	UpdateData();
	m_edit1+='5';
	UpdateData(FALSE);
}

void CCalculatorDlg::OnButton6() 
{
	// TODO: Add your control notification handler code here
	UpdateData();
	m_edit1+='6';
	UpdateData(FALSE);
}

void CCalculatorDlg::OnButton7() 
{
	// TODO: Add your control notification handler code here
	UpdateData();
	m_edit1+='7';
	UpdateData(FALSE);
}

void CCalculatorDlg::OnButton8() 
{
	// TODO: Add your control notification handler code here
	UpdateData();
	m_edit1+='8';
	UpdateData(FALSE);
}

void CCalculatorDlg::OnButton9() 
{
	// TODO: Add your control notification handler code here
	UpdateData();
	m_edit1+='9';
	UpdateData(FALSE);
}

void CCalculatorDlg::OnButtonPlus() 
{
	// TODO: Add your control notification handler code here
	if(m_Count_Style==1)
	{
		UpdateData();
		m_edit1+='+';
		UpdateData(FALSE);
	}
	if(m_Count_Style==2)
	{
		m_Count_type=1;
		char m_char[10];
		GetDlgItem(IDC_EDIT1)->GetWindowText(m_char,10);
		m_temp1=atof(m_char);
		m_edit1="";
		UpdateData(FALSE);
	}

}

void CCalculatorDlg::OnButtonSub() 
{
	// TODO: Add your control notification handler code here
	if(m_Count_Style==1)
	{
		UpdateData();
		m_edit1+='-';
		UpdateData(FALSE);
	}
	if(m_Count_Style==2)
	{
		m_Count_type=2;
		char m_char[10];
		GetDlgItem(IDC_EDIT1)->GetWindowText(m_char,10);
		m_temp1=atof(m_char);
		m_edit1="";
		UpdateData(FALSE);
	}
}

void CCalculatorDlg::OnButtonMul() 
{
	// TODO: Add your control notification handler code here
	if(m_Count_Style==1)
	{
		UpdateData();
		m_edit1+='*';
		UpdateData(FALSE);
	}
	if(m_Count_Style==2)
	{
		m_Count_type=3;
		char m_char[10];
		GetDlgItem(IDC_EDIT1)->GetWindowText(m_char,10);
		m_temp1=atof(m_char);
		m_edit1="";
		UpdateData(FALSE);
	}
}

void CCalculatorDlg::OnButtonDiv() 
{
	// TODO: Add your control notification handler code here
	if(m_Count_Style==1)
	{
		UpdateData();
		m_edit1+='/';
		UpdateData(FALSE);
	}
	if(m_Count_Style==2)
	{
		m_Count_type=4;
		char m_char[10];
		GetDlgItem(IDC_EDIT1)->GetWindowText(m_char,10);
		m_temp1=atof(m_char);
		m_edit1="";
		UpdateData(FALSE);
	}
}

void CCalculatorDlg::OnButtonQuyu() 
{
	// TODO: Add your control notification handler code here
	if(m_Count_Style==2)
	{
		m_Count_type=5;
		char m_char[10];
		GetDlgItem(IDC_EDIT1)->GetWindowText(m_char,10);
		m_temp1=atof(m_char);
		m_edit1="";
		UpdateData(FALSE);
	}
}
void CCalculatorDlg::OnButtonXy() 
{
	// TODO: Add your control notification handler code here
	m_Count_type=6;
	char m_char[10];
	GetDlgItem(IDC_EDIT1)->GetWindowText(m_char,10);
	m_temp1=atof(m_char);
	m_edit1="";
	UpdateData(FALSE);
}

void CCalculatorDlg::OnButtonDaoshu() 
{
	// TODO: Add your control notification handler code here
	char m_char[10];
	GetDlgItem(IDC_EDIT2)->GetWindowText(m_char,10);
	double temp=atof(m_char);
	CString str=m_char;
	if(temp==0)
		MessageBox("0不能做除数");
	else
	{
		m_edit1="1/"+str;
		m_edit2=1/temp;
	}
	UpdateData(FALSE);
}

void CCalculatorDlg::OnButtonSqrt() 
{
	// TODO: Add your control notification handler code here
	char m_char[10];
	GetDlgItem(IDC_EDIT2)->GetWindowText(m_char,10);
	CString str=m_char;
	double temp=atof(m_char);
	m_edit1="sqrt("+str+")";
	m_edit2=sqrt(temp);
	UpdateData(FALSE);
}

void CCalculatorDlg::OnButtonSin() 
{
	// TODO: Add your control notification handler code here
	char m_char[10];
	GetDlgItem(IDC_EDIT2)->GetWindowText(m_char,10);
	CString str=m_char;
	double temp=atof(m_char);
	m_edit1="sin("+str+")";
	m_edit2=sin(temp);
	UpdateData(FALSE);
}

void CCalculatorDlg::OnButtonCos() 
{
	// TODO: Add your control notification handler code here
	char m_char[10];
	GetDlgItem(IDC_EDIT2)->GetWindowText(m_char,10);
	CString str=m_char;
	double temp=atof(m_char);
	m_edit1="cos("+str+")";
	m_edit2=cos(temp);
	UpdateData(FALSE);
}

void CCalculatorDlg::OnButtonTan() 
{
	// TODO: Add your control notification handler code here
	char m_char[10];
	GetDlgItem(IDC_EDIT2)->GetWindowText(m_char,10);
	CString str=m_char;
	double temp=atof(m_char);
	m_edit1="tan("+str+")";
	m_edit2=tan(temp);
	UpdateData(FALSE);
}

void CCalculatorDlg::OnButtonSinh() 
{
	// TODO: Add your control notification handler code here
	char m_char[10];
	GetDlgItem(IDC_EDIT2)->GetWindowText(m_char,10);
	CString str=m_char;
	double temp=atof(m_char);
	m_edit1="sinh("+str+")";
	m_edit2=sinh(temp);
	UpdateData(FALSE);
}

void CCalculatorDlg::OnButtonCosh() 
{
	// TODO: Add your control notification handler code here
	char m_char[10];
	GetDlgItem(IDC_EDIT2)->GetWindowText(m_char,10);
	CString str=m_char;
	double temp=atof(m_char);
	m_edit1="cosh("+str+")";
	m_edit2=cosh(temp);
	UpdateData(FALSE);
}

void CCalculatorDlg::OnButtonTanh() 
{
	// TODO: Add your control notification handler code here
	char m_char[10];
	GetDlgItem(IDC_EDIT2)->GetWindowText(m_char,10);
	CString str=m_char;
	double temp=atof(m_char);
	m_edit1="tanh("+str+")";
	m_edit2=tanh(temp);
	UpdateData(FALSE);
}

void CCalculatorDlg::OnButtonInt() 
{
	// TODO: Add your control notification handler code here
	char m_char[10];
	GetDlgItem(IDC_EDIT2)->GetWindowText(m_char,10);
	CString str=m_char;
	int temp=atoi(m_char);
	m_edit1="Int("+str+")";
	m_edit2=temp;
	UpdateData(FALSE);
}

void CCalculatorDlg::OnButtonX2() 
{
	// TODO: Add your control notification handler code here
	char m_char[10];
	GetDlgItem(IDC_EDIT2)->GetWindowText(m_char,10);
	CString str=m_char;
	double temp=atof(m_char);
	m_edit1=str+"*"+str;
	m_edit2=temp*temp;
	UpdateData(FALSE);
}

void CCalculatorDlg::OnButtonX3() 
{
	// TODO: Add your control notification handler code here
	char m_char[10];
	GetDlgItem(IDC_EDIT2)->GetWindowText(m_char,10);
	CString str=m_char;
	double temp=atof(m_char);
	m_edit1=str+"*"+str+"*"+str;
	m_edit2=temp*temp*temp;
	UpdateData(FALSE);
}

void CCalculatorDlg::OnButton10x() 
{
	// TODO: Add your control notification handler code here
	char m_char[10];
	GetDlgItem(IDC_EDIT2)->GetWindowText(m_char,10);
	CString str=m_char;
	int temp=atoi(m_char);
	m_edit1="10^"+str;
	m_edit2=pow(10,temp);
	UpdateData(FALSE);
}

void CCalculatorDlg::OnButtonLn() 
{
	// TODO: Add your control notification handler code here
	char m_char[10];
	GetDlgItem(IDC_EDIT2)->GetWindowText(m_char,10);
	CString str=m_char;
	double temp=atof(m_char);
	if(temp<=0)
		MessageBox("参数不合法");
	else
	{
		m_edit1="ln("+str+")";
		m_edit2=log(temp);
	}
	UpdateData(FALSE);
}

void CCalculatorDlg::OnButtonN() 
{
	// TODO: Add your control notification handler code here
	char m_char[10];
	GetDlgItem(IDC_EDIT2)->GetWindowText(m_char,10);
	CString str=m_char;
	int temp=atoi(m_char);
	temp=int(temp);
	m_edit1=str+"!";
	m_edit2=temp;
	for(int i=temp-1;i>=1;i--)
		m_edit2*=i;
	UpdateData(FALSE);
}

void CCalculatorDlg::OnButtonLog() 
{
	// TODO: Add your control notification handler code here
	char m_char[10];
	GetDlgItem(IDC_EDIT2)->GetWindowText(m_char,10);
	CString str=m_char;
	double temp=atof(m_char);
	if(temp<=0)
		MessageBox("参数不合法");
	else
	{
		m_edit1="Log10("+str+")";
		m_edit2=log10(temp);
	}
	UpdateData(FALSE);
}

void CCalculatorDlg::OnButtonLeft() 
{
	// TODO: Add your control notification handler code here
	UpdateData();
	m_edit1+="(";
	UpdateData(FALSE);
}

void CCalculatorDlg::OnButtonRight() 
{
	// TODO: Add your control notification handler code here
	UpdateData();
	m_edit1+=")";
	UpdateData(FALSE);
}

void CCalculatorDlg::OnButtonEqual() 
{
	// TODO: Add your control notification handler code here
	if(m_Count_Style==1)
	{
		UpdateData();
		if(m_edit1=="")
		{
			m_result=0;	
			goto lp;
		}
		int i=0;
		double v1,v2,v3;
		double s,f;
		char *ch=(LPTSTR)(LPCTSTR)m_edit1; //将CString类型强制转换为char *类型
		stack<char> s1;
		stack<double> s2;
		while(ch[i]!='\0')
		{
			s=0;
			f=0.1;
			switch(ch[i])
			{
			case '0':
			case '1':
			case '2':
			case '3':
			case '4':
			case '5':
			case '6':
			case '7':
			case '8':
			case '9':
				while( (ch[i]>='0') && (ch[i]<='9') )
				{
					s=s*10+(ch[i]-'0');
					i++;
				}
				if(ch[i]=='.')
				{
					i++;
					while( (ch[i]>='0') && (ch[i]<='9'))
					{
						s=s+(ch[i]-'0')*f;
						f=f*0.1;
						i++;
					}
				}
				s2.push(s);
				i--;
				break;
			case '+':
			case '-':
				if( (s1.empty()) || (s1.top()=='(') )
					s1.push(ch[i]);
				else
				{
					while( (!s1.empty()) && (s1.top()!='(') )
					{
						switch(s1.top())
						{
						case '+':
							v1=s2.top();
							s2.pop();
							v2=s2.top();
							s2.pop();
							v3=v1+v2;
							s2.push(v3);
							break;
						case '-':
							v1=s2.top();
							s2.pop();
							v2=s2.top();
							s2.pop();
							v3=v2-v1;
							s2.push(v3);
							break;
						case '*':
							v1=s2.top();
							s2.pop();
							v2=s2.top();
							s2.pop();
							v3=v1*v2;
							s2.push(v3);
							break;
						case '/':
							v1=s2.top();
							s2.pop();
							v2=s2.top();
							s2.pop();
							v3=v2/v1;
							s2.push(v3);
							break;
						}//switch
						s1.pop();
					}//while
					s1.push(ch[i]);
				}//else
				break;
			case '*':
			case '/':
				if( (s1.empty()) || (s1.top()=='(') || (s1.top()=='+') || (s1.top()=='-') )
					s1.push(ch[i]);
				else
				{
					while( (!s1.empty()) && (s1.top()!='(') && (s1.top()!='+') && (s1.top()!='-') )
					{
						switch(s1.top())
						{
						case '*':
							v1=s2.top();
							s2.pop();
							v2=s2.top();
							s2.pop();
							v3=v1*v2;
							s2.push(v3);
							break;
						case '/':
							v1=s2.top();
							s2.pop();
							v2=s2.top();
							s2.pop();
							v3=v2/v1;
							s2.push(v3);
							break;
						}
						s1.pop();
					}
					s1.push(ch[i]);
				}
				break;
			case '(':
				s1.push(ch[i]);
				break;
			case ')':
				while( (!s1.empty()) && (s1.top()!='(') )
				{
					switch(s1.top())
					{
					case '+':
						v1=s2.top();
						s2.pop();
						v2=s2.top();
						s2.pop();
						v3=v1+v2;
						s2.push(v3);
						break;
					case '-':
						v1=s2.top();
						s2.pop();
						v2=s2.top();
						s2.pop();
						v3=v2-v1;
						s2.push(v3);
						break;
					case '*':
						v1=s2.top();
						s2.pop();
						v2=s2.top();
						s2.pop();
						v3=v1*v2;
						s2.push(v3);
						break;
					case '/':
						v1=s2.top();
						s2.pop();
						v2=s2.top();
						s2.pop();
						v3=v2/v1;
						s2.push(v3);
						break;
					}
					s1.pop();
				}
				if(!s1.empty())//pop掉左括号
					s1.pop();
				break;
			}//switch
			i++;
		}//while
		while(!s1.empty())
		{
			switch(s1.top())
			{
			case '+':
				v1=s2.top();
				s2.pop();
				v2=s2.top();
				s2.pop();
				v3=v1+v2;
				s2.push(v3);
				break;
			case '-':
				v1=s2.top();
				s2.pop();
				v2=s2.top();
				s2.pop();
				v3=v2-v1;
				s2.push(v3);
				break;
			case '*':
				v1=s2.top();
				s2.pop();
				v2=s2.top();
				s2.pop();
				v3=v1*v2;
				s2.push(v3);
				break;
			case '/':
				v1=s2.top();
				s2.pop();
				v2=s2.top();
				s2.pop();
				v3=v2/v1;
				s2.push(v3);
				break;
			}//switch
			s1.pop();
		}//while
		v3=s2.top();
		s2.pop();
		m_result=v3;
	}
	else if(m_Count_Style==2)
	{
		CString str1,str2;
		char m_c1[10],m_c2[10];
		char m_char[10];
		GetDlgItem(IDC_EDIT1)->GetWindowText(m_char,10);
		m_temp2=atof(m_char);
		m_edit1="";
		UpdateData(FALSE);

		switch(m_Count_type)
		{
		case 1:
			m_temp1+=m_temp2;
			if(m_result==0)
				m_result=m_temp1;
			else
				m_result+=m_temp2;
			break;
		case 2:
			m_temp1-=m_temp2;
			if(m_result==0)
				m_result=m_temp1;
			else
				m_result-=m_temp2;
			break;
		case 3:
			m_temp1*=m_temp2;
			if(m_result==0)
				m_result=m_temp1;
			else
				m_result*=m_temp2;
			break;
		case 4:
			m_temp1/=m_temp2;
			if(m_result==0)
				m_result=m_temp1;
			else
				m_result/=m_temp2;
			break;
		case 5:
			m_temp1=(int)m_temp1%(int)m_temp2;
			if(m_result==0)
				m_result=m_temp1;
			else
				m_result=(int)m_result%(int)m_temp2;
			break;
		case 6:
			itoa(m_temp1,m_c1,10);
			itoa(m_temp2,m_c2,10);
			str1=m_c1;
			str2=m_c2;
			m_edit1=str1+"^"+str2;
			m_result=pow(m_temp1,m_temp2);
			break;
		default:
			m_result=m_temp2;
		}
	}
	else
	{
		MessageBox("请选择计算的模式");
	}
lp:	m_edit2=m_result;
	UpdateData(FALSE);
}

 

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值