VC++ - mfc编计算器+源代码(3)
王井泉 《计算器程序设计》 第11页 共36页
在把表达式中的数字和运算符分别保存在数组后,接下来我们就要进行表达式的计算了,表达式的计算首先要考虑优先级的问题,这里先把所有的除法转化为乘法,再把除法后的数字取它的倒数,接下来就是进行乘法计算,每次乘法计算后都把计算的结果保存在计算的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];
王井泉 《计算器程序设计》 第12页 共36页
//进行乘法运算,把结果保存在前面的数组元素中
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
//这个循环是进行最后的加减法运算
王井泉 《计算器程序设计》 第13页 共36页
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时,退出循环
王井泉 《计算器程序设计》 第14页 共36页
}
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传给编辑框 }
王井泉 《计算器程序设计》 第15页 共36页 …… 此处隐藏:1138字,全部文档内容请下载后查看。喜欢就下载吧 ……
相关推荐:
- [高等教育]公司协助某村精准扶贫工作总结.doc
- [高等教育]高二生物知识点总结(全)
- [高等教育]苏教版数学三年级下册《解决问题的策略
- [高等教育]仪器分析课程学习心得
- [高等教育]2017年五邑大学数学与计算科学学院333
- [高等教育]人教版七年级下册语文第四单元测试题(
- [高等教育]2018年秋七年级英语上册Unit7Howmuchar
- [高等教育]2017年八年级下数学教学工作小结
- [高等教育]湖南省怀化市2019届高三统一模拟考试(
- [高等教育]四年级下册科学_基础训练及答案教材
- [高等教育]城郊煤矿西风井管路伸缩器更换施工安全
- [高等教育]昆八中20182019学年度上学期期末考试
- [高等教育]项目部各类人员任命书
- [高等教育]上市公司经营水务产业的模式
- [高等教育]人教版高二化学第一学期第三章水溶液中
- [高等教育]【中考物理第一轮复习资料】四.压强与
- [高等教育]金坑水电站报废改建工程机电设备更新改
- [高等教育]高中生物教学工作计划简易版
- [高等教育]2017年西华大学攀枝花学院(联合办学)44
- [高等教育]最新整理超短爆笑英文小笑话大全
- 优秀教师继续教育学习心得体会
- 阳历到阴历的转换
- 留守儿童教育案例分析
- 华师17春秋学期《玩教具制作与环境布置
- 测速传感器新型安装装置的现场应用
- 人教版小学数学三年级下册第四单元
- 创业个人意向书
- 山东省潍坊市2012年高考仿真试题(三)
- [恒心][好卷速递]四川省成都外国语学校
- 多少人错把好转反应当成了病情加重处理
- 中外广播电视史复习资料整理
- 江苏省扬州市江都区宜陵镇中学2014-201
- 工程造价专业毕业实习报告
- 广西师范学院心理与教育统计
- aympkrq基于 - asp的博客网站设计与开
- 建筑业外出经营相关流程操作(营改增后
- 人治 德治 法治
- [精华篇]常识判断专项训练题库
- 中国共产党为什么要实行民主集中
- 小学数学第三册第一单元试卷(A、B、C




