【摘要】本文以C++菜菜鸟(只需要学习了C++数据类型和控制结构即可)为目标读者,用求解一元二次方程作为实例,展示窗口式程序的开发过程,获得初步体验。写作目的包括:(1)让学生通过模仿,开发出类似风格的窗口程序;(2)以此为起点,课外通过案例教程等参考资料,学习开发更多的功能实用的程序;(3)体会到程序设计能力的核心并不在界面,从而能潜心提高程序设计的基本功和认真学习计算机科学的基础理论。
【相关博文】我写的C++“窗口”程序设计启蒙(之二) ,我的学生刘畅的报告点击打开链接,对初用VC++6.0,以及对英文界面怕怕的童鞋,有参考价值;邵帅和辛彬自主尝试了在VS2013下的开发,见点击打开链接和点击打开链接。
在程序设计学习过程中,尤其对于计算机相关专业的学生,总是从语言、程序结构、算法等学起,然后再结合工程实际,逐渐涉及窗口、界面的设计。不少同学失去耐心,甚至非常伤心:“为什么要让我们面对黑洞洞的DOS窗口。
如果从表面上,制作一个窗口程序并非难事。于是有了本文,目的就在于让零基础的童鞋们体验一次,过把瘾,然后能将主要精力投入到程序设计课中去,认认真真地打好编程序的基本功。大学学习有很强的阶段性,这个阶段可以不将设计窗口程序作为目标。
实际上,随着对程序设计技术的深入学习,尤其是学习了面向对象程序设计技术之后,我们的眼光将放在理解和运用MFC去开发系统。将来,这些由系统自动生成的程序你可以自己手工编写出来。C++是讲究效率的,手工编写而非由IDE自动生成,是C++程序员的追求。专业和非专业的区别就在这里。可能将来你会从事并不强调效率的一些应用开发,但精湛的程序设计技术、扎实的算法功底、良好的编程风格,是基本功,是看家本领。
不管怎么说,程序猿菜鸟们还是猴急猴急的。那就用一个例子将开发这种程序的过程演示一下。同学们可以模仿着做一遍。以后的作业、上机任务也可以照葫芦画瓢做成窗口版的。想要继续深入?可以借些书自学了。有了课堂中程序设计技术的支撑,不需要什么其他基础,只要能改变学习观念,你可以先行一步,体会更多的乐趣。在大学里,围绕课堂,展开自学,其力无穷。
下面,以VC++6.0为开发平台,开始这趟体验之旅。
一、问题:求一元二次方程式ax2+bx+c=0的根。a,b,c的值在运行时由键盘输入。
可以写出如下的程序完成求解:
#include<iostream> #include<cmath> usingnamespace std; int main( ) { float a,b,c,x1,x2; cin>>a>>b>>c; if ((b*b-4*a*c)>=0) { if((b*b-4*a*c)>0) { x1=(-b+sqrt(b*b-4*a*c))/(2*a); x2=(-b-sqrt(b*b-4*a*c))/(2*a); cout<<"两个不相等的实根分别是:x1="<<x1<<",""x2="<<x2<<endl; } else { x1=-b/(2*a); cout<<"两个相等的实根,x1=x2="<<x1<<endl; } } else cout<<"方程无实根"<<endl; return 0; }
二、开发窗口版程序
1、新建MFCAPP工程
新建工程,选择MFC APPWizard[exe],点确定:
选择基本对话框
下一步
再下一步
完成
IDE会显示工程骨架。点确定
2、安排窗口界面中的控件
出现设计界面
在对话框中添加和编辑控件:将”控件”拖到窗口中,点右键修改属性,下图将拖入的静态文本的“标题”改为a,后将放置一个编辑辑框,用于输入a的值。静态文本起提示的作用。
加入3个静态文本控件和编辑框控件,分别用于输入方程的三个系数;1个“求解”按钮,将来点击后可以完成求解;加入2个静态文本控件和编辑框控件,分别用于输出方程的解。
在控件上点右键,查看属性,本例中不做修改,确认输入a、b、c的编辑框的ID分别为IDC_EDIT1、IDC_EDIT2和IDC_EDIT3,用于输出结果的两个编辑框的ID分别为IDC_EDIT4、和IDC_EDIT5。
测试对话框:在layout(布局)菜单中,选择tset(测试)命令,可以看到将来运行时的外观。
3、将编辑框控件与变量绑定
下面需要完成核心的功能,如何求解方程。
为了让程序从窗口的编辑框中提取出输入的值,要设置变量,并与控件绑定。
在设计窗口中点右键,选择ClassWizard(建立类向导)
点击MemberVariables标签,设置各个控件对应的变量
双击IDC_EDIT1,为其添加对应的变量,变量名为m_a,变量类型为double,按下图输入。
同法为其他控件设置变量
4、为按钮设置将来点击后要执行的程序
切换到Message Maps标签页
为按钮添加BN_CLICKED消息映射:点击Messages:框中的BN_CLICKED,再单击右侧的“Add Function…”按钮,在新出现的弹出式窗口中点OK。
之后可以看到加入了Member Functions
双击新增加的成员函数,现在需要输入程序了
输入的程序这样的,程序设计的方法还是老一套,不过是增加了控件与变量传值的要求,变量用的是与控件绑定的变量:
5、运行程序
运行程序,结果是
结果还可以是:
界面其实还不好看,到图书馆借些书,按着例子做几个就有感觉了。
结语
看一个业界大牛的界面:
界面、窗口并非应用的核心。编程思想和方法是核心,现阶段优先解决编程方法的提高,如果时间有限,窗口程序可以以后解决。
还有,打好基础,有利于你理解向导生成的架构,这是我们的长期目标。
三、练习
1、用if语句编写选择结构的程序,完成下面的分段函数的求值
(提示:x1(1)、x1(2)为常数,变量名可以定为x1和x2。)
设计成的窗口版程序可以如下图(两个常量的值也可以调整):
2、编写多分支选择结构程序,输入个人月收入总额,计算出他本月应缴税款和税后收入。
所得税计算方法:从2011年9月1日起,我国调整个人所得税起征点。基数上调为3500元,超出部分按以下7级计算。
序号 | 收入范围 | 税率 | 速算扣除数 |
1 | 超过0至1500 | 3% | 0 |
2 | 超过1500元至4500元的部分 | 10% | 105 |
3 | 超过4500元至9000元的部分 | 20% | 555 |
4 | 超过9,000元至35,000元的部分 | 25% | 1005 |
5 | 超过35,000元至55,000元的部分 | 30% | 2755 |
6 | 超过55,000元至80,000元的部分 | 35% | 5505 |
7 | 超过80,000以上 | 45% | 13505 |
个人所得税计算方法:个人所得税=应纳税所得额*税率-速算扣除数,其中:应纳税所得额=收入总额-不征税收入-免税收入-各项扣除。
本题中忽略免税收入和各项扣除,不征税收入即起征点基数3500元,所以有:个人所得税=(收入总额-3500)*税率-速算扣除数
例如:王某月收入总额3600元,个人所得税=(3600-3500)*3%=3元,李某月收入13500元,个人所得税=(13500-3500)*25%-1005=2500-1005=1495元。
本题的关键是如何根据应纳税所得额,确定税率和速算扣除数。
个人所得税窗口版程序可以形如:
【拓展背影——速算扣除数】与解题已无太关系,但是可以了解一下
速算扣除数是指用快捷方法计算税款时,可以扣除的数额。个人所得税的计算,可以将应纳税所得额分成不同级距和相应的税率来计算。如扣除3500元后的应纳税所得额在1500元以内的,按3%税率计算,1500-4500元之间的部分(即3000元),按10%的税率计算。
如某人工资扣除3500元后的应纳税所得额是2200元,则税款计算方法为:1500*3%+700*10% =115元。个人所得税的计算,也可以将应纳税所得额直接按对应的税率来速算,但要扣除一个速算扣除数,否则会多计算税款。
如某人工资扣除3500元后的应纳税所得额是2200元,2200元对应的税率是10%,则税款速算方法为:2200*10%-105=115元。这里的105就是速算扣除数,因为2200元中,有1500元多计算了7%的税款,需要减去。其他税率所对应的速算扣除数分别是:20%:555,25%:1005,30%:2755,35%:5505,45%:13505。
四、后记
此文初成于2011年10月,感受到了同学们刚学了几天C++,就不满足于黑框框,不理解为何不把他们带入窗口世界。我当时想,是需要让同学们通过体验知道一下黑框框和窗口中世界的关系了。但限于初学者的背景,这项工作不是讲讲就做通得,需要的是同学们的体验。基于此文的实践表明,这种体验让同学们安静了一些。
用黑框框的目的自然是在黑框框之外的。即使同学们已经和黑框框有了深厚的感情,说声ByeBye只是迟早的事情。近日,面向对象的程序设计学习已经到了尾声,我准备再次拟一个适合同学们目前水平(了解了面向对象机制,但无任何开发经验和经历)的指导书,在窗口式程序开发和面向对象机制方面让同学们有更多的体验,也借此揭开课外自学MFC,甚至是其他语言,其他开发环境的序幕!
请关注近期将出炉的《增强版C++窗口程序设计启蒙》。