• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

Everyone Is No.1

学无前后,达者为先
  • 管理

View Post

基于MFC框架的计算器小程序

MFC介绍:

MFC(Microsoft Foundation Classes)是微软公司开发的一组C++类库,旨在简化Windows应用程序的开发。它提供了一系列用于创建和管理图形用户界面(GUI)的类和函数,为开发人员提供了丰富的工具和资源,用于构建功能强大的Windows应用程序。

我使用Visual Studio 2022的MFC模板开发的我的计算器.exe应用程序。老师让加减乘除,自作了主张,多添加了一些计算方式。因为这样就感觉比较完整了。

流程图:

 

在visual studio 上创建项目

 

 


就可以创建一个空白的MFC应用了。
源码链接:https://cowtransfer.com/s/c974df66cb5346
口令:33cp7m

1.首先在控件头文件test_computerDlg.h中用枚举创建一些符号常量指代各种运算。

enum Calculator_Flag {
FLAG_JIA,
FLAG_JIAN,
FLAG_CHENG,
FLAG_CHU,
FLAG_NFANG, //n方
FLAG_KAINFANG, //开n方
FLAG_PINGFANG,//平方
FLAG_KAIFANG,//开方
FLAG_LIFANG,//立方
FLAG_KAILIFANG,//开立方
FLAG_EX, //e的x次方
FLAG_SIN,//正弦
FLAG_COS,//余弦
FLAG_TAN,//正切
FLAG_MOD, //模运算
FLAG_N, //n的阶乘
FLAG_LNX, //以10为低的对数
FLAG_LOGNX,//对数运算
FLAG_HD,//十六进制到十进制
FLAG_OD,//八进制到十进制
FLAG_BD,//二进制到十进制
FlAG_HEX,//十六进制
FLAG_OCT,//八进制
FLAG_BIN//二进制
};

  

2.接着在控件类CtestcomputerDlg声明输入框的变量

private://将变量声明在private中体现了类的封装特性
CString mStr;//编辑框1内的字符串
CString mStr1;//编辑框2内的字符串
CString mStr2;
CString mStr3;
CString mStr4;
CString mStr5;
CString mStr6;
CString mStr7;
CString mStr8;
CString mTempStr;///中间变量
double mNum1;//运算数
double mNum2;
Calculator_Flag mFlag;//运算符号

  

3.接着在CtestcomputerDlg::DoDataExchange函数中将用户界面的输入框与变量相关联

void CtestcomputerDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Text(pDX, IDC_EDIT1, mStr);//将mStr变量与输入框IDC_EDIT1关联
DDX_Text(pDX, IDC_EDIT2, mStr1);
DDX_Text(pDX, IDC_EDIT3, mStr2);
DDX_Text(pDX, IDC_EDIT4, mStr3);
DDX_Text(pDX, IDC_EDIT5, mStr4);
DDX_Text(pDX, IDC_EDIT6, mStr5);
DDX_Text(pDX, IDC_EDIT7, mStr6);
DDX_Text(pDX, IDC_EDIT8, mStr7);
DDX_Text(pDX, IDC_EDIT9, mStr8);
}

  

4.定义每个按钮的点击函数

直接在这个界面上拖动来实现页面布局。
其中主要用到了工具箱里面的Button,Edit Control这两个,有8个Edit Control编辑框和45个按钮以及一个Static text用于显示历史记录四个静态文本。

在上面页面的每个按钮控件上双击,就自动在class CtestcomputerDlg : public CDialogEx这个类里面的public部分生成了相应的函数声明。

然后自己就需要在text_computerDlg.cpp控件实现文件中实现这些函数的定义。

例如双击   返回    这个按钮。将会在text_computerDlg.h文件的class CtestcomputerDlg : public CDialogEx类里面的public部分(函数是类对外部提供的接口)生成一个afx_msg void OnBnClickedButton1();的声明。

现在就需要在text_computerDlg.cpp中定义这个函数:

void CtestcomputerDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);
if (!mStr.IsEmpty()) {//判断是否为空,若不空,则
mStr = mStr.Left(mStr.GetLength() - 1);//去掉字符串最后一个字符,left从左边开始取
}
UpdateData(FALSE);
}

  

以次完成45个函数的声明以及定义,。

5.声明并定义下面这两个函数。

void SaveFirstValue();//保存第一个输入值--------------------------------------------在控件类头文件中声明

void CtestcomputerDlg::SaveFirstValue()------------------------在控件类的实现文件中定义
{
UpdateData(TRUE);
mNum1 = _wtof(mStr);//第一个运算数
mTempStr = mStr;//中间变量 为了构建历史记录
mStr = L"";//至空输入框 为了输入第二个运算数
UpdateData(FALSE);
}


void Calculator();//计算 ---------------------------------------在控件类头文件中声明

void CtestcomputerDlg::Calculator()---------------------------在控件类的实现文件中定义
{
UpdateData(TRUE);
mNum2 = _wtof(mStr);//第二个运算数 _wtof把字符串内容转换为浮点数
double result = 0.0f;//用来存放计算结果
switch (mFlag)
{
case FLAG_JIA: //加
result = mNum1 + mNum2;//进行加运算
mTempStr = mTempStr + _T("+") + mStr + _T("=");//历史记录中
break;
case FLAG_JIAN://减
result = mNum1 - mNum2;
mTempStr = mTempStr + _T("-") + mStr + _T("=");
break;
case FLAG_CHENG: //乘
result = mNum1 * mNum2;
mTempStr = mTempStr + _T("*") + mStr + _T("=");
break;
case FLAG_CHU: //除
if (mNum2 = 0) {
mTempStr = _T("除0错误");
}
else {
result = mNum1 / mNum2;
mTempStr = mTempStr + _T("/") + mStr + _T("=");
}
break;
case FLAG_NFANG: // n次方
result = pow(mNum1, 1.0/mNum2);
mTempStr = mTempStr + _T("^") + mStr + _T("=");
break;
case FLAG_KAINFANG://开n方
result = pow(mNum1, mNum2);
mTempStr = mTempStr + _T("^") + mStr + _T("=");
break;
case FLAG_MOD://模运算
result = (int)mNum1 % (int)mNum2;//模运算必须是整数
mTempStr = mTempStr + _T("%") + mStr + _T("=");
break;
case FLAG_LOGNX://对数运算
result = log(mNum2) / log(mNum1);
mTempStr = _T("log") + mTempStr + _T("(") + mStr + _T(")") + _T("=");
break;
case FLAG_PINGFANG://平方
result = mNum2 * mNum2;
mTempStr = mStr + _T("^2=");
break;
case FLAG_KAIFANG://开平方
result = sqrt(mNum2);
mTempStr = _T("根号") + mStr + _T("=");
break;
case FLAG_LIFANG://立方
result = mNum2 * mNum2 * mNum2;
mTempStr = mStr + _T("^3=");
break;
case FLAG_KAILIFANG://开立方
result = pow(mNum2, 1.0 / 3);
mTempStr = _T("开立方") + mStr + _T("=");
break;
case FLAG_SIN: // 正弦
result = sin(mNum2);
mTempStr = _T("sin(") + mStr + _T(")=");
break;
case FLAG_COS://余弦
result = cos(mNum2);
mTempStr = _T("cos(") + mStr + _T(")=");
break;
case FLAG_TAN://正切
result = tan(mNum2);
mTempStr = _T("tan(") + mStr + _T(")=");
break;
case FLAG_EX://e的x次方
{
double e = exp(1.0);
result = pow(e, mNum2);
mTempStr = _T("e^") + mStr + _T("=");
}
break;
case FLAG_N://计算n的阶乘
{
int n = (int)mNum2;
if (n == 0)
{
result = 1;
mTempStr = mStr + _T("!=");
}
else if (n < 0)
{
mTempStr = _T("负数没有阶乘");
}
else {
result = 1;
for (int i = 1; i <= n; i++) {
result *= i;
}
mTempStr = mStr + _T("!=");
}
}
break;
default:
break;
}
if (result - (int)result <= 1e-5)//如果结果是整数
{
mStr.Format(L"%d", (int)result);//以整数形式显示
}
else {
mStr.Format(L"%f", result);//以小数形式显示
}
mTempStr += mStr;//将结果与表达式拼接
mStr8 = mStr7;
mStr7 = mStr6;
mStr6 = mStr5;
mStr5 = mStr4;
mStr4 = mStr3;
mStr3 = mStr2;
mStr2 = mStr1;
mStr1 = mTempStr;
UpdateData(FALSE);
mNum1 = result;
mNum2 = 0.0f;
}

  

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

在编写时需要注意的是单目运算符与双目运算符的区别就可以了:单目运算在点击一个数字后,在点击运算符,然后点击第二个数字。双目运算符需要先输入第一个数字,再输入运算符,然后点击=按钮。这个等于按钮会调用   ”计算”  函数。单目运算符点击后只执行 mFlag = 运算符代表的枚举量,而双目运算符点击后会先获取第一个数字“SaveFirstValue()”,然后执行mFlag = 运算符代表的枚举量。

通过以上步骤就基本完成了基于MFC框架的用C++语言实现的计算器小程序。太多了,,,,,主要计算过程都是在最后这个”计算“函数中实现的。对于老师说的那个什么牛顿的还没有实现。另外进制

之间的转换还未完成。以下是实际情况。

 

页面左边是历史记录,最近计算结果会优先显示再第一行,右边是计算器主要按钮。

由于开平方的这个根号键盘上没法输入,就利用  “/”  代替,,第一行是进制转换,第二行是十六进制数。第三行是幂运算与开方运算。 

 

 

以下是主要实现代码:

 

// test_computerDlg.cpp: 实现文件
//

#include "pch.h"
#include "framework.h"
#include "test_computer.h"
#include "test_computerDlg.h"
#include "afxdialogex.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// 用于应用程序“关于”菜单项的 CAboutDlg 对话框

class CAboutDlg : public CDialogEx
{
public:
CAboutDlg();

// 对话框数据
#ifdef AFX_DESIGN_TIME
enum { IDD = IDD_ABOUTBOX };
#endif

protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持

// 实现
protected:
DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialogEx(IDD_ABOUTBOX)
{
}
//关于对话框
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()


// CtestcomputerDlg 对话框

 

CtestcomputerDlg::CtestcomputerDlg(CWnd* pParent /*=nullptr*/)
: CDialogEx(IDD_TEST_COMPUTER_DIALOG, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
//用户界面中的输入框与其变量关联
void CtestcomputerDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Text(pDX, IDC_EDIT1, mStr);//将mStr变量与输入框IDC_EDIT1关联
DDX_Text(pDX, IDC_EDIT2, mStr1);
DDX_Text(pDX, IDC_EDIT3, mStr2);
DDX_Text(pDX, IDC_EDIT4, mStr3);
DDX_Text(pDX, IDC_EDIT5, mStr4);
DDX_Text(pDX, IDC_EDIT6, mStr5);
DDX_Text(pDX, IDC_EDIT7, mStr6);
DDX_Text(pDX, IDC_EDIT8, mStr7);
DDX_Text(pDX, IDC_EDIT9, mStr8);
}

BEGIN_MESSAGE_MAP(CtestcomputerDlg, CDialogEx)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON6, &CtestcomputerDlg::OnBnClickedButton6)
ON_BN_CLICKED(IDC_BUTTON43, &CtestcomputerDlg::OnBnClickedButton43)
ON_BN_CLICKED(IDC_BUTTON42, &CtestcomputerDlg::OnBnClickedButton42)
ON_BN_CLICKED(IDC_BUTTON36, &CtestcomputerDlg::OnBnClickedButton36)
ON_BN_CLICKED(IDC_BUTTON37, &CtestcomputerDlg::OnBnClickedButton37)
ON_BN_CLICKED(IDC_BUTTON38, &CtestcomputerDlg::OnBnClickedButton38)
ON_BN_CLICKED(IDC_BUTTON30, &CtestcomputerDlg::OnBnClickedButton30)
ON_BN_CLICKED(IDC_BUTTON31, &CtestcomputerDlg::OnBnClickedButton31)
ON_BN_CLICKED(IDC_BUTTON32, &CtestcomputerDlg::OnBnClickedButton32)
ON_BN_CLICKED(IDC_BUTTON24, &CtestcomputerDlg::OnBnClickedButton24)
ON_BN_CLICKED(IDC_BUTTON25, &CtestcomputerDlg::OnBnClickedButton25)
ON_BN_CLICKED(IDC_BUTTON26, &CtestcomputerDlg::OnBnClickedButton26)
ON_BN_CLICKED(IDC_BUTTON1, &CtestcomputerDlg::OnBnClickedButton1)
ON_BN_CLICKED(IDC_BUTTON3, &CtestcomputerDlg::OnBnClickedButton3)
ON_BN_CLICKED(IDC_BUTTON2, &CtestcomputerDlg::OnBnClickedButton2)
ON_BN_CLICKED(IDC_BUTTON45, &CtestcomputerDlg::OnBnClickedButton45)
ON_BN_CLICKED(IDC_BUTTON44, &CtestcomputerDlg::OnBnClickedButton44)
ON_BN_CLICKED(IDC_BUTTON10, &CtestcomputerDlg::OnBnClickedButton10)
ON_BN_CLICKED(IDC_BUTTON11, &CtestcomputerDlg::OnBnClickedButton11)
ON_BN_CLICKED(IDC_BUTTON12, &CtestcomputerDlg::OnBnClickedButton12)
ON_BN_CLICKED(IDC_BUTTON13, &CtestcomputerDlg::OnBnClickedButton13)
ON_BN_CLICKED(IDC_BUTTON14, &CtestcomputerDlg::OnBnClickedButton14)
ON_BN_CLICKED(IDC_BUTTON15, &CtestcomputerDlg::OnBnClickedButton15)
ON_BN_CLICKED(IDC_BUTTON39, &CtestcomputerDlg::OnBnClickedButton39)
ON_BN_CLICKED(IDC_BUTTON33, &CtestcomputerDlg::OnBnClickedButton33)
ON_BN_CLICKED(IDC_BUTTON27, &CtestcomputerDlg::OnBnClickedButton27)
ON_BN_CLICKED(IDC_BUTTON21, &CtestcomputerDlg::OnBnClickedButton21)
ON_BN_CLICKED(IDC_BUTTON20, &CtestcomputerDlg::OnBnClickedButton20)
ON_BN_CLICKED(IDC_BUTTON19, &CtestcomputerDlg::OnBnClickedButton19)
ON_BN_CLICKED(IDC_BUTTON18, &CtestcomputerDlg::OnBnClickedButton18)
ON_BN_CLICKED(IDC_BUTTON17, &CtestcomputerDlg::OnBnClickedButton17)
ON_BN_CLICKED(IDC_BUTTON16, &CtestcomputerDlg::OnBnClickedButton16)
ON_BN_CLICKED(IDC_BUTTON23, &CtestcomputerDlg::OnBnClickedButton23)
ON_BN_CLICKED(IDC_BUTTON34, &CtestcomputerDlg::OnBnClickedButton34)
ON_BN_CLICKED(IDC_BUTTON41, &CtestcomputerDlg::OnBnClickedButton41)
ON_BN_CLICKED(IDC_BUTTON35, &CtestcomputerDlg::OnBnClickedButton35)
ON_BN_CLICKED(IDC_BUTTON29, &CtestcomputerDlg::OnBnClickedButton29)
ON_BN_CLICKED(IDC_BUTTON28, &CtestcomputerDlg::OnBnClickedButton28)
ON_BN_CLICKED(IDC_BUTTON40, &CtestcomputerDlg::OnBnClickedButton40)
ON_BN_CLICKED(IDC_BUTTON22, &CtestcomputerDlg::OnBnClickedButton22)
ON_BN_CLICKED(IDC_BUTTON4, &CtestcomputerDlg::OnBnClickedButton4)
ON_BN_CLICKED(IDC_BUTTON5, &CtestcomputerDlg::OnBnClickedButton5)
ON_BN_CLICKED(IDC_BUTTON7, &CtestcomputerDlg::OnBnClickedButton7)
ON_BN_CLICKED(IDC_BUTTON8, &CtestcomputerDlg::OnBnClickedButton8)
ON_BN_CLICKED(IDC_BUTTON9, &CtestcomputerDlg::OnBnClickedButton9)
END_MESSAGE_MAP()


// CtestcomputerDlg 消息处理程序

BOOL CtestcomputerDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();

// 将“关于...”菜单项添加到系统菜单中。

// IDM_ABOUTBOX 必须在系统命令范围内。
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);

CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != nullptr)
{
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: 在此添加额外的初始化代码

return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}

void CtestcomputerDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialogEx::OnSysCommand(nID, lParam);
}
}

// 如果向对话框添加最小化按钮,则需要下面的代码
// 来绘制该图标。 对于使用文档/视图模型的 MFC 应用程序,
// 这将由框架自动完成。

void CtestcomputerDlg::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 CtestcomputerDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}


//B->D按钮
void CtestcomputerDlg::OnBnClickedButton6()
{
// TODO: 在此添加控件通知处理程序代码
mFlag = FLAG_BD;
}

//按钮0
void CtestcomputerDlg::OnBnClickedButton43()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);//获取输入框中的值并且赋值给输入框关联的变量
mStr += L"0";
UpdateData(FALSE);//将更改后的值返回给输入框
}

//按钮“.”
void CtestcomputerDlg::OnBnClickedButton42()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);
//如果没有小鼠点,则加上小数点,如果找到小鼠点,则忽略此次点击
if (-1 == mStr.Find(L'.'))
{
mStr += _T(".");
}
UpdateData(FALSE);
}

//按钮1
void CtestcomputerDlg::OnBnClickedButton36()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);
mStr += L"1";
UpdateData(FALSE);
}

//按钮2
void CtestcomputerDlg::OnBnClickedButton37()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);
mStr += L"2";
UpdateData(FALSE);
}

//按钮3
void CtestcomputerDlg::OnBnClickedButton38()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);
mStr += L"3";
UpdateData(FALSE);
}

//按钮4
void CtestcomputerDlg::OnBnClickedButton30()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);
mStr += L"4";
UpdateData(FALSE);
}


void CtestcomputerDlg::OnBnClickedButton31()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);
mStr += L"5";
UpdateData(FALSE);
}


void CtestcomputerDlg::OnBnClickedButton32()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);
mStr += L"6";
UpdateData(FALSE);
}


void CtestcomputerDlg::OnBnClickedButton24()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);
mStr += L"7";
UpdateData(FALSE);
}


void CtestcomputerDlg::OnBnClickedButton25()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);
mStr += L"8";
UpdateData(FALSE);
}


void CtestcomputerDlg::OnBnClickedButton26()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);
mStr += L"9";
UpdateData(FALSE);
}

//返回按钮(消去输入框中最后一个字符)
void CtestcomputerDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);
if (!mStr.IsEmpty()) {//判断是否为空,若不空,则
mStr = mStr.Left(mStr.GetLength() - 1);//去掉字符串最后一个字符,left从左边开始取
}
UpdateData(FALSE);
}

//清除按钮
void CtestcomputerDlg::OnBnClickedButton3()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);//获取输入框
mStr = L"";
mNum1 = 0.0f;
mNum2 = 0.0f;
mFlag = FLAG_JIA;
UpdateData(FALSE);//输出到输入框
}

//清除所有按钮
void CtestcomputerDlg::OnBnClickedButton2()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);//获取输入框
mStr1 = L"";
mStr2 = L"";
mStr3 = L"";
mStr4 = L"";
mStr5 = L"";
mStr6 = L"";
mStr7 = L"";
mStr8 = L"";
mStr = L"";
mNum1 = 0.0f;
mNum2 = 0.0f;
mFlag = FLAG_JIA;
UpdateData(FALSE);//输出到输入框
}
//保存第一个输入值
void CtestcomputerDlg::SaveFirstValue()
{
UpdateData(TRUE);
mNum1 = _wtof(mStr);//第一个运算数
mTempStr = mStr;//中间变量 为了构建历史记录
mStr = L"";//至空输入框 为了输入第二个运算数
UpdateData(FALSE);
}
//计算
void CtestcomputerDlg::Calculator()
{
UpdateData(TRUE);
mNum2 = _wtof(mStr);//第二个运算数 _wtof把字符串内容转换为浮点数
double result = 0.0f;//用来存放计算结果
switch (mFlag)
{
case FLAG_JIA: //加
result = mNum1 + mNum2;//进行加运算
mTempStr = mTempStr + _T("+") + mStr + _T("=");//历史记录中
break;
case FLAG_JIAN://减
result = mNum1 - mNum2;
mTempStr = mTempStr + _T("-") + mStr + _T("=");
break;
case FLAG_CHENG: //乘
result = mNum1 * mNum2;
mTempStr = mTempStr + _T("*") + mStr + _T("=");
break;
case FLAG_CHU: //除
if (mNum2 = 0) {
mTempStr = _T("除0错误");
}
else {
result = mNum1 / mNum2;
mTempStr = mTempStr + _T("/") + mStr + _T("=");
}
break;
case FLAG_NFANG: // n次方
result = pow(mNum1, 1.0/mNum2);
mTempStr = mTempStr + _T("^") + mStr + _T("=");
break;
case FLAG_KAINFANG://开n方
result = pow(mNum1, mNum2);
mTempStr = mTempStr + _T("^") + mStr + _T("=");
break;
case FLAG_MOD://模运算
result = (int)mNum1 % (int)mNum2;//模运算必须是整数
mTempStr = mTempStr + _T("%") + mStr + _T("=");
break;
case FLAG_LOGNX://对数运算
result = log(mNum2) / log(mNum1);
mTempStr = _T("log") + mTempStr + _T("(") + mStr + _T(")") + _T("=");
break;
case FLAG_PINGFANG://平方
result = mNum2 * mNum2;
mTempStr = mStr + _T("^2=");
break;
case FLAG_KAIFANG://开平方
result = sqrt(mNum2);
mTempStr = _T("根号") + mStr + _T("=");
break;
case FLAG_LIFANG://立方
result = mNum2 * mNum2 * mNum2;
mTempStr = mStr + _T("^3=");
break;
case FLAG_KAILIFANG://开立方
result = pow(mNum2, 1.0 / 3);
mTempStr = _T("开立方") + mStr + _T("=");
break;
case FLAG_SIN: // 正弦
result = sin(mNum2);
mTempStr = _T("sin(") + mStr + _T(")=");
break;
case FLAG_COS://余弦
result = cos(mNum2);
mTempStr = _T("cos(") + mStr + _T(")=");
break;
case FLAG_TAN://正切
result = tan(mNum2);
mTempStr = _T("tan(") + mStr + _T(")=");
break;
case FLAG_EX://e的x次方
{
double e = exp(1.0);
result = pow(e, mNum2);
mTempStr = _T("e^") + mStr + _T("=");
}
break;
case FLAG_N://计算n的阶乘
{
int n = (int)mNum2;
if (n == 0)
{
result = 1;
mTempStr = mStr + _T("!=");
}
else if (n < 0)
{
mTempStr = _T("负数没有阶乘");
}
else {
result = 1;
for (int i = 1; i <= n; i++) {
result *= i;
}
mTempStr = mStr + _T("!=");
}
}
break;
default:
break;
}
if (result - (int)result <= 1e-5)//如果结果是整数
{
mStr.Format(L"%d", (int)result);//以整数形式显示
}
else {
mStr.Format(L"%f", result);//以小数形式显示
}
mTempStr += mStr;//将结果与表达式拼接
mStr8 = mStr7;
mStr7 = mStr6;
mStr6 = mStr5;
mStr5 = mStr4;
mStr4 = mStr3;
mStr3 = mStr2;
mStr2 = mStr1;
mStr1 = mTempStr;
UpdateData(FALSE);
mNum1 = result;
mNum2 = 0.0f;
}
//点击+按钮
void CtestcomputerDlg::OnBnClickedButton45()
{
// TODO: 在此添加控件通知处理程序代码
SaveFirstValue();//保存第一个运算数
mFlag = FLAG_JIA;//设置运算符
}


//点击=按钮
void CtestcomputerDlg::OnBnClickedButton44()
{
// TODO: 在此添加控件通知处理程序代码
Calculator();//调用运算方法
}

//点击A按钮
void CtestcomputerDlg::OnBnClickedButton10()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);
mStr += L"A";
UpdateData(FALSE);
}

//点击B按钮
void CtestcomputerDlg::OnBnClickedButton11()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);
mStr += L"B";
UpdateData(FALSE);
}

//点击C按钮
void CtestcomputerDlg::OnBnClickedButton12()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);
mStr += L"C";
UpdateData(FALSE);
}

//点击D按钮
void CtestcomputerDlg::OnBnClickedButton13()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);
mStr += L"D";
UpdateData(FALSE);
}

//点击E按钮
void CtestcomputerDlg::OnBnClickedButton14()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);
mStr += L"E";
UpdateData(FALSE);
}

//点击F按钮
void CtestcomputerDlg::OnBnClickedButton15()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);
mStr += L"F";
UpdateData(FALSE);
}

//点击-按钮
void CtestcomputerDlg::OnBnClickedButton39()
{
// TODO: 在此添加控件通知处理程序代码
SaveFirstValue();//保存第一个运算数
mFlag = FLAG_JIAN;//设置运算符
}

//点击x按钮
void CtestcomputerDlg::OnBnClickedButton33()
{
// TODO: 在此添加控件通知处理程序代码
SaveFirstValue();//保存第一个运算数
mFlag = FLAG_CHENG;//设置运算符
}

//点击/按钮
void CtestcomputerDlg::OnBnClickedButton27()
{//双目运算符
// TODO: 在此添加控件通知处理程序代码
SaveFirstValue();//保存第一个运算数
mFlag = FLAG_CHU;//设置运算符
}

//点击x^2按钮
void CtestcomputerDlg::OnBnClickedButton21()
{
// TODO: 在此添加控件通知处理程序代码
mFlag = FLAG_PINGFANG;//设置运算符
}

//点击2/x按钮
void CtestcomputerDlg::OnBnClickedButton20()
{
// TODO: 在此添加控件通知处理程序代码
mFlag = FLAG_KAIFANG;
}

//点击x^3按钮
void CtestcomputerDlg::OnBnClickedButton19()
{
// TODO: 在此添加控件通知处理程序代码
mFlag = FLAG_LIFANG;//单目运算符
}

//点击3/x按钮
void CtestcomputerDlg::OnBnClickedButton18()
{
// TODO: 在此添加控件通知处理程序代码
mFlag = FLAG_KAILIFANG;
}

//点击x^n
void CtestcomputerDlg::OnBnClickedButton17()
{
// TODO: 在此添加控件通知处理程序代码
SaveFirstValue();
mFlag = FLAG_KAINFANG;
}


//点击n/x
void CtestcomputerDlg::OnBnClickedButton16()
{
// TODO: 在此添加控件通知处理程序代码
SaveFirstValue();//双目运算符,先保存第一个运算数
mFlag = FLAG_NFANG;
}

//点击%按钮
void CtestcomputerDlg::OnBnClickedButton23()
{
// TODO: 在此添加控件通知处理程序代码
SaveFirstValue();
mFlag = FLAG_MOD;
}

//点击lognX
void CtestcomputerDlg::OnBnClickedButton34()
{
// TODO: 在此添加控件通知处理程序代码
SaveFirstValue();
mFlag = FLAG_LOGNX;
}

//点击tanX
void CtestcomputerDlg::OnBnClickedButton41()
{
// TODO: 在此添加控件通知处理程序代码
mFlag = FLAG_TAN;
}

//点击cosX
void CtestcomputerDlg::OnBnClickedButton35()
{
// TODO: 在此添加控件通知处理程序代码
mFlag = FLAG_COS;
}

//点击sinX
void CtestcomputerDlg::OnBnClickedButton29()
{
// TODO: 在此添加控件通知处理程序代码
mFlag = FLAG_SIN;
}

//点击lnX
void CtestcomputerDlg::OnBnClickedButton28()
{
// TODO: 在此添加控件通知处理程序代码
mFlag = FLAG_LNX;
}

//点击e^x
void CtestcomputerDlg::OnBnClickedButton40()
{
// TODO: 在此添加控件通知处理程序代码
mFlag = FLAG_EX;
}

//点击n!按钮
void CtestcomputerDlg::OnBnClickedButton22()
{
// TODO: 在此添加控件通知处理程序代码
mFlag = FLAG_N;
}

//H->D按钮
void CtestcomputerDlg::OnBnClickedButton4()
{
// TODO: 在此添加控件通知处理程序代码
mFlag = FLAG_HD;
}

//O->D
void CtestcomputerDlg::OnBnClickedButton5()
{
// TODO: 在此添加控件通知处理程序代码
mFlag = FLAG_OD;
}

//Hex
void CtestcomputerDlg::OnBnClickedButton7()
{
// TODO: 在此添加控件通知处理程序代码
}

//Oct
void CtestcomputerDlg::OnBnClickedButton8()
{
// TODO: 在此添加控件通知处理程序代码
}

//Bin
void CtestcomputerDlg::OnBnClickedButton9()
{
// TODO: 在此添加控件通知处理程序代码
}

  

// test_computerDlg.h: 头文件
//

#pragma once
//运算符
enum Calculator_Flag {
	FLAG_JIA,
	FLAG_JIAN,
	FLAG_CHENG,
	FLAG_CHU,


	FLAG_NFANG,  //n方
	FLAG_KAINFANG,  //开n方
	FLAG_PINGFANG,//平方
	FLAG_KAIFANG,//开方
	FLAG_LIFANG,//立方
	FLAG_KAILIFANG,//开立方
	FLAG_EX, //e的x次方

	FLAG_SIN,//正弦
	FLAG_COS,//余弦
	FLAG_TAN,//正切

	FLAG_MOD, //模运算
	FLAG_N,  //n的阶乘
	FLAG_LNX,  //以10为低的对数
	FLAG_LOGNX,//对数运算

	FLAG_HD,//十六进制到十进制
	FLAG_OD,//八进制到十进制
	FLAG_BD,//二进制到十进制
	FlAG_HEX,//十六进制
	FLAG_OCT,//八进制
	FLAG_BIN//二进制
};


// CtestcomputerDlg 对话框  用户界面类以及类中的函数和变量
class CtestcomputerDlg : public CDialogEx
{
// 构造
public:
	CtestcomputerDlg(CWnd* pParent = nullptr);	// 标准构造函数
	void SaveFirstValue();//保存第一个输入值
	void Calculator();//计算

// 对话框数据
#ifdef AFX_DESIGN_TIME
	enum { IDD = IDD_TEST_COMPUTER_DIALOG };
#endif

	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()
//控件的变量,,,即输入框的变量  在这里声明后需要在test_computerDlg.cpp文件中关联
private:
	CString mStr;//编辑框1内的字符串
	CString mStr1;//编辑框2内的字符串
	CString mStr2;
	CString mStr3;
	CString mStr4;
	CString mStr5;
	CString mStr6;
	CString mStr7;
	CString mStr8;
	CString mTempStr;///中间变量
	double mNum1;//运算数
	double mNum2;
	Calculator_Flag mFlag;//运算符号
public:
	//点击按钮自动生成的函数声明,函数原型在test_computerDlg.cpp文件中
	//这些都是按钮你的消息处理函数
	afx_msg void OnBnClickedButton6();
	afx_msg void OnBnClickedButton43();
	afx_msg void OnBnClickedButton42();
	afx_msg void OnBnClickedButton36();
	afx_msg void OnBnClickedButton37();
	afx_msg void OnBnClickedButton38();
	afx_msg void OnBnClickedButton30();
	afx_msg void OnBnClickedButton31();
	afx_msg void OnBnClickedButton32();
	afx_msg void OnBnClickedButton24();
	afx_msg void OnBnClickedButton25();
	afx_msg void OnBnClickedButton26();
	afx_msg void OnBnClickedButton1();
	afx_msg void OnBnClickedButton3();
	afx_msg void OnBnClickedButton2();
	afx_msg void OnBnClickedButton45();
	afx_msg void OnBnClickedButton44();
	afx_msg void OnBnClickedButton10();
	afx_msg void OnBnClickedButton11();
	afx_msg void OnBnClickedButton12();
	afx_msg void OnBnClickedButton13();
	afx_msg void OnBnClickedButton14();
	afx_msg void OnBnClickedButton15();
	afx_msg void OnBnClickedButton39();
	afx_msg void OnBnClickedButton33();
	afx_msg void OnBnClickedButton27();
	afx_msg void OnBnClickedButton21();
	afx_msg void OnBnClickedButton20();
	afx_msg void OnBnClickedButton19();
	afx_msg void OnBnClickedButton18();
	afx_msg void OnBnClickedButton17();
	afx_msg void OnBnClickedButton16();
	afx_msg void OnBnClickedButton23();
	afx_msg void OnBnClickedButton34();
	afx_msg void OnBnClickedButton41();
	afx_msg void OnBnClickedButton35();
	afx_msg void OnBnClickedButton29();
	afx_msg void OnBnClickedButton28();
	afx_msg void OnBnClickedButton40();
	afx_msg void OnBnClickedButton22();
	afx_msg void OnBnClickedButton4();
	afx_msg void OnBnClickedButton5();
	afx_msg void OnBnClickedButton7();
	afx_msg void OnBnClickedButton8();
	afx_msg void OnBnClickedButton9();
};

  

posted on 2023-10-06 21:01  hsdhfgw  阅读(342)  评论(1)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3