版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、简单计算器一、基本功能描述 二进制、八进制、十进制及十六进制数的加、减、乘、除、乘方、取模等简单计算科学计算函数,包括( 反 ) 正弦、 ( 反 ) 余弦、 ( 反 ) 正切、 ( 反 ) 余切、开方、指数等函数运行以角度、弧度两种方式实现上述部分函数具备历史计算的记忆功能对不正确的表达式能指出其错误原因二、 流程图输入数据子函数编辑框关联变量 m_num =0键入一个数是否为正数?NYm_numm_num=10*m_num+i=10*m_num-i是否为小数?Y还原 m_numN根据小数点后位数将键入的数除以 n 次 10 累加到 m_numY继续键入数字?N用 UpdateData(FAL
2、SE) 刷新显示图 1 输入数据子函数流程图图 2三、 设计步骤打开Microsoft Visual C+, 在文件中点击新建,在弹出框内选择MFC AppWizardexe工程,输入工程名Calculter及其所在位置,点击确定,如图3 所示。图 3 新建 MFC AppWizardexe 工程将弹出 MFC AppWizard-step 1对话框,选择基本对话框,点击完成,如图4 所示。图 4 基本对话框这样, MFC AppWizard就建立了一个基于对话窗口的程序框架,如图5 所示。图 5 新建的对话框四、 界面设计1、创建控件在图 5 所示的Resoure View 选项卡中打开Di
3、alog 资源组,双击IDD_CALCULATOR_DIALOG,在右边的窗口中显示出待编辑的对话框。开始摆放控件,包括编辑框和按钮的创建。按钮的创建以 “1”为例进行介绍,其他按钮的创建可参照此进行操作。1)在图 5 中 Controls 的 “编辑框 ”按钮上单击鼠标左键,在对话框编辑窗口上合适的位置按下鼠标左键并拖动鼠标画出一个大小合适的编辑框。在编辑框上单击鼠标右键,在弹出的快捷莱单中选择属性选项,此时弹出Edit 属性对话框,如图6 所示,在该对话框中输入ID 属性。图 6 Edit 属性对话框2)在图 3 中 Controls 的 “ Button按”钮上单击鼠标左键,在对话框上的
4、合适的位置上按下鼠标左键并拖动鼠标画出一个大小合适的下压式按钮。在按钮上单击鼠标右键,在弹出的快捷菜单中选择属性选项,此时也弹出Push Button 属性对话框,如图7 所示,在该对话框中输入控件的ID 值和标题属性。图 7 Push Button 属性按照上面的操作过程编辑其他按钮和编辑框等对象的属性。表 1 各按钮和编辑框等对象的属性对象ID标题或说明编辑框IDC_DC_EDIT_INPUT结果显示按钮IDC_BUTTON11按钮IDC_BUTTON22按钮IDC_BUTTON33按钮IDC_BUTTON44按钮IDC_BUTTON55按钮IDC_BUTTON66按钮IDC_BUTTON
5、77按钮IDC_BUTTON88按钮IDC_BUTTON99按钮IDC_BUTTON100按钮IDC_BUTTON11.按钮IDC_BUTTON12空格按钮IDC_BUTTON23-按钮IDC_BUTTON26*按钮IDC_BUTTON27/按钮IDC_BUTTON38sqrt按钮IDC_BUTTON30%按钮IDC_BUTTON25按钮IDC_BUTTON31sin按钮IDC_BUTTON32cos按钮IDC_BUTTON33tan按钮IDC_BUTTON34cot按钮IDC_BUTTON40sin1按钮IDC_BUTTON41cos1按钮IDC_BUTTON35log按钮IDC_BUTTO
6、N36ln按钮IDC_BUTTON14a按钮IDC_BUTTON15b按钮IDC_BUTTON16c按钮IDC_BUTTON17d按钮IDC_BUTTON18e按钮IDC_BUTTON19f按钮IDC_BUTTON13退格按钮IDC_BUTTON37e按钮IDC_BUTTON22清空按钮IDOK计算按钮IDC_RADIO_DEGREE角度按钮IDC_RADIO_RADIAN弧度按钮IDC_STATIC计算结果按钮IDC_BTN_HISTREXP历史表达式按钮IDCANCEL退出按钮IDC_BTN_CONVERT进制完成后界面如图8 所示。图 8 计算器界面五、计算器源程序代码;else if(
7、decimal>16)for(int i=();i<decimal;i+) str+="0"str+=".0"elsefor(int i=0;i<-decimal;i+)(0,".");(0,"0");if(sign=1) (0,"-");return str;double CCalculation:StoN(CString str)char*stopstring;double x;x = strtod( (0), &stopstring );m_strTmp=stop
8、string;return x;CString CCalculation:TwoE(CString strExp)double x2,y,x1=StoN(strExp);strExp=m_strTmp;char op=(0);(0);x2=StoN(strExp);if(m_strTmp!="") return "ERROR_"+m_strTmp+" 未知符号 _" if(op='+') y=x1+x2;else if(op='*') y=x1*x2;else if(op='-') y=
9、x1-x2;else if(op='') y=pow(x1,x2);else if(op='/') y=x1/x2;else if(op='%') y=fmod(x1,x2);else return "ERROR_"+m_strTmp+"未知运算符 _"return NtoS(y);CString CCalculation:SingleE(CString op,double dx)if(op="ln")return NtoS(log(dx);else if(op="log&qu
10、ot;)return NtoS(log10(dx);else if(op="sqr")return NtoS(sqrt(dx);else if(op="e")return NtoS(exp(dx);else if(op="abs")return NtoS(fabs(dx);else if(op="ac")return NtoS(acos(dx);else if(op="as")return NtoS(asin(dx);else if(op="at")return NtoS(a
11、tan(dx);if(m_bDegree) dx=dx*PI/180;if(op="tan")return NtoS(tan(dx);else if(op="sin")return NtoS(sin(dx);else if(op="cos")return NtoS(cos(dx);else if(op="cot")return NtoS(1/tan(dx);else if(op="sh")return NtoS(sinh(dx);else if(op="ch")return
12、NtoS(cosh(dx);else if(op="th")return NtoS(sinh(dx)/cosh(dx);else if(op="exp")return NtoS(pow(10,dx);return "ERROR"+op+"_未知函数 _"int CCalculation:LocateLBra(CString strExp)int len=();int pos=-1;for(int i=0;i<len;i+)if(pos>=0 && (i)=')') bre
13、ak;if(i)='(')pos=i;return pos;void CCalculation:DelBracket(CString *strExp)int pos=LocateLBra(*strExp);int i,len=strExp->GetLength();if(pos=-1) *strExp="ERROR_无效表达式_"return;for(i=pos;i<len;i+) if(strExp->GetAt(i)=')') break;CString str;str=strExp->Mid(pos+1,i-po
14、s-1);MultiE(&str);strExp->Delete(pos,i-pos+1);strExp->Insert(pos,str);void CCalculation:MultiE(CString *strExp)if(strExp->IsEmpty() *strExp="ERROR_函数表达式为空_"if(IsDigital(*strExp) return;while(1)/* 处理所有的一元运算*/for(int i=0;i<FUNCNUM;i+)int pos=strExp->Find(opti);if(pos!=-1)C
15、String str=strExp->Right(strExp->GetLength()-pos-opti.GetLength(); double dx=StoN(str);if(m_strTmp=str) *strExp="ERROR"+str+"_ 无法识别的函数 _"return; strExp->Delete(pos,strExp->GetLength()-pos); *strExp+=SingleE(opti,dx)+m_strTmp;MinusMinus(strExp);if(pos>=1)char ch=str
16、Exp->GetAt(pos-1);if(ch>=48 && ch<=57)*strExp="ERROR_缺少二元运算符_"return;break;if(i=FUNCNUM) break;ind('-');if(tmpos=-1) break;else pos+=tmpos;if(pos=0 && strExp->GetAt(pos+1)='-' | pos>0)if(strExp->GetAt(pos+1)='+')strExp->Delete(po
17、s+1);pos=0;continue;/*处理连减(如:-1 )的情况*/int nCount=0;while(1)if(+pos>0)if(strExp->GetAt(pos)!='-') break;else nCount+;else break;if(nCount>0)strExp->Delete(pos-nCount-1,nCount+1);if(nCount%2=0) strExp->Insert(pos-nCount-1,"-");else if(pos-nCount-1>0) strExp->Inse
18、rt(pos-nCount-1,"+");pos=0;continue;else pos-;/*/if(pos>0 && strExp->GetAt(pos-1)='+')pos+;continue;Calcu(strExp,pos);else pos+;pos=0;while(1)pos=strExp->Find('+');ind('+');if(pos=-1) break;etLength();strExp->Insert(pos,m_strConValuei);if(pos>
19、=1)char ch=strExp->GetAt(pos-1);if(ch>=48 && ch<=57 | ch=41)*strExp="缺少二元运算符"return;pos=strExp->Find(m_strConNamei);CString CCalculation:ModiResult(CString strRes)if("#IN")!=-1) return "/*结果有溢出或值域越界"去掉保护括号*/if(0)='(') (0);if()-1)=')')
20、 ()-1);/*/int pos=(".");CString str=""if(pos!=-1)if(pos=0) strRes="0"+strRes;else if(0)='-' && (1)='.') (1,"0");if(pos>16)(pos);(1,".");("%d",pos-1);str=" E"+str;pos=(".");if(pos=0 | pos=1 &
21、;& (0)='0')for(int i=pos+1;i<();i+)if(i)!='0') break;if(i>4)(" E-%d",i-2);(pos,i-1);(1,".");strRes=(pos+16)+str;if(pos!=-1)strDF=()-pos-1);(pos,()-pos);();len=();for(i=0;i<len;i+)ch=(i);dx+=(ch-48)*pow(8,i);len=();for(i=0;i<len;i+)ch=(i);dx+=(ch-48
22、)*pow(8,-i-1);strTmp=NtoS(dx);strExp->Insert(index+1,strTmp);pos=strExp->Find("xo");void CCalculation:Hex2Dec(CString *strExp)int len,i,index,pos=strExp->Find("xh");CString strTmp,strDF;char ch;double dx;while(pos!=-1)dx=0;strTmp=""strDF=""strExp->
23、Delete(pos,2);for(i=pos-1;i>=0;i-)ch=strExp->GetAt(i);if(ch>=48 && ch<=57 | ch>=97 && ch<=102 |ch=46)(0,strExp->Mid(i,1);strExp->Delete(i);else break;if(i=pos-1) *strExp="ERROR_缺少二元运算符_"return;index=i;pos=0;for(i=0;i<();i+)if(i)='.') pos+;
24、if(pos>1) *strExp="ERROR_缺少二元运算符_"return;pos=(".");if(pos!=-1)strDF=()-pos-1);(pos,()-pos);();len=();for(i=0;i<len;i+)ch=(i);if(ch>=48 && ch<=57);if(pos!=-1)strDF=()-pos-1);(pos,()-pos);();len=();for(i=0;i<len;i+)ch=(i);dx+=(ch-48)*pow(2,i);len=();for(i=0;i
25、<len;i+)ch=(i);dx+=(ch-48)*pow(2,-i-1);strTmp=NtoS(dx);strExp->Insert(index+1,strTmp);pos=strExp->Find("xb");void CCalculation:Dec2Hex(CString *strExp/*strExp须为数字 */)bool bMinus=0;if(strExp->GetAt(0)='-')bMinus=1;strExp->Delete(0);int pos=strExp->Find('.')
26、;CString str,strDec;int nDecInt;double dDec;if(pos!=-1)strDec=strExp->Left(pos);nDecInt=atoi(0);strDec=strExp->Right(strExp->GetLength()-pos);elsenDecInt=atoi(strExp->GetBuffer(0);strExp->Empty();while(nDecInt!=0)int nTmp=nDecInt%16;if(nTmp=10) str="a"else if(nTmp=11) str=&q
27、uot;b"else if(nTmp=12) str="c"else if(nTmp=13) str="d"else if(nTmp=14) str="e"else if(nTmp=15) str="f"else ("%d",nTmp);nDecInt/=16;strExp->Insert(0,str);*strExp+="."if(pos!=-1)dDec=StoN(strDec);int nCount=0;while(dDec!=0)dDec*=16;in
28、t nTmp=dDec;if(nTmp=10) str="a"else if(nTmp=11) str="b"else if(nTmp=12) str="c"else if(nTmp=13) str="d"else if(nTmp=14) str="e"else if(nTmp=15) str="f"else ("%d",nTmp);*strExp+=(pos);dDec-=nTmp;if(+nCount=17) break;if(bMinus) strE
29、xp->Insert(0,"-");if(strExp->Find("-1")!=-1 && bMinus!=1) *strExp="太大无法表示"void CCalculation:Dec2Oct(CString *strExp)bool bMinus=0;if(strExp->GetAt(0)='-')bMinus=1;strExp->Delete(0);int pos=strExp->Find('.');CString str,strDec;int n
30、DecInt;double dDec;if(pos!=-1)strDec=strExp->Left(pos);nDecInt=atoi(0);strDec=strExp->Right(strExp->GetLength()-pos);elsenDecInt=atoi(strExp->GetBuffer(0);strExp->Empty();while(nDecInt!=0)int nTmp=nDecInt%8;("%d",nTmp);nDecInt/=8;strExp->Insert(0,str);*strExp+="."if(pos!=-1)dDec=StoN(strDec);int n
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 在建门面定金合同范本
- 地产中介佣金合同范本
- 土方施工安全合同范本
- 外卖骑手借款合同范本
- 外贸家具英文合同范本
- 土地农业承包合同范本
- 坚果传媒公司合同范本
- 塔吊电梯租赁合同范本
- 土地无效合同解除协议
- 器材中介服务合同范本
- 2024年太原武宿机场航空产业集团招聘笔试冲刺题(带答案解析)
- 新疆维吾尔自治区普通高校学生转学申请(备案)表
- 乡卫生院影像检查资格授权申请表
- 严重精神障碍患者家属护理教育
- 口腔龋病课件
- 颞下颌关节疾病的生物力学分析
- 《新能源汽车动力电池及管理系统检修》 课件 7-2 了解废旧动力电池的回收、拆解与相关政策(制作中)
- 健身器材采购项目投标方案(技术方案)
- 烯湾科城(广州)新材料有限公司扩产增效技术改造项目环境影响报告表
- 关于推动党建引领经济高质量发展的调研报告
- 间歇性跛行的鉴别诊疗培训课件
评论
0/150
提交评论