版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、简单计算器一、基本功能描述 二进制、八进制、十进制及十六进制数的加、减、乘、除、乘方、取模等简单计 算科学计算函数,包括 (反)正弦、 (反)余弦、(反)正切、 (反)余切、开方、指数等函数运行以角度、弧度两种方式实现上述部分函数具备历史计算的记忆功能对不正确的表达式能指出其错误原因流程图输入数据子函数图1输入数据子函数流程图二、设计步骤打开Microsoft Visual C+ ,在文件中点击新建,在弹出框内选择MFC AppWizardexe工程,输入工程名 Calculter 及其所在位置,点击确定,如图 3 所示。文养 re 工花区 其它文档QATL COM AppWizard Clu
2、ster Resource Type Wizard 1 Custom A叩Wizard Uatabsc Project DcvStudio Add-in Wizard g txtended Stored Froc Wizard ftlSAPI Extension Wizard tlMakelile ii»MFC ActiveX ConlrolWizard工程君琛:Calculator童童(g:D:VCCalculatorsan岖補即丛蜩Ncw Database WizardiWizard exeH Utility Project21 Win32 Application1 Win32
3、Console Application 国 Win32 DynamioLink Library % Win32 Static Library矗创建新的工件空间IS广摩加到当前工作空间凶 厂从展干(DJ:I3平台回1< Win32石JE图 3 新建 MFC AppWizardexe工程将弹出MFC AppWizard-step 1对话框,选择基本对话框,点击完成,如图4所示。图4基本对话框5所示。这样,MFC AppWizard就建立了一个基于对话窗口的程序框架,如图图5新建的对话框四、界面设计1、创建控件在图5所示的 Resoure View 选项卡中打开 Dialog资源组,双击IDD
4、_CALCULATOR_DIALOG 在右边的窗口中显示出待编辑的对话框。开始摆放控件,包括编辑框和按钮的创建。按钮的创建 以“ 1”例进行介绍,其他按钮的创建可参照此进行操作。1)在图5中Controls的 编辑框"按钮上单击鼠标左键,在对话框编辑窗口上合适的位置按下鼠标 左键并拖动鼠标画出一个大小合适的编辑框。在编辑框上单击鼠标右键,在弹出的快捷莱单中选 择属性选项,此时弹出 Edit属性对话框,如图 6所示,在该对话框中输入ID属性。图6 Edit属性对话框2)在图3中Controls的“ Button按钮上单击鼠标左键,在对话框上的合适的位置上按下鼠标左键并拖动鼠标画出一个大
5、小合适的下压式按钮。在按钮上单击鼠标右键,在弹出的快捷菜单中选择属性选项,此时也弹出Push Butt on属性对话框,如图 7所示,在该对话框中输入控件的ID值和标题属性。Pusti button 詹性IT占骨常规样式扩展样式|JD: |IDC_BUTT0N1T标题;11断可见圖厂组圈厂帮助ID(IJ厂己禁用回*制表站回图 7 Push Button 属性按照上面的操作过程编辑其他按钮和编辑框等对象的属性。表1各按钮和编辑框等对象的属性对象ID标题或说明编辑框IDC DC EDIT INPUT结果显示按钮IDC BUTTON11按钮IDC BUTTON22按钮IDC BUTTON313按钮I
6、DC BUTTON44按钮IDC BUTTON55按钮IDC BUTTON66按钮IDC BUTTON77按钮IDC BUTTON88按钮IDC BUTTON99按钮IDC BUTTON100按钮IDC BUTTON11按钮IDC BUTTON12空格按钮IDC BUTTON23-按钮IDC BUTTON26*按钮IDC BUTTON27/按钮IDC BUTTON38:sqrt按钮IDC BUTTON30%按钮IDC BUTTON25A按钮IDC BUTTON31sin按钮IDC BUTTON32cos按钮IDC BUTTON33tan按钮IDC BUTTON34cot按钮IDC BUTTON
7、40sin1按钮IDC BUTTON41cos1按钮IDC_BUTTON35log按钮IDC BUTTON36In按钮IDC BUTTON14a按钮IDC BUTTON15b按钮IDC BUTTON16c按钮IDC BUTTON17d按钮IDC BUTTON18e按钮IDC BUTTON19f按钮IDC BUTTON13退格按钮IDC BUTTON37eA按钮IDC BUTTON22清空按钮IDOK计算按钮IDC RADIO DEGREE角度按钮IDC RADIO RADIAN弧度按钮IDC STATIC计算结果按钮IDC BTN HISTREXP历史表达式按钮IDCANCEL退出按钮IDC
8、BTN CONVERT进制图8计算器界面完成后界面如图8所示五、计算器源程序代码10A8)"m_strCo nN ame8="LS"m_strCo nV alue9="*10A(-12)"m_strCo nN ame9="DC"m_strConValue10="" m_strConName10="E"CCalculation:CCalculation()bool CCalculation:IsDigital(CString str)while(0)='-') (0);f
9、or(int i=0;i<FUNCNUM;i+) if(opti)!=-1) return 0; for(i=0;i<6;i+) if(opt2i)!=-1) return 0;return 1;CString CCalculation:NtoS(double d)int decimal, sign;char *buffer;buffer = _ecvt( d, 16, &decimal, &sign );CString str=buffer;if(decimal>=0 && decimal<=16) (decimal,".&q
10、uot;);else if(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
11、 );m_strTmp=stopstring;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='-
12、9;) y=x1-x2;else if(op='A') 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&q
13、uot;)return NtoS(log10(dx);else if(op="sqr")return NtoS(sqrt(dx);else if(op="eA")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
14、(atan(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")retur
15、n 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)=')')
16、break;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
17、,i-pos-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(p
18、os!=-1)CString 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
19、ch=strExp->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-
20、>Delete(pos+1); pos=0; continue;/* 处理连减(如: int nCount=0;1 )的情况 */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
21、>0) strExp->Insert(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
22、_strConValuei); if(pos>=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)='(
23、') (0);if()-1)=')') ()-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=("
24、;.");if(pos=0 | pos=1 && (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
25、(i=0;i<len;i+)ch=(i); dx+=(ch-48)*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="
26、;"strDF=""strExp->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
27、(i=0;i<();i+)if(i)='.') pos+;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+)
28、ch=(i);dx+=(ch-48)*pow(2,i); len=(); for(i=0;i<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; st
29、rExp->Delete(0);int pos=strExp->Find('.');CString str,strDec;int nDecInt; double dDec;if(pos!=-1) strDec=strExp->Left(pos); nDecInt=atoi(0); strDec=strExp->Right(strExp->GetLength()-pos);else nDecInt=atoi(strExp->GetBuffer(0); strExp->Empty();while(nDecInt!=0)int nTmp=nD
30、ecInt%16; 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); nDecInt/=16; strExp->Insert(0,str);*strExp+=".&quo
31、t; if(pos!=-1) dDec=StoN(strDec);int nCount=0; while(dDec!=0) dDec*=16; int 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 (&q
32、uot;%d",nTmp); *strExp+=(pos); dDec-=nTmp; if(+nCount=17) break;太大无法表示if(bMinus) strExp->Insert(0,"-"); if(strExp->Find("-1")!=-1 && bMinus!=1) *strExp=" void CCalculation:Dec2Oct(CString *strExp)bool bMinus=0;if(strExp->GetAt(0)='-')bMinus=1;st
33、rExp->Delete(0);int pos=strExp->Find('.');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%8;("%d",nTmp);nDecInt/=8;strExp->Insert(0,str);*strExp+="."if(pos!=-1)dDec=StoN(strDec);int nCount=0;while(dDec!=0)dDec*=8;int nTmp=dDec;(&quo
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 印染洗涤工班组安全竞赛考核试卷含答案
- 纹版复制工操作管理考核试卷含答案
- 印染助剂生产工安全生产能力知识考核试卷含答案
- 民族弹拨乐器制作工创新意识竞赛考核试卷含答案
- 丁基橡胶装置操作工基础常识强化考核试卷含答案
- 发电集控值班员道德考核试卷含答案
- 固体矿产钻探工达标水平考核试卷含答案
- 铁合金原料工创新思维强化考核试卷含答案
- 高炉上料工岗位环保竞赛考核试卷含答案
- 煤直接液化操作工班组建设评优考核试卷含答案
- 2026年产前筛查和产前诊断试题
- 2026年高邮市消防系统事业单位公开招聘工作人员3人笔试备考题库及答案解析
- 2025年河南省检察官逐级遴选笔试题目及答案
- 《勤洗生活衣物》教学设计-2026-2027学年滇教版初中劳动技术七年级上册
- 注册消防工程师继续教育2025年部分题目与答案(126题)
- 2026年江苏省徐州市中考英语真题(含答案)
- 2026年东阳市城管辅助人员招聘真题(附答案)
- 肉联厂屠宰人员安全防护手册
- 2026年度湖北省部分工程高、中级职称水平能力测试(轻工)复习题及答案
- AQ3035-2010危险化学品重大危险源安全监控技术规范关键条款解读
- T∕CHCIA 013-2023 液体香氛规范
评论
0/150
提交评论