本書在內容編排上對C語言的知識不求全面系統, 但求有理論、有深度、有層次, 使其真正能夠承擔起第一門專業軟件課程的重任, 對大一新生有一定的專業引導性。
現代科學技術正在迅猛地發展著,計算機信息技術在其中發揮著巨大的作用,并已滲透到各行各業,推動著相關行業的迅速發展。合理利用計算機及其軟件可以迅速提升人們生活與工作的效率。因此,如何盡快地掌握計算機知識,學好一門計算機語言,并用來解決人們在生活與工作中的實際問題,是一個有著迫切需求的問題。本書希望能在這方面為讀者“安上”智慧的翅膀,越過學好一門計算機語言的種種障礙,盡情享受學好一門計算機語言的樂趣。
C語言是迄今為止人類發明的最為成功的計算機語言之一,應用非常廣泛,同時也是很多其他計算機語言的基礎。例如,C++語言是在C語言基礎上發展起來的計算機語言,而Java語言和C#語言則是在C/C++語言的基礎上發展起來的語言。無論如何發展與變革,C語言本身依然不斷展示出其巨大的自身優勢,數十年來一直在開發商業軟件所采用的計算機語言當中名列前茅,深受人們青睞。C語言程序常常以短小精悍并且運行效率高著稱。這實際上也體現出了C語言強大的表達能力和處理實際問題的能力。
無論國內還是國外,C語言程序設計目前通常是計算機或軟件專業學生學習的第一門計算機語言課程。這說明Ic語言是一門相對比較容易入門的;計算機語言;。它容易上手,而且可以迅速用來解決實際問題;具有很大的靈活性,可以支持結構化程序設計,可以用來培養嚴謹的編程思維習慣:具有很好的通用性,容易理解,可以構成學習其他計算機語言的基礎。
我從1991年進入清華大學計算機系就開始學習C語言程序設計,積累了大量的筆記。2002年我從美國留學回國并回到清華大學工作,那時便答應我的學生開始著手編寫本書。因為工作的原因,編寫的過程時斷時續。也許因為自己過于追求完美,寫起來非常緩慢,我從VC(VisualC++,簡稱VC)6.0、VC2003、VC2005、VC2008、VC2010、VC2012、VC2015、Linux的gcc和Unix的gcc等逐個平臺進行實驗,并反反復復地進行修改。在此期間,隨著時間的流逝,兩次出臺了新的C語言國際標準,讓我又改變了本書的寫法。其實,因為工作的原因,C語言與自己朝夕相處,要重現其完美是一件非常難的事。正所謂“親近無偉人”。在描述與自己朝夕相處的C語言的程序設計時,我一方面常常擔心是否遺漏了什么;另一方面又擔心過于煩瑣,破壞了C語言的簡潔之美。耐間便在這樣反反復復之中流逝而去i。好在最后終于成稿了,可以暫時松一口氣了,也可以給學生一個交待了。
我希望本書能夠給讀者帶來盡可能多的益處。對于學習而言,首先最重要的應當是對學習方法的引導。學習每門課程都有其內在的學習規律。順應其規律,采用正確的學習方法,一般會產生良好的學習效果。學習首先應當是“學以致用”。為此,我常常利用各種機會調研軟件公司對程序設計的實際需求。如果能夠從應用出發進行學習,那么應當會提高學習的效率。另外,學習過程的關鍵應當是實踐,課本是實踐的一種輔助工具。為此,本書比較詳細地講解了在vc平臺以及Linux和Unix操作系統下進行C語言程序設計實踐的方法,努力降低進行C語言實踐的難度,希望讀者能夠很快入門并進行C語言程序設計實踐。在本書每章的后面都有習題。對于書中的習題,都沒有提供答案,是因為我真誠希望這些習題能夠給讀者增加一些自主性思考和實踐練習的機會。自主性思考意味著應當通過自己的思考去理解C語言并求解問題,同時應當不拘泥于某一種答案,即可以采用多種不同的方法求解相同的問題,從而快速掌握C語言及其程序設計方法。不過,本書提供了大基的例程及其詳細的講解,讀者可以進行模仿。同時,希望讀者能夠經常總結實踐過程的收獲,享受其中的成就感,即使無法最終求解問題。
本書還講解了C語言所有常用的庫函數、運算符與宏,在一定程度上體現出了C語言程序設計手冊或指南的特點!。為了方便讀者查找本書知識點和中心內容,通過加黑加粗加i框的方式,強調各部分內容的中心詞以及各個基本概念或定義的核心詞,并提供了非常明顯的注意事項、說明和小甜點等內容,而且在附錄中添加了圖、表、例程以及函數、運算符和宏的頁碼索引。此外,本書在魯棒編程、高效編程和規范編程等方面也形成了一定的特色。
本書既可以作為計算機專業和非計算機專業的基礎教材,也可以作為需要使用計算機的工程人員和科技工作者的自學參考書。本書在編寫與出版的過程中得到了許多朋友的幫助,其中,讀者、選修我所負責的課程的學生以及我所負責的清華大學計算機輔助設計、圖形學與可視化研究所里的同事與學生,都起到了非常重要的作用。他們的建議和批評意見是本書發生變化的最重要的外在因素,并且他們當中的很多人也參與了本書的校對工作。本書也凝聚了他們的勞動結晶。這里一并對他們表示誠摯的謝意。真誠希望讀者能夠輕松并且愉悅地掌握C語言程序設計,也希望自己能做得更好。+歡迎廣大讀者特別是講授此課程的老師對本書進行批評和指正。真誠歡迎各種建設性意見。
雍俊海,1991年9月到2000年9月就讀于清華大學計算機系,分別獲得學士、碩士和博士學位,同時輔修了應用數學專業。從2000年10月到2002年9月在美國肯塔基大學計算機系做博士后。現為清華大學軟件學院教授、博導和學術委員會主任,計算機輔助設計、圖形學與可視化研究所所長,全國計算機輔助設計與圖形學專業委員會副主任,全國技術產品文件標準化技術委員會委員,國際期刊《Computers & Graphics》的Associate Editor,《軟件學報》責任編委和《計算機輔助設計與圖形學學報》編委。曾任IEEE形狀造型國際會議程序委員會聯合主席、CAD/Graphics2013國際會議聯合主席以及CAD/Graphics2015國際會議程序委員會聯合主席等。多年來一直堅持科研工作為我國國民經濟服務的理念,提出了幾何Hermite曲線等曲線、曲面和實體表示、設計與編輯方案,設計并編寫了大量代碼,努力提升我國在計算機輔助設計、圖形學和增強現實領域的科技水平及國際競爭力。負責的多項軟件產品以及參與編寫的多項國家標準已經在企業得到應用實施和推廣。在《CAD》、《CAGD》、《ACMTOG》和《IEEETPAMI》等國內外期刊與會議上發表160多篇學術論文。曾獲全國杰青、全國博士論文獎、國際Elsevier Outstanding Service Award、計算機動畫國際會議論文獎和教育部自然科學一等獎等榮譽。編寫的教材《Java程序設計教程》入選國家規劃教材并獲教育部普通高等教育精品教材和首屆中國大學出版社圖書獎一等獎等獎勵。另外,還編寫了生動有趣的個人科研科普專著《清華教授的小課堂:魔方真好玩》,減少了復原魔方所需的轉動次數。
第1章 緒論
1.1 C語言簡介
1.2 開發C語言程序
1.2.1 第一個C語言例程
1.2.2 在Microsoft Windows下開發程序
1.2.3 在Linux或Unix下開發程序
1.3 小結
1.4 習題
第2章 數據和運算
2.1 標識符和關鍵字
2.2 數據類型
2.2.1 有符號整數系列類型和無符號整數系列類型
2.2.2 字符類型
2.2.3 枚舉類型
2.2.4 浮點數類型
2.3 變量和字面常量
2.3.1 變量
2.3.2 有符號整數系列類型和無符號整數系列類型字面常量
2.3.3 字符類型字面常量
2.3.4 枚舉類型字面常量
2.3.5 浮點數類型字面常量
2.4 數據的輸入和輸出
2.4.1 函數printf
2.4.2 函數scanf和scanf_s
2.4.3 字符輸入函數getchar和字符輸出函數putchar
2.5 運算
2.5.1 算術運算
2.5.2 關系運算
2.5.3 邏輯運算
2.5.4 位運算
2.5.5 賦值類運算
2.5.6 條件運算
2.5.7 其他運算
2.6 小結
2.7 習題
第3章 控制結構
3.1 選擇結構
3.1.1 if語句和if-else語句
3.1.2 switch語句
3.2 循環結構
3.2.1 for語句
3.2.2 while語句
3.2.3 do-while語句
3.2.4 continue語句
3.2.5 break語句
3.3 小結
3.4 習題
第4章 結構化程序設計
4.1 函數基礎
4.1.1 函數定義與調用
4.1.2 形式參數個數可變的函數
4.1.3 主函數main
4.2 多個源程序文件
4.3 函數遞歸調用
4.4 結構化程序設計實現
4.5 小結
4.6 習題
第5章 靜態數組
5.1 一維數組
5.2 多維數組
5.3 字符數組與字符串
5.4 小結
5.5 習題
第6章 結構體和共用體
6.1 結構體(struct)
6.2 共用體(union)
6.3 小結
6.4 習題
第7章 指針
7.1 指針類型與變量
7.2 動態數組
7.3 指針運算
7.4 函數返回值
7.5 單向鏈表和雙向鏈表
7.6 函數指針與函數自動測試
7.7 小結
7.8 習題
第8章 關鍵字typedef和const以及預處理命令
8.1 類型別名定義typedef
8.2 常量屬性const
8.3 預處理命令
8.3.1 宏定義#define與取消宏定義#undef
8.3.2 條件編譯
8.3.3 文件包含#include
8.4 小結
8.5 習題
第9章 文件處理
9.1 文件操作基本框架
9.2 以文本形式讀寫文件
9.3 以二進制數據流形式讀寫文件
9.4 文件整體信息與處理
9.5 錯誤處理
9.6 文件處理程序示例
9.7 小結
9.8 習題
第10章 編程規范、程序調試與測試
10.1 程序編寫規范
10.1.1 命名規范
10.1.2 排版規范
10.1.3 語句
10.1.4 文件組織
10.2 程序編譯與調試
10.2.1 程序編譯與鏈接
10.2.2 設置斷點與查看即時信息
10.2.3 斷言assert
10.2.4 編寫調試日志文件程序
10.3 程序測試
10.4 小結
10.5 習題
第11章 其他常用函數和宏
11.1 數學庫
11.1.1 指數與對數類函數
11.1.2 三角函數
11.1.3 反三角函數
11.1.4 雙曲函數
11.1.5 其他數學類函數
11.2 標準庫
11.2.1 偽隨機數生成函數
11.2.2 程序退出函數以及注冊函數
11.2.3 環境變量值的獲取函數
11.2.4 查找與排序函數
11.2.5 整數絕對值和除法運算函數
11.3 時間獲取與處理函數
11.3.1 在時間庫中的時間獲取函數
11.3.2 在時間庫中的時間處理函數
11.3.3 在時間庫中的時間格式輸出函數
11.3.4 在VC平臺下的高精度計時函數
11.4 小結
11.5 習題
附錄A 圖的索引
附錄B 表的索引
附錄C 例程索引
附錄D 函數、運算符與宏索引
參考文獻