简易计算器代码部分的实现

在已创建好的MFC解决方案里打开头文件下的…Dlg.h文件(以下简称.h文件)、源文件下的…Dlg.cpp文件(以下简称.cpp文件)和资源文件下.rc文件里的Dialog\IDD_XXX_DIALOG文件(以下简称DIALOG文件)。

Static Text(静态文本框)

添加静态文本框,单机鼠标右键即可更改属性:

Edit Control(编辑框)的实现

在DIALOG文件中插入Edit Control,双击进入.cpp文件中的函数部分。进入.h文件中,声明变量字符串变量str(有几个编辑框声明几个),声明两个double类型变量num1和num2,以及字符串变量TempStr(用于存放中间值)。

private:CString str;CString str1;CString str2;CString str3;CString str4;double num1;double num2;CString TempStr;myCalculator_Flag flag; //定义运算符对应的变量

在.cpp文件中添加以下代码,使.h中设置的字符串变量与文本框相关联。

void CmyCalculatorDlg::DoDataExchange(CDataExchange* pDX)
{CDialogEx::DoDataExchange(pDX);DDX_Text(pDX, IDC_EDIT1, str);DDX_Text(pDX, IDC_EDIT2, str1);DDX_Text(pDX, IDC_EDIT3, str2);DDX_Text(pDX, IDC_EDIT4, str3);DDX_Text(pDX, IDC_EDIT5, str4);
}

最好每插入一个编辑框就双击编辑框一次,这样做保险一点。

Button(按键)

Back:实现撤销最后一个数字

void CmyCalculatorDlg::OnBnClickedButton1()
{// TODO: 在此添加控件通知处理程序代码UpdateData(TRUE);   //获取所有文本框内的字符串if (!str.IsEmpty()) {str=str.Left(str.GetLength()-1); //字符串长度减1}UpdateData(FALSE);    //将字符串内容更新到文本框
}

Clear:清除当前输入编辑框中的全部内容。

void CmyCalculatorDlg::OnBnClickedButton2()
{// TODO: 在此添加控件通知处理程序代码UpdateData(TRUE);str = L""; //把字符串置空num1 = 0.0f;num2 = 0.0f;UpdateData(FALSE);
}

Clear All:清楚包括历史记录编辑框在内的所有编辑框中的内容。

void CmyCalculatorDlg::OnBnClickedButton3()
{// TODO: 在此添加控件通知处理程序代码UpdateData(TRUE);str = L"";str1 = L"";str2 = L"";str3 = L"";str4 = L"";num1 = 0.0f;num2 = 0.0f;UpdateData(FALSE);
}

数字部分:(其余类似)

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

小数点部分:此处要加一个判断,以防止同时存在两个小数点。

void CmyCalculatorDlg::OnBnClickedButton13()
{// TODO: 在此添加控件通知处理程序代码UpdateData(TRUE);//如果不存在小数点,则添加一个小数点if (-1 == str.Find(L'.')) {str += L".";}UpdateData(FALSE);
}

在.h文件中声明两个共有函数:

void SaveFirstValue();   //保存第一个数
void myCalculator();   //计算

在…cpp文件中实现这两个函数:

1)SaveFirstValue()用于保存第一个数num1。

void CmyCalculatorDlg::SaveFirstValue()
{UpdateData(TRUE);num1 = _wtof(str);  //字符串内容转换为浮点数TempStr = str;str = L"";   //str置空UpdateData(FALSE);
}

2)myCalculator()用于生成结果,相当于按键中的“=”。

void CmyCalculatorDlg::myCalculator()    //"="
{UpdateData(TRUE);num2 = _wtof(str);double result = 0.0f;//根据运算符类型选择对应的caseswitch (flag){case FLAG_JIA:result = num1 + num2;TempStr = TempStr + _T("+") + str + _T("=");break;case FLAG_JIAN:result = num1 - num2;TempStr = TempStr + _T("-") + str + _T("=");break;case FLAG_CHENG:result = num1 * num2;TempStr = TempStr + _T("x") + str + _T("=");break;case FLAG_CHU:if (num2 == 0.0f){result = num1;TempStr = _T("除数不能为0!");}else{result = num1 / num2;TempStr = TempStr + _T("÷") + str + _T("=");}break;case FLAG_NFANG:result = pow(num1, num2);TempStr = TempStr + _T("^") + str + _T("=");break;case FLAG_KAIFANG:result = pow(num2, 1.0 / num1);TempStr = TempStr + _T("√") + str + _T("=");break;case FLAG_LOGNX:result = log(num2) / log(num1);TempStr = _T("log") + TempStr + _T("(") + str + _T(")=");break;case FLAG_PINGFANG:result = num1 * num1;TempStr = TempStr + _T("^2=");break;case FLAG_KAIPINGFANG:result = sqrt(num1);TempStr = _T("2√") + TempStr + _T("=");break;case FLAG_LIFANG:result = num1 * num1 * num1;TempStr =TempStr+ _T("^3=") ;break;case FLAG_KAILIFANG:result = pow(num1, 1.0 / 3);TempStr = _T("3√") + TempStr + _T("=");break;default:break;}//如果浮点数是整数,就显示为整数if (result - int(result) <= 1e-5) //结果的小数部分是否<=0.00001{str.Format(L"%d", (int)result);  //整数化处理,%d表示按整型数据的实际长度输出数据}else{str.Format(L"%f", result);  //小数化处理,%f表示浮点数(包括double,float)}//历史记录编辑框与输入编辑框中的数据进行转移TempStr += str;str4 = str3;str3 = str2;str2 = str1;str1 = TempStr;UpdateData(FALSE);  //更新上述编辑框中数据num1 = result;  //结果赋值给num1num2 = 0.0f;
}

注:这里最好添加一个按键定义一次,保险起见,建议每定义完一个按键运行一次。定义的同时在.h文件中添加运算符标志。

//运算符标志
enum myCalculator_Flag {FLAG_JIA,FLAG_JIAN,FLAG_CHENG,FLAG_CHU,FLAG_NFANG,FLAG_KAIFANG,FLAG_LOGNX,FLAG_PINGFANG,FLAG_KAIPINGFANG,FLAG_LIFANG,FLAG_KAILIFANG,FLAG_JIECHENG,FLAG_SINX,FLAG_COSX,FLAG_TANX,FLAG_LNX,FLAG_EX,
};

注:一定要在定义的同时添加运算符标志!我当时先把所有的运算符标志都写好了,结果函数定义部分没有写完就去调试,就一直调试不了,显示可执行文件丢失。

双击DIALOG文件中的按键,定义对应按键,如加法(其余类似):

void CmyCalculatorDlg::OnBnClickedButton15()
{// TODO: 在此添加控件通知处理程序代码SaveFirstValue(); //保存num1flag = FLAG_JIA;  //调用switch中的case=FLAG_JIA实现加法运算
}

特殊运算:
1)阶乘:

void CmyCalculatorDlg::OnBnClickedButton28()
{// TODO: 在此添加控件通知处理程序代码UpdateData(TRUE);TempStr = str + _T("!=");num1 = _wtof(str);double f = 1;int index = (int)num1;while (index > 0) {f *= index;index = index - 1;}if (f - int(f) <= 1e-5){str.Format(L"%d", (int)f);}else{str.Format(L"%f", f);}TempStr += str;str4 = str3;str3 = str2;str2 = str1;str1 = TempStr;UpdateData(FALSE);num1 = f;num2 = 0.0f;flag = FLAG_JIECHENG;
}

2)sinx:
.cpp文件首部添加宏定义pi、std_angle实现弧度转换:

#define pi 3.1415926535898
#define std_angle (pi/180)
void CmyCalculatorDlg::OnBnClickedButton29()
{// TODO: 在此添加控件通知处理程序代码UpdateData(TRUE);TempStr = _T("sin(") + str + _T(")=");num1 = _wtof(str);double f = sin(num1 * std_angle);  //.cpp文件首部定义if (f - int(f) <= 1e-5){str.Format(L"%d", (int)f);}else{str.Format(L"%f", f);}TempStr += str;str4 = str3;str3 = str2;str2 = str1;str1 = TempStr;UpdateData(FALSE);num1 = f;num2 = 0.0f;flag = FLAG_SINX;
}

3)cosx:

void CmyCalculatorDlg::OnBnClickedButton30()
{// TODO: 在此添加控件通知处理程序代码UpdateData(TRUE);TempStr = _T("cos(") + str + _T(")=");num1 = _wtof(str);double f = cos(num1 * std_angle);if (f - int(f) <= 1e-5){str.Format(L"%d", (int)f);}else{str.Format(L"%f", f);}TempStr += str;str4 = str3;str3 = str2;str2 = str1;str1 = TempStr;UpdateData(FALSE);num1 = f;num2 = 0.0f;flag = FLAG_COSX;
}

4)tanx:

void CmyCalculatorDlg::OnBnClickedButton31()
{// TODO: 在此添加控件通知处理程序代码UpdateData(TRUE);TempStr = _T("tan(") + str + _T(")=");num1 = _wtof(str);double f = sin(num1 * std_angle)/cos(num1*std_angle);if (f - int(f) <= 1e-5){str.Format(L"%d", (int)f);}else{str.Format(L"%f", f);}TempStr += str;str4 = str3;str3 = str2;str2 = str1;str1 = TempStr;UpdateData(FALSE);num1 = f;num2 = 0.0f;flag = FLAG_TANX;
}

5)lnx:

void CmyCalculatorDlg::OnBnClickedButton32()
{// TODO: 在此添加控件通知处理程序代码UpdateData(TRUE);TempStr = _T("ln") + str + _T("=");num1 = _wtof(str);double f = log(num1);if (f - int(f) <= 1e-5){str.Format(L"%d", (int)f);}else{str.Format(L"%f", f);}TempStr += str;str4 = str3;str3 = str2;str2 = str1;str1 = TempStr;UpdateData(FALSE);num1 = f;num2 = 0.0f;flag = FLAG_LNX;
}

6)e^x:

void CmyCalculatorDlg::OnBnClickedButton33()
{// TODO: 在此添加控件通知处理程序代码UpdateData(TRUE);TempStr = _T("e^") + str + _T("=");num1 = _wtof(str);double f = pow(2.71828182845,num1);if (f - int(f) <= 1e-5){str.Format(L"%d", (int)f);}else{str.Format(L"%f", f);}TempStr += str;str4 = str3;str3 = str2;str2 = str1;str1 = TempStr;UpdateData(FALSE);num1 = f;num2 = 0.0f;flag = FLAG_EX;
}

最后调整好计算器的界面就可以啦!
参考视频教程

利用Visual Studio(C++)实现简易计算器(二)相关推荐

  1. Windows10下利用Visual Studio Code搭建C语言开发环境

    Windows10下利用Visual Studio Code搭建C语言开发环境 1. 前言 2. 下载安装VSCode以及MinGW 2.1 下载安装VSCode 2.2 下载安装MinGW-w64 ...

  2. IDE之VS:利用 Visual Studio中的IDE配置python语言进行编程

    IDE之VS:利用 Visual Studio中的IDE配置python语言进行编程 目录 第一步,先安装python环境 第二步,加载本地已有的python 第一步,先安装python环境

  3. IDE之VS:利用 Visual Studio中的IDE配置C++语言进行编程

    IDE之VS:利用 Visual Studio中的IDE配置C++语言进行编程 目录 C++编译器之VS2015 1.新建项目,VisualC++,空项目,确定 2.右键项目文件夹,添加,新建 3.添 ...

  4. 利用Visual Studio 2005的自动化测试工具来做数据导入

    * reference link: http://www.bentan.cn/Blog/Lists/Posts/Post.aspx?ID=3 1     引言 1.1         研究目标 在我们 ...

  5. 利用Visual Studio Project自动将数据加载到SQL Server数据库中

    介绍 (Introduction) A few months back, I encountered an interesting challenge at a client site. For th ...

  6. android studio大作业-简易计算器实现

    android studio大作业-简易计算器实现 先看效果图 基本功能:加,减,乘,除 核心代码实现 public class MainActivity extends AppCompatActiv ...

  7. 如何利用Visual Studio建立具有MVC框架的网页模型

    如何利用Visual Studio建立具有MVC框架的网页模型 1.打开VS2015,新建项目,选择Web模型中的ASP.NET Web应用程序 2.其次选择带有MVC的模板进行创建,并等待项目创建成 ...

  8. 【C++】利用Visual Studio 2008编写C++,Visual Studio 2008的基本使用

    现在很多高校还是利用Visual C++ 6.0这一经典版本在教C++,很多人对自己第一个程序的回忆是利用Visual C++ 6.0用C语言写的Helloworld,之后再学习C++的类,不过还是在 ...

  9. VB.NET,C#.NET调用Web Service,利用visual studio 的实现方法

    在VB.NET调用Web Service提供的服务 技术qq交流群:JavaDream:251572072 下面是一篇文章比较详细,其实具体操作很简单,把Web Service服务地址,利用工具(VS ...

最新文章

  1. 【代码段】UITableView Section圆角
  2. python硬件编程智能家居_利用 Python 的力量,实现 Tableau 与智能家居系统集成
  3. linux系统如何安装其他包,Linux系统下如何安装软件包
  4. java udp 同一个端口_java – 系统中的两个不同的UDP套接字可以绑定相同的端口吗?...
  5. power of two java_LeetCode算法题-Power Of Two(Java实现)
  6. c++ map初始化同时赋值_Golang入门教程——map篇
  7. 密码学替代技术_替代技术及其类型| 密码学
  8. 2019111 控制台上实现极乐净土(有图有背景音乐)
  9. 启动tomcat报错:Destroying ProtocolHandler [ajp-nio-8009]
  10. 浅谈统一权限管理平台
  11. MinGW MinGW-W64介绍
  12. Eclipes安装plugin插件
  13. PyQt5 使用 webdings,Wingdings 字体来替代某些常用图片
  14. 网上0月租不限量、不实名的流量卡是真的吗?
  15. html 获取语音时长,javascript – HTML5音频 – 获取声音对象的时间(howler.js)
  16. 表述为oracle进程有哪些 作用是什么,Oracle系统进程主要有哪些,作用是什么?...
  17. 通过PC获取Tello无人机视频图像和发送控制命令
  18. 【导航】自己的导航网站
  19. ShanaEncoder tesla P4转码
  20. python相关系数热力图_python绘制热力图heatmap

热门文章

  1. 机器学习过程步骤总结
  2. HDMI+VGA+USB3.0+PD3.0四合一多功能扩展坞|type c 扩展坞接口功能说明
  3. 使用Keras 构建基于 LSTM 模型的故事生成器
  4. psa加密_PSA:请注意这种新的Google翻译网络钓鱼攻击
  5. 【渝粤教育】电大中专电子商务网站建设与维护 (6)作业 题库
  6. iMeta高被引论文|陈同/刘永鑫等高颜值绘图网站imageGP被引500次(截止22/12/13)
  7. php 生成指定长度字符串
  8. AIGC神器 Midjourney 强势更新!逼真到令人发指!文心一言紧跟其后
  9. python不同曲线设置标签_python 绘制拟合曲线并加指定点标识的实现 Python怎么实现非线性的拟合...
  10. Unity UGUI中的rebatch和rebuild理解