第一桶 从C到C++ 第四碗 陈老C教研室论道 潘小P书桌前练功

      "呵呵,算你小子有良心。"老C心满意足的摸着肚子。
      "嗯,嗯。"小P有一搭没一搭的回答着,一边数着自己的钱包。
      "哈哈,别难过了,下回我请你,还去这家。那个酱骨头味道还真是不错啊。"老C承诺道。
      "哦~哦~,我看你是没有吃到刀削面怀恨在心吧,k,好像你饿了一个星期一样,没见过这样吃肉的。"小P很是伤心。
      "哈哈,说好了下回我请你的……"
      "我没有你吃得多……"小P有些郁闷。
      "嗯,我们先把饭量问题放一边,我来帮你装eclipse和CDT吧。"老C开始转移话题。
      "对了对了,正事都快忘了。"
      感谢教育网的网速和老C的帮助,小P很快装好了eclipse,在老C的指导下写了一个Hello world,算是正式上路了。
      "我们以后都要这样开始,"老C不知道从哪里摸出一副眼镜架在鼻子上,"一个问题,一段代码。问题就像正式项目中的需求,而代码就像我们正式的产品。在从需求到产品的过程中,我们会明白C++的哪些技术是因为哪种需求而产生的,这样以后你遇到类似的问题时,就会使用正确的方法或者技术去解决问题了。"老C扶了扶眼镜,"不过在此之前……我要去喝点茶……,好了好了,开玩笑的。不过我真的要问一个很严肃的问题,你考试成绩那么好,是不是分析问题,解决问题的能力就真的那么好呢?"
      "那是自然,我的排名可是不低的呢。"
      "好吧,我想问问你什么是分析问题,解决问题的能力?"
      "多做题,能力自然就上来啦。当我在考试时遇到一个问题,我会想做过的类似的习题或者例题,然后采用同样的方法再做一遍啊。"
      "那么要是从来没有做过的类型呢?"
      "不可能,我复习的时候是很认真的。"
      "……那么你遇到陌生的问题怎么办?"
      "分析喽……"
      "算了,看来你真是实实在在的经验主义啊。"
      "那你说什么是分析问题,解决问题的能力?"
      "就我的感觉,分析问题其实是对问题归类。因为在现实生活中,我们其实不用发明什么解决问题的方法,因为那么多科学家、牛人和前辈已经把解决问题的方法放到那里了,我们只是要找到这个方法而已……"老C开始口喷漠漠,“比如你解微分方程,就要看是常系数还是变系数,是齐次还是非齐次,等等,如果你将方程归入某一类,那么解法也就顺其自然了,关键是你要归类正确,然后你就站在巨人肩膀上了。"
      "哦?听你一说,我感觉我做题的时候的确是要仔细阅读题目,看看它是想考察哪一类问题或方面的……那么所谓解决问题的能力你认为是什么呢?"
      "我觉得所谓解决问题的能力是对细节的理解和掌握程度,细节理解得越透彻,解决问题的能力越强。同时如果你细节理解得越明白,越容易掌握此类问题的根本。"
      "哦?说来听听。"
      "比如让你来求解一个函数的最值问题,你会怎么做?"
      "这 个难不倒我,”小P很是自信,“我数学可不赖的。我需要先对函数求一阶导数,找到它的拐点,然后求二阶倒数,看它在拐点上是上凹还是下凹,来判断这些 拐点处的数值是极大值还是极小值;如果函数在所求范围内没有极点,那么我会判断它是单调增还是单调减函数,然后看函数在所求范围的边界是否连续,边界范围 是否可达;最后不要忘了函数的非连续点,因为非连续点上函数不可导,所以要单独看看。"小P想了想,"哦,如果函数处处不可导而处处连续的话,或者根本就处处不连续,那么就要靠人品构造一些函数,运用夹逼法则,但是一般不会这么bt的。当求出以上所有点后,比较一下,最大的就是最大值,最小的就是最小值。"
      "……佩服佩服,"老C鼓掌,“怪不得你的成绩好,看来你是很下功夫的。不错,这些就是对细节的了解,说明起码你 在这个方面解决问题的能力很强!看,你了解求导的前提是要连续,而且了解导数为零的地方是函数的拐点,并且也了解到有可能函数在拐点处不可导,同时你还根 据环境对函数进行了正确的分类:处处可导,处处连续但非处处可导,处处连续处处不可导和非处处连续以及处处不连续,然后根据这些分类、足够充分的细节,良 好的解决了这个问题。"
      "呵呵,是啊,但是这个和C++有什么关系?"
      "有关系,”老C肯定的说,“ 与做高数题目是一样的道理,我们在做C++编码时,首先要注意问题发生的环境——也就是上下文,我们需要根据问题所处的环境与需求对问题分类,这需要我们 收集足够多的信息;然后根据这类问题一般的解决通法列出解决此类问题的方案,再根据具体需求和上下文在方案中挑选,或者对此方案进行修改以满足具体需求, 在这里我们需要关注足够的细节,才可以采纳较优的方案;最后根据需求进行评审,寻找是否还有更好的方案。这只是开发的一般步骤,在具体开发中这些活动是迭 代进行的,从需求分析到代码实现,这些活动重复的出现在软件开发的各个阶段——但是我们得首先解决的问题是,你先要知道可能的分类有哪些,然后再根据所处 的环境和需求,去逆向思维,寻找解决之道。综合起来讲,解决问题的方法就是一般逆向思维的方法,而逆向思维总是靠猜测和试验的,至于猜得好不好或者试验的 对不对,就要靠经验了,如果你的经验够丰富,能够根据逆向思维的结果总结出来一套方法,顺着这个方法你总可以找到正确的问题分类——那么恭喜你,你离大师 也不远了。你看看,是否和解决生活中其他技术问题的方法是一样的呢?”
     “好像是的,感觉如果不是创造性的活动的话,还真是这样的,不过就算是创造性活动或者科研活动,也需要对问题进行分类,然后研究看看前人都做了哪些成就可以借鉴的。”小P点点头。
     “好了,形而上的东西我们就聊这么多,现在看看形而下的东西。”老C从旁边拉过白板,在上面画了一个圆,在顺时针方向标上了箭头,并在旁边写下“谁是最后一个幸运儿?”“这是一个很常见的问题,可能出现在各大招聘笔试题目中。”
     “哦?”
     “话说有一帮倒霉孩子——嗯,有20个吧——排排坐,吃果果,但是由于资源匮乏,金融危机等原因,很不幸——只有一个果果。那么这个果果分给谁呢?老师决 定,把他们排成一个圆圈,按顺时针方向标号,12点钟的小朋友是1号,以此类推。然后从1号小朋友开始,依次报数,数到……嗯……7的小朋友就被踢出队 伍,下一个小朋友接着从1开始数,直到队伍中有且仅有一个小朋友。请问,如果你在这个队伍中,你会挑选几号坐位,从而吃到果果呢?”老C停了一下,“你现 在也装好了eclipse,正好可以练练,一开始先用C写吧,然后我们再谈论C++的解决之道。我刚才吃得有点多,得去喝点茶……”于是留下小P一个人, 拿着茶杯出门接开水去了。
     “嗯,这个问题不是很难,”小C自言自语,“我只要有一个循环队列就可以解决了……”他先是在一张纸上画了一个圆圈,并安排了5个小朋友玩这个游戏,试了两下,觉得自己理解的差不多了,就开始在键盘上扣扣扣扣的敲代码……
     老C回来后看到小P正在忙,也没有打扰他。他一边吹气一边慢慢喝完杯子里的水,顺便在起点上看了几篇yy的穿越水文,估摸着小P差不多了,转过椅子问:“怎么样?差不多了吧?”
     “等等,还有一个问题……好了好了,最后一个留下的是2号小朋友。”
     “你确认?”
     “等等我还得再看看……”小P又是一番手忙脚乱,“好吧,我基本确定是2号小朋友……”
     “?”老C很是好奇,“为什么是基本上?”
     “因为……这个……我还需要一段调试时间才可以确定……”
     “算了,我们来直接看看代码好了。”
     “好啊,写得不好请多批评。”小P假装谦虚道,心想自己的代码应当还是不错的。
     “是这个a.c文件吗?”
     “是的是的,呵呵。”
     老C于是做到小P旁边review他的代码。

#include <stdio.h>
 
void main()
{
int a[20];
 int  b;
 int m;
 int k;
  int   N=20;
    for(m=0;m<20;++m){
     a[m]=1;}

    m= 0;
    b =1;
    while(N>1)
    {  if(a[m]!=0)
        {
            if (b==7){
             a[m] = 0;
              --N;
               if (N==1)
                {break;
                }
                b=1;
            }
          else{
           ++b;
            }
        }
        ++m;
        m%=20;
    }

    for(k=0;k<20;++k){
     if (a[k]==1)
     {break;}
       }
    ++k;
    printf("%d\n", k);
}
    
     “我看不懂……”老C才看了30秒就决定放弃了。
     “不会吧,我觉得我写得逻辑性还挺清楚的啊。”小P有些得意老C看不懂他写的代码,觉得
可能自己写的逻辑过于高深了。
     “……”老C沉默了半分钟,“这个不是C代码!”他肯定的说道,“所以我看不懂,也不想看懂。”
     “?”小P有些奇怪,“这明明就是C语言写的代码啊,你看,我来给你解释解释……”
     “哦,算了,这些根本不是C代码,我没有必要看懂。”
     “那你说这些是什么?”小P有些不高兴了。
     “这些是……”老C找着合适的形容词汇,“这些是猫爬过屏幕的脚印,我没有必要看懂脚印所代表的含义……”看到小P有些惊愕,然后开始有些生气,逐渐开始 恼羞成怒了,老C赶快对他说:“呵呵,别生气了,我开玩笑的,不过,”老C的语气严肃起来,“这些的确是很糟糕的代码,哪怕它的算法多么高效,执行效率多 么高,它都是糟糕的代码!”
     “为什么?”从来没有人说过小P的代码糟糕,听了老C的评论他觉得一时无法接受。
     “我们先不评论代码正确与否,单单是它的格式和缩进……”老P用鼠标在代码上划来划去,“就无法让人提起评审它的欲望。”老C真诚的看着小P,“你一定没有参加过比较大型的,3、5个人合作开发的项目吧?”
     “是啊,学校里面哪里来的机会?”
     “唉,所以说教育失败啊。”老C有些感慨,“即使没有参加过项目,基本的规范性的东西学校还是要教的啊,算了,这个不是你的错,是老师的错,是学校的错。”
     “嗯……”听到老C说不是自己的错误,小P开始平静下来。
     “言之无文,行而不远,是什么意思?”老C问道。
     “就是说如果一篇文章不够优美,那么它就流传不广。”小P还是比较油菜的。
     “是啊,代码也是一样的啊。如果它的格式有问题,大家不喜欢看,也就没有人维护,这样的代码很快会被替换掉,哪怕它背后闪烁着照耀银河系的智慧的光芒!”
     “是吗?”小P有些不相信。
     “好吧,我们试试,”老C决定不要再
打击可怜的孩子了,“我们把这个代码放一段时间——就一个星期吧——反正我们这周有两个讲座要听,等到周末的时候你再讲讲你的代码,如何?”
     “没有问题,就10几行代码么,我就不相信我记不住!”小P有些和老C对上了。

(to be continued...)













































posted on 2009-01-20 00:05 Anderson 阅读(2077) 评论(5)  编辑 收藏 引用

评论

# re: 第一桶 从C到C++ 第四碗 陈老C教研室论道 潘小P书桌前练功 2009-01-20 09:37 Smile

eclipse的ctrl+shift+F,代码格式化一下就好看多了  回复  更多评论   

# re: 第一桶 从C到C++ 第四碗 陈老C教研室论道 潘小P书桌前练功 2009-01-20 12:15 zwp

c风格也需要一些具有明确责任的抽象过程。而这里显然是一锅粥,几乎木有任何可重用性和可读性。
而c++则是一些具有能够保存状态进而拥有更高层抽象的实体。可以说c++会在最终机器码和需求之间比c更多一个抽象层。  回复  更多评论   

# re: 第一桶 从C到C++ 第四碗 陈老C教研室论道 潘小P书桌前练功[未登录] 2009-01-20 12:40 Anderson

@zwp
没错,您是内行!的确就算用C也可以写出具有明确责任和抽象的代码……这与我们使用的语言没有关系,而和我们的思考问题的方式有关,就算用汇编也可以写出很清晰的代码……语言提供的帮助不过是简化了这一过程而已。
老C会在以下几方面对代码进行评审:
1. 格式。
2. 规范性,包括命名,大小写等等。
3. 抽象与复用。  回复  更多评论   

# re: 第一桶 从C到C++ 第四碗 陈老C教研室论道 潘小P书桌前练功 2009-02-19 12:37 func

"“我看不懂……”老P才看了30秒就决定放弃了。"

错了,应该是“老C”  回复  更多评论   

# re: 第一桶 从C到C++ 第四碗 陈老C教研室论道 潘小P书桌前练功 2009-02-19 21:26 Anderson

@func
谢谢,已经修正  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2024年3月>
252627282912
3456789
10111213141516
17181920212223
24252627282930
31123456

导航

统计

常用链接

留言簿(6)

随笔档案(21)

文章档案(1)

搜索

最新评论

阅读排行榜

评论排行榜