第二章 算法——程序的灵魂_C语言程序设计书评-查字典图书网
查字典图书网
当前位置: 查字典 > 图书网 > 科技 > C语言程序设计 > 第二章 算法——程序的灵魂
薛非 C语言程序设计 的书评 发表时间:2010-10-22 19:10:08

第二章 算法——程序的灵魂

  【第二章 算法——程序的灵魂】
   这一章总的来说就如同阑尾,而且是发炎的阑尾。
   首先映入眼帘让人感到眼前一亮的是
   【著名计算机科学家沃思(Nikiklause Wirth)……】
   又来了。有人做过实验,google Nikiklause Wirth搜来的全是中文网页。不要问我为什么,只有智商约等于0的人才会问这样的问题。
   由此可见,垃圾也是会疯狂地繁殖的。有人总喜欢沾沾自喜地拿“1100万”说事儿, 我倒想问一句,“1100万”个错误是个什么概念,“1100万”堆垃圾又会造成多大的污染。
  对于 Wirth 提出的
   算法+数据结构=程序
   老谭评论道:
   【直到今天,这个公式对于过程化程序来说依然是适用的。】
  
   没有任何理由和依据,而敢于指责大师的公式具有局限性,不能不承认谭大师很有“勇气”。
   接着,老谭提出
   【实际上,一个过程化的程序除了以上两个主要因素之外,还应当采用结构化程序设计方法进行程序设计,并且用某一种计算机语言表示。因此,算法、数据结构、程序设计方法和语言工具4个方面是一个程序设计人员所应具备的知识,在设计一个程序时要综合运用这几方面的知识。】
   感慨:大师总是一针见骨地道出事物的本质;“伪大师”总是点金成铁狗尾续貂并且把水搅混。不妨再续狗尾:小学数学也是“程序设计人员所应具备的知识”。
   【2.1 什么是算法】
   本小节前半部分介绍什么是算法,后半部分讨论了数值算法与非数值算法。主要毛病在后半部分。
   后半部分实际上毫无必要;“数值运算算法”和“非数值运算算法”属于作者闭门造车自创的不规范用语(估计是不怎么读文献所导致);
   【对各种数值运算都有比较成熟的算法可供使用】
  乃极其武断的信口开河,表明作者对数值计算领域惊人的无知。无知不是过错,但对自己无知的领域随心妄断,是对读者的大不敬

【2.2 简单的算法举例】


  这一小节读起来犹如嚼棉花的感觉,只好快些扫过。
 
 【例 2.1】
  …【由于计算机是高速运算的自动机器,实现循环是轻而易举的……】

  脑残是怎样炼成的,这种似是而非的“由于”句型功不可没。“循环”居然是由于“高速”,咄咄怪事。

【例 2.3】
  …【从图2.1可以看出:“其他”这一部分,包括不能被4整除的年份,以及能被4整除,又能被100整除,但不能被400整除的那些年份(如1900 年),它们都是非闰年。】
  敢问大师有没有亲自看过?要是看过的话,我们可就知道什么叫睁着眼睛胡说了
 【例 2.4】
 其中描述的算法必然导致拖泥带水的代码。

【例 2.5】……
【所谓素数(prime),是指除了1和该数本身之外,不能被其他任何整数整除的数】
 厉害!把素数的定义都给改了,数学家们该感到汗颜了吧。
【判断一个数n(n≥3)是否为素数……】
【实际上,n不必被2~n-1的整数除,只须被2~n/2间的整数除即可,甚至只须被2~n之间的整数除既可。例如,判断13是否为素数,只须将13被 2,3除即可,如都除不尽,n必为素数。】
 2~n/2 , 2~n 这两个区间到底哪个大啊?怎么后者竟然成了“甚至” 了呢

  2.3 算法的特性
  ……
  (2)确定性。算法中的每一个步骤都应当是确定的,而不不应当是含糊的、模棱两可的。…… 也就是说,算法的含义应当是唯一的,而不应当产生“歧义性”。所谓“歧义性”,是指可以被理解为两种(或多种)的可能含义。
  】
====================================
用老谭自己的矛攻一下他自己的盾
本章后面的习题
【4-(3)有3个数a,b,c,要求输出其中最大的数。】
这个题目本身是否“含糊”,是否具有“歧义性”?
问题本身就“模棱两可”,又何谈算法的“确定性”呢?

  2.4 怎样表示一个算法
 流程图是用一些图框来表示各种操作。用图形表示算法,直观形象,易于理解。美国国家标准化委员会 ANSI(American National Standard Institute)规定了一些常用的流程图符号(见图2.3),已为世界各国程序工作者普遍采用。
 】
首先ANSI是 American National Standards Institute.
其次,老谭把ANSI搬出来是无知的卖弄。理由是:
这个标准有ISO版本,ANSI采纳了这个ISO标准。而且对应于ISO标准,我国有自己的GB。这些标准的内容是一致的。老谭不谈GB,不谈ISO,却舍近求远地搬出了ANSI,又有什么特殊的理由呢?只能说他自己并不熟悉这些标准及其相互的关系。
而且书中的流程图根本不符合无论是ISO标准还是GB还是ANSI标准,流线乱窜,甚至全书中压根就没有标准用来表示循环的基本图形。
既然连这些标准读都没读过,把ANSI搬出来不是唬人又能是什么呢?
 【 2.三种基本结构
  1966年,Bohra和Jacopini提出了以下3种基本结构,用这3种基本结构作为表示一个良好算法的基本单元。】
首先把Böhm的名字错误地写成了Bohra。
   其次更严重的是Böhm和Jacopini根本就没有提出什么3种基本结构,更没有提出“用这3种基本结构作为表示一个良好算法的基本单元”。3种基本结构在之前的高级语言中普遍存在。
   Böhm和 Jacopini仅仅不很严格地证实了向前的goto语句可以用其他语句实现,他们的论文发表的时候,Dijkstra反对goto语句的论文(1968)还没发表呢
【 2.4.4用N-S流程图表示算法】
N-S图废除了流线,哪里还是什么“流程图”?
事实上通用的说法是Nassi– Shneiderman diagram (NSD)
有什么必要自己创造一个不通的概念呢
【例2.15 ……
图2.31】
图2.31的算法其蠢无比
明明一次循环就可以解决非要用两次循环
明明一个变量就可以解决非要用一个数组
而且那个50基本没有用处
因为可以轻易写出人数为一正整数时的算法

三鹿往奶粉里掺加大量三聚氰胺使婴儿身体受到摧残而被判刑
老谭往教科书里掺加的无知、错误和愚蠢使初学者大脑变残为什么不被判刑?
我看刑法应该参照食品卫生法考虑一下这个问题
在教科书中传播愚蠢败坏民族的智力难道不是犯罪?
【2.4.5 用伪代码表示算法】
两道例题都是用for循环可以很漂亮完成
却莫名其妙的选择了用罗嗦的while循环描述
【2.4.6 用计算机语言表示算法
……用计算机语言表示的算法是计算机能够执行的算法。】
胡扯,计算机能够执行只有机器语言。
【例 2.19……
double deno=2.0,sum,term;
while(deno<=100)
{
……
}

明显的错误,缺乏最基本的编程素质
【2.5 结构化程序设计方法
……关键是算法,有了正确的算法,用任何语言进行编码都不是什么困难的事情。】
这种对算法的片面强调是对初学者绝对的误导。误导的结果是,许多初学者往往只会用最拙劣数据结构绞尽脑汁地苦思复杂无比的“算法”。
这段话另外的一个误导是,有经验的人都知道,即使懂得了算法,学习用另一种语言编程往往也不是那么容易的事,比如C++。

展开全文


推荐文章

猜你喜欢

附近的人在看

推荐阅读

拓展阅读