踢爆IT劣书出版黑幕——由清华大学出版社之《C语言入门很简单》想到的(2)

前文链接:踢爆IT劣书出版黑幕——由清华大学出版社之《C语言入门很简单》想到的(1)

目录

  只凭前言评价一本书,想必难以服人。

  因此,讲完前言中的“作者”的奥秘,下面再从技术角度来讲一下这本书的目录。

  目录是一本书的骨架,基本能确定一本书的好坏。目录好,书一般怎么也不会写得太差,差也是细节的问题;目录差,一本书无论如何也写不好。这就跟盖房子的道理一样,你搭了一个猪圈的架子,永远不可能建起一座别墅。

  《C语言入门很简单》这本书的目录如下:

第1篇 一切从基础开始
   第1章 概述
      1.1 c语言简介
         1.1.1 c语言的位置
         1.1.2 c语言的优缺点
         1.1.3 c适合什么开发
      1.2 c语言的开发环境
         1.2.1 编辑器、编译器和链接器
         1.2.2 集成开发环境
      1.3 visual studio使用简介
         1.3.1 visual studio版本
         1.3.2 visual studio的安装
         1.3.3 新建项目
         1.3.4 编写代码
         1.3.5 编译链接
         1.3.6 运行可执行程序
      1.4 如何学好c语言
      1.5 小结
      1.6 习题
   第2章 开始c语言之旅
      2.1 为什么要写代码
         2.1.1 为什么要写程序
         2.1.2 从本书开始学编程
         2.1.3 从一个现实的例子开始
      2.2 编程的核心——数据
         2.2.1 数据从哪里来
         2.2.2 数据的表示
         2.2.3 数据类型面面观——精度和范围
         2.2.4 c语言基本数据类型
         2.2.5 数据的变与不变——变量、常量
      2.3 使用变量和常量
         2.3.1 变量的使用
         2.3.2 命名的方式
         2.3.3 关键字
         2.3.4 常量的使用
      2.4 小结
      2.5 习题
第2篇 简单程序的构建
   第3章 简单数学运算
      3.1 什么是赋值
         3.1.1 赋值的作用——把数据存起来
         3.1.2 赋值运算的形式
         3.1.3 赋值表达式
         3.1.4 机动灵活的赋值——scanf()
         3.1.5 看看我们的劳动成果——printf()
         3.1.6 赋值的重要性
      3.2 开始赋值——整型赋值
         3.2.1 整数在计算机中的表示——二进制
         3.2.2 更先进的表示方法——八进制和十六进制
         3.2.3 进制之间的转化——以二进制为桥梁
         3.2.4 给整型赋值
      3.3 浮点型赋值
         3.3.1 小数在计算机的表示
         3.3.2 给浮点型赋值
      3.4 字符型赋值
         3.4.1 字符在计算机中的表示——ascii
         3.4.2 给字符赋值
      3.5 类型转化
         3.5.1 什么是类型转换
         3.5.2 类型转换的利弊
         3.5.3 隐式类型转化和显示类型转换
         3.5.4 赋值中的类型转换
      3.6 基本数学运算
         3.6.1 数学运算和数学表达式
         3.6.2 商与余数
         3.6.3 位运算
         3.6.4 优先级的奥秘
         3.6.5 数学运算中的类型转换
      3.7 复合赋值运算
         3.7.1 复合赋值运算
         3.7.2 自增自减运算——特殊的复合赋值
         3.7.3 自增自减的使用
      3.8 小结
      3.9 习题
   第4章 程序结构
      4.1 语句和语句块
         4.1.1 简单语句
         4.1.2 语句块
      4.2 变量的作用域
         4.2.1 局部变量的声明定义位置规则
         4.2.2 局部变量的作用域规则
         4.2.3 嵌套语句块的同名变量作用域规则
      4.3 最常见的语句执行顺序——顺序结构
      4.4 判断结构
         4.4.1 判断的基础——逻辑真假
         4.4.2 基础的判断——关系运算
         4.4.3 复杂的判断——逻辑运算
      4.5 if判断结构
         4.5.1 基本if结构
         4.5.2 ifelse…结构
         4.5.3 另类的条件判断——?运算符的使用
         4.5.4 ifelse if…else结构
         4.5.5 嵌套的if结构
      4.6 switch判断结构
         4.6.1 switch基本结构
         4.6.2 果断结束——break的使用
      4.7 循环结构
         4.7.1 while循环结构
         4.7.2 for循环结构
         4.7.3 goto语句
         4.7.4 循环嵌套
         4.7.5 break和continue
      4.8 真正的程序——三种结构的揉和
      4.9 小结
      4.10 习题
第3篇 复杂数据的表示
   第5章 数组
      5.1 数组简介
         5.1.1 数组的用途
         5.1.2 数组变量的定义
      5.2 数组变量初始化和赋值
         5.2.1 数组的初始化
         5.2.2 数组的下标
         5.2.3 给数组赋值
         5.2.4 数组元素的引用
      5.3 二维数组
         5.3.1 数组的维
         5.3.2 二维数组表示和含义
         5.3.3 二维数组的初始化
         5.3.4 二维数组的赋值
         5.3.5 二维数组的引用
      5.4 多维数组
      5.4 小结
      5.5 习题
   第6章 字符的数组——字符串
      6.1 字符数组
         6.1.1 字符数组的表示
         6.1.2 字符数组的初始化
         6.1.3 字符数组的赋值和引用
      6.2 字符串
         6.2.1 字符串的c语言表示
         6.2.2 使用字符串为字符数组初始化
         6.2.3 字符串的保存形式
      6.3 字符串的输入输出——scanf和printf字符串
         6.3.1 输入输出字符串的c语言表示
         6.3.2 scanf()函数对字符串的特殊处理
      6.4 小结
      6.5 习题
   第7章 指针
      7.1 地址的概念
         7.1.1 地址的含义
         7.1.2 为什么要用地址
         7.1.3 地址的表示与取址运算
      7.2 指针和指针变量
         7.2.1 指针的含义和用途
         7.2.2 指针类型
         7.2.3 指针变量的定义和使用
         7.2.4 void指针
      7.3 指针运算
         7.3.1 取指针元素
         7.3.2 指针的自加自减
         7.3.3 指针的类型转换
      7.4 数组和指针
         7.4.1 数组名也是指针
         7.4.2 数组名是指针常量
         7.4.3 使用数组名访问数组元素
         7.4.4 三种访问数组元素的方法
         7.4.5 数组指针和指针数组
      7.5 多重指针和多维数组
         7.5.1 多重指针
         7.5.2 取多重指针元素运算
         7.5.3 多维数组名和各维元素
         7.5.4 使用指针访问多维数组
      7.6 字符串和指针
         7.6.1 字符指针
         7.6.2 字符指针和字符串
         7.6.3 scanf()、printf()函数和字符指针
      7.7 小结
      7.8 习题
   第8章 结构体
      8.1 结构体的含义
      8.2 结构体类型的表示
         8.2.1 结构体类型的一般格式
         8.2.2 结构体的成员变量
         8.2.3 复杂的结构体
      8.3 结构体变量
         8.3.1 结构体变量的声明定义
         8.3.2 结构体变量初始化
         8.3.3 取结构体成员运算
      8.4 结构体数组
      8.5 结构体指针
         8.5.1 一重结构体指针
         8.5.2 使用结构体指针取结构体数据
         8.5.3 结构体指针例子
      8.6 回到问题
      8.7 小结
      8.8 习题
   第9章 共同体类型
      9.1 共同体的含义与表示
         9.1.1 共同体的用途
         9.1.2 共同体的表示
         9.1.3 复杂的共同体
      9.2 共同体变量
         9.2.1 共同体变量
         9.2.2 共同体成员变量的相互覆盖
         9.2.3 使用共同体变量
      9.3 共同体数组
      9.4 共同体的指针
         9.4.1 一重共同体指针类型
         9.4.2 共同体指针变量
         9.4.3 完整的例子
      9.5 小结
      9.6 习题
   第10章 枚举类型
      10.1 枚举类型的含义与表示
         10.1.1 枚举类型的含义
         10.1.2 枚举类型的表示
      10.2 枚举常量和枚举变量
         10.2.1 枚举常量
         10.2.2 枚举变量的定义
         10.2.3 枚举变量的使用
      10.3 枚举数组和指针
         10.3.1 枚举数组
         10.3.2 枚举指针
         10.3.3 用枚举指针来访问枚举数组
      10.4 typedef类型定义符
         10.5 小结
         10.6 习题
第4篇 复杂功能的实现
   第11章 函数
      11.1 函数的意义
      11.2 函数的形式
         11.2.1 函数的一般形式
         11.2.2 函数的参数列表
         11.2.3 函数的返回值类型
      11.3 函数声明和定义
         11.3.1 函数的声明
         11.3.2 函数的定义形式
         11.3.3 函数的形参
         11.3.4 return返回值语句
      11.4 自己动手写一个函数——加法函数
         11.4.1 确定加法函数的样子
         11.4.2 实现加法函数体
         11.4.3 完整的加法函数定义
      11.5 函数调用
         11.5.1 函数的调用作用
         11.5.2 函数调用表达式
         11.5.3 函数的实参
         11.5.4 简单函数的调用
      11.6 复杂参数
         11.6.1 数组参数
         11.6.2 指针参数
         11.6.3 结构体、共同体和枚举参数
      11.7 小结
      11.8 习题
   第12章 特殊的函数——main()函数
      12.1 main()函数的作用
      12.2 main()函数的声明定义
         12.2.1 main()函数的声明形式
         12.2.2 main()函数的参数
         12.2.3 main()函数的返回值
      12.3 小结
      12.4 习题
   第13章 局部变量和全局变量
      13.1 变量的作用域和生命周期
      13.2 函数内的局部变量
         13.2.1 局部变量的作用域
         13.2.2 局部变量的生命周期
         13.2.3 局部变量的覆盖作用
      13.3 函数外的全局变量
         13.3.1 全局变量的作用域
         13.3.2 全局变量的生命周期
         13.3.3 局部变量对全局变量的覆盖作用
      13.4 变量修饰符
         13.4.1 使用修饰符改变变量的作用域和生命周期
         13.4.2 c语言中常用变量修饰符的作用
      13.5 小结
      13.6 习题
第5篇 c语言的高级内容
   第14章 预处理命令、文件包含
      14.1 预处理命令的作用
         14.1.1 程序预处理
         14.1.2 预处理命令
         14.1.3 c语言的几类预处理命令
      14.2 c语言中的宏定义
         14.2.1 c语言的宏定义形式
         14.2.2 不带参宏定义
         14.2.3 带参数的宏定义
      14.3 预编译控制
         14.3.1 c语言预编译控制
         14.3.2 三种预编译控制组合形式
         14.3.3 一个简单的例子
      14.4 文件包含
         14.4.1 头文件和源文件的文件名
         14.4.2 头文件和源文件的内容
      14.5 include包含头文件
         14.5.1 自定义头文件和系统头文件
         14.5.2 文件包含的两种形式
         14.5.3 完整的circle例子
         14.5.4 c语言中的标准头文件
      14.6 小结
      14.7 习题
   第15章 文件操作
      15.1 文件
         15.1.1 重新认识文件
         15.1.2 计算机眼里的文件
         15.1.3 开发人员能对文件干些什么
      15.2 文件的打开关闭
         15.2.1 文件指针
         15.2.2 文件打开函数
         15.2.3 文件关闭函数
      15.3 文件读写
         15.3.1 读写一个字符
         15.3.2 读写一个字符串
         15.3.3 读写一个数据块
      15.4 文件的其他操作
         15.4.1 随机读写文件
         15.4.2 出错检验
      15.5 小结
      15.6 习题
《C语言入门很简单》目录

  这个目录安排得如此的海立云垂、奇诡无比,绝对算得上是C语言书籍中荒诞派的代表作。其荒谬绝伦的程度令人惨不忍睹,有屎以来,前无来者。读过之后,顿感虎躯一震,三观俱覆。

  最奇葩之处就在于它在接近全书结束的第4篇的第11章才开始讲“函数”,而在此之前却在第8章已经早早地把结构体讲完了。

  初学者不可能知道这样有什么不妥,但是任何一个懂得程序设计(不一定是C语言)的人看到这些立刻就会明白,这个作者绝对是一个外行,这样写给初学者的书绝对是在坑爹。

  为什么呢?因为这不符合C语言的基本特点,也违背了程序设计的基本原则。你见过小学数学先讲小数再讲整数的吗?你见过没学过代数直接上微积分的吗?《C语言入门很简单》就是这种荒唐透顶的本末倒置的C语言版。谭浩强的书都不敢这么写。

  为什么不能把函数放在结构体后面讲呢?因为在C语言中,如果不懂得函数的基本理论并能熟练构造、使用函数,结构体这种东西根本就没用!你一定要用,那就跟在炕上用挠炕席的方法学游泳一样。只有谭浩强那样的“大师”才会在程序中只写一个main()函数,同时又使用结构体。(参见 用驴子拖宝马——怎样滥用结构体 )仅此一点,就足以说明《C语言入门很简单》作者的编程水平连学得比较好的大一学生都不如,搞不好他的C编程就是跟老谭学出来的。

  函数一定要放在结构体前面讲,而且应该尽可能地早讲。原因是它非常重要。它是实现结构化程序设计思想最重要的手段,是组织代码最重要的利器(对不起,不是指针,指针是用来组织数据的)。

  Dijkstra当年说过,“一个有过 BASIC 编程经历的人是很难学会好的编程习惯的。作为一个潜在的程序员,他们已经被脑残并且无法修复。”(It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration.)

  Dijkstra为什么要这样说?就是因为BASIC(当时的)根本就没有像样的现代意义的函数,函数调用是通过滥用全局变量实现的,整个程序是用一种傻逼精神完成的。Dijkstra实在看不下去这帮脑残的代码了,不得不跳出来大声疾呼。自此,人们才开始懂得什么叫做结构化程序设计。

  但是,由清华大学出版社在90年代初出版且至今仍在出版发行的的谭浩强的《C程序设计》及《习题解答》中,那种傻逼风格的代码却比比皆是。在谭浩强的书里即使在函数讲完之后,也到处都是一main()到底(参见 将main()进行到底  )或使用不合格的残疾函数的代码(参见 半身不遂和粗中有细 )。使这种傻逼风格如同中世纪的僵尸一样在天朝的教科书中满血复活,用一种“巨擘”和“大师”的装逼姿态,炫耀着呆逼的智商。原因很简单,谭浩强根本不懂编程,他只会玩他那套BASIC垃圾写法(谭最早出名是他的BASIC书)。所为我曾说过,谭浩强的C根本不是ANSI-C而是BASI-C。

  让我惊奇万分的是这本《C语言入门很简单》竟然能将这种傻逼风格的代码弄出了一个新的高潮——这货居然把函数放在了几乎是最后才讲。真是长江后浪推前浪,一代更比一代翔啊!

  来看看正经人是如何写C语言书的。这里我用手边常常翻用的几本C语言书为例:

  先来看大师的经典——Brian W. KernighanDennis M. Ritchie《The C Programming Language》

Chapter 1. A Tutorial Introduction 
   1.1 Getting Started 
   1.2 Variables and Arithmetic Expressions 
   1.3 The For Statement 
   1.4 Symbolic Constants 
   1.5 Character Input and Output 
   1.6 Arrays 
   1.7 Functions 
   1.8 Arguments--Call by Value 
   1.9 Character Arrays 
   1.10 External Variables and Scope
Chapter 2. Types, Operators, and Expressions 
   2.1 Variable Names 
   2.2 Data Types and Sizes 
   2.3 Constants 
   2.4 Declarations 
   2.5 Arithmetic Operators 
   2.6 Relational and Logical Operators 
   2.7 Type Conversions 
   2.8 Increment and Decrement Operators 
   2.9 Bitwise Operators 
   2.10 Assignment Operators and Expressions 
   2.11 Conditional Expressions 
   2.12 Precedence and Order of Evaluation 
Chapter 3. Control Flow 
   3.1 Statements and Blocks 
   3.2 If-Else 
   3.3 Else-If 
   3.4 Switch 
   3.5 Loops--While and For 
   3.6 Loops-Do-while 
   3.7 Break and Continue 
   3.8 Goto and LabelsChapter 
4. Functions and Program Structure 
   4.1 Basics of Functions 
   4.2 Functions Returning Non-integers 
   4.3 External Variables 
   4.4 Scope Rules 
   4.5 Header Files 
   4.6 Static Variables 
   4.7 Register Variables 
   4.8 Block Structure 
   4.9 Initialization 
   4.10 Recursion 
   4.11 The C PreprocessorChapter 
5. Pointers and Arrays 
   5.1 Pointers and Addresses 
   5.2 Pointers and Function Arguments 
   5.3 Pointers and Arrays 
   5.4 Address Arithmetic 
   5.5 Character Pointers and Functions 
   5.6 Pointer Arrays; Pointers to Pointers 
   5.7 Multi-dimensional Arrays 
   5.8 Initialization of Pointer Arrays 
   5.9 Pointers vs. Multi-dimensional Arrays 
   5.10 Command-line Arguments 
   5.11 Pointers to Functions 
   5.12 Complicated DeclarationsChapter 
6. Structures 
   6.1 Basics of Structures 
   6.2 Structures and Functions 
   6.3 Arrays of Structures 
   6.4 Pointers to Structures 
   6.5 Self-referential Structures 
   6.6 Table Lookup 
   6.7 Typedef 
   6.8 Unions 
   6.9 Bit-fieldsChapter 
7. Input and Output 
   7.1 Standard Input and Output 
   7.2 Formatted Output--Printf 
   7.3 Variable-length Argument Lists 
   7.4 Formatted Input-Scanf 
   7.5 File Access 
   7.6 Error Handling--Stderr and Exit 
   7.7 Line Input and Output 
   7.8 Miscellaneous FunctionsChapter 
8. The UNIX System Interface 
   8.1 File Descriptors 
   8.2 Low Level I/O-Read and Write 
   8.3 Open, Creat, Close, Unlink 
   8.4 Random Access--Lscek 
   8.5 Example--An Implementation of Fopen and Getc 
   8.6 Example--Listing Directories 
   8.7 Example--A Storage Allocator
Appendix 
   A. Reference Marital 
   B. Standard Library 
《The C Programming Language》目录

  第一章就简略地提到了Functions,在讲完“Types, Operators, and Expressions”和“Control Flow”之后,立刻就开始在第4章详细讲解“Functions”并且同时开始讲“Program Structure”。Structures是在后面的第6章才讲到。

  再看K. N. King《C Programming: A Modern Approach 》

《C Programming: A Modern Approach 》目录
1 INTRODUCING C 1
2 C Fundamentals 9 
3 Formatted Input/Output 37 
4 Expressions 53 
5 Selection Statements 73 
6 Loops 99 
7 Basic Types 125 
8 Arrays 161 
9 Functions 183 
10 Program Organization 219 
Advanced Features of C 
11 Pointers 241 
12 Pointers and Arrays 257 
13 Strings 277 
14 The Preprocessor 315 
15 Writing Large Programs 349 
16 Structures, Unions, and Enumerations 377 
17 Advanced Uses of Pointers 413 
18 Declarations 457 
19 Program Design 483 
20 Low-Level Programming 509 The Standard C Library 
21 The Standard Library 529 
22 Input/Output 539 
23 Library Support for Numbers and Character Data 589 
24 Error Handling 627 
25 International Features 641 
26 Miscellaneous Library Functions 677 
27 Additional C99 Support for Mathematics 705

  刚讲完Arrays就在第9章开始介绍Functions。而Structures是在后面的第16章才讲到。

  Kenneth A.Reek 《Pointers on C》  

 1 A Quick Start. 
 2 Basic Concepts. 
 3 Data. 
 4 Statements. 
 5 Operators and Expressions. 
 6 Pointers. 
 7 Function. 
 8 Arrays. 
 9 Strings, Characters, and Bytes. 
10 Structures and Unions. 
11 Dynamic Memory Allocation. 
12 Using Structures and Pointers. 
13 Advanced Pointer Topics. 
14 The Preprocessor. 
15 Input/Output Functions. 
16 Standard Library. 
17 Classic Abstract Data Types. 
《Pointers on C》目录

   刚讲完Pointers就在第7章开始讲Function。而Structures是在后面的第10章才讲到。

  再来看两本国内作者写的书。

  键盘农夫《狂人C:程序员入门必备》 

第1篇 理解程序设计 1

   第1章 基础知识 2
      1.1 什么是编程 3
      1.2 怎样用C语言编程 7
      1.3 printf()函数初步 13
      1.4 C语言的“字母”和“单词” 14
   
   第2章 数据类型 23
      2.1 什么是数据类型 24
      2.2 让程序记住计算结果——变量 31
      2.3 int类型——总结与补充 35
      2.4 对数据类型的进一步讨论 39
      2.5 莫名其妙的“整型” 45
      2.6 浮点类型 51
      2.7 数据类型与算法 57
      2.8 算法的特性 61
   
   第3章 运算符、表达式及语句 66
      3.1 C的“动词”及“动词”的“宾语” 67
      3.2 表达式——C语言的“词组” 67
      3.3 谁是谁的谁 71
      3.4 右值的类型转换 74
      3.5 语句的概念 81
      3.6 例题 84
      3.7 算法和数据结构初窥 88
      3.8 在程序运行时提供数据 90
   
   第4章 选择语句 95
      4.1 关系运算 96
      4.2 if语句 97
      4.3 判等运算 104
      4.4 表达复杂的条件 106
      4.5 if-else语句 107
      4.6 鸡肋——_Bool类型(C99) 109
      4.6 鸡肋——_B4.7判断三角形种类 111
      4.8 显得很有学问的运算符 117
      4.9 大师如是说goto 118
      4.10 给程序更多选项——switch语句 119
      4.11 程序开发的过程 124
   
   第5章 从循环到穷举 130
      5.1 造句:当……就…… 131
      5.2 do-while语句 138
      5.3 for语句 140
      5.4 不规则的循环及对循环的修整 150
      5.5 循环的嵌套与穷举法 151
   
第2篇 结构化程序设计与简单的数据结构 161
   
   第6章 最复杂的运算符——“()” 162
      6.1 什么是函数 163
      6.2 步骤1:函数的声明 163
      6.3 步骤2:函数的定义 165
      6.4 步骤3:函数的调用 167
      6.5 程序的执行过程 168
      6.6 例题——为什么使用函数 170
      6.7 使用函数小结 171
      6.8 函数与结构化程序设计 174
      6.9 变量的作用域 181
      6.10 递归 182
      6.11 对局部变量的进一步修饰 190
      6.12 使用库函数 193
      6.13 inline关键字(C99) 195
   
   第7章 作为类型说明符和运算符的“[]” 199
      7.1 使用数组 200
      7.2 深入理解数组 202
      7.3 熟练应用一维数组 205
      7.4 数组名做实参 209
      7.5 多维数组 216
   
   第8章 结构体、共用体与位运算 228
      8.1 结构体 229
      8.2 C语言中复数类型的历史和现状 237
      8.3 共用体union 240
      8.4 位运算 242
      8.5 “小的变量”——位段 251
   
   第9章 指针 258
      9.1 指针是什么 259
      9.2 指向数据对象的指针 260
      9.3 指针的应用与误用 266
      9.4 指针与一维数组 270
      9.5 指针的应用(二) 279
      9.6 高维数组名 281
      9.7 变量长度数组——VLA(C99) 287
      9.8 数组类型的字面量(C99) 291
      9.9 指针与结构体 292
      9.10 指针与函数 294
      9.11 指向虚无的指针 298
      9.12 参数不确定的函数 299
   
   第10章 字符串、字符数组及指向字符的指针 306
      10.1 字符串文字量 307
      10.2 字符串的输入与存储 309
      10.3 例题 310
      10.4 形参说明符“[]”里的修饰符(C99) 316
      10.5 常用的字符串函数 317
      10.6 main()的参数 320
      10.7 体现代码优美的数据类型——枚举类型 323
   
第3篇 复杂的数据结构、算法及其他话题 328
   
   第11章 复杂的数据类型与算法 329
      11.1 2 2 2 2 = 0 330
      11.2 复杂数据类型的构造和解读 331
      11.3 递归、穷举、回溯、排列 344
      11.4 更自由地使用内存 356
      11.5 typedef 364
   
   第12章 程序的输入与输出 369
      12.1 面向文件的输入与输出 370
      12.2 文卷、流、“FILE”及“FILE *” 380
      12.3 二进制文卷的读写 384
      12.4 定位问题 388
      12.5 制作素数表 389
   
   第13章 程序组织与编译预处理 394
      13.1 简介 395
      13.2 文件包含 396
      13.3 Tic-Tac-Toe游戏 397
      13.4 重新开始 409
      13.5 宏定义与宏替换 416
      13.6 使用外部变量 423
      13.7 走棋 427
      13.8 预处理命令的其他话题 439
   
   第14章 标准库简介 446
      14.1 使用标准库的一些常识 447
      14.2 对语言的补充 449
      14.3 stdio.h 452
      14.4 通用函数:stdlib.h 454
      14.5 inttypes.h(C99) 460
      14.6 string.h 462
      14.7 数值计算 462
      14.8 错误处理:errno.h 466
      14.9 断言与调试:assert.h 468
      14.10 非本地跳转setjmp.h 468
      14.11 信号处理signal.h 470
      14.12 time.h 471
      14.13 国际化问题 475
《狂人C:程序员入门必备》目录

   刚讲完语句在第二篇一开始的第6章马上就讲解函数,并且刻意地强调了()是一种运算符。结构体到第8章才讲。 

  裘宗燕《从问题到程序:程序设计与C语言引论》

第一章,程序设计与C 语言。介绍程序与程序语言的概念,C 语言的发展及其特点。用
一个小例子介绍C 程序形式,其加工和执行。最后介绍程序设计与开发过程。

第二章,数据对象与计算。讨论程序语言的许多最基本概念,包括:字符集、标识符和
关键字,数据与类型,数据表示,运算符、表达式与计算过程,数学函数库的使用等。

第三章,变量、函数和控制结构。讨论程序设计的一些基本问题,包括语句与复合结构,
变量及其使用,简单函数定义,逻辑条件的描述与使用等。最后介绍了几种基本控制结构。

第四章,基本程序设计技术。首先分析循环程序设计的基本问题,通过一系列程序实例
分析了循环的构造过程。此后介绍了C 语言其他控制结构及其使用。

第五章,C 语言程序结构。讨论C 语言许多具有一般性的重要问题,主要是C 程序结
构,函数概念及有关的问题,预处理命令和预处理过程,递归的概念等。

第六章,数据对象的顺序组合:数组。介绍数组概念、定义和使用,数组与函数的关系,
两维和多维数组等。

第七章,指针。指针概念和指针变量的使用,C 语言中指针与数组的关系,多维数组作
为参数的通用函数。而后讨论了动态存储管理,类型定义,指向函数的指针等一系列问题。

第八章,输入输出与文件。讨论了文件概念,与输入输出有关的各种问题,标准库的输
入输出功能,以及输入输出的程序设计问题。

第九章,结构及其他数据机制。介绍结构(struct)、联合(union)、枚举(enum)等数
据定义机制的意义及在程序中的使用。随后简单介绍了链接结构的概念。

第十章,程序开发。讨论程序设计和开发中的许多一般性问题和技术。包括C 程序的
分块开发问题等。

第十一章,标准库函数。介绍标准库提供的各方面功能及其相关知识。
最后有几个附录和一个比较详细的索引。
《从问题到程序:程序设计与C语言引论》目录

  为了尽早讲解函数,特意把函数部分拆成了两部分,能讲的部分,早早地在第三章刚介绍完变量就开讲了,其余部分放在了后面第五章讲。第九章才讲结构。

  什么叫境界?什么叫水平?什么叫懂得C语言?什么叫懂得编程?什么叫懂得写书?

  这些作者们,他们知道编程中最重要的是什么,知道C语言是什么,知道什么叫循序渐进。他们在用有形的文字、无声的语言,在告诉你,在熏陶你,在启发你,在引导你渐渐地懂得C语言的精髓和编程的真谛。他们让你懂得,饭碗是用来盛饭的,便盆是用来小便的。

  可是《C语言入门很简单》这本书或老谭那本书呢?纯粹是教人用便盆当饭碗!这会教出很多二逼,你若告诉他这样写不对,他会振振有词:

  作为一名第一次接触C语言的小白,我很感谢这本书在很短的时间内让我对C语言产生了兴趣并且能做简单的应用。这本书即使有这样那样的纰漏,但是作为“领进门的师傅”,已经很尽责了~特别是书配套的视频,对初学者帮助真的很大!!!函数调到后面我觉得也很合理,让我们这些怕语言的小白很好接受!

  这特么跟坚持“便盆也能盛饭,饭碗也能小便”有什么区别?!

  不怕不识货,就怕货比货。不过写到这里,我突然感到一阵疚惭,把《The C Programming Language》、《C Programming: A Modern Approach 》、《Pointers on C》、《狂人C:程序员入门必备》、《从问题到程序:程序设计与C语言引论》这几本书和《C语言入门很简单》写在同一篇博文里实在是一种亵渎。我真的感觉对不住前面那些书的作者们。在此我向Brian W. Kernighan、Dennis M. Ritchie、K. N. King、Kenneth A.Reek、键盘农夫、裘宗燕等几位作者鞠躬致歉。对不起,万般无奈,势不得已,实在是箭在弦上,想收都收不住了。

  从以上种种,我们不难看出,《C语言入门很简单》作者的C语言和编程水平其渣无比。这同样证明了这本书的责任编辑根本不称职,要么无知,水平与作者同样其渣无比,要么无良。对于一名编辑来说,即使你不得懂编程,可你连作者是个门外汉都看不出来,你有什么资格当编辑?

  作者们炮制这样的书不是坑人又是什么?!不是像老谭一样误人子弟又是什么?!不是谋财害命又是什么?!清华大学出版社出版这种垃圾,不是玷污文化污染技术又是什么?!不是生产技术地沟油又是什么?!不是浪费森林污染环境又是什么?!不是误人子弟谋财害命的帮凶或同谋又是什么?!你们对得起辛辛苦苦长了好几百年才长成的森林吗?你们有资格抱怨帝都的雾霾吗?

  为此我强烈建议人大修改刑法将这种炮制劣书误人子弟的行为入罪并课以无期徒刑!

  孩子喊我陪他看电影了,今天就只能写到这里了。

续文链接:踢爆IT劣书出版黑幕——由清华大学出版社之《C语言入门很简单》想到的(3)

posted @ 2013-12-29 16:00  garbageMan  阅读(11625)  评论(147编辑  收藏  举报