13
4结论与心得体会
经过多次调试,设计的计算器可以实现本次要求的所有功能。
此次VC++课程设计,在同学的帮助下,顺利完成,收获也很大。本学期我们开设了《面向对象程序设计与VC++实践》这门课,其中MFC部分皆是需要实践的,所以,此次课程设计是很及时、很有必要的。这样,不仅能加深我们对MFC程序设计的掌握,而且,还能让我们真正做到学以致用。
课程设计刚开始的时候,觉着比较轻松,毕竟上课时做过简单计算器,觉着这次的题目也不会太难。后来,通过老师的讲解,发现这次课程设计与平时做的计算器有很多不同,不仅需要考虑运算的优先级,还需要实现连续运算,而且还有单目运算与双目运算的不同等一系列新的问题。但是,真正开始做的时候,通过查找资料和与同学的交流,渐渐有了头绪。在完成过程中,仍然避免不了会遇到一些问题,这时,不仅需要思考,还需要查阅相关资料来解决。
当然,做课程设计,基本知识是必备的。只有具有了一定的基础知识,才能在课程设计过程中高质高效完成。同时,也不能请示任何一道题,每一道题都有它自己的难点。
这次课程设计让我学到了很多,不仅巩固了先前学的MFC程序设计知识,而且也培养了我的实践能力,将理论知识与实践联系起来,更令我的创造性思维得到了拓展。希望以后类似这样的课程设计、这样的实践机会能多一些。
5思考题
1、程序中如何实现小数的显示与运算?
答:编辑框所关联的变量为Cstring类的m_str,当输入小数点时,直接将字符’.’加在之前已输入字符后面即可。运算时,通过BOOL型变量pass2判断是否有小数点,有,则为0;无,则为1。当有小数点时,在把已输入的字符串转化为相应数值时,乘以的比率rate为0.1,且每乘一次,都使rate值变为原来rate值的十分之一,之后由于头文件中加了“math.h”,故,再通过进行相关
13 1
14
数学运算即可得到结果。
2、描述等号对应的消息处理函数中需要处理的问题及相应的实现代码? 答:等号对应的消息处理函数中需要实现双目运算符的功能和连续运算,同时还要解决运算优先级的问题,另外还需要有相应的错误提示。 实现代码:
void CLuxiaoyingDlg::OnDengyuButton20() {
// TODO: Add your control notification handler code here int i, j, z, s, x=0, y=1, t, m=1; char b[10];
double rate=10.0, itemp=0.0,a[20], l; for(i=0;i<20;i++)
a[i]=100000000.0;
for(i=0;i<10;i++)
b[i]=' ';
//以下为双目运算; z=0;
for(i=0;i //长度 { if(isdigit(m_str.GetAt(i)))//isdigit 若参数c为阿拉伯数字,则 //返回TRUE,否则返回NULL(0)。 //m_str.GetAt(i)取出字符串 中的第i个字符 //(编号从 0起) { if(rate==10.0) { itemp=itemp*rate+(m_str.GetAt(i)-'0'); 14 1 15 } if(i==m_str.GetLength()-1) a[z]=itemp; else { itemp=itemp+rate*(m_str.GetAt(i)-'0'); rate=rate/10; if(i==m_str.GetLength()-1) a[z]=itemp; } } else if(m_str.GetAt(i)=='.') rate=0.1; else if(m_str.GetAt(i)=='+') { a[z]=itemp;itemp=0; z++; b[z]='+'; z++; rate=10.0; } else if(m_str.GetAt(i)=='-') { a[z]=itemp;itemp=0; z++; b[z]='-'; z++; rate=10.0; } 15 1 16 } else if(m_str.GetAt(i)=='*') { } else if(m_str.GetAt(i)=='/') { } a[z]=itemp;itemp=0; z++; b[z]='/'; z++; rate=10.0; a[z]=itemp;itemp=0; z++; b[z]='*'; z++; rate=10.0; s=z; for(j=0;j<=s;j++)//除法转换成乘法 { if(b[j]=='/') { if(a[j+1]==0) MessageBox(\不能作为除数!\ else { a[j+1]=1/a[j+1]; 16 1