垃圾“程序是怎樣煉成的”——關於《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()函數並不是次品,而是廢品。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM