// CalculatorDlg.h : 頭文件
//
#pragma once
// CCalculatorDlg 對話框
class CCalculatorDlg : public CDialogEx
{
// 構造
public:
CCalculatorDlg(CWnd* pParent = NULL); // 標准構造函數
// 對話框數據
enum { IDD = IDD_CALCULATOR_DIALOG };
void GetStr(CString);
void CalStr();
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
// 實現
protected:
HICON m_hIcon;
// 生成的消息映射函數
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnEnter();
afx_msg void OnB1();
CString m_strAns;
afx_msg void OnB2();
afx_msg void OnB3();
afx_msg void OnB4();
afx_msg void OnB5();
afx_msg void OnB6();
afx_msg void OnB7();
afx_msg void OnB8();
afx_msg void OnB9();
afx_msg void OnB0();
CString m_strFun;
afx_msg void OnBdot();
afx_msg void OnBdevide();
afx_msg void OnBnClickedBc();
afx_msg void OnBadd();
afx_msg void OnBcut();
afx_msg void OnBride();
afx_msg void OnBback();
afx_msg void OnBaddcut();
afx_msg void OnBce();
afx_msg void OnBpercent();
afx_msg void OnBcontrary();
afx_msg void OnBsqr();
afx_msg void OnBnClickedBmr();
afx_msg void OnBnClickedBms();
afx_msg void OnBnClickedBmc();
afx_msg void OnBnClickedBmadd();
afx_msg void OnBnClickedBmcut();
CString m_M;
};
// CalculatorDlg.cpp : 實現文件
//
#include "stdafx.h"
#include "Calculator.h"
#include "CalculatorDlg.h"
#include "afxdialogex.h"
#include <math.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
bool gotDot = false; //按.標志
bool gotNum = false; //按數字標志
bool gotZero = false; //按0標志
bool optPsd = false; //按下計算符號標志
bool gotEtr = false; //按下=鍵標志
bool gotM = false; //得到存儲器
bool flg = false; //計算時賦值t的判斷符號
char b[10]; //數據處理存儲數組
double a[20];
int max = 0;
double memory = 0;
// 用於應用程序“關於”菜單項的 CAboutDlg 對話框
class CAboutDlg : public CDialogEx
{
public:
CAboutDlg();
// 對話框數據
enum { IDD = IDD_ABOUTBOX };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
// 實現
protected:
DECLARE_MESSAGE_MAP()
public:
};
CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD)
{
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()
// CCalculatorDlg 對話框
CCalculatorDlg::CCalculatorDlg(CWnd* pParent /*=NULL*/)
: CDialogEx(CCalculatorDlg::IDD, pParent)
, m_strAns(_T(""))
, m_strFun(_T(""))
, m_M(_T(""))
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CCalculatorDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Text(pDX, IDC_EDITANS, m_strAns);
DDX_Text(pDX, IDC_EDITDSP, m_strFun);
DDX_Text(pDX, IDC_EDITM, m_M);
}
BEGIN_MESSAGE_MAP(CCalculatorDlg, CDialogEx)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BENTER, &CCalculatorDlg::OnEnter)
ON_BN_CLICKED(IDC_B1, &CCalculatorDlg::OnB1)
ON_BN_CLICKED(IDC_B2, &CCalculatorDlg::OnB2)
ON_BN_CLICKED(IDC_B3, &CCalculatorDlg::OnB3)
ON_BN_CLICKED(IDC_B4, &CCalculatorDlg::OnB4)
ON_BN_CLICKED(IDC_B5, &CCalculatorDlg::OnB5)
ON_BN_CLICKED(IDC_B6, &CCalculatorDlg::OnB6)
ON_BN_CLICKED(IDC_B7, &CCalculatorDlg::OnB7)
ON_BN_CLICKED(IDC_B8, &CCalculatorDlg::OnB8)
ON_BN_CLICKED(IDC_B9, &CCalculatorDlg::OnB9)
ON_BN_CLICKED(IDC_B10, &CCalculatorDlg::OnB0)
ON_BN_CLICKED(IDC_BDOT, &CCalculatorDlg::OnBdot)
ON_BN_CLICKED(IDC_BDEVIDE, &CCalculatorDlg::OnBdevide)
ON_BN_CLICKED(IDC_BC, &CCalculatorDlg::OnBnClickedBc)
ON_BN_CLICKED(IDC_BADD, &CCalculatorDlg::OnBadd)
ON_BN_CLICKED(IDC_BCUT, &CCalculatorDlg::OnBcut)
ON_BN_CLICKED(IDC_BRIDE, &CCalculatorDlg::OnBride)
ON_BN_CLICKED(IDC_BBACK, &CCalculatorDlg::OnBback)
ON_BN_CLICKED(IDC_BADDCUT, &CCalculatorDlg::OnBaddcut)
ON_BN_CLICKED(IDC_BCE, &CCalculatorDlg::OnBce)
ON_BN_CLICKED(IDC_BPERCENT, &CCalculatorDlg::OnBpercent)
ON_BN_CLICKED(IDC_BCONTRARY, &CCalculatorDlg::OnBcontrary)
ON_BN_CLICKED(IDC_BSQR, &CCalculatorDlg::OnBsqr)
ON_BN_CLICKED(IDC_BMR, &CCalculatorDlg::OnBnClickedBmr)
ON_BN_CLICKED(IDC_BMS, &CCalculatorDlg::OnBnClickedBms)
ON_BN_CLICKED(IDC_BMC, &CCalculatorDlg::OnBnClickedBmc)
ON_BN_CLICKED(IDC_BMADD, &CCalculatorDlg::OnBnClickedBmadd)
ON_BN_CLICKED(IDC_BMCUT, &CCalculatorDlg::OnBnClickedBmcut)
END_MESSAGE_MAP()
// CCalculatorDlg 消息處理程序
BOOL CCalculatorDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// 將“關於...”菜單項添加到系統菜單中。
// IDM_ABOUTBOX 必須在系統命令范圍內。
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
BOOL bNameValid;
CString strAboutMenu;
bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
ASSERT(bNameValid);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// 設置此對話框的圖標。當應用程序主窗口不是對話框時,框架將自動
// 執行此操作
SetIcon(m_hIcon, TRUE); // 設置大圖標
SetIcon(m_hIcon, FALSE); // 設置小圖標
// TODO: 在此添加額外的初始化代碼
//GetDlgItem(IDC_EDITANS)->EnableWindow(false);
return TRUE; // 除非將焦點設置到控件,否則返回 TRUE
}
void CCalculatorDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialogEx::OnSysCommand(nID, lParam);
}
}
void CCalculatorDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用於繪制的設備上下文
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
// 使圖標在工作區矩形中居中
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;
// 繪制圖標
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialogEx::OnPaint();
}
}
//當用戶拖動最小化窗口時系統調用此函數取得光標
//顯示。
HCURSOR CCalculatorDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}
void CCalculatorDlg::OnB1()
{
if(true == gotEtr || true == gotM)
{
m_strAns = "";
UpdateData(FALSE);
gotEtr = false;
gotM = false;
}
if(false ==gotNum && true == gotZero)
{
m_strAns = "1";
}else{
m_strAns += "1";
}
UpdateData(FALSE);
gotNum =true;
optPsd = false;
}
void CCalculatorDlg::OnB2()
{
if(true == gotEtr || true == gotM)
{
m_strAns = "";
UpdateData(FALSE);
gotEtr = false;
gotM = false;
}
if(false ==gotNum && true == gotZero)
{
m_strAns = "2";
}else{
m_strAns += "2";
}
UpdateData(FALSE);
gotNum =true;
optPsd = false;
}
void CCalculatorDlg::OnB3()
{
if(true == gotEtr || true == gotM)
{
m_strAns = "";
UpdateData(FALSE);
gotEtr = false;
gotM = false;
}
if(false ==gotNum && true == gotZero)
{
m_strAns = "3";
}else{
m_strAns += "3";
}
UpdateData(FALSE);
gotNum =true;
optPsd = false;
}
void CCalculatorDlg::OnB4()
{
if(true == gotEtr || true == gotM)
{
m_strAns = "";
UpdateData(FALSE);
gotEtr = false;
gotM = false;
}
if(false ==gotNum && true == gotZero)
{
m_strAns = "4";
}else{
m_strAns += "4";
}
UpdateData(FALSE);
gotNum =true;
optPsd = false;
}
void CCalculatorDlg::OnB5()
{
if(true == gotEtr || true == gotM)
{
m_strAns = "";
UpdateData(FALSE);
gotEtr = false;
gotM = false;
}
if(false ==gotNum && true == gotZero)
{
m_strAns = "5";
}else{
m_strAns += "5";
}
UpdateData(FALSE);
gotNum =true;
optPsd = false;
}
void CCalculatorDlg::OnB6()
{
if(true == gotEtr || true == gotM)
{
m_strAns = "";
UpdateData(FALSE);
gotEtr = false;
gotM = false;
}
if(false ==gotNum && true == gotZero)
{
m_strAns = "6";
}else{
m_strAns += "6";
}
UpdateData(FALSE);
gotNum =true;
optPsd = false;
}
void CCalculatorDlg::OnB7()
{
if(true == gotEtr || true == gotM)
{
m_strAns = "";
UpdateData(FALSE);
gotEtr = false;
gotM = false;
}
if(false ==gotNum && true == gotZero)
{
m_strAns = "7";
}else{
m_strAns += "7";
}
UpdateData(FALSE);
gotNum =true;
optPsd = false;
}
void CCalculatorDlg::OnB8()
{
if(true == gotEtr || true == gotM)
{
m_strAns = "";
UpdateData(FALSE);
gotEtr = false;
gotM = false;
}
if(false ==gotNum && true == gotZero)
{
m_strAns = "8";
}else{
m_strAns += "8";
}
UpdateData(FALSE);
gotNum =true;
optPsd = false;
}
void CCalculatorDlg::OnB9()
{
if(true == gotEtr || true == gotM)
{
m_strAns = "";
UpdateData(FALSE);
gotEtr = false;
gotM = false;
}
if(false ==gotNum && true == gotZero)
{
m_strAns = "9";
}else{
m_strAns += "9";
}
UpdateData(FALSE);
gotNum =true;
optPsd = false;
}
void CCalculatorDlg::OnB0()
{
if(true == gotEtr || true == gotM)
{
m_strAns = "";
UpdateData(FALSE);
gotEtr = false;
gotM = false;
}
gotZero = true;
if(true == gotNum)
{
m_strAns += "0";
}
else
{
m_strAns = "0";
}
UpdateData(FALSE);
optPsd = false;
}
void CCalculatorDlg::OnBdot()
{
if(true == gotEtr || true == gotM)
{
m_strAns = "";
UpdateData(FALSE);
gotEtr = false;
gotM = false;
}
if(false ==gotNum && true == gotZero)
{
m_strAns += "0.";
}
else if(gotDot==false)
{
m_strAns += ".";
}
UpdateData(FALSE);
gotNum = true;
gotDot = true;
optPsd = false;
}
void CCalculatorDlg::OnBadd() //加法
{
if(false==optPsd)
{
m_strFun += m_strAns;
m_strFun += "+";
m_strAns = "";
UpdateData(FALSE);
}
UpdateData(TRUE);
int n = 0;
n = m_strFun.GetLength();
n--;
if(m_strFun.GetAt(n) == '-' ||m_strFun.GetAt(n) == '*'||m_strFun.GetAt(n) == '/')
{ //最后一個字符不是數字,可以二次修改運算符
m_strFun.Delete(n);
m_strFun += "+";
UpdateData(FALSE);
}
optPsd = true;
gotNum = false;
gotDot = false;
}
void CCalculatorDlg::OnBcut() //減法
{
if(false==optPsd) //不能連續按兩個字符
{
m_strFun += m_strAns;
m_strFun += "-";
m_strAns = "";
UpdateData(FALSE);
}
UpdateData(TRUE);
int n = 0;
n = m_strFun.GetLength();
n--;
if(m_strFun.GetAt(n) == '+' ||m_strFun.GetAt(n) == '*'||m_strFun.GetAt(n) == '/')
{ //最后一個字符不是數字,可以二次修改運算符
m_strFun.Delete(n);
m_strFun += "-";
UpdateData(FALSE);
}
optPsd = true;
gotNum = false;
gotDot = false;
}
void CCalculatorDlg::OnBride() //乘法
{
if(false==optPsd)
{
m_strFun += m_strAns;
m_strFun += "*";
m_strAns = "";
UpdateData(FALSE);
}
UpdateData(TRUE);
int n = 0;
n = m_strFun.GetLength();
n--;
if(m_strFun.GetAt(n) == '+' ||m_strFun.GetAt(n) == '-'||m_strFun.GetAt(n) == '/')
{ //最后一個字符不是數字,可以二次修改運算符
m_strFun.Delete(n);
m_strFun += "*";
UpdateData(FALSE);
}
optPsd = true;
gotNum = false;
gotDot = false;
}
void CCalculatorDlg::OnBdevide() //除法
{
if(false==optPsd)
{
m_strFun += m_strAns;
m_strFun += "/";
m_strAns = "";
UpdateData(FALSE);
}
UpdateData(TRUE);
int n = 0;
n = m_strFun.GetLength();
n--;
if(m_strFun.GetAt(n) == '+' ||m_strFun.GetAt(n) == '*'||m_strFun.GetAt(n) == '-')
{ //最后一個字符不是數字,可以二次修改運算符
m_strFun.Delete(n);
m_strFun += "/";
UpdateData(FALSE);
}
optPsd = true;
gotNum = false;
gotDot = false;
}
void CCalculatorDlg::OnBnClickedBc() //清屏(全部)
{
m_strFun = "";
m_strAns = "";
UpdateData(FALSE);
gotDot = false;
gotNum = false;
gotZero = false;
optPsd = false;
gotEtr = false; //按下=鍵標志
bool gotM = false;
bool flg = false; //計算時賦值t的判斷符號
max = 0;
}
void CCalculatorDlg::OnBback() //回刪
{
int n= 0;
if(m_strAns != "")
{
n = m_strAns.GetLength()-1;
if('.' == m_strAns.GetAt(n)) //釋放點控制標志
{
gotDot = false;
}
m_strAns.Delete(n);
UpdateData(FALSE);
}
}
void CCalculatorDlg::OnBaddcut() // 符號取反
{
UpdateData(TRUE);
if(m_strAns!="")
{
int n;
n = m_strAns.Find(_T("-")); //查找是否有-
if(n!=-1)
{
m_strAns.Delete(0);
}else
{
m_strAns = _T("-") + m_strAns;
}
UpdateData(FALSE);
}
}
void CCalculatorDlg::OnBce() //清屏(輸入)
{
m_strAns = "";
gotDot = false;
gotNum = false;
gotZero = false;
optPsd = false;
gotEtr = false; //按下=鍵標志
bool gotM = false;
max = 0;
UpdateData(FALSE);
}
void CCalculatorDlg::OnBpercent() //求百分比
{
UpdateData(TRUE);
double a = 0;
a = _ttoi(m_strAns);
a *= 0.01;
m_strAns.Format(_T("%lf"),a);
int m = m_strAns.GetLength()-1; //最大位置
int n = m_strAns.Find(_T('.'));//小數點位置
while('0' == m_strAns.GetAt(m)) //m處為零
{
m_strAns.Delete(m);
m--;
}
m = m_strAns.GetLength()-1; //最大位置
if('.' == m_strAns.GetAt(m))
{
m_strAns.Delete(m);
}
UpdateData(FALSE);
}
void CCalculatorDlg::OnBcontrary() //求倒數
{
UpdateData(TRUE);
double a = 0;
a = _ttoi(m_strAns);
a = 1 / a;
m_strAns.Format(_T("%lf"),a);
int m = m_strAns.GetLength()-1; //最大位置
int n = m_strAns.Find(_T('.'));//小數點位置
while('0' == m_strAns.GetAt(m)) //m處為零
{
m_strAns.Delete(m);
m--;
}
m = m_strAns.GetLength()-1; //最大位置
if('.' == m_strAns.GetAt(m))
{
m_strAns.Delete(m);
}
UpdateData(FALSE);
}
void CCalculatorDlg::OnBsqr() //開平方根
{
UpdateData(TRUE);
double a = 1;
a = _ttoi(m_strAns);
a = sqrt(a);
m_strAns.Format(_T("%lf"),a);
int m = m_strAns.GetLength()-1; //最大位置
int n = m_strAns.Find(_T('.'));//小數點位置
while('0' == m_strAns.GetAt(m)) //m處為零
{
m_strAns.Delete(m);
m--;
}
m = m_strAns.GetLength()-1; //最大位置
if('.' == m_strAns.GetAt(m))
{
m_strAns.Delete(m);
}
UpdateData(FALSE);
}
void CCalculatorDlg::OnEnter() //計算並得值
{
int m,n = 0;
UpdateData(TRUE);
m_strFun += m_strAns;
GetStr(m_strFun);
CalStr();
m_strAns.Format(_T("%lf"),a[0]);
if(m_strFun.Find(_T("/0")) != -1)
{
m_strAns = "除數不能為零";
m_strFun = "";
UpdateData(FALSE);
}else
{
m_strAns.Format(_T("%lf"),a[0]);
m = m_strAns.GetLength()-1; //最大位置
n = m_strAns.Find(_T('.'));//小數點位置
while('0' == m_strAns.GetAt(m)) //m處為零
{
m_strAns.Delete(m);
m--;
}
m = m_strAns.GetLength()-1; //最大位置
if('.' == m_strAns.GetAt(m))
{
m_strAns.Delete(m);
}
m_strFun = "";
UpdateData(FALSE);
}
gotDot = false; //按.標志
gotNum = false; //按數字標志
gotZero = false; //按0標志
optPsd = false; //按下運算符號標志
gotEtr = true;
flg = false; //計算時賦值t的判斷符號
}
void CCalculatorDlg::GetStr(CString str) //處理字符串
{
int i=0,p=0;
double rate = 10.0,item = 0.0;
for(i=0;i<20;i++) //初始化
{
a[i] = 1000000.0;
}
for(i=0;i<10;i++) //初始化
{
b[i] = ' ';
}
i = 0;
for(;i<str.GetLength();i++)//得到操作數
{
if(isdigit(str.GetAt(i)))
{
if(rate==10.0)
{item = item*rate+(str.GetAt(i)-'0');} //取得整數
else
{
item = item+rate*(str.GetAt(i)-'0'); //小數部分
rate = rate/10;
}
}
else if(str.GetAt(i)=='.') //遇點
{
rate = 0.1;
}
else if(str.GetAt(i)=='+') //遇+
{
a[p] = item;
item = 0;
p++;
b[p] = '+';
p++;
rate = 10.0;
}
else if(str.GetAt(i)=='-') //遇-
{
a[p] = item;
item = 0;
p++;
b[p] = '-';
p++;
rate = 10.0;
}
else if(str.GetAt(i)=='*') //遇*
{
a[p] = item;
item = 0;
p++;
b[p] = '*';
p++;
rate = 10.0;
}
else if(str.GetAt(i)=='/') //遇/
{
a[p] = item;
item = 0;
p++;
b[p] = '/';
p++;
rate = 10.0;
}
}
a[p] = item;//把最后一個item賦值
max = p;//獲得操作總數
}
void CCalculatorDlg::CalStr() //計算所得值存入a[0]
{
int i = 0,x = 0, y = 1,t = 1,p = 1;
for(i=0;i<=max;i++)
{
if('/' == b[i])//把除操作化成乘,簡化
{
b[i] = '*';
a[i+1] = 1 / a[i+1];
}
}
for(i=0;i<=max;i++)
{
if('*' == b[i])//操作乘法
{
if(2 == i-t && flg == true)//處理連乘,再次相乘賦值在最前個數據位置
{
a[t-p] = a[t-p]*a[i+1];
p += 2;
}else{
a[i-1] = a[i-1]*a[i+1];
}
a[i+1] = 1000000.0; //乘號后數字初始化
b[i] = ' '; //乘號設為初始化
t = i;
flg = true;
}
}
for(i=0;i<=max;i++) //為計算加減做准備
{
if(1000000.0 != a[i])
{
a[x] = a[i];
x += 2;
}
if(' ' != b[i])
{
b[y] = b[i];
y += 2;
}
}
for(i=0;i<=y-2;i++)
{
if('+'== b[i])
{
a[0] = a[0]+a[i+1];
}else if('-'== b[i]){
a[0] = a[0]-a[i+1];
}
}
}
void CCalculatorDlg::OnBnClickedBmr() //讀取存儲器值
{
m_M = "M";
m_strAns.Format(_T("%lf"),memory);
int m = m_strAns.GetLength()-1; //最大位置
int n = m_strAns.Find(_T('.'));//小數點位置
while('0' == m_strAns.GetAt(m)) //m處為零
{
m_strAns.Delete(m);
m--;
}
m = m_strAns.GetLength()-1; //最大位置
if('.' == m_strAns.GetAt(m))
{
m_strAns.Delete(m);
}
UpdateData(FALSE);
gotM = true;
}
void CCalculatorDlg::OnBnClickedBms() //設置存儲器
{
UpdateData(TRUE);
if("" != m_strAns){
m_M = "M";
memory = _ttoi(m_strAns);
UpdateData(FALSE);
gotM = true;
}
}
void CCalculatorDlg::OnBnClickedBmc() //存儲器清除
{
UpdateData(TRUE);
m_M = "";;
memory = 0;
UpdateData(FALSE);
gotM = true;
}
void CCalculatorDlg::OnBnClickedBmadd() //M+
{
UpdateData(TRUE);
if(false == gotM){
m_M = "M";;
memory += _ttoi(m_strAns);
UpdateData(FALSE);
gotM = true;
}
}
void CCalculatorDlg::OnBnClickedBmcut() //M-
{
UpdateData(TRUE);
if(false == gotM){
m_M = "M";;
memory -= _ttoi(m_strAns);
UpdateData(FALSE);
gotM = true;
}
}