第七回 孩童落水大石砸开,司马光为么钻牛角尖

本回重点说明:必要的时候要拐弯。人生不总是直路。编程的路上也是这样,所以有了分支。世界上万事万物解决的方法不一定是一种,真正要处理问题,也不可能将他们都分成一个个的小问题然后解决。那怎么办呢?所以除了顺序结构的语句外,语言中提供了分支语句,有了他们,我们就可在探索中前进了。
工作不总是一成不变的,只要经过一二三四五等等的顺序就能完成,有时还有某些坎坷。可能的发展方向有好多,我们只能根据相应的条件来选择怎样向下工作。
对于一个问题,判断它是通过顺序的方式还是用分支的方式来解决,就要先看一下这个问题的特点,将来得到的结果是只有一套方案,还是有多套,是从多套中选择一种,还是从多套中选择多种。

前面曾说到西方著名画家达芬奇,其传奇的鸡蛋和传神的妙作千百年来令人们浮想连翩。下面,我们再节到古中国,去见识一位传奇人物:他就是司马光。司马光最生动的故事是:砸缸。但在故事的背后,令人未想到的是,一块石头竟然改变了一个孩子的一生。

2.7.1 P7司马光的石头

enter image description here

图2.7.1 司马光由“石”而慨

 司马光(1019—1086年),字君实,世称涑水先生,北宋陕州(今山西夏县)人,是中国古代著名的历史学家,他经过19年的不懈努力,终于在1084年完成了《资治通鉴》的通史巨著。《资治通鉴》是中国历史上第一部编年体通史,记述了一千三百六十二年的丰富历史史实,全书计二百九十四卷。司马光在编修《资治通鉴》的十九年中,付出了巨大的劳动,特别是在洛阳的十五年里,几乎付出了他全部的精力和心血。他家房子低矮窄小,夏天闷热难堪,洒下的汗珠把书稿都浸湿了。后来,他请匠人在书房里挖了一个大深坑,砌上砖,修成一间“地下室”,他就在这个冬暖夏凉的地方,专心致志地埋头编书。

但在人们心中流传最久的故事,不是他的《资治通鉴》和写书的故事,而是他儿时发生的一个小故事。正是这场偶然的事件,使得他从一位开明人士转而成为保守派领袖,顽固地坚持“祖宗之法不可变”的教条。

故事是这样的,有一次,司马光和小朋友们一起玩,其中一个小孩不小心掉进盛满水的大缸里,司马光急中生智,拾起一块石头将缸砸破。这本来是件见义勇为的好事,没想到,由此引发了以下N种后果。
损坏东西当然要赔,司马光故意砸破人家的缸,人家当然不干,司马光不得不乖乖地照价赔偿。

缸砸破后,缸里的小孩得救了,却被缸的断碴儿划破了胳膊,人家父母找上门来,要求司马光承担医疗费、误工费、精神损失费等。理由很简单,也很充分,他若不砸缸,人家小孩能被划伤吗?
  司马光砸缸一举成名,招致一些未谙世事的孩子纷纷效仿,造成村子里许多缸被无端砸破,其中也包括司马光家的缸。

司马光砸缸发出的声音,触动了一位前卫音乐家的灵感,他谱写了一首曲子,其最高潮时就是砸缸发出的声响,后来该曲获奖,却不给司马光任何报酬,司马光从此踏上漫长的版权诉讼之路。

此缸乃千年古董,属于国家一级文物。司马光以破坏文物罪被提起公诉,追究法律责任。   司马光砸了缸不久,附近便有一家失火了,本来火不大,有点水就可浇灭,可附近惟一的水缸被司马光砸破了,结果火势蔓延,越烧越大,烧掉了半个村子,司马光遭到众人的一致谴责。   当时,周围有那么多小孩都不去砸缸,惟独司马光去砸,别人都说他不正常,父母将他送到精神病院检查 。 ……

当有记者后来采访司马光时,他的话很发人深省:在拿那两块石头中的一块时,我做了0.001秒的思想斗争!但就是这块石头,却深深地改变了我的一生!
我们的问题是:当时在司马光面前两块外表差不多重量却不同的石头,他想选一块最重的,他究竟应该选哪一块呢?

2.7.2 五步积木法解题:

第一步:三积木
这是最简陋一个图形(如图1),也是最基本的一步。

enter image description here

图1

enter image description here
图2
第二步:做头尾 上面的三部分,先分析开头和结尾部分,开头是什么呢?题中的已知条件,是两块石头,我们用a和b来表示。结尾是什么呢?因为是最重的,无非两种选择,要么a,要么b。这是以前不曾出现过的结果,先写上,后面慢慢理论。

enter image description here

图3
enter image description here
图4

第三步:连头尾
如何将开头和结尾连接起来呢?也就是建立a和“输出a或者b”的关系,通过以前的办法,显然是行不通的,以前的所有方法有个特点,直肠子,不需要拐弯,现在结果中最要命的地方是有弯?怎么办呢,这就是本节的新知识,引入一种全新的结构,分支结构,又叫选择结构,其特点是两种情况最终只有一种情况出现,其N-S图如图3中间所示,问题分成了三部分:1和2放两种方案,3则是分成1,2方案的分类依据或标准,符合3,则执行1方案,否则,执行2方案。下面就可以一部分一部分地完成本题了。
1中是输出a,2中则是输出b,如何分出来的呢?因为是决定轻重,只要比较一下二者大小也就有了,所以要用a>b(如图4示) 。
这样看似可以了,但我们细看一下,本来在结尾处干的工作我们在处理过程的分支中就解决了,所以最下面的部分可以舍弃掉了。

第四步:贴语法
下面我们还用QBASIC语言来解这个题目。第三步图中的各个语句和具体语言的语法还有一定的差距,根据相应语言,还要再行将相应语句转化。本题中主要是输入和输出,(如图5示)。

enter image description here 图5

第五步:写代码
下面可以很简单地写代码了,但再照着图原封不动地抄上,却行不通了,怎么办呢?先将下面的分支做为一个大部分,程序就分成了两部分,上面的原封不动,下面还必须用我们的分支结构语句:
if 条件 then
符合条件成立部分
else
符合条件成立部分
endif

所以代码如下:

input a,b
if a>b then
print a
else
print b
endif
(上程序在Qbasic下调试通过)

enter image description here

图2.7.2 Scratch积木程序

2.7.3 阿兰开讲

程序演义到现在,开始出现有意思的地方了:思路终于可以发生转变了!馒头可以引发一场血案,石头竟能改变一个人的一生!思路转变的过程看似这么不可捉摸,但我们却更要在这种不可捉摸中逮住它。
和前面的情况不同的是,我们现在遇到的编程问题,是多种情况下,将来只出现一种,而以前的各种版本有多种情况,也有一种情况,但无一例外地是都要求出结果,正因为这点不同,导致了我们编程思路的巨大改变!
阿兰告诉大家的是:司马光石头给我们的正是这样一种打破传统的精神,遇事不慌,遇事不要老是局限于以前的老例,要针对具体的新情况,解决新问题。
后面我们还将奉献上这样一些有意思的题目,如果石头还是两块,大小都要看看,或者石头成了三块,会发生什么后果呢?欲知后事如何,且听下节分解。

2.7.4 小测验

焚香计时
有两根不均匀的香,香点燃后烧完刚好一小时,您能用什么办法来确定45分钟吗?

小测验参考答案:
我们经常想的办法是截断法,但由于不均匀,此路不通了。那香还有什么不一样的地方呢?从点燃香的方法来看,一般情况下,我们是从一头开始,并且只点一头,从一头燃烧是一小时,思路一转,如果从两头点燃呢?每支香会用半小时。有了这样的思路,将两支香中一支点燃一头,另一支点燃两头,等点两头的香烧尽时,再将燃一头的香的那一头点上,45分钟就有了。