`

基于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’最好和‘*’一致吧
  

相关推荐

    MFC / VC一个的简单(计算器)计算机程序源代码下载

    MFC / VC一个的简单(计算器)计算机程序源代码下载MFC / VC一个的简单(计算器)计算机程序源代码下载MFC / VC一个的简单(计算器)计算机程序源代码下载MFC / VC一个的简单(计算器)计算机程序源代码下载MFC / VC...

    mfc计算器(基于vc++和vc2008两种)

    在本项目中,我们探讨的是基于VC++和VC2008开发的MFC计算器,这是一款非常适合初学者理解MFC框架和实践Windows编程的经典案例。 1. **MFC基础知识** - MFC是微软为了简化Windows API编程而设计的,它封装了Windows...

    用VC++6.0MFC做的一个计算器源代码

    【VC++6.0 MFC计算器源代码解析】 在编程领域,Microsoft Visual C++ 6.0(简称VC++6.0)是一款经典的集成开发环境,尤其对于学习Windows应用程序开发的人来说,它是一个不可或缺的工具。MFC(Microsoft Foundation...

    简易计算器VCMFC

    在实际的开发流程中,"简易计算器VCMFC"的源代码可能包含了多个文件,比如头文件(.h)定义了类和函数,源文件(.cpp)实现了函数的细节。"Calculate"可能是指主计算逻辑的实现文件,或者是一个包含了所有计算相关...

    MFC 普通计算器 源代码

    MFC 计算器 VC++ 我自己写的有缺陷.请大家包含。内包含源代码

    VC6.0 计算器源代码

    通过深入研究这个“VC6.0计算器源代码”,我们可以了解到MFC应用程序的基本架构,以及如何处理用户输入和控制GUI元素。这不仅有助于理解Windows程序的工作原理,也为后续更复杂的项目打下坚实基础。在实践中,不断...

    VC6.0计算器源代码

    【VC6.0计算器源代码】是一个...总的来说,通过研究这个VC6.0计算器源代码,开发者不仅可以学习到C++编程和MFC库的使用,还能掌握Windows应用程序开发的基本流程和技巧,对于提升编程技能和理解软件工程有极大的帮助。

    Calculator VC MFC 做的简单计算器

    包里有:基于VC的MFC计算器案例步骤及源代码,从网上下载的一个支持表达式计算的计算器源码包,自己做的一个简单计算器,能实现加减乘除等基本计算,可以不清零直接进行后续计算,包括使用上次结果计算和重新开始一...

    mfc计算器.zip

    从标签"MFC计算器"我们可以推断,这个压缩包包含的是一个使用MFC构建的计算器应用源代码。学习这个项目,开发者可以了解如何利用MFC的类来创建窗口、按钮、文本框等控件,以及如何处理用户的输入事件,如点击按钮...

    基于MFC(VC6.0)的简单计算器程序

    在本案例中,我们讨论的是一个基于MFC的简单计算器程序,它是在VC6.0环境下编译运行的。VC6.0是微软的Visual C++ 6.0集成开发环境,尽管现在已经有更新的版本,但因其稳定性和对MFC的良好支持,仍然被许多开发者用于...

    mfc设计的完美计算器源代码

    本项目“mfc设计的完美计算器源代码”是一个利用MFC构建的强大且美观的计算器应用,旨在帮助开发者理解和学习如何在Visual Studio环境下,特别是VC6.0中,利用MFC进行桌面应用开发。 首先,我们来了解一下MFC的基本...

    vc计算器源代码,支持各种进制正余弦的计算器,vc多功能计算器,vc计算器,mfc计算器,

    本计算器实现了的功能有: 1、二进制、八进制、十进制及十六进制数的加、减、乘、除、乘方、取模等简单计算 2、科学计算函数,包括(反)正弦、(反)余弦、(反)正切、(反)余切、开方、指数等函数运行 3、以角度、弧度两...

    MFC计算器源码+动态库源码

    1. 理解MFC的控件和事件处理机制:通过查看源代码,了解MFC是如何创建GUI界面,以及如何响应用户操作,例如点击按钮、输入数字等。 2. 学习MFC的文档/视图架构:这是一个常见的MFC应用程序设计模式,它将数据(文档...

    Visual C++ 6.0(MFC)计算器源代码

    总的来说,Visual C++ 6.0的MFC计算器源代码是学习MFC和Windows GUI编程的一个典型实例。通过分析和理解这段代码,可以深入掌握如何使用MFC构建窗口应用,理解控件的交互机制,以及如何组织和实现计算逻辑。同时,这...

    VC++计算器源代码

    【VC++计算器源代码】是基于Microsoft Visual C++开发的一款简单计算器程序的源代码,它展示了如何使用C++语言和Microsoft的MFC(Microsoft Foundation Classes)框架来构建一个图形用户界面(GUI)应用。MFC是C++的...

    mfc多功能计算器源代码,vc多功能科学计算器,计算器源代码

    二进制、八进制、十进制及十六进制数的加、减、乘、除、乘方、取模等简单计算 科学计算函数,包括(反)正弦、(反)余弦、(反)正切、(反)余切、开方、指数等函数运行 以角度、弧度两种方式实现上述部分函数 具备历史...

    VC 计算器源代码和报告

    "VC 计算器源代码和报告" 这个标题指的是一个使用Visual C++(简称VC)开发的计算器项目,它不仅包含了实际的源代码,还附带了一份24页的设计报告。这表明这个资源是面向学习或教学目的的,可能是一个课程设计、项目...

    VC简单的MFC计算器

    在这个案例中,“VC简单的MFC计算器”是一个基于Visual C++ 6.0开发的计算器应用,它实现了基本的四则运算功能,包括加、减、乘、除,适用于处理小数和整数。 **MFC框架** MFC由一系列的C++类组成,这些类提供了对...

    基于MFC的计算器

    vc calcu1这个文件可能是项目的源代码或编译后的二进制文件。 总结,基于MFC的计算器项目是一个典型的Windows GUI应用程序开发案例,涵盖了MFC的基础知识、用户界面设计、事件处理、逻辑计算等多个方面。通过实践这...

    用vc做的计算器程序源代码

    总的来说,这个“用vc做的计算器程序源代码”是一个学习C++和Windows应用程序开发的良好起点。通过研究这个程序,你可以了解到如何结合MFC库创建用户界面,如何处理事件,以及如何组织和实现计算逻辑。这对于进一步...

Global site tag (gtag.js) - Google Analytics