本書的內容共分10章。第1章介紹程序設計的基本概念、常識以及C語言的初步知識,可完成對C語言、程序設計及設計環境的基本了解。第2章和第3章介紹數據、運算、輸入輸出、順序與與分支流程控制,可滿足設計簡單但完整的C語言程序的要求。第4章介紹循環結構以及數組的基本應用方法,可以解決稍微復雜的實際問題。第5章介紹函數,能夠較全面了解C語言程序的組織結構和模塊化的程序設計技術。第6章介紹指針,這是C語言"高級能力的體現。第7章介紹字符串,這是應用廣泛且能夠體現C語言程序設計技巧的內容。第8章介紹了利用指針訪問數組的方法、動態內存管理、指向函數的指針以及類型識別與描述方法,集中討論了幾種與指針相關的復雜概念和技術。第9章介紹自定義的數據類型,包括枚舉、結構體和共用體,使程序能夠順利描述復雜的對象,建立復雜的數據結構。第10章介紹文件操作,完成數據在內存與磁盤文件之間的交互。
前 言
C語言以其獨特的魅力吸引了眾多的軟件開發者,也被作為程序設計的一種基本語言來學習。它兼有高級語言和低級語言二者之長,代碼簡潔高效,功能強大。盡管以C語言為基礎發展起來的C 、Java等語言已逐漸趕上甚至超過了C語言本身,但從實用性、易用性和學習的難度等多種角度看,C語言仍是不可多得的語言,而C語言程序設計也是大部分高校計算機及相關專業的必修課程。
十年前,本書第一作者應邀為遼寧省計算機基礎教育學會編寫了C語言程序設計教材,并在多所高校使用,取得了良好的教學效果。該書的主要目的是實現普及性的程序設計知識教育,并兼顧國家的程序設計等級考試。隨著高校向工程化實用型人才培養目標的轉化,以及企業對高校畢業生動手實踐能力的要求,促使我們對以前的教材進行整理和修改,從面向工程、面向應用的觀點出發,結合新的C語言標準重新編撰了此書。
與現存的普及性教材和程序設計技巧和實例類的書籍不同,本書的讀者對象是高校的在讀學生,重點是在掌握語言及程序設計的一般知識基礎上,突出面向工程應用的知識積累和解決實際問題的能力培養,強化學習的實踐性和實用性。因此,本書緊密圍繞著上述目標進行組織,并體現了如下主要特點:
■ 精心安排的體系結構。盡管C語言本身是一種很小的語言,但設計一個完整程序所涉及到的知識點是很多的,且很多知識點存在著交叉、重疊。根據難點的合理拆分,知識點結合的緊密性以及完整項目與程序的組織原則等多種因素,確定了自己的體系結構,使前后內容自然銜接,循序漸進,也使讀者能夠更容易建立知識體系。
■ 采取面向工程和實際應用的原則。雖然掌握程序設計的基本方法是計算機語言教學的目的之一,但作為一本大學生使用的教材,應該充分考慮解決工程中的實際應用所面臨的問題,要使其了解哪些是工程應該中應該使用的技術,怎樣的程序更符合工程應用的要求,哪些問題在實際工作中必須避免,等等。因此,除了對相關知識增加質量上的評價外,本書對重點問題、工程應用經驗、應特殊注意的事項等進行了詳細總結和提煉,并以提示的方式貫穿于知識點的講解過程。
■ 追求優秀的技術和高質量的程序。為了使學習更靠近應用,首先,強化有應用背景的材料,并據此對實用技術做透徹的講解。其次,利用后續逐步展開的新技術,不斷修正前面已設計的程序,提高其質量,引導學生學會用更合適的技術來解決實際問題。
本書的內容共分10章。第1章介紹程序設計的基本概念、常識以及C語言的初步知識,可完成對C語言、程序設計及設計環境的基本了解。第2章和第3章介紹數據、運算、輸入/輸出、順序與分支流程控制,可滿足設計簡單但完整的C語言程序的要求。第4章介紹循環結構以及數組的基本應用方法,可以解決稍微復雜的實際問題。第5章介紹函數,能夠較全面地了解C語言程序的組織結構和模塊化的程序設計技術。第6章介紹指針,這是C語言高級能力的體現。第7章介紹字符串,這是應用廣泛且能夠體現C語言程序設計技巧的內容。第8章介紹利用指針訪問數組的方法、動態內存管理、指向函數的指針以及類型識別與描述方法,集中討論了幾種與指針相關的復雜概念和技術。第9章介紹自定義的數據類型,包括枚舉、結構體和共用體,使程序能夠順利描述復雜的對象,建立復雜的數據結構。第10章介紹文件操作,完成數據在內存與磁盤文件之間的交互。
在內容講解上,本書盡量做到簡明扼要,重點突出,采用更直觀和直接的方法解釋復雜的概念,以使讀者容易理解并認清問題的本質。為了輔助學習和強化實踐,每章除了正常的例題和習題之外,還特別安排了一定數量的編程實戰題目。同時,本書還簡要介紹了幾種主要的C(C )編程環境的使用方法,以便讀者上機實習時選用。
我們希望本書能夠高質量地滿足工科學校計算機相關專業的教學需要,也特別希望讀者能夠不吝指出書中的缺點和錯誤,以便再版時能夠加以改進。
作者的電子郵箱:niulq@sut.edu.cn。
編著者
牛連強,男,沈陽工業大學軟件學院院長、教授二是余年來,長期從事高等學校計算機領域的教學和科研工作,教學經驗豐富、科研項目成果豐富,并出版了多部教材和專著,發表論文40余篇。
目 錄
第1章 概述1
1.1 程序設計基礎1
1.1.1 問題的求解過程1
1.1.2 算法及其描述2
1.1.3 模塊化與結構化4
1.2 C語言及其特點5
1.2.1 C語言的產生和發展5
1.2.2 C語言的主要特點5
1.3 C語言程序的基本結構6
1.4 高級語言程序的處理過程10
1.5 利用Visual C 6.0環境編寫和運行
C語言程序11
1.5.1 VC6環境的安裝與運行12
1.5.2 編制一個(控制臺)源程序13
1.5.3 編譯、鏈接與運行程序14
1.5.4 程序調試技術15
1.5.5 簡單的程序調試與糾錯17
1.6 習題19
1.7 編程實戰20
第2章 數據與運算21
2.1 標識符與關鍵字21
2.1.1 標識符21
2.1.2 關鍵字22
2.2 數據類型22
2.3 常量23
2.3.1 直接常量與符號常量23
2.3.2 整型常量24
2.3.3 字符型常量與字符串常量25
2.3.4 浮點型常量28
2.4 變量29
2.4.1 變量定義與初始化29
2.4.2 整型變量31
2.4.3 字符型變量32
2.4.4 浮點型變量33
2.5 算術運算與賦值運算33
2.5.1 運算符和表達式34
2.5.2 算術運算35
2.5.3 賦值運算35
2.5.4 自加和自減運算38
2.6 關系運算和邏輯運算39
2.6.1 邏輯值39
2.6.2 關系運算40
2.6.3 邏輯運算41
2.7 位運算44
2.7.1 位運算符及表達式44
2.7.2 位運算操作44
2.8 sizeof運算與逗號運算48
2.8.1 sizeof運算符48
2.8.2 逗號運算符49
2.9 數據類型轉換50
2.9.1 隱式類型轉換50
2.9.2 顯式類型轉換51
2.10 習題52
2.11 編程實戰54
第3章 簡單程序設計55
3.1 C語言語句概述55
3.1.1 語句分類55
3.1.2 語句的形式56
3.2 數據輸出58
3.2.1 輸出一個字符58
3.2.2 按自定義格式輸出數據59
3.3 數據輸入62
3.3.1 輸入一個字符62
3.3.2 按自定義格式輸入數據63
3.4 分支結構66
3.4.1 條件運算符與條件表達式66
3.4.2 if語句67
3.4.3 switch語句與多分支處理72
3.5 習題76
3.6 編程實戰77
第4章 循環結構與數組78
4.1 while語句與do while語句78
4.1.1 while語句78
4.1.2 do while語句80
4.2 for語句82
4.2.1 for語句的語法82
4.2.2 for語句的特殊形式83
4.3 流程轉移語句85
4.3.1 break語句85
4.3.2 continue語句86
4.3.3 goto語句87
4.4 循環結構的應用88
4.5 一維數組的定義和引用91
4.5.1 一維數組的定義91
4.5.2 一維數組的引用92
4.5.3 一維數組的定義初始化93
4.6 一維數組的應用94
4.7 二維數組97
4.7.1 二維數組的定義與引用97
4.7.2 二維數組的定義初始化98
4.7.3 二維數組的應用99
4.8 習題101
4.9 編程實戰103
第5章 函數104
5.1 函數的定義與聲明104
5.1.1 函數定義104
5.1.2 函數聲明107
5.2 函數調用及返回108
5.2.1 函數的調用過程108
5.2.2 用return語句控制函數返回109
5.3 形參與實參111
5.3.1 函數的形式參數111
5.3.2 實參與形參的匹配112
5.3.3 函數調用表達式112
5.4 參數的傳值調用規則114
5.5 遞歸調用116
5.5.1 遞歸調用過程116
5.5.2 典型的遞歸問題與函數示例118
5.6 變量的存儲屬性120
5.6.1 變量的生存期與作用域120
5.6.2 局部變量121
5.6.3 外部變量125
5.6.4 static修飾、變量屏蔽和外部變量
的使用127
5.7 編譯預處理指令129
5.7.1 宏定義129
5.7.2 文件包含131
5.7.3 條件編譯132
5.8 習題132
5.9 編程實戰135
第6章 指針138
6.1 指針與指針變量138
6.1.1 指針是經過包裝的地址138
6.1.2 指針變量140
6.2 指針變量的賦值與指針的間接
引用141
6.2.1 指針變量的賦值141
6.2.2 *運算符與間接訪問142
6.2.3 指針變量的初始化144
6.3 指針的運算145
6.3.1 指針的加減算術運算145
6.3.2 指針的自加和自減運算147
6.3.3 指針的比較147
6.4 指針作函數的參數148
6.4.1 修改實參變量的值148
6.4.2 從被調用函數取得信息150
6.5 利用指針訪問一維數組151
6.5.1 利用指針實現快速數組元素
訪問151
6.5.2 一維數組名的指針含義152
6.5.3 指針與數組的一致性153
6.6 向函數傳遞一維數組154
6.7 習題158
6.8 編程實戰161
第7章 字符串162
7.1 用字符數組作字符串變量162
7.1.1 對字符數組的特殊處理162
7.1.2 用作字符串變量的字符數組
初始化164
7.2 指向字符串常量的指針變量165
7.2.1 界限模糊的字符串常量與變量165
7.2.2 利用const限制指針的行為166
7.3 字符串的輸出與輸入167
7.3.1 字符串輸出167
7.3.2 字符串輸入168
7.3.3 內存格式化169
7.4 字符串操作170
7.4.1 向函數傳遞字符串170
7.4.2 返回指針的函數171
7.4.3 字符串運算函數173
7.4.4 字符串處理函數的設計176
7.5 指針數組178
7.5.1 指針數組的定義與引用178
7.5.2 字符串數組179
7.6 指向指針的指針181
7.6.1 指向指針的指針常量與變量181
7.6.2 指針數組作函數參數183
7.7 習題184
7.8 編程實戰187
第8章 與指針相關的其他技術189
8.1 二維數組的指針訪問189
8.1.1 二維數組的一維表示189
8.1.2 二維數組名的指針含義190
8.1.3 指向一維數組的指針變量192
8.1.4 二維數組作函數參數193
8.1.5 利用二維數組實現的字符串
數組195
8.2 動態內存管理196
8.2.1 動態內存申請與使用的一般
過程197
8.2.2 calloc函數與realloc函數199
8.3 指向函數的指針201
8.3.1 指向函數的指針常量與變量202
8.3.2 函數指針的應用203
8.4 定義的識別與數據類型的顯式
描述205
8.4.1 由運算識別復雜的定義205
8.4.2 用typedef顯式描述數據類型207
8.5 習題209
8.6 編程實戰211
第9章 自定義數據類型212
9.1 枚舉212
9.2 結構體類型214
9.2.1 結構體類型的定義214
9.2.2 結構體類型的變量定義216
9.3 結構體變量的引用217
9.3.1 引用結構體成員217
9.3.2 結構體變量的初始化218
9.3.3 整體引用結構體變量218
9.3.4 結構體對象在函數間的傳遞219
9.4 結構體數組和指針220
9.4.1 結構體數組220
9.4.2 結構體指針221
9.5 結構體指針的應用──鏈表224
9.5.1 單向鏈表及其支撐結構224
9.5.2 鏈表的創建與訪問225
9.5.3 鏈表結點的查找、插入與刪除227
9.6 位段231
9.7 共用體232
9.8 習題233
9.9 編程實戰235
第10章 文件236
10.1 文件概述236
10.1.1 文件的概念236
10.1.2 文本流與二進制流236
10.1.3 標準I/O和系統I/O237
10.2 文件的打開與關閉238
10.2.1 文件類型與文件指針238
10.2.2 文件的打開238
10.2.3 文件的關閉241
10.3 文件的順序讀寫242
10.3.1 字符讀寫函數fgetc和fputc242
10.3.2 文件尾檢測243
10.3.3 getw函數和putw函數245
10.3.4 讀寫字符串函數fgets和fputs246
10.3.5 格式化讀寫函數fscanf和
fprintf247
10.3.6 按塊讀寫函數fread和fwrite248
10.4 文件的隨機讀寫251
10.4.1 以讀/寫方式打開文件251
10.4.2 fseek函數與讀寫位置的隨機
定位252
10.5 相關函數253
10.6 習題254
10.7 編程實戰255
附錄A 常用字符與ASCII碼對照表257
附錄B 運算符的優先級與結合性258
附錄C C Builder編程環境的使用259
附錄D DEV-C 編程環境簡介264
參考文獻267