这次更新的周期实在是有点长了,主要是最近真的很忙,一边上课做单片机实验,一边ACM训练,一边帮论坛做手册,一边还在写着自己的书。
通过上次和一位学长的交流,我觉得还是有必要把主函数返回类型改为整型。的确,在有标准存在的情况下,不符合标准的教材就是不合格的产品,所以,无论如何应该贯彻这个标准。于是我把所有的主函数全都改为返回整型了。如有疏漏或写的不自然之处,欢迎来提建议!
本册更新的主要内容是如何编写程序,我从算、找、实现功能三方面作为分类,讲述如何解决问题,编写程序,并在“算法时间”中,指出了掌握好这三者的核心。接下来稍微介绍了一下驱动测试的程序设计,其实这也是偶然的机会在编译原理课上和别的同学讨论看到的,我觉得这种主导思想和我自己的想法很符合,而且很多时候我也是用类似与这样的方法来做一个程序的,所以也拿出来提一下。最后讲了递归,其实我自己并不爱好递归,平时也不经常使用,虽然也用来写过程序。我想主要是要交待一个调用函数的机制,这对了解高级语言和对以后数据结构的学习有好处。
本次内容节选:
当我们遇到一个问题,它往往不是一个直接用程序代码描述的问题,比如:统计销售量和利润,寻找出行的公交线路,将中文翻译成英语等等。所以我们先要把实际问题转化成一个电脑能够解决的问题,而大多数问题一般分为三类:
(1)算:计算利润,计算一元二次方程的根,计算一个数列的和等等。
(2)找:找最大的一个数,找最短的一条路径,找一个字符串的位置等等。
(3)实现功能:实现撤销、重做的功能,实现模拟某种操作的功能等等。有时候实现功能问题可以拆解为若干个“算”和“找”的问题。
大家以前可能有过这样的经历:如果做一份练习卷,是做一道题目核对一次答案的正确率高,还是做完所有题目再核对答案的正确率高?一般来说是前者。造成这种结果的原因有二:如果所做的每道题都是正确的,那么无疑给解答后面的题目增加了信心;如果某道题做错了,那么立刻就能发现问题,并且保证在之后不会再犯同类的错误。
我们开发程序,就如同是做一份练习卷。传统的开发方式是等到整个程序完成后再进行测试,这给开发者的心理带来阴影,也给查找问题的症结带来了麻烦。而如果每做完一个功能模块就测试一次,则可以在小范围内找到问题所在。在积累经验的同时也给自己增加了信心。
以上只是测试驱动程序开发的一种主导思想,在我们编写程序的时候值得借鉴采纳。
可通过递归解决的问题往往能够转化为若干个解决步骤,并且第n步和第n+1步有着类似或相同的限制条件。比如一个数列的递推公式:
an=3an-1+2,an-1=3an-2+2,an-2=3an-3+2,……,a1=3a0+2,a0=1,它的相邻两项有着相同的关系,即求第n项和第n+1项有着相同的方法。唯一的不同就是a0=1,我们把这种与众不同的方法称为递归出口,不断调用函数的递归将在那里终止。