各位同学大家好,我们开始今天的课程。
今天的主题叫做:从现实问题到计算机程序。
那么,首先咱们明确一下咱们所处的学习阶段,
我们现在还处在感性认识C++程序的这个阶段。
也就是说在这个阶段,我仍然不要求大家, 自己能够独立的写出正确的C++程序来,
仍然不要求。我只希望你对C++程序有一个比较好的感性认识
就可以了。 那么这一次课,我们来讨论这么一个话题,
就是当你面临一个现实问题的时候,比方说,
我给你出了一道题,
那怎么从这个现实问题找到相应的计算机程序呢?今天我们来讨论一下这个问题。
上次课我们讲述了这样一件事情,程序
是你告诉计算机的话。也就说如果你想让计算机做什么,
那你就要把要做的事情表达成程序告诉计算机,然后呢让它去执行。
那么这次课我想说什么呢?我想说计算机能起到的作用
也就这么多了。什么意思呢? 计算机其实是一个很笨的执行者。
如果你把要做的事情明明白白的告诉它, 它的确可以按照你的话去执行。
但是如果面对一个问题的时候,你还没有想好怎么去解决这个问题,
它是不可能帮你想到解决问题的这个办法的。
也就是说写程序其实是这样一个过程,
当你面临一个问题的时候,比方说我给你出了一道题,
你首先要找到解决这个问题的办法, 也就是说那个解决方案。
然后才有可能把这个解决方案写成程序让计算机去执行。
也就是说当你面对一个问题的时候,你必须要先找到解决这个问题的办法,
然后才有可能写出相应的程序来。
如果你找不到这个办法,你是别指望计算机帮你去找这个办法的。
为了让大家有一个直接的感受,
我们来举一个例子说明一下这个问题。这个例子的名字叫做切饼。
那么我们先来看一下这个题目给我们出的问题是什么?
他说假设有一张很大很大的饼, 然后呢给你一把足够长的刀,
要求每次在这个饼上切一刀。问题就是问N刀,
如果你切N刀的话,最多能切出多少块饼?
这就是这个问题。我们来看一下,比方说N等于3,
也就是说问你3刀最多能切出多少块饼?
那我们第一刀横着切,第二刀竖着切,
第三刀呢,为了保证我们能切出更多的块数,
我们需要保证切的第三刀跟前两刀有两个不同的交点,
这样的话我们才能切出更多的块数来。
所以人家的问题是如果切N刀的话能切出多少块饼?
这是这个题的涵义。那请你来想一下怎么去计算呢?
我能不能上来就写个程序说,唉呀,我让计算机帮我来算一下。
我就把这个题目告诉计算机,让计算机去帮我算一下。
我能不能上来就开始写程序呀? 当然不行,因为我还不知道该怎么算呢。
三块的话,我可以数一数一、二、三、四、五、六、七、七块。
那么再多了呢,我就不知道了。
我必须要想到这个解决的办法,然后交给计算机,
它才有可能帮我去计算出来。是不是这个意思呀?
所以说当面临一个问题的时候,我们一定要先去思考它的解决方案。
在这一点上计算机帮不了我们,我们必须要自己去做。
那好我们就来分析一下这道题目,
那怎么分析呢,先看一下,先总结规律,比方说
这是第一刀,我们横着切。 第一刀切完了,我们得到了两块,
第二刀呢,我竖着切。第二刀切完了很明显我们得到了四块。
再看第三刀,刚才说啦,第三刀斜着切,
保证跟前两刀有更多的交点,这样我们才能得到更多的块数。
那第三到切完了有几块呢,我们来数一下,第三刀切完了有
一、二、三、四、五、六、七,
有七块。这似乎有个规律。
你看,第一刀切完了有两块。第二刀切完了有四块。
2+2=4, 第三刀切完了有七块,4+3=7。
按照这个规律的话,如果第四刀切完了,我们应该有11块。
我们来看一下是不是这个规律,
第四刀为了保证有更多的块数,要跟前三刀有不同的交点。
这一刀我们这么切,它跟前三刀确实有不同的交点。我们来数一下是不是11块,一、二、三、四、
五,六、七、八、九、十、十一,的确是11块,也就是说
的确是7+4=11,
这的确是一个规律。利用这个规律我们的确能够计算出来,如果切N刀的话, 能切到多少块?
但是这个规律成立吗?我们必须得想一个办法来证明这个规律。
好,那接下来我们就来证明一下这个问题。
那么,你看,当我们切第三刀的时候,第三刀跟前两刀有两个不同的交点,
这两个不同的交点就把第三刀在这个饼上的这段线段分成了三段,
你看是不是这样啊,分成了三段。 然后呢,每一段线段都把
原来的某一块小饼分成了两块。
比方说这一段把这个小饼分成了两块, 1、2两块,
那么这一小线段呢,把这个分成了两块,
这个也分成了两块。
于是现在的块数就比原来多了这个线段的数目,有几个线段就多了几块。
我们在来看切四刀的时候,切四刀的时候,
这第四刀切下去跟前三刀有三个交点,
然后呢它把这个线段切成了四段,1、2、3、4,这四段呢,
新切出来4块小饼。
也就是说,那么第几刀切下去,这条新的线就被原来的线分成了几块。
然后呢这个饼的块数也就增加了几块。
这完全符合刚才我们所给出来的这个规律。
如果把这个规律写出来就应该是这样的,
q表示当前的块数,括号里面的这个值表示当前的刀数,
也就是说如果我们不切的话,那么当然就是一块大饼。
那么如果切一刀,我们得到了两块,切两刀就在原来的块数上增加了2块得到四块。
那么如果切三刀呢, 就在原来的块数上增加了三,
切四刀的话就在原来的块数上增加了4,
得到11。
如果切第N刀的时候,那么我就在N-1刀的基础上增加了N块, 这就是我们得到的那个解决方案,
这就是那个解决方案。
那么这个解决方案是不可能靠计算机帮我们想出来的。
讲到这我特别想跟大家分享这样一个感受,
什么感受呢,当你面临一个问题的时候,比方说一道题目,
如果你还没有想出来解决这个题目的这个解决方案,
请你千万不要着急动手去写这个程序。 那为什么不要这样做呢?
在这我列举三点原因。第一点,很明显,
如果你还没有想到这个解决方案,你是不可能写出程序来的。
第二点,急着去写程序很有可能会限制你的思维,
从而使你找不到带有创新性的解决方案。
第三,如果没有想好这个解决方案就去写程序,
那么势必你会对这个程序改来改去,改来改去,
这个改来改去的写程序很容易造成程序结构的混乱,
很容易引入更多的错误。这一点是在软件工程领域被充分的证明过的。
也就是说啊,当你在面对一个问题的时候,如果你还没有想到一个相应的解决方案,
你千万不要着急动手去写那个程序。 请你把那个写程序的事先搁到一边,
先放开手脚去寻找那个解决方案。
这就是特别想跟大家分享的。