`

基于VC的MFC计算器案例步骤及源代码

    博客分类:
  • vc++
阅读更多

严重受不了那些下载需要积分豆豆什么的!!!

本人做了一个一个计算器上交报告,拿出来分享分享!!!

基于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 Text设置为right,如图:

 

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 only”设置为ture!

7.在类视图中给CdckCalculatorDlg类添加成员变量:

int m_duType;初始值为0,用来作为判定弧度还是角度的变准;

double m_first;//存储一次运算的第一个操作数及一次运算的结果

double m_second;//存储一次运算的第二个操作数

CString m_operator;//存储运算符

double m_coff;//存储小数点的系数权值

8.给编辑框添加关联变量:(右击编辑框->添加变量)

CString m_display;//编辑框IDC_DISPLAY的关联变量,显示计算结果(注意最右边选择“value”)

9.双击“弧度”给其添加事件响应(等价于右击然后添加事件处理器);

同理双击“角度”添加代码:

//弧度处理函数

void CdckCalculatorDlg::OnBnClickedHudu()

{

m_duType=0;//系统默认m_duType为,这里为刚好可以为计算器默认为弧度计算

}

//角度处理函数

void CdckCalculatorDlg::OnBnClickedJiaodu()

{

m_duType=1;//当选择角度处理函数的时候,m_duType为;这哥主要是作为以后函数算法的判断标准

}


10.在对话框类的构造函数中,初始化成员变量

// CdckCalculatorDlg 对话框的构造函数

CdckCalculatorDlg::CdckCalculatorDlg(CWnd* pParent /*=NULL*/)

: CDialog(CdckCalculatorDlg::IDD, pParent)

, m_duType(0)

, m_first(0.0)

, m_second(0.0)

, m_operator(_T("+"))

, m_coff(0)

, m_display(_T("0.0"))

     ······

 

11.类视图里手动为对话框添加2个函数:

void  UpdateDisplay(double dck)——用于编辑框显示数据

Void Calculate(void)——用于计算结果  

代码如下(由于在代码中要用到fabs,要在CdckCalculatorDlg.cpp里添加一个库:#include "math.h"):

//在编辑框中显示数据

void CdckCalculatorDlg::UpdateDisplay(double dck)

{

m_display.Format(_T("%f"),dck);

int i=m_display.GetLength();

while(m_display.GetAt(i-1)=='0'//格式化输出,将输出结果后的零截去

{  m_display.Delete(i-1,1);  i--; }

UpdateData(false);//更新编辑框变量m_display

}

//计算结果

void CdckCalculatorDlg::Calculate(void)

{//将前一次数据与当前数据进行运算,作为下次的第一操作数,并在编辑框显示。

switch(m_operator.GetAt(0))

{  case '+': m_first+=m_second;break;

case '-': m_first-=m_second;break;

case '*': m_first*=m_second;break;

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  onButtonN(int n);以便数字按钮调用响应

//用于数字按钮调用

void CdckCalculatorDlg::onButtonN(int n)

{if( m_coff == 1.0)

m_second = m_second*10 + n;//作为整数输入数字时

else  

{ m_second = m_second + n*m_coff; //作为小数输入数字

m_coff *= 0.1;}

UpdateDisplay(m_second);//更新编辑框的数字显示

}

13.双击各个数字按钮,添加响应,调用函数:如:

void CdckCalculatorDlg::OnBnClickedButton0()

{

onButtonN(0);

}

void CdckCalculatorDlg::OnBnClickedButton1()

{

onButtonN(1);

}······

14.为各个运算符号添加事件处理器:

//   "+/-"

void CdckCalculatorDlg::OnBnClickedButtonSign()

{

m_second = -m_second;

UpdateDisplay(m_second);

}

//   "."

void CdckCalculatorDlg::OnBnClickedButtonPoint()

{

m_coff= 0.1 ;

}

//   "+"

void CdckCalculatorDlg::OnBnClickedButtonAdd()

{

Calculate();

m_operator="+"// - *方法类似

}

//   "/"

void CdckCalculatorDlg::OnBnClickedButtonDiv()

{

Calculate();

m_operator.Format(_T("%s"),"/");

}

//   "C"

void CdckCalculatorDlg::OnBnClickedButtonClear()

{

m_first=0.0;

m_second=0.0;

m_operator = "+";

m_coff = 1.0;

UpdateDisplay(0.0);

}

//   "sqrt"

void CdckCalculatorDlg::OnBnClickedButtonSqrt()

{

if( m_second==0)

{    m_first=sqrt(m_first);      

UpdateDisplay(m_first);   }

else

{ m_second=sqrt(m_second);    

UpdateDisplay(m_second);}

}

//   "1/x"

void CdckCalculatorDlg::OnBnClickedButtonReci()

{

if(fabs(m_second)<0.000001 && fabs(m_first)<0.000001)

{m_display = "除数不能为零";

UpdateData(false);

return;}

if( fabs(m_second)<0.000001)

{    m_first=1.0/m_first;

UpdateDisplay(m_first);

}

else

{ m_second=1.0/m_second;

UpdateDisplay(m_second);

}

}

//   "="

void CdckCalculatorDlg::OnBnClickedButtonEqual()

{

Calculate(); 

}

15.同理添加其他特殊函数按钮事件处理器,其中大部分在API里math类里都有定义好了的 可以直接用的函数,当然有几个是自己写的如(n!和x^y而且第二个比较棘手),然后还有一个问题就是,里面的函数括号里面跟的值是弧度,而不是角度,这就需要我们去判断了,也就是说m_duType终于派上用场了,只要switch,m_duType,case得到0即默认的为弧度,case1 则值为角度,然后转换值赋给我们需要的显示出来:还是如上手动添加一个函数:void  sanjiaoHanshu()

但是此时我们还需要PI,但是我们不能直接得到所以在这之前我们需要添加成员变量m_PI,并赋予初值m_PI=3.14159265358979323846;代码如下:用来抉择结果,是弧度还是角度

void CdckCalculatorDlg::sanjiaoHanshu(void)

{

switch(m_duType)

{case 0:

m_second=m_second;

break;

case 1:

m_second=m_second*m_PI/180;

break;

}

}

16.编辑其他函数的代码:

//   "exp"

void CdckCalculatorDlg::OnBnClickedExp()

{

m_second=exp(m_second);

UpdateDisplay(m_second);

}

//   "10^x"

void CdckCalculatorDlg::OnBnClicked10x()

{

m_second=pow(10,m_second);

UpdateDisplay(m_second);

}

//   "cos"

void CdckCalculatorDlg::OnBnClickedCos()

{

sanjiaoHanshu();

m_second=cos(m_second);

UpdateDisplay(m_second);

}

//   "sin"

void CdckCalculatorDlg::OnBnClickedSin()

{

sanjiaoHanshu();

m_second=sin(m_second);

UpdateDisplay(m_second);

}

//   "ln"

void CdckCalculatorDlg::OnBnClickedLn()

{

m_second=log(m_second);

UpdateDisplay(m_second);

}

//   "log"

void CdckCalculatorDlg::OnBnClickedLog()

{

m_second=log10(m_second);

UpdateDisplay(m_second);

}

//   "arccos"

void CdckCalculatorDlg::OnBnClickedArccos()

{

sanjiaoHanshu();

m_second=acos(m_second);

UpdateDisplay(m_second);

 

}

//   "arcsin"

void CdckCalculatorDlg::OnBnClickedArcsin()

{

sanjiaoHanshu();

m_second=asin(m_second);

UpdateDisplay(m_second);

}

//   "tan"

void CdckCalculatorDlg::OnBnClickedTan()

{

sanjiaoHanshu();

m_second=tan(m_second);

UpdateDisplay(m_second);

}

//   "arctan"

void CdckCalculatorDlg::OnBnClickedArctan()

{

sanjiaoHanshu();

m_second=atan(m_second);

UpdateDisplay(m_second);

}

//   "cosh"

void CdckCalculatorDlg::OnBnClickedCosh()

{

sanjiaoHanshu();

m_second=cosh(m_second);

UpdateDisplay(m_second);

}

//   "sinh"

void CdckCalculatorDlg::OnBnClickedSinh()

{m_second=sinh(m_second);

UpdateDisplay(m_second);

}

//   "tanh"

void CdckCalculatorDlg::OnBnClickedTanh()

{

sanjiaoHanshu();

m_second=tanh(m_second);

UpdateDisplay(m_second);

}

//   "2^x"

void CdckCalculatorDlg::OnBnClicked2dex()

{

m_second=pow(2,m_second);

UpdateDisplay(m_second);

}

 

17.现在来看x^y 我们需要先得到  然后点击x^y按钮后再得到y,在点击“=”按钮后得到结果:步骤:如上添加变量 bool型 isXY

默认为false,再添加一个中间变量 double temp;当点击按钮的时候我们将编辑框显示的结果赋值给temp,然后将m_second设置为0.0,编辑框显示为0.0,设置isXYture如下代码:

//   "x^y"

void CdckCalculatorDlg::OnBnClickedXdey()

{

temp=m_second;

m_second=0.0;

UpdateDisplay(0.0);

isXY=true;

}

 

(再输入新数据,然后再按“=”,所以在=之前我们需要对x^y做出判断 如果按了则isXYture,则我们将上面的数字记下然后参与计算,如果为false就不算:)

添加一个函数void  xDEy()

//用来判断是否点击了“x^y”按钮,点击了后又作何运算

void CdckCalculatorDlg::xDEy(void)

{

if(isXY){

m_second=m_second;

m_second=pow(temp,m_second);

}

}

然后在每次等于之前都调用一下这个函数,如果点击了x^y按钮则执行里面的代码,所以“=”的代码需要修改一下:

//   "="

void CdckCalculatorDlg::OnBnClickedButtonEqual()

{

xDEy();

Calculate(); 

}

 

18.n的阶乘:我们需要利用递归,如上添加函数int  jiecheng(int n)

利用递归,返回阶乘值,代码如下:

int CdckCalculatorDlg::jiecheng(int n)

{

if(n==0||n==1){

return 1;

}else if(n>1){

return n*fun(n-1);

}

}

在n!的按钮消息处理里,如果输入的不是整数则不能进行阶乘运算:

//   "n!"

void CdckCalculatorDlg::OnBnClickedNjiecheng()

{

if((m_second-(int)m_second)>0){

m_display =_T("你输入的不是整数,请输入整数!");

UpdateData(false);//如果是非整数,则结束运算,重新开始

return;

}

else {

m_second=(double)jiecheng(m_second);

UpdateDisplay(m_second);

}

}

 

19.所有按钮事件处理已经完成,编译运行:

自我检测,所有功能都能正确运行!完成!!!
 
 

<!--EndFragment-->
  • 大小: 16.9 KB
  • 大小: 89 KB
  • 大小: 18 KB
  • 大小: 40 KB
  • 大小: 16.9 KB
  • 大小: 79.1 KB
  • 大小: 49.5 KB
38
4
分享到:
评论
2 楼 zclzcllll 2018-01-05  
能不能再给个退个按钮和π的按钮的
1 楼 shezhangjiadao 2016-08-06  
写的非常好!!不过我有几个小建议~希望楼主能更正一下~~
[color=red][/color]
1、m_coff 没有提醒初始化为 1.0
2、在阶乘那个函数中,func应改为jiecheng,不然函数名不一致
3、乘法那个功能中,‘x’最好和‘*’一致吧
  

相关推荐

Global site tag (gtag.js) - Google Analytics