收藏 分销(赏)

计算器设计.docx

上传人:xrp****65 文档编号:7436251 上传时间:2025-01-04 格式:DOCX 页数:14 大小:275.01KB 下载积分:10 金币
下载 相关 举报
计算器设计.docx_第1页
第1页 / 共14页
计算器设计.docx_第2页
第2页 / 共14页


点击查看更多>>
资源描述
基于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,设置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.所有按钮事件处理已经完成,编译运行:
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 应用文书 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服