for(;i if(str0.GetAt(i)=='(') //如果碰到了左括号 { } i++; //i自加一次,用来跳过左括号 for(;i i++; //i自加一次,用来跳过右括号 for(;i str3+=str0.GetAt(i); //把括号后边的表达式赋给str3 if(str0.GetAt(i)==')') break; //如果碰到右括号,跳出循环 str2+=str0.GetAt(i); //把括号内的表达式赋给str2 else } GetStr(str2); //调用GetStr(str2)函数,把str2里的数字和运算符保存在数组中 str1+=str0.GetAt(i); //把括号前边的表达式赋给str3 GetResult(); //计算出表达式str2的值 for(i=0;i if(str0.GetAt(i)=='(') //如果m_strResult中有括号 str2.Format(\ //把a[0]转化为字符串赋给str2 m_strResult=str1+str2+str3; //把str1,str2,str3的值加起来赋给m_strResult } 2.2 计算出结果的算法 在把表达式中的数字和运算符分别保存在数组后,接下来我们就要进行表达式的计算了,表达式的计算首先要考虑优先级的问题,这里先把所有的除法转化为乘法,再把除法后的数字取它的倒数,接下来就是进行乘法计算,每次乘法计算后都把计算的结果保存在计算的2个数中的前面的那个数上,并把乘号和后面的数字删除。进行完乘法运算后,进行一次循环,重新整理下数组,最后进行加法和减法运算。函数代码如下: void CMyDlg::GetResult() { int i=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] } if(b[i]!=' ') //如果b[i]的值不为空格 { } b[y]=b[i]; //把b[i]的值赋给b[y] y=y+2; //y自加2 x+=2; //x自加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]中 else if(b[i]=='-') //如果b[i]等于减号 a[0]=a[0]-a[i+1]; //把减号后的数字和a[0]相减,结果保存在a[0]中 } } 2.3 转化为十六进制和二进制的算法 (1)转化为二进制的算法。将数值除以2并记录余数,只要商不为0,继续将最新的商除以2并记录余数,当商为0以后,此数的二进制便可以由记录下来的余数得到[3]。以下是函数的代码: void CMyDlg::On2() { int m,n[20]; CString str; UpdateData(TRUE); //把编辑框显示的字符串传给相应的变量m_strResult m=(int)GetaStr(m_strResult); //调用GetaStr(m_strResult),用来获取m_strResult中的数字 m_strResult=\ //对m_strResult的值初始化 for(int i=0;i<=20;i++) { n[i]=m%2; //把m除2的余数保存在n[i]中 m=m/2; //把m/2的值赋给m if(m==0) break; //当m为0时,退出循环 } for(;i>=0;i--) { str.Format(\ //用Format函数把n[i]的值转化为字符串 m_strResult+=str; //把str的值加在m_strResult上 } OperatorPressed=true; //把bool变量OperatorPressed的值改为true UpdateData(FALSE); //把字符串变量m_strResult传给编辑框 } (2)转化为十六进制的算法。如果要转化的数字大于16,则把这个数字除以16并记录余数,继续将最新的商除以16并记录余数,当商为0以后,把大于9的数字转化为字母记录,这样得到的字符串就是十六进制数了。函数代码如下; void CMyDlg::On16() { int m; UpdateData(TRUE); //把编辑框显示的字符串传给相应的变量m_strResult m=(int)GetaStr(m_strResult); //调用GetaStr(m_strResult),用来获取m_strResult中的数字 f(m); //调用f(m)函数,把十进制转化为十六进制 m_strResult=str7; //把str7的值赋给m_strResult str7=\ //把str7初始化 OperatorPressed=true; //把bool变量OperatorPressed的值改为true UpdateData(FALSE); //把字符串变量m_strResult传给编辑框 } void CMyDlg::f(int n) {