zoukankan      html  css  js  c++  java
  • 垃圾“程序是怎样炼成的”——关于《C程序设计伴侣》第A章(二)

    前文链接:http://www.cnblogs.com/pmer/archive/2012/12/10/2812205.html

    【样本】

        ——陈良乔 ,《C程序设计伴侣》,人民邮电出版社,2012年10月,p277

    【评析】

      既然已经废了很大的劲把文件内容读入了数组,现在总该统计词频了吧?然而不是,居然还要“清理文本”。如何清理文本呢?竟然是“删除文本内容中的无效字符”,“例如单词之后的标点符号等”。我勒个去!这就等于说,想要统计关键词在文章中的词频,不但要先把文章背下来,还要再把标点符号忘掉才行。

    【样本】

        ——陈良乔 ,《C程序设计伴侣》,人民邮电出版社,2012年10月,p277

    【评析】

      while(i<strlen(text))

    明显是外行似是而非的写法。因为这意味着多次调用strlen()函数。然而由于在循环体内并没有改变字符串长度,所以多次调用既低效又无意义。这是一种典型的谭氏写法。虽说,有的编译器对此会做优化处理,但是一个程序员自己写出低能愚蠢的代码而把效率寄托于编译器的聪明是说不过去的。况且,这种优化并非编译器的义务,编译器对此也可能不优化。
      从while(i<strlen(text))以及“清理文本”的做法不难看出,作者压根就没有读过K&R。如果读过的话,应该至少会写while(text[i]!='\0'),而且也不会费九牛二虎之力去“清理文本”。但是可笑的是作者在后面一章一本正经装模作样地向读者介绍、推荐K&R,这也太能装了吧。顺便说一句,该章后面对K&R的介绍是从豆瓣上相关介绍复制粘贴而来的,但这本书既没有列出参考文献,而且居然是“图灵原创”的“陈良乔著”。

    【样本】

    ——陈良乔 ,《C程序设计伴侣》,人民邮电出版社,2012年10月,p277

    【评析】

      “清理后”,居然还不肯统计单词,还要把“单词切分出来”。很明显这不是由于架子太大而摆谱,而是因为作者根本不具备写程序的基本能力。这点在下面代码中很容易得到证实。

    【样本】

    ——陈良乔 ,《C程序设计伴侣》,人民邮电出版社,2012年10月,p277~278

     

    【评析】

      代码中

      bool continchar = false ;
    定义了一个标志变量,远远地就能闻到一股馊味儿。这种写法多半是从谭浩强的书中学来的。无法从整体上把握程序、写代码时到处打补丁的人特别喜欢用这种标志变量。
      int i = 0 ;
      int w = 0 ;
      除了笨拙、啰嗦,没有其他更恰当的形容词。同时表明作者不懂得怎样使用指针。
      while(i<strlen(text))
      参见前面一段的评析。
      if((' ' == text[i])||( '\n' == text[i]))
    中的“||( '\n' == text[i])”是很无聊的画蛇添足,因为在前面“清理文本”部分早就把'\n'清理掉了。在执行cutword()函数时字符串中根本不存在'\n'这种字符。
      代码中最严重的问题是
      word[w] = text[i];
      因为word的长度是有限的,text中的单词超过word数组长度时,程序会发生严重错误。
      这个错误是致命的缺陷,归根到底是因为
      char * cutword(char *text,char *word)

    的设计错误,这里缺少一个word相关数组尺寸的参数。这就是所谓的接口设计错误,打个通俗的比方,就如同生产三相电源插头,但产品只有两只脚一样。因此,这个cutword()函数并不是次品,而是废品。

  • 相关阅读:
    HDU
    POJ
    POJ
    POJ
    POJ
    POJ
    POJ
    SPFA算法——最短路径
    POJ1251 Jungle Roads Kruskal+scanf输入小技巧
    MongoDB--关于数据库及选择MongoDB的原因
  • 原文地址:https://www.cnblogs.com/pmer/p/2815300.html
Copyright © 2011-2022 走看看