严重受不了那些下载需要积分豆豆什么的!!!
本人做了一个一个计算器上交报告,拿出来分享分享!!!
基于VC的MFC计算器案例步骤及源代码
基于VC的MFC计算器案例详细步骤有图有代码,图中右边的各个函数也都能实现:清除,加,减,乘,除,倒数,e的x次方,以e为底x的对数,10的x次方,以10为底x的对数,余弦,反余弦,双曲余弦值,正弦,反正弦,双曲正弦值,正切,反正切,双曲正切值,x的y次方,2的x次方,n(n为整数)的阶乘。如图:
1.创建一个基于对话框的应用程序(这一步应该都会吧!),命名为dckCalculator;
2.打开资源视图->点击“dckCalculator”左边的“+”->点击“dckCalculator.rc”左边的“+”->点击“Dialog”左边的“+”->双击“IDD_DCKCALCULATOR_DIALOG”->去除“确定”“取消”“TODO:
3.按照我们想要的效果给对话框添加组件->编辑各个组件的显示名字->改变其ID属性
4.将编辑框的属性中的Align
5.设置相关属性(每次改变ID都要保存一下):
控件 | Caption(名称) | ID | 控件 | caption | ID |
按钮 | 0 | IDC_BUTTON0 | 按钮 | exp | IDC_EXP |
按钮 | 1 | IDC_BUTTON1 | 按钮 | 10^x | IDC_10X |
按钮 | 2 | IDC_BUTTON2 | 按钮 | cos | IDC_COS |
按钮 | 3 | IDC_BUTTON3 | 按钮 | sin | IDC_SIN |
按钮 | 4 | IDC_BUTTON4 | 按钮 | ln | IDC_LN |
按钮 | 5 | IDC_BUTTON5 | 按钮 | log | IDC_LOG |
按钮 | 6 | IDC_BUTTON6 | 按钮 | arccos | IDC_ARCCOS |
按钮 | 7 | IDC_BUTTON7 | 按钮 | arcsin | IDC_ARCSIN |
按钮 | 8 | IDC_BUTTON8 | 按钮 | tan | IDC_TAN |
按钮 | 9 | IDC_BUTTON9 | 按钮 | arctan | IDC_ARCTAN |
按钮 | +/- | IDC_BUTTON_SIGN | 按钮 | cosh | IDC_COSH |
按钮 | . | IDC_BUTTON_POINT | 按钮 | sinh | IDC_SINH |
按钮 | + | IDC_BUTTON_ADD | 按钮 | tanh | IDC_TANH |
按钮 | - | IDC_BUTTON_MINUS | 按钮 | X^y | IDC_XDEY |
按钮 | * | IDC_BUTTON_MUTIPLY | 按钮 | 2^x | IDC_2DEX |
按钮 | / | IDC_BUTTON_DIV | 按钮 | N! | IDC_NJIECHENG |
按钮 | C | IDC_BUTTON_CLEAR | 单选 | 弧度 | IDC_HUDU |
按钮 | sqrt | IDC_BUTTON_SQRT | 单选 | 角度 | IDC_JIAODU |
按钮 | 1/x | IDC_BUTTON_RECI | 编辑框 | 编辑框 | IDC_DISPLAY(只读) |
按钮 | = | IDC_BUTTON_EQUAL | | | |
6.将编辑框中属性的“read
7.在类视图中给CdckCalculatorDlg类添加成员变量:
int
double
double
CString
double
8.给编辑框添加关联变量:(右击编辑框->添加变量)
CString
9.双击“弧度”给其添加事件响应(等价于右击然后添加事件处理器);
同理双击“角度”添加代码:
//弧度处理函数
void
{
m_duType=0;//系统默认m_duType为,这里为刚好可以为计算器默认为弧度计算
}
//角度处理函数
void
{
m_duType=1;//当选择角度处理函数的时候,m_duType为;这哥主要是作为以后函数算法的判断标准
}
10.在对话框类的构造函数中,初始化成员变量:
//
CdckCalculatorDlg::CdckCalculatorDlg(CWnd*
:
,
,
,
,
,
,
11.类视图里手动为对话框添加2个函数:
void
Void
代码如下(由于在代码中要用到fabs,要在CdckCalculatorDlg.cpp里添加一个库:#include
//在编辑框中显示数据
void
{
m_display.Format(_T("%f"),dck);
int
while(m_display.GetAt(i-1)=='0')
{
UpdateData(false);//更新编辑框变量m_display
}
//计算结果
void
{//将前一次数据与当前数据进行运算,作为下次的第一操作数,并在编辑框显示。
switch(m_operator.GetAt(0))
{
case
case
case
if(fabs(m_second)<=0.000001)
{m_display="除数不能为";
UpdateData(false);
return;
m_first/=m_second;break;
}
m_second=0.0;
m_coff=1.0;
m_operator=_T("+");
UpdateDisplay(m_first);//更新编辑框显示内容
}
12.如上添加函数void
//用于数字按钮调用
void
{
m_second
else
{
m_coff
UpdateDisplay(m_second);//更新编辑框的数字显示
}
13.双击各个数字按钮,添加响应,调用函数:如:
void
{
onButtonN(0);
}
void
{
onButtonN(1);
}······
14.为各个运算符号添加事件处理器:
//
void
{
m_second
UpdateDisplay(m_second);
}
//
void
{
m_coff
}
//
void
{
Calculate();
m_operator="+";
}
//
void
{
Calculate();
m_operator.Format(_T("%s"),"/");
}
//
void
{
m_first=0.0;
m_second=0.0;
m_operator
m_coff
UpdateDisplay(0.0);
}
//
void
{
if(
{
UpdateDisplay(m_first);
else
{
UpdateDisplay(m_second);
}
//
void
{
if(fabs(m_second)<0.000001
{m_display
UpdateData(false);
return;
if(
{
UpdateDisplay(m_first);
}
else
{
UpdateDisplay(m_second);
}
}
//
void
{
Calculate();
}
15.同理添加其他特殊函数按钮事件处理器,其中大部分在API里math类里都有定义好了的
但是此时我们还需要PI,但是我们不能直接得到所以在这之前我们需要添加成员变量m_PI,并赋予初值m_PI=3.14159265358979323846;代码如下:/
void
{
switch(m_duType)
{case
m_second=m_second;
break;
case
m_second=m_second*m_PI/180;
break;
}
}
16.编辑其他函数的代码:
//
void
{
m_second=exp(m_second);
UpdateDisplay(m_second);
}
//
void
{
m_second=pow(10,m_second);
UpdateDisplay(m_second);
}
//
void
{
sanjiaoHanshu();
m_second=cos(m_second);
UpdateDisplay(m_second);
}
//
void
{
sanjiaoHanshu();
m_second=sin(m_second);
UpdateDisplay(m_second);
}
//
void
{
m_second=log(m_second);
UpdateDisplay(m_second);
}
//
void
{
m_second=log10(m_second);
UpdateDisplay(m_second);
}
//
void
{
sanjiaoHanshu();
m_second=acos(m_second);
UpdateDisplay(m_second);
}
//
void
{
sanjiaoHanshu();
m_second=asin(m_second);
UpdateDisplay(m_second);
}
//
void
{
sanjiaoHanshu();
m_second=tan(m_second);
UpdateDisplay(m_second);
}
//
void
{
sanjiaoHanshu();
m_second=atan(m_second);
UpdateDisplay(m_second);
}
//
void
{
sanjiaoHanshu();
m_second=cosh(m_second);
UpdateDisplay(m_second);
}
//
void
{
UpdateDisplay(m_second);
}
//
void
{
sanjiaoHanshu();
m_second=tanh(m_second);
UpdateDisplay(m_second);
}
//
void
{
m_second=pow(2,m_second);
UpdateDisplay(m_second);
}
17.现在来看x^y
默认为false,再添加一个中间变量
//
void
{
temp=m_second;
m_second=0.0;
UpdateDisplay(0.0);
isXY=true;
}
(再输入新数据,然后再按“=”,所以在=之前我们需要对x^y做出判断
添加一个函数void
//用来判断是否点击了“x^y”按钮,点击了后又作何运算
void
{
if(isXY){
m_second=m_second;
m_second=pow(temp,m_second);
}
}
然后在每次等于之前都调用一下这个函数,如果点击了x^y按钮则执行里面的代码,所以“=”的代码需要修改一下:
//
void
{
xDEy();
Calculate();
}
18.n的阶乘:我们需要利用递归,如上添加函数int
利用递归,返回阶乘值,代码如下:
int
{
if(n==0||n==1){
return
}else
return
}
}
在n!的按钮消息处理里,如果输入的不是整数则不能进行阶乘运算:
//
void
{
if((m_second-(int)m_second)>0){
m_display
UpdateData(false);//如果是非整数,则结束运算,重新开始
return;
}
else
m_second=(double)jiecheng(m_second);
UpdateDisplay(m_second);
}
}
19.所有按钮事件处理已经完成,编译运行:
自我检测,所有功能都能正确运行!完成!!!