2023年7月18日发(作者:)
基于VC的MFC计算器案例步骤及源代码严重受不了那些下载需要积分⾖⾖什么的本⼈做了⼀个⼀个计算器上交报告,拿出来分享分享基于VC的MFC计算器案例步骤及源代码基于VC的MFC计算器案例详细步骤有图有代码,图中右边的各个函数也都能实现:清除,加,减,乘,除,倒数,e的x次⽅,以e为底x的对数,10的x次⽅,以10为底x的对数,余弦,反余弦,双曲余弦值,正弦,反正弦,双曲正弦值,正切,反正切,双曲正切值,x的y次⽅,2的x次⽅,n(n为整数)的阶乘。如图: 步骤:1.创建⼀个基于对话框的应⽤程序(这⼀步应该都会吧!),命名为dckCalculator;2.打开资源视图->点击“dckCalculator”左边的“+”->点击“”左边的“+”->点击“Dialog”左边的“+”->双击“IDD_DCKCALCULATOR_DIALOG”->去除“确定”“取消”“TODO: 在此放置对话框控件。”⼏个组件(全选。然后右击选择“删除”即可):3.按照我们想要的效果给对话框添加组件->编辑各个组件的显⽰名字->改变其ID属性4.将编辑框的属性中的Align Text设置为right,如图:
5.设置相关属性(每次改变ID都要保存⼀下):控件按钮按钮按钮按钮按钮按钮按钮按钮按钮按钮按钮按钮按钮按钮按钮按钮按钮按钮按钮按钮Caption(名称)+/-.+-*/Csqrt1/x=IDIDC_BUTTON0IDC_BUTTON1IDC_BUTTON2IDC_BUTTON3IDC_BUTTON4IDC_BUTTON5IDC_BUTTON6IDC_BUTTON7IDC_BUTTON8IDC_BUTTON9IDC_BUTTON_SIGNIDC_BUTTON_POINTIDC_BUTTON_ADDIDC_BUTTON_MINUSIDC_BUTTON_MUTIPLYIDC_BUTTON_DIVIDC_BUTTON_CLEARIDC_BUTTON_SQRTIDC_BUTTON_RECIIDC_BUTTON_EQUAL控件按钮按钮按钮按钮按钮按钮按钮按钮按钮按钮按钮按钮按钮按钮按钮按钮单选单选编辑框captionexp10^xcossinlnlogarccosarcsintanarctancoshsinhtanhX^y2^xN!弧度⾓度编辑框IDIDC_EXPIDC_10XIDC_COSIDC_SINIDC_LNIDC_LOGIDC_ARCCOSIDC_ARCSINIDC_TANIDC_ARCTANIDC_COSHIDC_SINHIDC_TANHIDC_XDEYIDC_2DEXIDC_NJIECHENGIDC_HUDUIDC_JIAODUIDC_DISPLAY(只读)
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,要在⾥添加⼀个库:#include "math.h")://在编辑框中显⽰数据void CdckCalculatorDlg::UpdateDisplay(double dck){m_(_T("%f"),dck);int i=m_gth();while(m_(i-1)=='0') //格式化输出,将输出结果后的零截去{ m_(i-1,1); i--; }UpdateData(false);//更新编辑框变量m_display}//计算结果void CdckCalculatorDlg::Calculate(void){//将前⼀次数据与当前数据进⾏运算,作为下次的第⼀操作数,并在编辑框显⽰。switch(m_(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_(_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.979323846;代码如下:/ ⽤来抉择结果,是弧度还是⾓度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,设置isXY为ture如下代码:// "x^y"void CdckCalculatorDlg::OnBnClickedXdey(){temp=m_second;m_second=0.0;UpdateDisplay(0.0);isXY=true;}
(再输⼊新数据,然后再按“=”,所以在=之前我们需要对x^y做出判断 如果按了则isXY为ture,则我们将上⾯的数字记下然后参与计算,如果为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.所有按钮事件处理已经完成,编译运⾏:⾃我检测,所有功能都能正确运⾏!完成
发布者:admin,转转请注明出处:http://www.yc00.com/xiaochengxu/1689610744a270390.html
评论列表(0条)