踢爆IT劣書出版黑幕——由清華大學出版社之《C語言入門很簡單》想到的(2)

前文連接:踢爆IT劣書出版黑幕——由清華大學出版社之《C語言入門很簡單》想到的(1)html

目錄

  只憑前言評價一本書,想必難以服人。程序員

  所以,講完前言中的「做者」的奧祕,下面再從技術角度來說一下這本書的目錄。算法

  目錄是一本書的骨架,基本能肯定一本書的好壞。目錄好,書通常怎麼也不會寫得太差,差也是細節的問題;目錄差,一本書不管如何也寫很差。這就跟蓋房子的道理同樣,你搭了一個豬圈的架子,永遠不可能建起一座別墅。編程

  《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章已經早早地把結構體講完了。dom

  初學者不可能知道這樣有什麼不妥,可是任何一個懂得程序設計(不必定是C語言)的人看到這些馬上就會明白,這個做者絕對是一個外行,這樣寫給初學者的書絕對是在坑爹。編輯器

  爲何呢?由於這不符合C語言的基本特色,也違背了程序設計的基本原則。你見太小學數學先講小數再講整數的嗎?你見過沒學過代數直接上微積分的嗎?《C語言入門很簡單》就是這種荒唐透頂的本末倒置的C語言版。譚浩強的書都不敢這麼寫。ide

  爲何不能把函數放在結構體後面講呢?由於在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)

相關文章
相關標籤/搜索