并且按照从大到小的方式把它排列起来
第二:输出其中的偶数, 并按照从小到大的方式给它排列起来。
说到这儿,可能有的同学已经注意到了,我给的这个例题,还跟作业题不是完全雷同的。
作业题呢是说,都是从大到小的方式。
我在这儿做了一个小的变化,奇数呢从大到小排,偶数呢从小到大排。
大家想像一下这个题目应该怎么做呢? 如果不是让你来抄写这个程序,
而是让你设计一个程序,你应该怎么做呢,在这儿我特别想
阐明一点,我现在虽然不要求你一下子能写出一个正确的程序来,
但是我真的希望你啊能够想象一下这个程序会是什么样的。
也许一些细节我还太会写, 但是整个的这个程序我能想像的出来是怎么让它去做的。
比方说对于这个题,我们不需要搞什么特殊的算法,
我们就用最平实的办法去解决就可以了。
首先,给了我们十个数,我们必须要把这个十个数先读进来,放到一个数组里头,
肯定是我们要做的第一步。 放好了以后,接下来刚好用上刚才我们给大家讲过的那道题,
把奇数和偶数给它区分开。
奇数呢放到一个数组里头,偶数呢再放到另外一个数组里头,放好两个数组,
那么接下来就更明确了,既然奇数和偶数都拆分开了。那我就分别对奇数的数组
和偶数的数组再进行排序。排完序以后,
我再按照你所要求的方式去把所有的数打印出来。
是不是这么一个过程啊。那如果我们用刚才的那种方式把
我们的这个思路给它表达下来,那个思路就长成这样子。
一路的箭头。第一步,输入待排序的数据;
第二步,把奇数和偶数拆分开;第三步,对奇数组进行从大到小的排序;
第四步,对偶数组进行从小到大的排序;第五步
输出奇数组;那么第六步,输出偶数组。是不是这么来进行的?
所以说呢,整个的这个步骤,在我们脑子里边非常的清楚。有的同学说哎呀我也知道是这么做,
但是这些细节我写不了, 我现在这个阶段我写不了什么奇偶分组,什么从大到小的排序。我写不了。
没关系,现在这个阶段你写不了没关系。你能想得到这样第一个结构,
我就已经非常高兴了,具体的程序写不了,我们可以,可以去抄程序。
所以在现阶段我们设计的作业呢,都是给大家去抄写程序,
没有一定要求你一定要把这个程序独立的正确的把它写出来。
关键的,是一定要养成这种思维的这种方式。
这是一个抽象程度比较高的思路,
其中的每一小步,都有可能是刚才我们做过的一个题目。比方说,奇偶数分组。
那么奇偶数分组呢我们刚才也给了一个这样的算法。 然后再说这个排序,你看,这个小的步骤里头,
就包含了这么一些小的程序,
这个小的步骤里头包含了这样一些程序。
你看我们去思考这个题目的解决方案的时候,我们总是先从一个抽象程度比较高的地方开始去想,
我们先不去管这些细节,甚至于我们可以把这个题目交给好几个人去做,
有一个人负责总体设计,我就设计一二三四五六,六步。
然后呢,第二部,交给一个同学去做,
第三步和第四步交给另外一个同学去做。我就可以把它组合成一个
大的程序。有了这样一个构想以后,
我们就来看一下这个题目具体的程序。这个程序写的非常的有特点。
虽然这个程序非常长,但是刚才啊我跟大家说过, 我说这是一个优秀的程序,我为什么这么讲呢,我们来观察一下。
我们来看一下这个程序是怎么做的。首先, 先把数据输入进来,这是刚才我们说的第一步。
然后呢,对奇数和偶数进行一个分组,这是刚才我们说的第二步;
再往下,先对奇数进行排序,
这是我们说的第三步;再对偶数进行排序,
这是第四步;然后呢,输出奇数组,
这是第五步;最后输出偶数组这是第六步。
看到这个程序了吗,这个程序非常的清楚。这是第一点我喜欢它的地方。它的结构
非常非常的清楚,我喜欢它的第二点,
更重要,这个程序有一个非常非常好的特性。
什么样的特性呢?他把每一步的操作,
都写到一个独立的部分里头完成了。
你比方说输入,从这开始,到这结束。这段里头就解决完了输入的事情。在这段程序里头我不做其他的事情。
再看第二段,从这开始,到这结束。我就解决完了
奇偶数分组的事情。在这样一段程序里头,除了奇偶数分组的事情,其他的事情我也不做,
专注做好这一件事情,我们再往后看第三个。
第三个呢,这部分里头我只负责对奇数组进行由大到小的排序,
只做这一件事情,其他的事情不做。这个范围是从这到这。再看第四,
从这到这,这个范围里头,我只做,对偶数数组进行排序的事情,其他的事情也不做。
那么第五第六段也是,在这只输出奇数组,
在这只输出偶数组,其他的事情一概不做。
这样做有什么好处呢?大家看这个程序。
在写程序的时候,我们总担心程序会出错。
我们看,观察一下这个程序。要想验证这个程序里头有没有错误,
或者是说我想确认,哪一步出现了错误,对于这个程序而言,非常好确认。
比方说,输入。在输入完了之后我就可以在这加一个断点,
或者插入一行程序,把当前的数组里面这个结果打印出来,看看我输入有没有错误。
这是第一个。第二个,在完成了奇偶分组以后,
我也可以插入一段代码或者是插入一个断点,把奇数组和偶数组
分别打印出来,看看我分组有没有问题。
如果分组没有问题,OK,接着往下再进行。
在奇数组排序结束以后,我照样可以看一下,到底是这个过程有没有错。
偶数组排序完了,再看一下有没有错。
也就是说,也就是说整个这个程序可以被拆分成一块一块一块的。
块与块之间没有过多的联系,
每一块都完成一个独立的任务。
所以说,这个程序是一个结构性非常好的程序。
我们非常乐于见到这样的程序。
通过这个程序我们可以感受到 结构化设计所带来的好处。
好,那么借着这个程序呢,我们来总结一下, 通过这个程序我们可以感受一些怎么样的思想。
首先啊,我们能够体会到,写程序,
是一个由大到小由粗到精由抽象到具体的
这么一个过程。就是说,从你分析问题到写出程序,
是按照这样一个过程来进行的。其次,对于程序的结构而言,我们可以
感受到,好的程序是由若干个模块来构成的。
也就是说你写的程序最好能够被清晰的拆分成
很多个模块,而且呢这些模块之间应该满足这样一种关系。
就是说,模块之内,应该是高内聚的;模块之间应该是低耦合的。
什么叫做高内聚呢?刚才这个程序就是一个最好的例子。
所谓高内聚就是这个模块我只干这个事情,不干别的,
功能单一,这是关于高内聚的一个非常好的例子。
那么模块之间应该低耦合。什么叫低耦合呢?
就是说当一个模块被改动的时候,
它只会影响它自己,而不会影响其他的模块。
像刚才我们的这个程序,也是这样的。当一个模块被改动的时候,不会因为这个模块错了下面的程序也接着错,
不会造成这个结果。 这就是高内聚低耦合。
其实啊,我们在这里讲的,就是结构化程序设计的基本思想。
这就是我们希望向大家传达的这种思想,
也是我们让大家去抄写这个程序的原因。OK,那么这个例子呢我们就
讲到这。我们希望啊,
同学们能在课下,勤加练习,还是那句话,多做简单的题。
大家通过刚才这个例子就可以看得到了,其实复杂的题目
都是由简单的题目来构成的,所以说做好了简单题你才有可能
去做复杂的题。如果简单的题做不好,等到接触到了复杂问题,你就没有
办法处理了。所以说一定要多做简单题。OK,我们的课