《國家精品課教材·大學計算機規劃教材:C語言大學實用教程(第3版)》是普通高等教育“十一五”國家級規劃教材和國家精品課程教材。全書共10章,內容包括:程序設計ABC,數據類型、運算符與表達式,鍵盤輸入與屏幕輸出,程序的控制結構,函數,數組,指針,結構體與共用體,文件操作,C程序設計常見錯誤及解決方案等。
《國家精品課教材·大學計算機規劃教材:C語言大學實用教程(第3版)》注重教材的可讀性和可用性,每章開頭有內容關鍵詞和難點提示;每章結尾安排本章小結,給出了該章常見編程錯誤提示;典型例題一題多解,由淺入深,強化知識點、算法、編程方法與技巧;還將程序測試、程序調試與排錯、軟件的健壯性和代碼風格、結構化與模塊化程序設計方法等軟件工程知識融入其中;配套教材《C語言大學實用教程學習指導(第3版)》包括習題解答、上機實驗指導、案例分析三部分,案例分析中給出了錯誤案例與趣味經典實例分析;為任課教師免費提供電子課件及全部例題和習題源代碼。
致本書讀者
在Java,C#等充滿面向對象、快速開發和穩定可靠這樣溢美之詞的語言大行其道的今天,還如此耗費心力寫一本關于已經落伍了的C語言的書,著實讓人匪夷所思。雖然C語言在教育界還舉足輕重,在系統開發領域依然健碩,鐵桿支持者遍布世界各地,但是C語言的書籍種類繁多,早已被寫到“濫”的地步了。這本書的存在還會有價值嗎?
萬物皆將成為時間的灰燼,其價值體現在燃燒時發出的光熱。
C語言的重要性將會在第1章中闡述。在計算機教育方面,C語言是為數不多的與國外保持內容同步的課程之一,這大概也是因為C語言自身多年以來沒有什么變化吧。但在教學深度上,尤其在把C語言從應試課程轉變為實踐工具方面,國內無論教材還是課程建設方面都跟不上時代發展的步伐。
計算機科學日進千里,很多舊的思想、方法都被打破,不能與時俱進的語言必遭淘汰。可C語言卻能奇跡般地以不動如山之姿態笑傲天下,論劍江湖,這套以靜制動的本領,來自于C語言的靈活。
靈活,使C語言的用法可以產生諸般變化。每種變化都有其利與害,趨利避害是根本。但何為利,何為害呢?這是程序設計科學研究的主題之一。隨著時間的推移,判斷的標準總在變化。比如20世紀90年代以前,性能一直是最重要的,所有的程序設計方法都趨向于提高性能。當硬件越來越快、越來越便宜,軟件越來越復雜、越來越昂貴,設計程序時考慮更多的是如何降低開發成本和難度,不惜以犧牲性能為代價。當網絡成為技術推動力時,安全問題又成為重中之重。
無論思潮怎樣變化,C語言總能有一套行之有效的方法來應對。這些方法完全構建在對C語言基本語法的應用之上,絲毫影響不到它固有的體系。一些適時的方法被制定為規則,另一些落后的方法則被劃為禁手。如果C語言的教科書還只以講述語法為主,而忽略在新形勢下的新方法、新規則和新思想的傳授,就真的是沒有價值了。
此書要做有價值的書,要讓讀這本書的人真正學會C語言。那么,達到什么程度算是“學會”了C語言呢?這倒是一個很有意思的問題。
本書作者中有一人,自稱一生三次學會了C語言。
第一次是大一,看到C語言成績后,不禁自封“C語言王子”。
待到大二,偶遇一個機會,用C語言開發一個真實的軟件,才知道自己“卷上談兵”的本領實在太小,實在與會用C語言的目標相去甚遠。編了大小幾個項目,上萬行代碼,自覺對C語言的掌握已爐火純青,此為第二次學會。
待回眸品評這些項目,發現除了幾副好皮囊能取悅用戶之外,無論程序結構、可讀性、可維護性還是穩定性都一團糟。年輕程序員的良心大受譴責,終于認識到,寫好程序絕不是懂語法、會調用函數那么簡單。又經歷練,其間苦學軟件工程、面向對象等理論,打造出第一個讓自己由衷滿意的程序,于是長出一口氣,嘆曰:“C,我終于會用了!”。
這條路走得著實辛苦,但也確實滋味無窮,樂在其中。留校任教后,他很快獲得了講C語言課的機會。欣然領命,直欲把經年積累一并爆發,送與學生。前輩高人指點,選擇了Kernighan與Ritchie所撰的圣經《C Programming Language》為教材。早聞此書,初見其形;邊教邊品,仰天長嘆:“原來C語言若此,吾不曾會矣!”
總結往事,環顧業界,何謂“學會”?這是一個沒有答案的提問。學完語法規則只是讀完了小學,識字不少,還會造句,但還寫不出大篇的漂亮文章。若要進步,就非要在算法和結構設計兩方面努力了。但這兩者實非一蹴而就,大學四年也只能學到一些條條框框,就像高中畢業盡管作文無數,能力卻僅止于八股應試而已。若要寫出“驚天地、泣鬼神”之程序,還必須廣泛實踐,多方積累。學無止境啊!
行文至此,終于完成了這本自認還有價值的書。目前的計算機圖書市場異常火爆,“經典與濫竽齊飛,贊美共炒作一色”。我們不知道此書能發出多少光熱,也不知道有多少人能見到這份光、感到這點熱,只知道它也會成為時間的灰燼,而且盼望這一天越早到來越好。因為,此書觀點被大量否定之時,必是IT再次飛躍之日。
編著者
于哈爾濱工業大學計算機科學與技術學院
第1章 程序設計ABC
1.1 計算機與人
1.2 計算機與程序設計語言
1.3 程序設計語言的故事
1.4 C語言的故事
1.5 程序設計語言的工作原理
1.5.1 運行
1.5.2 內存
1.6 本章小結
習題1
第2章 數據類型、運算符與表達式
2.1 一個簡單的C程序例子
2.2 C程序常見符號分類
2.3 數據類型
2.3.1 為什么引入數據類型
2.3.2 從基本數據類型到抽象數據類型
2.3.3 類型修飾符
2.3.4 標識符命名
2.4 常量
2.4.1 整型常量
2.4.2 實型常量
2.4.3 字符常量
2.4.4 字符串常量
2.4.5 宏常量
2.4.6 枚舉常量
2.5 變量
2.5.1 變量的定義與初始化
2.5.2 const類型修飾符
2.5.3 使用變量時的注意事項
2.6 常用運算符及表達式
2.6.1 運算符的優先級與結合性
2.6.2 算術運算符
2.6.3 關系運算符
2.6.4 邏輯運算符
2.6.5 賦值運算符
2.6.6 增1和減1運算符
2.6.7 類型強制轉換運算符
2.6.8 位運算符
2.6.9 逗號運算符
2.7 賦值和表達式中的類型轉換
2.8 本章小結
習題2
第3章 鍵盤輸入與屏幕輸出
3.1 C語句分類
3.2 表達式語句
3.3 復合語句和空語句
3.4 基本的輸入/輸出操作
3.4.1 字符輸入/輸出
3.4.2 格式輸入/輸出
3.4.3 使用函數scanf時需要注意的問題
3.5 本章小結
習題3
第4章 程序的控制結構
4.1 算法及其描述方法
4.1.1 算法的概念
4.1.2 算法的描述方法
4.2 順序結構
4.2.1 順序結構的流程圖表示
4.2.2 應用程序舉例
4.3 選擇結構
4.3.1 應用場合
4.3.2 選擇結構的流程圖表示
4.3.3 條件語句
4.3.4 開關語句
4.4 循環結構
4.4.1 應用場合
4.4.2 循環結構的流程圖表示
4.4.3 循環語句
4.4.4 單重循環程序實例
4.4.5 嵌套循環及其程序實例
4.5 流程轉移控制語句
4.5.1 goto語句
4.5.2 break與continue語句
4.5.3 程序實例
4.6 程序調試與排錯
4.6.1 程序中常見的出錯原因
4.6.2 程序調試與排錯的基本方法
4.6.3 使用getchar需要注意的問題
4.7 結構化程序設計方法簡介
4.7.1 關于goto論戰
4.7.2 結構化程序設計的核心思想
4.7.3 “自頂向下、逐步求精”的程序設計方法
4.8 本章小結
習題4
第5章 函數
5.1 程序設計的藝術
5.2 函數的定義與使用
5.2.1 函數的分類
5.2.2 函數的定義
5.2.3 函數的調用、參數傳遞和返回值
5.2.4 函數原型
5.2.5 主函數main的特殊性
5.3 變量的作用域和存儲類型
5.3.1 變量的作用域
5.3.2 全局變量
5.3.3 變量的存儲類型
5.4 函數封裝
5.5 預處理指令
5.5.1 #include
5.5.2 #define和#undef
5.5.3 條件編譯
5.6 使用assert查錯
5.7 模塊和鏈接
5.8 模塊化程序設計方法簡介
5.8.1 模塊劃分的原則
5.8.2 應用實例--“猜數”游戲
5.9 遞歸
5.9.1 遞歸問題的提出
5.9.2 遞歸函數
5.10 本章小結
習題5
第6章 數組
6.1 數組類型的應用場合
6.2 數組的定義、引用和初始化
6.2.1 數組的定義
6.2.2 數組的引用
6.2.3 數組的初始化
6.2.4 程序實例
6.3 向函數傳遞一維數組
6.4 向函數傳遞二維數組
6.5 字符數組
6.5.1 字符數組與字符串的關系
6.5.2 字符數組的輸入/輸出
6.5.3 字符串處理函數
6.5.4 應用實例
6.6 本章小結
習題6
第7章 指針
7.1 指針概述
7.1.1 指針的概念
7.1.2 為什么引入指針的概念
7.1.3 指針變量作函數參數
7.1.4 字符指針作函數參數
7.2 指針和數組間的關系
7.2.1 一維數組的地址和指針
7.2.2 二維數組的地址和指針
7.3 指針數組
7.4 函數指針
7.5 帶參數的main函數
7.6 動態數組的實現
7.6.1 C程序的內存映像
7.6.2 動態內存分配函數
7.6.3 一維動態數組的實現
7.6.4 二維動態數組的實現
7.7 使用const修飾指針變量
7.8 代碼風格
7.8.1 程序版式
7.8.2 命名規則
7.8.3 函數設計
7.8.4 防御性程序設計
7.9 本章小結
習題7
第8章 結構體與共用體
8.1 結構體的應用場合
8.2 結構體類型與結構體變量
8.2.1 結構體類型的聲明
8.2.2 用typedef定義結構體類型
8.2.3 結構體變量的定義
8.2.4 指向結構體變量的指針
8.2.5 結構體變量的引用和初始化
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.5.4 鏈表的建立
8.5.5 鏈表的刪除操作
8.5.6 鏈表的插入操作
8.6 共用體
8.7 本章小結
習題8
第9章 文件操作
9.1 計算機中的流
9.2 文件
9.2.1 存儲設備的使用
9.2.2 目錄
9.2.3 文件格式
9.3 基本文件操作
9.3.1 基本文件操作函數
9.3.2 錯誤處理
9.3.3 程序示例
9.3.4 基本文件操作的意義
9.4 高級文件操作
9.4.1 文件的打開與關閉
9.4.2 文件的讀/寫
9.4.3 程序實例
9.4.4 標準輸入與標準輸出
9.5 本章小結
習題9
第10章 C程序設計常見錯誤及解決方案
條款1:使用未初始化和未賦值的變量
條款2:不考慮數值溢出的可能
條款3:不用sizeof獲得類型或變量的字長
條款4:假定類型取值范圍
條款5:期望兩個整數的運算自動得出浮點數的結果
條款6:不預先判斷除數是否為0
條款7:混淆“&,|”與“&&,||”
條款8:使用依賴編譯器求值順序的語句
條款9:使用依靠算符優先級的表達式
條款10:表達式過于復雜
條款11:用“==”時誤用“=”
條款12:用“==”比較兩個浮點數
條款13:使用幻數
……