版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C++程序设计课程设计报告题目:用C++编写计算器程序学生姓名:学号:院(系):专业:2023年9月9日
用C++编写计算器程序搞要本课程设计是在基于对话框的应用程序中模拟一个计算器,本计算器可以进行十进制下的四则运算(加、减、乘、除)和四则混合运算,可以把十进制转化为二进制或十六进制,可以进行一些常用的函数运算(比如sin、cos、tan、cot、sqrt、ln等),还可以支持带“(”,“)”符号的表达式的计算。系统开发平台为WindowsXP,程序设计设计语言采用VisualC++6.0,程序运营平台为Windows98/2023/XP。程序通过调试运营,初步实现了设计目的。关键词程序设计;计算器;C++;1引言在现代社会中,计算器已经进入了每一个家庭,人们在生活和学习中经常需要使用到计算器,它的出现大大减少了人们在计算方面的工作量,可以说它在人们生活和学习中是不可缺少的。C++介绍C++语言的重要特点表现在两个方面,一是全面兼容C语言,二是支持面向对象的程序设计方法[1]。(1)C++是一个更好的C,它保持了C语言的优点,大多数的C程序代码略作修改或不作修改就可在C++的集成环境下调试和运营。这对于继承和开发当前已在广泛的软件是非常重要的,可以节省大量的人力和物力。(2)C++是一种面向对象的程序设计语言它使得程序的各个模块的独立性更强,程序的可读性和可移植性更强,程序代码的结构更加合理,程序的扩充性更强。这对于设计、编制和调试一些大型的软件尤为重要。(3)C++集成环境不仅支持C++程序的编译和调试,并且也支持C程序的编译和调试。通常,C++程序环境 约定:当源程序文献的扩展名为c.时,则为C程序;而当源程序文献的扩展名为cpp.时,则为C++程序。(4)C++语句非常简练,对语法限制比较宽松,因此C++语法非常灵活。其优点是给用户编程带来书写上的方便。其缺陷是由于编译时对语法限制比较宽松,许多逻辑上的错误不容易发现,给用户编程增长了难度。1.2计算器的介绍(1)在运营程序后,系统会弹出一个基于对话框的计算器界面,如下图所示:图1.1计算器界面(2)在计算器程序中,重要通过一个编辑框来获取表达式和显示计算结果,表达式可以通过键盘和单击按钮2种方式输入,输入后的结果如下图所示:图1.2输入表达式后的界面(3)在输入完表达式后,单击“=”后,开始对表达式进行计算,计算完毕后,在编辑框中显示计算的结果。图1.3计算后的结果(4)计算器可以实现十进制转化为十六进制或二进制,其实现的操作为先输入一个十进制整数,再单击按钮“转化为二进制”或“转化为十六进制。图1.4输入一个十进制数100图1.5100转化为二进制后的结果图1.6100转化为十六进制后的结果(4)此外,计算器还可以实现一些简朴的函数运算,实现的操作和十六进制/二进制转化类似,是先输入一个数字,在单击想要进行的函数的按钮,单击后就会在编辑框中显示运算的结果。算法的实现2.1把字符串转化为数字和运算符的算法(1)假如字符串中只有数字。这个情况用来实现一些简朴函数的运算。在进行简朴函数的运算时,都是先输入一个数字,再单击要进行运算的按钮,然后编辑框显示运算的结果。程序用了一个函数doubleGetaStr(CStringstr)来实现这个功能,该函数以编辑框变量m_strResult为实参,再得到m_strResult的值后,调用GetAt函数,一个字符一个字符的读取,假如碰到整数,执行“itemp=itemp*rate+(str.GetAt(i)-'0');”,其中变量itemp初始值为0,变量rate初始值为10,假如碰到了小数点,改变rate的值,使其等于0.1,再向后继续读取,再碰到整数时执行“itemp=itemp+rate*(str.GetAt(i)-'0');rate=rate/10;”,函数的最后拟定返回值为itemp。以下是这个函数的代码[2]:doubleCMyDlg::GetaStr(CStringstr){ inti=0; doublerate=10.0,itemp=0.0; for(;i<str.GetLength();i++) { if(isdigit(str.GetAt(i)))//假如字符串str.GetAt(i)的内容是整数 { if(rate==10.0) //整数部分 itemp=itemp*rate+(str.GetAt(i)-'0');//获得整数 else//小数部分 { itemp=itemp+rate*(str.GetAt(i)-'0');//获得小数 rate=rate/10;//每次让rate小10倍 } } elseif(str.GetAt(i)=='.')//假如str.GetAt(i)是小数点 rate=0.1;//让rate=0.1,开始计算小数部分 } return(itemp);}(2)假如字符串中有运算符和数字,但是没有括号。程序调用函数voidGetStr(CStringstr),这个函数的前半部分和函数voidGetaStr(CStringstr)同样,都是获取数字的算法,但是由于表达式中也许有多个数字和运算符,所以我们需要定义2个数组,分别用来存放数字和运算符,当读取字符碰到运算符时,把变量itemp的值保存在数组a中,并把0赋给itemp,把10赋给rate,把运算符保存在数组b中。当不在碰到运算符号时,把最后一个整数itemp的值数组a中,把z的值赋给s。(z的值表达运算符加数字一个有多少个,把这个值赋给s,可以在以后的计算中,控制循环的条件,避免导致不必要的误差。)这个函数的代码如下:voidCMyDlg::GetStr(CStringstr){ inti=0,z=0; doublerate=10.0,itemp=0.0; for(i=0;i<20;i++)a[i]=1000000.0;//对数组a[20]初始化 for(i=0;i<10;i++)b[i]='';//对数组b[10]初始化 i=0;//把0赋给i for(;i<str.GetLength();i++) { if(isdigit(str.GetAt(i)))//假如字符串str.GetAt(i)的内容是整数 { if(rate==10.0) //整数部分 itemp=itemp*rate+(str.GetAt(i)-'0');//获得整数 else//小数部分 { itemp=itemp+rate*(str.GetAt(i)-'0');//获得小数 rate=rate/10;//每次让rate小10倍 } } elseif(str.GetAt(i)=='.')//假如str.GetAt(i)是小数点 rate=0.1;//让rate=0.1,开始计算小数部分 elseif(str.GetAt(i)=='+')//假如str.GetAt(i)是加号{ a[z]=itemp;itemp=0;//把itemp的值放入双精度数组a中,并把itemp的值改为0 z++;//让z自加一次 b[z]='+';//把加号放入字符数组b中 z++;//让z自加一次 rate=10.0;//把10赋给rate,保证读取下个数字时,先计算整数部分 } elseif(str.GetAt(i)=='-')//假如str.GetAt(i)是减号{ a[z]=itemp;itemp=0;//把itemp的值放入双精度数组a中,并把itemp的值改为0 z++;//让z自加一次 b[z]='-';//把减号放入字符数组b中 z++;//让z自加一次 rate=10.0; //把10赋给rate,保证读取下个数字时,先计算整数部分 } elseif(str.GetAt(i)=='*')//假如str.GetAt(i)是乘号{ a[z]=itemp;itemp=0;//把itemp的值放入双精度数组a中,并把itemp的值改为0 z++;//让z自加一次 b[z]='*';//把减号放入字符数组b中 z++;//让z自加一次 rate=10.0;//把10赋给rate,保证读取下个数字时,先计算整数部分 } elseif(str.GetAt(i)=='/')//假如str.GetAt(i)是除号{ a[z]=itemp;itemp=0;//把itemp的值放入双精度数组a中,并把itemp的值改为0 z++;//让z自加一次 b[z]='/';//把除号放入字符数组b中 z++;//让z自加一次 rate=10.0;//把10赋给rate,保证读取下个数字时,先计算整数部分 } } a[z]=itemp;//把最后一个整数itemp的值放入双精度数组a中s=z;//把z的值赋给变量s,用来控制计算结果的循环中的条件}(3)假如字符串中有括号。程序用函数voidBracket(CStringstr0)来解决括号问题,同样,函数以编辑框变量m_strResult为实参,重要思想是把m_strResult先提成3个字符串,比如一个表达式2*(2+3)-6,这个函数的目的是先把表达式2*(2+3)-6提成2*、2+3、-6三个字符串,再计算2+3后,把结果覆盖掉2+3所在的字符串,最后把3个字符串相加,这样就解决掉了括号的问题。具体实现的算法:定义3个字符串变量str1、str2、str3,这三个变量都初始化为空变量,现在开始一个循环,当没有碰到字符“(”时,把每次得到的字符都加在字符串str1上,当碰到字符“(”时,把“(”后的字符都加在字符串str2上,直到碰到字符“)”。当碰到字符“)”时,把“)”后的字符都加在字符串str3上,str2再调用函数计算出它的表达式的值,最后把3个字符串相加,这就解决了括号问题。该函数代码如下:voidCMyDlg::Bracket(CStringstr0){ CStringstr1="",str2="",str3=""; inti=0; for(;i<str0.GetLength();i++) {if(str0.GetAt(i)=='(')//假如碰到了左括号 { i++;//i自加一次,用来跳过左括号 for(;i<str0.GetLength();i++) { if(str0.GetAt(i)==')')break;//假如碰到右括号,跳出循环 str2+=str0.GetAt(i);//把括号内的表达式赋给str2 } i++;//i自加一次,用来跳过右括号 for(;i<str0.GetLength();i++) { str3+=str0.GetAt(i);//把括号后边的表达式赋给str3 } } else str1+=str0.GetAt(i);//把括号前边的表达式赋给str3 }GetStr(str2);//调用GetStr(str2)函数,把str2里的数字和运算符保存在数组中GetResult();//计算出表达式str2的值 for(i=0;i<str0.GetLength();i++) if(str0.GetAt(i)=='(')//假如m_strResult中有括号 str2.Format("%1f",a[0]);//把a[0]转化为字符串赋给str2 m_strResult=str1+str2+str3;//把str1,str2,str3的值加起来赋给m_strResult}2.2计算出结果的算法在把表达式中的数字和运算符分别保存在数组后,接下来我们就要进行表达式的计算了,表达式的计算一方面要考虑优先级的问题,这里先把所有的除法转化为乘法,再把除法后的数字取它的倒数,接下来就是进行乘法计算,每次乘法计算后都把计算的结果保存在计算的2个数中的前面的那个数上,并把乘号和后面的数字删除。进行完乘法运算后,进行一次循环,重新整理下数组,最后进行加法和减法运算。函数代码如下:voidCMyDlg::GetResult(){ inti=0,x=0,y=1,t,z=1;//这个循环的目的是把所有除法运算都改为乘法计算 for(i=0;i<=s;i++) { if(b[i]=='/')//当循环碰到除号时 { a[i+1]=1/a[i+1];//把a[i+1]的值改为1/a[i+1] b[i]='*'; //把b[i]的值改为乘号 } }//这个循环可以对所有乘法进行计算 for(i=0;i<=s;i++) { if(b[i]=='*')//当循环碰到乘号时 {//假如i-t==2(再上次循环中,t被赋值成了i,这次2个值只相差2,说明表达式的情况是连续乘法,比如2*3*4)以2*3*4为例,在这个条件之前,函数已经进行了2*3的运算,其计算结果保存在本来的2中,把2的值覆盖了,这个条件的作用是让2*3的结果再和4相乘,结果保存在本来的2中 if(i-t==2) { a[t-z]=a[t-z]*a[i+1];//进行乘法运算,把结果保存在前面的数组元素中 z=z+2;//这里引进变量z,可以解决很多数连续相乘的问题,比如2*2*2*2*2*2 } a[i-1]=a[i-1]*a[i+1];//碰到乘号后把乘号前后2个数字相乘,结果保存在前面的数组元素 a[i+1]=1000000.0;//对乘号后面的数字初始化为0.0 b[i]='';//对乘号初始化为空格//2数相乘后把乘号及其后面的数字初始化了,假如是2*3*4的情况,将会无法计算*4,所以要用开始的条件语句来解决 t=i;//把i的值赋给t } }//这个循环的目的是对数组a和b进行整理,由于已经进行了乘法和除法运算,进行运算的时候,把一些数字和运算符初始化了这个函数的作用可以使中间一些初始化了的数字和符号被后面的数字和符号代替,让数组可以重新排列 for(i=0;i<=s;i++) { if(a[i]!=1000000.0)//假如a[i]的值不为0.0 { a[x]=a[i];//把a[i]的值赋给a[x] x+=2;//x自加2 } if(b[i]!='')//假如b[i]的值不为空格 { b[y]=b[i];//把b[i]的值赋给b[y] y=y+2;//y自加2 } }//这个循环是进行最后的加减法运算 for(i=0;i<=y-2;i++)//这里i的上限小于等于y-2,可以保证不进行多余的运算 { if(b[i]=='+')//假如b[i]等于加号 a[0]=a[0]+a[i+1];//把加号后的数字和a[0]相加,结果保存在a[0]中 elseif(b[i]=='-')//假如b[i]等于减号 a[0]=a[0]-a[i+1];//把减号后的数字和a[0]相减,结果保存在a[0]中 } }2.3转化为十六进制和二进制的算法(1)转化为二进制的算法。将数值除以2并记录余数,只要商不为0,继续将最新的商除以2并记录余数,当商为0以后,此数的二进制便可以由记录下来的余数得到[3]。以下是函数的代码:voidCMyDlg::On2(){intm,n[20];CStringstr;UpdateData(TRUE);//把编辑框显示的字符串传给相应的变量m_strResultm=(int)GetaStr(m_strResult);//调用GetaStr(m_strResult),用来获取m_strResult中的数字m_strResult="";//对m_strResult的值初始化for(inti=0;i<=20;i++){n[i]=m%2;//把m除2的余数保存在n[i]中m=m/2;//把m/2的值赋给mif(m==0)break;//当m为0时,退出循环}for(;i>=0;i--){str.Format("%d",n[i]);//用Format函数把n[i]的值转化为字符串m_strResult+=str;//把str的值加在m_strResult上}OperatorPressed=true;//把bool变量OperatorPressed的值改为trueUpdateData(FALSE);//把字符串变量m_strResult传给编辑框}(2)转化为十六进制的算法。假如要转化的数字大于16,则把这个数字除以16并记录余数,继续将最新的商除以16并记录余数,当商为0以后,把大于9的数字转化为字母记录,这样得到的字符串就是十六进制数了。函数代码如下;voidCMyDlg::On16(){ intm;UpdateData(TRUE);//把编辑框显示的字符串传给相应的变量m_strResultm=(int)GetaStr(m_strResult);//调用GetaStr(m_strResult),用来获取m_strResult中的数字f(m);//调用f(m)函数,把十进制转化为十六进制m_strResult=str7;//把str7的值赋给m_strResultstr7="";//把str7初始化OperatorPressed=true;//把bool变量OperatorPressed的值改为trueUpdateData(FALSE);//把字符串变量m_strResult传给编辑框}voidCMyDlg::f(intn){CStringstr1;intx;if((n/16)!=0)//假如n大于等于16f(n/16);//把n除以16,进行递归调用x=n%16;//把n除以16的余数赋给xif(x>=0&&x<=9){//假如x在0到9之间str1.Format("%d",x);//用Format函数把x的值转化为字符串str7+=str1;}//把str1加在str3上elsestr7+=char(x+55);//把x的值加55(运用ASCII码)再转化为字符型加在str3上}3参考文献[1]谭浩强.C++程序设计.清华大学出版社2023.[2]郑阿奇.VisualC++教程.机械工业出版社2023[3]J.GleenBrookshear.计算机科学概论.人民邮电出版社2023.4程序代码voidCMyDlg::OnNo0(){ UpdateData(TRUE);//把编辑框显示的字符串传给相应的变量m_strResult if(OperatorPressed==true||Restarted==true)//在按下了"=","AC","sqrt","tan","sin"等按忸时, m_strResult="0";//变量m_strResult的值为按下的按忸"0" else//在按下数字键的情况下,则在m_strResult后加"0" m_strResult+="0"; OperatorPressed=false;//把bool变量OperatorPressed和Restarted的值改为false Restarted=false; UpdateData(FALSE);//把字符串变量m_strResult传给编辑框}voidCMyDlg::OnNo1(){ UpdateData(TRUE);//把编辑框显示的字符串传给相应的变量m_strResult if(OperatorPressed==true||Restarted==true)//在按下了"=","AC","sqrt","tan","sin"等按忸时, m_strResult="1";//变量m_strResult的值为按下的按忸"1" else//在按下数字键的情况下,则在m_strResult后加"1" m_strResult+="1"; OperatorPressed=false;//把bool变量OperatorPressed和Restarted的值改为false Restarted=false; UpdateData(FALSE);//把字符串变量m_strResult传给编辑框}voidCMyDlg::OnNo2(){ UpdateData(TRUE);//把编辑框显示的字符串传给相应的变量m_strResult if(OperatorPressed==true||Restarted==true)//在按下了"=","AC","sqrt","tan","sin"等按忸时, m_strResult="2";//变量m_strResult的值为按下的按忸"2" else//在按下数字键的情况下,则在m_strResult后加"2" m_strResult+="2"; OperatorPressed=false;//把bool变量OperatorPressed和Restarted的值改为false Restarted=false; UpdateData(FALSE);//把字符串变量m_strResult传给编辑框}voidCMyDlg::OnNo3(){ UpdateData(TRUE);//把编辑框显示的字符串传给相应的变量m_strResult if(OperatorPressed==true||Restarted==true)//在按下了"=","AC","sqrt","tan","sin"等按忸时, m_strResult="3";//变量m_strResult的值为按下的按忸"3" else//在按下数字键的情况下,则在m_strResult后加"3" m_strResult+="3"; OperatorPressed=false;//把bool变量OperatorPressed和Restarted的值改为false Restarted=false; UpdateData(FALSE);//把字符串变量m_strResult传给编辑框}voidCMyDlg::OnNo4(){ UpdateData(TRUE);//把编辑框显示的字符串传给相应的变量m_strResult if(OperatorPressed==true||Restarted==true)//在按下了"=","AC","sqrt","tan","sin"等按忸时, m_strResult="4";//变量m_strResult的值为按下的按忸"4" else//在按下数字键的情况下,则在m_strResult后加"4" m_strResult+="4"; OperatorPressed=false;//把bool变量OperatorPressed和Restarted的值改为false Restarted=false; UpdateData(FALSE);//把字符串变量m_strResult传给编辑框}voidCMyDlg::OnNo5(){ UpdateData(TRUE);//把编辑框显示的字符串传给相应的变量m_strResult if(OperatorPressed==true||Restarted==true)//在按下了"=","AC","sqrt","tan","sin"等按忸时, m_strResult="5";//变量m_strResult的值为按下的按忸"5" else//在按下数字键的情况下,则在m_strResult后加"5" m_strResult+="5"; OperatorPressed=false;//把bool变量OperatorPressed和Restarted的值改为false Restarted=false; UpdateData(FALSE);//把字符串变量m_strResult传给编辑框}voidCMyDlg::OnNo6(){ UpdateData(TRUE);//把编辑框显示的字符串传给相应的变量m_strResult if(OperatorPressed==true||Restarted==true)//在按下了"=","AC","sqrt","tan","sin"等按忸时, m_strResult="6";//变量m_strResult的值为按下的按忸"6" else//在按下数字键的情况下,则在m_strResult后加"6" m_strResult+="6"; OperatorPressed=false;//把bool变量OperatorPressed和Restarted的值改为false Restarted=false; UpdateData(FALSE);//把字符串变量m_strResult传给编辑框}voidCMyDlg::OnNo7(){ UpdateData(TRUE);//把编辑框显示的字符串传给相应的变量m_strResult if(OperatorPressed==true||Restarted==true)//在按下了"=","AC","sqrt","tan","sin"等按忸时, m_strResult="7";//变量m_strResult的值为按下的按忸"7" else//在按下数字键的情况下,则在m_strResult后加"7" m_strResult+="7"; OperatorPressed=false;//把bool变量OperatorPressed和Restarted的值改为false Restarted=false; UpdateData(FALSE);//把字符串变量m_strResult传给编辑框}voidCMyDlg::OnNo8(){ UpdateData(TRUE);//把编辑框显示的字符串传给相应的变量m_strResult if(OperatorPressed==true||Restarted==true)//在按下了"=","AC","sqrt","tan","sin"等按忸时, m_strResult="8";//变量m_strResult的值为按下的按忸"8" else//在按下数字键的情况下,则在m_strResult后加"8" m_strResult+="8"; OperatorPressed=false;//把bool变量OperatorPressed和Restarted的值改为false Restarted=false; UpdateData(FALSE);//把字符串变量m_strResult传给编辑框}voidCMyDlg::OnNo9(){ UpdateData(TRUE);//把编辑框显示的字符串传给相应的变量m_strResult if(OperatorPressed==true||Restarted==true)//在按下了"=","AC","sqrt","tan","sin"等按忸时, m_strResult="9";//变量m_strResult的值为按下的按忸"9" else//在按下数字键的情况下,则在m_strResult后加"9" m_strResult+="9"; OperatorPressed=false;//把bool变量OperatorPressed和Restarted的值改为false Restarted=false; UpdateData(FALSE);//把字符串变量m_strResult传给编辑框}voidCMyDlg::OnAdd(){ UpdateData(TRUE);//把编辑框显示的字符串传给相应的变量m_strResult m_strResult+="+";//在变量m_strResult后加"+" OperatorPressed=false;//把bool变量OperatorPressed和Restarted的值改为falseRestarted=false; UpdateData(FALSE);//把字符串变量m_strResult传给编辑框}voidCMyDlg::OnDec(){ UpdateData(TRUE);//把编辑框显示的字符串传给相应的变量m_strResult m_strResult+="-";//在变量m_strResult后加"-" OperatorPressed=false;//把bool变量OperatorPressed和Restarted的值改为falseRestarted=false; UpdateData(FALSE);//把字符串变量m_strResult传给编辑框}voidCMyDlg::OnMut(){ UpdateData(TRUE);//把编辑框显示的字符串传给相应的变量m_strResult m_strResult+="*";//在变量m_strResult后加"*" OperatorPressed=false;//把bool变量OperatorPressed和Restarted的值改为falseRestarted=false; UpdateData(FALSE);//把字符串变量m_strResult传给编辑框}voidCMyDlg::OnDiv(){ UpdateData(TRUE);//把编辑框显示的字符串传给相应的变量m_strResult m_strResult+="/";//在变量m_strResult后加"/" OperatorPressed=false;//把bool变量OperatorPressed和Restarted的值改为falseRestarted=false; UpdateData(FALSE);//把字符串变量m_strResult传给编辑框}//通过这个函数,实现把字符串中的数字和运算符读取出来,并分别储存在2个数组里voidCMyDlg::GetStr(CStringstr){ inti=0,z=0; doublerate=10.0,itemp=0.0; for(i=0;i<20;i++)a[i]=1000000.0;//对数组a[20]初始化 for(i=0;i<10;i++)b[i]='';//对数组b[10]初始化 i=0;//把0赋给i for(;i<str.GetLength();i++) { if(isdigit(str.GetAt(i)))//假如字符串str.GetAt(i)的内容是整数 { if(rate==10.0) //整数部分 itemp=itemp*rate+(str.GetAt(i)-'0');//获得整数 else//小数部分 { itemp=itemp+rate*(str.GetAt(i)-'0');//获得小数 rate=rate/10;//每次让rate小10倍 } } elseif(str.GetAt(i)=='.')//假如str.GetAt(i)是小数点 rate=0.1;//让rate=0.1,开始计算小数部分 elseif(str.GetAt(i)=='+')//假如str.GetAt(i)是加号{ a[z]=itemp;itemp=0;//把itemp的值放入双精度数组a中,并把itemp的值改为0 z++;//让z自加一次 b[z]='+';//把加号放入字符数组b中 z++;//让z自加一次 rate=10.0;//把10赋给rate,保证读取下个数字时,先计算整数部分 } elseif(str.GetAt(i)=='-')//假如str.GetAt(i)是减号{ a[z]=itemp;itemp=0;//把itemp的值放入双精度数组a中,并把itemp的值改为0 z++;//让z自加一次 b[z]='-';//把减号放入字符数组b中 z++;//让z自加一次 rate=10.0; //把10赋给rate,保证读取下个数字时,先计算整数部分 } elseif(str.GetAt(i)=='*')//假如str.GetAt(i)是乘号{ a[z]=itemp;itemp=0;//把itemp的值放入双精度数组a中,并把itemp的值改为0 z++;//让z自加一次 b[z]='*';//把减号放入字符数组b中 z++;//让z自加一次 rate=10.0;//把10赋给rate,保证读取下个数字时,先计算整数部分 } elseif(str.GetAt(i)=='/')//假如str.GetAt(i)是除号{ a[z]=itemp;itemp=0;//把itemp的值放入双精度数组a中,并把itemp的值改为0 z++;//让z自加一次 b[z]='/';//把除号放入字符数组b中 z++;//让z自加一次 rate=10.0;//把10赋给rate,保证读取下个数字时,先计算整数部分 } } a[z]=itemp;//把最后一个整数itemp的值放入双精度数组a中s=z;//把z的值赋给变量s,用来控制计算结果的循环中的条件}//这个函数结束后编辑框的表达式被提成了数字和运算符2部分,数字保存在a[0],a[2],a[4]...中,运算符保存在b[1],b[3]...中voidCMyDlg::GetResult(){ inti=0,x=0,y=1,t,z=1;//这个循环的目的是把所有除法运算都改为乘法计算 for(i=0;i<=s;i++) { if(b[i]=='/')//当循环碰到除号时 { a[i+1]=1/a[i+1];//把a[i+1]的值改为1/a[i+1] b[i]='*'; //把b[i]的值改为乘号 } }//这个循环可以对所有乘法进行计算 for(i=0;i<=s;i++) { if(b[i]=='*')//当循环碰到乘号时 {//假如i-t==2(再上次循环中,t被赋值成了i,这次2个值只相差2,说明表达式的情况是连续乘法,比如2*3*4)以2*3*4为例,在这个条件之前,函数已经进行了2*3的运算,其计算结果保存在本来的2中,把2的值覆盖了,这个条件的作用是让2*3的结果再和4相乘,结果保存在本来的2中 if(i-t==2) { a[t-z]=a[t-z]*a[i+1];//进行乘法运算,把结果保存在前面的数组元素中 z=z+2;//这里引进变量z,可以解决很多数连续相乘的问题,比如2*2*2*2*2*2 } a[i-1]=a[i-1]*a[i+1];//碰到乘号后把乘号前后2个数字相乘,结果保存在前面的数组元素 a[i+1]=1000000.0;//对乘号后面的数字初始化为0.0 b[i]='';//对乘号初始化为空格//2数相乘后把乘号及其后面的数字初始化了,假如是2*3*4的情况,将会无法计算*4,所以要用开始的条件语句来解决 t=i;//把i的值赋给t } }//这个循环的目的是对数组a和b进行整理,由于已经进行了乘法和除法运算,进行运算的时候,把一些数字和运算符初始化了这个函数的作用可以使中间一些初始化了的数字和符号被后面的数字和符号代替,让数组可以重新排列 for(i=0;i<=s;i++) { if(a[i]!=1000000.0)//假如a[i]的值不为0.0 { a[x]=a[i];//把a[i]的值赋给a[x] x+=2;//x自加2 } if(b[i]!='')//假如b[i]的值不为空格 { b[y]=b[i];//把b[i]的值赋给b[y] y=y+2;//y自加2 } }//这个循环是进行最后的加减法运算 for(i=0;i<=y-2;i++)//这里i的上限小于等于y-2,可以保证不进行多余的运算 { if(b[i]=='+')//假如b[i]等于加号 a[0]=a[0]+a[i+1];//把加号后的数字和a[0]相加,结果保存在a[0]中 elseif(b[i]=='-')//假如b[i]等于减号 a[0]=a[0]-a[i+1];//把减号后的数字和a[0]相减,结果保存在a[0]中 } }voidCMyDlg::OnEqu(){ UpdateData(TRUE);//把编辑框显示的字符串传给相应的变量m_strResult Bracket(m_strResult);//调用Bracket(m_strResult)函数,解决括号问题GetStr(m_strResult);//调用函数GetStr(m_strResult),作用是把m_strResult转化成数字和加减乘除四则运算GetResult();//调用函数GetResult(),作用是计算出表达式的值 m_strResult.Format("%1f",a[0]);//用Format函数,把双精度型小数转化为字符串UpdateData(FALSE); //把字符串变量m_strResult传给编辑框 OperatorPressed=true;//把bool变量OperatorPressed的值改为true,再次输入数字时,覆盖掉现在的m_strResult}voidCMyDlg::OnAc(){ Restarted=true;//把bool变量Restarted的值改为true,再次输入数字时,覆盖掉现在的m_strResult m_strResult="0";//把字符串"0"赋给m_strResult UpdateData(FALSE);//把字符串变量m_strResult传给编辑框 }voidCMyDlg::OnBac(){ UpdateData(TRUE);//把编辑框显示的字符串传给相应的变量m_strResult if(m_strResult!="0"&&m_strResult.GetLength()>1)//当m_strResult不等于"0"且m_strResult长度大于1时 m_strResult=m_strResult.Left(m_strResult.GetLength()-1);//使m_strResult长度减少1,去掉最右边的字符 else { Restarted=true;//把bool变量Restarted的值改为true,再次输入数字时,覆盖掉现在的m_strResult m_strResult="0";//把字符串"0"赋给m_strResult } UpdateData(FALSE);//把字符串变量m_strResult传给编辑框 }voidCMyDlg::OnSin(){ UpdateData(TRUE);//把编辑框显示的字符串传给相应的变量m_strResult doubleresult;//定义一个双精度型变量result,用来获取进行了sin运算的结果result=sin(GetaStr(m_strResult));//先调用GetaStr函数用来把字符串变为数字,再进行sin运算,把结果赋给result m_strResult.Format("%1f",result);//调用Format函数,把result转化为字符串并赋给m_strResult OperatorPressed=true;//把bool变量OperatorPressed的值改为true,再次输入数字时,覆盖掉现在的m_strResultUpdateData(FALSE);//把字符串变量m_strResult传给编辑框}voidCMyDlg::OnCos(){ UpdateData(TRUE);//把编辑框显示的字符串传给相应的变量m_strResult doubleresult;//定义一个双精度型变量result,用来获取进行了cos运算的结果result=cos(GetaStr(m_strResult));//先调用GetaStr函数用来把字符串变为数字,再进行cos运算,把结果赋给result m_strResult.Format("%1f",result);//调用Format函数,把result转化为字符串并赋给m_strResult OperatorPressed=true;//把bool变量OperatorPressed的值改为true,再次输入数字时,覆盖掉现在的m_strResultUpdateData(FALSE);//把字符串变量m_strResult传给编辑框}voidCMyDlg::OnTan(){ UpdateData(TRUE);//把编辑框显示的字符串传给相应的变量m_strResult doubleresult;//定义一个双精度型变量result,用来获取进行了tan运算的结果result=tan(GetaStr(m_strResult));//先调用GetaStr函数用来把字符串变为数字,再进行tan运算,把结果赋给result m_strResult.Format("%1f",result);//调用Format函数,把result转化为字符串并赋给m_strResult OperatorPressed=true;//把bool变量OperatorPressed的值改为true,再次输入数字时,覆盖掉现在的m_strResultUpdateData(FALSE);//把字符串变量m_strResult传给编辑框}voidCMyDlg::OnCot(){UpdateData(TRUE);//把编辑框显示的字符串传给相应的变量m_strResult doubleresult;//定义一个双精度型变量result,用来获取进行了cot运算的结果result=1/tan(GetaStr(m_strResult));//先调用GetaStr函数用来把字符串变为数字,再进行cot运算,把结果赋给result m_strResult.Format("%1f",result);//调用Format函数,把result转化为字符串并赋给m_strResult OperatorPressed=true;//把bool变量OperatorPressed的值改为true,再次输入数字时,覆盖掉现在的m_strResultUpdateData(FALSE);//把字符串变量m_strResult传给编辑框}voidCMyDlg::OnLn(){ UpdateData(TRUE);//把编辑框显示的字符串传给相应的变量m_strResult doubleresult;//定义一个双精度型变量result,用来获取进行了ln运算的结果result=log(GetaStr(m_strResult));//先调用GetaStr函数用来把字符串变为数字,再进行ln运算,把结果赋给result m_strResult.Format("%1f",result);//调用Format函数,把result转化为字符串并赋给m_strResult OperatorPressed=true;//把bool变量OperatorPressed的值改为true,再次输入数字时,覆盖掉现在的m_strResultUpdateData(FALSE);//把字符串变量m_strResult传给编辑框 }voidCMyDlg::OnSqr(){ UpdateData(TRUE);//把编辑框显示的字符串传给相应的变量m_strResult doubleresult;//定义一个双精度型变量result,用来获取进行了sqrt运算的结果result=sqrt(GetaStr(m_strResult));//先调用GetaStr函数用来把字符串变为数字,再进行sqrt运算,把结果赋给result m_strResult.Format("%1f",result);//调用Format函数,把result转化为字符串并赋给m_strResult OperatorPressed=true;//把bool变量OperatorPressed的值改为true,再次输入数字时,覆盖掉现在的m_strResultUpdateData(FALSE);//把字符串变量m_strResult传给编辑框}voidCMyDlg::OnDot(){ UpdateData(TRUE);//把编辑框显示的字符串传给相应的变量m_strResult if(OperatorPressed==true||Restarted==true)//在按下了"=","AC","sqrt","tan","sin"等按忸时, m_strResult=".";//变量m_strResult的值为按下的按忸"." else//在按下数字键的情况下,则在m_strResult后加"." m_strResult+="."; OperatorPressed=false;//把bool变量OperatorPressed和Restarted的值改为false Restarted=false; UpdateData(FALSE);//把字符串变量m_strResult传给编辑框 }doubleCMyDlg::GetaStr(CStringstr){ inti=0; doublerate=10.0,itemp=0.0; for(;i<str.GetLength();i++) { if(isdigit(str.GetAt(i)))//假如字符串str.GetAt(i)的内容是整数 { if(rate==10.0) //整数部分 itemp=itemp*rate+(str.GetAt(i)-'0');//获得整数 else//小数部分 { itemp=itemp+rate*(str.GetAt(i)-'0');//获得小数 rate=rate/10;//每次让rate小10倍 } } elseif(str.GetAt(i)=='.')//假如str.GetAt(i)是小数点 rate=0.1;//让rate=0.1,开始计算小数部分 } return(itemp);}voidCMyDlg::OnLbr(){ UpdateData(TRUE);//把编辑框显示的字符串传给相应的变量m_strResult if(OperatorPressed==true||Restarted==true)//在按下了"=","AC","sqrt","tan","sin"等按忸时, m_strResult="(";//变量m_strResult的值为按下的按忸"(" else
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年内蒙古医科大学附属人民医院医护人员招聘笔试参考试题及答案详解
- 2026年温州市人民医院(信河院区)医护人员招聘考试参考题库及答案详解
- 2026年上海交通大学医学院附属瑞金医院北院医护人员招聘考试备考试题及答案详解
- 2026年中国人民解放军三零七医院医护人员招聘笔试备考题库及答案详解
- 2026年丽水市第二人民医院医护人员招聘考试备考题库及答案详解
- 2026年景德镇市中医医院医护人员招聘考试参考试题及答案详解
- 2026年天水市第一人民医院医护人员招聘笔试备考题库及答案详解
- 2026年佳木斯市中医院医护人员招聘考试备考试题及答案详解
- 2026年华夏银行(济南分行)人员招聘考试参考题库及答案详解
- 2026年中国人民解放军第四二二医院医护人员招聘笔试备考题库及答案详解
- 电动汽车充电桩建设合同能源管理协议
- 《眼科临床诊疗指南(2025版)》
- JJF 2370-2026建筑运行阶段碳排放计量技术规范
- 第17课 物联数据需采集 课件 2025-2026学年人教版初中信息科技八年级全一册
- 2025-2030长三角经济一体化深度研究报告
- AQ3062-2025《精细化工企业安全管理规范》专项检查表汇编(共5份)28
- 腐蚀检测技术
- 入职培训班级管理制度
- 人教版(2024)八年级下册英语期末复习:Unit 6 Crossing Cultures 写作专项练习(含答案+范文)
- 2026年高考新课标一卷数学试题(附答案)
- 国家事业单位招聘2025国家自然科学基金委员会招聘拟聘(二)笔试历年参考题库典型考点附带答案详解(3卷合一)
评论
0/150
提交评论