第一次写计算器,自己制作的计算器下载:
https://download.csdn.net/download/cai_niaocainiao/10594663
第一步参考博客:【基于VS2010的MFC编程】多功能计算器
相同的内容在这里就不说了,先说自己遇到的问题:
(1):创建MFC时遇到:error RC1015
解决方案:项目名右击->属性-->vc++目录-->包含目录-->编辑-(如下两张):
点击蓝圈圈里的添加,添加:$(WindowsSDK_IncludePath)
同样的在库目录里添加:$(WindowsSDK_LibraryPath_x86)
改完之后在调试-->启动调试,对话框就出来了,
关于对话框操作如参考博客就行。
(2)关于代码方面我做了一点改变:(这里可以按我的代码写也可以按照参考博客里的代码写)
设计好主对话框后,开始双击按钮进入主程序中相应的位置,添加消息处理程序。
(1)首先在××Dlg.h(主程序头文件,××是你建立的工程名,如工程名为“多功能计算器”,则主程序头文件为“多功能计算器Dlg.h”)中主对话框类中的公有成员(public:)中添加代码,如下图所示,红框内为手动添加的代码:
2)在××Dlg.cpp主程序中添加如下代码:
①在程序顶部包含cmath头文件:#include “cmath”(因为开方函数sqrt()、指数函数pow()需要该头文件)
②在初始化函数BOOL C多功能计算器Dlg::OnInitDialog()中添加m_edit.SetWindowText(“”);将编辑框初始化为空
③双击主对话框中的按钮,主程序会自动添加其消息响应函数,在函数体中添加实现代码:
A、“关于软件”“后退”“清零”按钮的代码:(一样)
B.关于“+”,“-”“*” “/" 代码如下:
void CMFCTestzxzxDlg::OnBnClickedAdd() //"+"
{
// TODO: 在此添加控件通知处理程序代码
SaveValuel(); //执行SaveValuel()函数,保存第一个数值并
UpdateData(TRUE);
m_str = m_str + "+";
UpdateData(FALSE);
m_istrle = strlen(m_str); //求目前字符串的长度
m_iSign = 0; //“+”的标志,用于Calculater()函数中case的跳转判断
}
void CMFCTestzxzxDlg::OnBnClickedDec() //"-"
{
// TODO: 在此添加控件通知处理程序代码
SaveValuel(); //执行SaveValuel()函数,保存第一个数值
UpdateData(TRUE);
m_str = m_str + "-";
UpdateData(FALSE);
m_istrle = strlen(m_str);
m_iSign = 1; //“-”的标志,用于Calculater()函数中case的跳转判断
}
void CMFCTestzxzxDlg::OnBnClickedMultiply() //"×”
{
// TODO: 在此添加控件通知处理程序代码
SaveValuel();
UpdateData(TRUE);
m_str = m_str + "*";
UpdateData(FALSE);
m_istrle = strlen(m_str);
m_iSign = 2;
}
void CMFCTestzxzxDlg::OnBnClickedDivide() //"÷"
{
// TODO: 在此添加控件通知处理程序代码
SaveValuel();
UpdateData(TRUE);
m_str = m_str + "/";
UpdateData(FALSE);
m_istrle = strlen(m_str);
m_iSign = 3;
}
C:“平方”“开方”“指数”“log”按钮的代码:
void CMFCTestzxzxDlg::OnBnClickedBidcExp() //指数
{
// TODO: 在此添加控件通知处理程序代码
SaveValuel();
UpdateData(TRUE);
m_str = m_str + "^";
UpdateData(FALSE);
m_istrle = strlen(m_str);
m_iSign = 6;
}
void CMFCTestzxzxDlg::OnBnClickedSquare() //平方
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);
m_fNumber1 = atof(m_str); //由于操作数只有一个,因此不需要等到“=”按下时才在编辑框显示
double f = m_fNumber1*m_fNumber1;
//如果浮点数是整数
if (f - int(f) <= 1e-5)
{
m_str.Format("%d", (int)f);
}
else
{
m_str.Format("%f", f);
}
UpdateData(FALSE);
}
void CMFCTestzxzxDlg::OnBnClickedSqrt() //开方
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);
m_fNumber1 = atof(m_str);
double f = sqrt(m_fNumber1);
if (f - (int)f <= 1e-5)
{
m_str.Format("%d", (int)f);
}
else
{
m_str.Format("%f", f);
}
UpdateData(FALSE);
}
void CMFCTestzxzxDlg::OnBnClickedLog() //以十为底的对数
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);
m_fNumber1 = atof(m_str);
double f = log10(m_fNumber1);
if (f - (int)f <= 1e-5)
{
m_str.Format("%d", (int)f); //将整数转化为字符
}
else
{
m_str.Format("%f", f);
}
UpdateData(FALSE);
}
D:数字按钮的代码(以数字1按钮为例,其他数字类似):
void CMFCTestzxzxDlg::OnBnClickedNum1() //数字1
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);
m_str = m_str + "1";
UpdateData(FALSE);
}
E:"."和“=”代码:
void CMFCTestzxzxDlg::OnBnClickedDemical() //“."
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);
if (-1 == m_str.Find(".")) //找到第一个小数点的位置
{
m_str = m_str + ".";
}
UpdateData(FALSE);
}
void CMFCTestzxzxDlg::OnBnClickedEqual() //"="
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);
//m_iSign=0~3分别对应"+""-""*""÷",m_iSign=6对应指数
if (m_iSign != 0 && m_iSign != 1 && m_iSign != 2 && m_iSign != 3 && m_iSign != 6)
{
m_fNumber1 = atof(m_str);
}
//当单击输入数值而没有单击操作符按钮、直接单击“=”时,界面上保持显示第一个操作数
else
Calculator();
UpdateData(FALSE);
}
F:自定义函数:
void CMFCTestzxzxDlg::SaveValuel()
{
UpdateData(TRUE);
m_fNumber1 = atof(m_str); //编辑框显示第一个操作数,atof()把字符串转换成浮点数
UpdateData(FALSE);
}
//计算,涉及到两个操作数,按下”=“时执行。包括”+“,”-“,”*“,”➗“”指数“
void CMFCTestzxzxDlg::Calculator()
{
UpdateData(TRUE);
m_fNumber2 = atof(m_str.Right(m_str.GetLength() - m_istrle)); //获得第二个操作数并显示在编辑框中
double f = 0.0f; //f必须初始化,用于保留计算结果
switch (m_iSign) //根据m_iSign标志跳转
{
case 0:
f = m_fNumber1 + m_fNumber2; //加
break;
case 1:
f = m_fNumber1 - m_fNumber2; //减
break;
case 2:
f = m_fNumber1 * m_fNumber2; //乘
break;
case 3:
if (m_fNumber2 == 0.0f) //除法中分母不能为0,为0时执行如下
{
MessageBox("除数不能为0!"); //弹出提示信息框
f = m_fNumber1;
//除数为0时直接将第一个操作数赋给结果,表示第二个操作数不算,直接继续下一步操作
}
else
{
f = m_fNumber1 / m_fNumber2; //除
}
break;
case 6:
f = pow(m_fNumber1, m_fNumber2); //指数
break;
default:
break;
}
UpdateData(FALSE);
if (f - int(f) <= 1e-5)
{
m_str.Format("%d", (int)f);
}
else
{
m_str.Format("%f", f); //double型的数据转换为Cstring型
}
}
写完之仍有一个问题需要:配置属性-->常规-->字符集改成使用多字节字符集
(3)运行结果展示部分:
(4)使用Installshield 将文件打包成 exe格式安装包 (自己百度搜索即可,很详细)
打开后就可以运行啦