MFC計算器項目——普通計算模塊

普通計算模塊:(運行效果圖參見計算器項目綜述

該模塊開發文檔截圖


這一模塊是該項目的核心。考慮核心代碼的實現:由於運算符只有這六種(+、-、*、/、平方、開方)所以就可以將表達式中的運算符存在一個char數組中,然後先對該數組中平方和開方這兩個一元運算符進行處理,這樣表達式中就只剩下另外四種運算符了。而這四種運算符只有兩個優先級,利用堆棧很容易實現。遇到+、-就將數字(或其相反數)push(),遇到*、/就進行pop(),這樣最後將棧中的數字加和即可。

該模塊完整代碼如下:

// 簡化調試Dlg.cpp : implementation file
//

#include "stdafx.h"
#include "簡化調試.h"
#include "簡化調試Dlg.h"
#include "cmath"
#include "stack"
#include "MyDlg_1.h"
#include "MyDlg_2.h"
#include "MyDlg_3.h"
using namespace std;
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

CString m_num("");
CString m_sig("");
double xiaoshu,jieguo,answer;
int zhengshu,index;
int i,j,num_lenth=0;
double num[50];
stack <double> result;
/////////////////////////////////////////////////////////////////////////////
// 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()

/////////////////////////////////////////////////////////////////////////////
// CMyDlg dialog

CMyDlg::CMyDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CMyDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CMyDlg)
	m_str = _T("");
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CMyDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CMyDlg)
	DDX_Text(pDX, IDC_EDIT1, m_str);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CMyDlg, CDialog)
	//{{AFX_MSG_MAP(CMyDlg)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
	ON_BN_CLICKED(IDC_BUTTON2, OnButton2)
	ON_BN_CLICKED(IDC_BUTTON3, OnButton3)
	ON_BN_CLICKED(IDC_BUTTON4, OnButton4)
	ON_BN_CLICKED(IDC_BUTTON5, OnButton5)
	ON_BN_CLICKED(IDC_BUTTON10, OnButton10)
	ON_BN_CLICKED(IDC_BUTTON11, OnButton11)
	ON_BN_CLICKED(IDC_BUTTON12, OnButton12)
	ON_BN_CLICKED(IDC_BUTTON13, OnButton13)
	ON_BN_CLICKED(IDC_BUTTON14, OnButton14)
	ON_BN_CLICKED(IDC_BUTTON6, OnButton6)
	ON_BN_CLICKED(IDC_BUTTON7, OnButton7)
	ON_BN_CLICKED(IDC_BUTTON8, OnButton8)
	ON_BN_CLICKED(IDC_BUTTON9, OnButton9)
	ON_BN_CLICKED(IDC_BUTTON0, OnButton0)
	ON_BN_CLICKED(IDC_BUTTON15, OnButton15)
	ON_BN_CLICKED(IDC_BUTTON16, OnButton16)
	ON_BN_CLICKED(IDC_BUTTON17, OnButton17)
	ON_BN_CLICKED(IDC_BUTTON18, OnButton18)
	ON_BN_CLICKED(IDC_BUTTON19, OnButton19)
	ON_COMMAND(ID_MENUITEM0, OnMenuitem0)
	ON_COMMAND(ID_MENUITEM1, OnMenuitem1)
	ON_COMMAND(ID_MENUITEM2, OnMenuitem2)
	ON_COMMAND(ID_MENUITEM3, OnMenuitem3)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMyDlg message handlers

BOOL CMyDlg::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 CMyDlg::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 CMyDlg::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 CMyDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}

void CMyDlg::OnButton1() 
{
	// TODO: Add your control notification handler code here
	m_num = m_num + "1";
	m_str = m_str + "1";
	UpdateData(FALSE);
}

void CMyDlg::OnButton2() 
{
	// TODO: Add your control notification handler code here
	m_num = m_num + "2";
	m_str = m_str + "2";
	UpdateData(FALSE);
}

void CMyDlg::OnButton3() 
{
	// TODO: Add your control notification handler code here
	m_num = m_num + "3";
	m_str = m_str + "3";
	UpdateData(FALSE);
}

void CMyDlg::OnButton4() 
{
	// TODO: Add your control notification handler code here
	m_num = m_num + "4";
	m_str = m_str + "4";
	UpdateData(FALSE);
}

void CMyDlg::OnButton5() 
{
	// TODO: Add your control notification handler code here
	m_num = m_num + "5";
	m_str = m_str + "5";
	UpdateData(FALSE);
}

void CMyDlg::OnButton10() 
{
	// TODO: Add your control notification handler code here
	UpdateData();
	m_str = m_str + "+";
	zhengshu = 0;
    xiaoshu =0.0;
    index = 1;
	char cnum[50];
	strncpy(cnum,m_num,sizeof(cnum));
	for(i = 0;i < strlen(cnum);i++)
    {
        if(cnum[i] != '.')
            zhengshu = zhengshu * 10 + (cnum[i] - '0');
		else
		{
			for(j = i+1;j < strlen(cnum);j++,index++)
			{
				xiaoshu += (cnum[j] - '0') / pow(10,index);
			}
			break;
        }
    }
	jieguo = zhengshu + xiaoshu;
	num[num_lenth++] = jieguo;
	m_sig = m_sig + "+";
	UpdateData(FALSE);
	m_num = "";
}

void CMyDlg::OnButton11() 
{
	// TODO: Add your control notification handler code here
	UpdateData();
	m_str = m_str + "-";
	zhengshu = 0;
    xiaoshu =0.0;
    index = 1;
	char cnum[50];
	strncpy(cnum,m_num,sizeof(cnum));
	for(i = 0;i < strlen(cnum);i++)
    {
        if(cnum[i] != '.')
            zhengshu = zhengshu * 10 + (cnum[i] - '0');
		else
		{
			for(j = i+1;j < strlen(cnum);j++,index++)
			{
				xiaoshu += (cnum[j] - '0') / pow(10,index);
			}
			break;
        }
    }
	jieguo = zhengshu + xiaoshu;
	num[num_lenth++] = jieguo;
	m_sig = m_sig + "-";
	UpdateData(FALSE);
	m_num = "";
}

void CMyDlg::OnButton12() 
{
	// TODO: Add your control notification handler code here
	UpdateData();
	m_str = m_str + "×";
	zhengshu = 0;
    xiaoshu =0.0;
    index = 1;
	char cnum[50];
	strncpy(cnum,m_num,sizeof(cnum));
	for(i = 0;i < strlen(cnum);i++)
    {
        if(cnum[i] != '.')
            zhengshu = zhengshu * 10 + (cnum[i] - '0');
		else
		{
			for(j = i+1;j < strlen(cnum);j++,index++)
			{
				xiaoshu += (cnum[j] - '0') / pow(10,index);
			}
			break;
        }
    }
	jieguo = zhengshu + xiaoshu;
	num[num_lenth++] = jieguo;
	m_sig = m_sig + "*";
	UpdateData(FALSE);
	m_num = "";
}

void CMyDlg::OnButton13() 
{
	// TODO: Add your control notification handler code here
	UpdateData();
	m_str = m_str + "÷";
	zhengshu = 0;
    xiaoshu =0.0;
    index = 1;
	char cnum[50];
	strncpy(cnum,m_num,sizeof(cnum));
	for(i = 0;i < strlen(cnum);i++)
    {
        if(cnum[i] != '.')
            zhengshu = zhengshu * 10 + (cnum[i] - '0');
		else
		{
			for(j = i+1;j < strlen(cnum);j++,index++)
			{
				xiaoshu += (cnum[j] - '0') / pow(10,index);
			}
			break;
        }
    }
	jieguo = zhengshu + xiaoshu;
	num[num_lenth++] = jieguo;
	m_sig = m_sig + "/";
	UpdateData(FALSE);
	m_num = "";
}

void CMyDlg::OnButton14() 
{
	// TODO: Add your control notification handler code here
	UpdateData(TRUE);
	zhengshu = 0;
    xiaoshu =0.0;
    index = 1;
	char cnum[50];
	strncpy(cnum,m_num,sizeof(cnum));
	for(i = 0;i < strlen(cnum);i++)
    {
        if(cnum[i] != '.')
            zhengshu = zhengshu * 10 + (cnum[i] - '0');
		else
		{
			for(j = i+1;j < strlen(cnum);j++,index++)
			{
				xiaoshu += (cnum[j] - '0') / pow(10,index);
			}
			break;
        }
    }
	jieguo = zhengshu + xiaoshu;
    num[num_lenth++] = jieguo;
	answer = 0;
	char csig[50];
	strncpy(csig,m_sig,sizeof(csig));
    for(i = 0;i < strlen(csig);i++)
    {
        if(csig[i] == '#' || csig[i] == '@')
        {
            if(csig[i] == '#')
                num[i] = num[i] * num[i];
            else
                num[i] = sqrt(num[i]);
			for(j = i;j<strlen(csig)-1;j++)
                csig[j] = csig[j+1];
            csig[strlen(csig)-1] = '\0';
        }
    }
    result.push(num[0]);
    int m =-1;
    double b;
    while(1)
    {
        m++;
        if(csig[m] != '+' && csig[m] != '-' && csig[m] != '*' && csig[m] != '/')
            break;
        if(csig[m]=='+'||csig[m]=='-')
        {
            if(csig[m]=='+') result.push(num[m+1]);
            else result.push(-num[m+1]);
        }
        else            
        {
            b=result.top();
            result.pop();
            if(csig[m]=='*') result.push(b*num[m+1]);
            else 
			{
				if(num[m+1]==0)
				{
					MessageBox("除以0,你是逗比嗎?!\n重新計算吧。");
					return ;
				}
				result.push(b/num[m+1]);
			}
        }
    }
    while(!result.empty())
    {
        answer+=result.top();
        result.pop();
    }
	m_str.Format("%f", answer);
    UpdateData(FALSE);
}

void CMyDlg::OnButton16() 
{
	// TODO: Add your control notification handler code here
	UpdateData();
	m_str = m_str + "^2";
	zhengshu = 0;
    xiaoshu =0.0;
    index = 1;
	char cnum[50];
	strncpy(cnum,m_num,sizeof(cnum));
	for(i = 0;i < strlen(cnum);i++)
    {
        if(cnum[i] != '.')
            zhengshu = zhengshu * 10 + (cnum[i] - '0');
		else
		{
			for(j = i+1;j < strlen(cnum);j++,index++)
			{
				xiaoshu += (cnum[j] - '0') / pow(10,index);
			}
			break;
        }
    }
	jieguo = zhengshu + xiaoshu;
	num[num_lenth++] = jieguo;
	m_sig = m_sig + "#";
	UpdateData(FALSE);
	m_num = "";
}

void CMyDlg::OnButton6() 
{
	// TODO: Add your control notification handler code here
	m_num = m_num + "6";
	m_str = m_str + "6";
	UpdateData(FALSE);
}

void CMyDlg::OnButton7() 
{
	// TODO: Add your control notification handler code here
	m_num = m_num + "7";
	m_str = m_str + "7";
	UpdateData(FALSE);
}

void CMyDlg::OnButton8() 
{
	// TODO: Add your control notification handler code here
	m_num = m_num + "8";
	m_str = m_str + "8";
	UpdateData(FALSE);
}

void CMyDlg::OnButton9() 
{
	// TODO: Add your control notification handler code here
	m_num = m_num + "9";
	m_str = m_str + "9";
	UpdateData(FALSE);
}

void CMyDlg::OnButton0() 
{
	// TODO: Add your control notification handler code here
	m_num = m_num + "0";
	m_str = m_str + "0";
	UpdateData(FALSE);
}

void CMyDlg::OnButton15() 
{
	// TODO: Add your control notification handler code here
	if(m_num.GetAt(m_num.GetLength()-1)=='.')
		return ;
	m_num = m_num + ".";
	m_str = m_str + ".";
	UpdateData(FALSE);
}

void CMyDlg::OnButton17() 
{
	// TODO: Add your control notification handler code here
	UpdateData();
	m_str = m_str + "^0.5";
	zhengshu = 0;
    xiaoshu =0.0;
    index = 1;
	char cnum[50];
	strncpy(cnum,m_num,sizeof(cnum));
	for(i = 0;i < strlen(cnum);i++)
    {
        if(cnum[i] != '.')
            zhengshu = zhengshu * 10 + (cnum[i] - '0');
		else
		{
			for(j = i+1;j < strlen(cnum);j++,index++)
			{
				xiaoshu += (cnum[j] - '0') / pow(10,index);
			}
			break;
        }
    }
	jieguo = zhengshu + xiaoshu;
	num[num_lenth++] = jieguo;
	m_sig = m_sig + "@";
	UpdateData(FALSE);
	m_num  = "";
}

void CMyDlg::OnButton18() 
{
	// TODO: Add your control notification handler code here
	MessageBox("1.該計算器可以進行混合運算\n\n2.每次重新計算之前請按CE","溫馨提示");
}

void CMyDlg::OnButton19() 
{
	// TODO: Add your control notification handler code here
	UpdateData();
	m_num = "";
	m_sig = "";
	num_lenth = 0;
	m_str =  "";
	UpdateData(FALSE);
}

void CMyDlg::OnMenuitem1() 
{
	// TODO: Add your command handler code here
	CMyDlg::OnCancel();
	CMyDlg_1 dlg;
	dlg.DoModal();
}

void CMyDlg::OnMenuitem2() 
{
	// TODO: Add your command handler code here
	CMyDlg::OnCancel();
	CMyDlg_2 dlg;
	dlg.DoModal();
}

void CMyDlg::OnMenuitem0() 
{
	// TODO: Add your command handler code here
	MessageBox("您已處於普通計算模式!");
}

void CMyDlg::OnMenuitem3() 
{
	// TODO: Add your command handler code here
	CMyDlg::OnCancel();
	CMyDlg_3 dlg;
	dlg.DoModal();
}


發佈了54 篇原創文章 · 獲贊 57 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章