《程序設計基礎(C語言)》是為了適應高職高專教學改革的需要而編寫的,全書主要內容包括C程序的結構,算法及算法的描述,c語言基礎,流程控制語句,函數,數組,結構體、共用體和枚舉類型,文件等,較全面地反映了c語言的全貌。《程序設計基礎(C語言)》在內容的組織上打破了同類教材的傳統結構,突出了重點,分散了難點。主要表現在:一是將編譯預處理和位運算并入c語言基礎,降低了教學要求;二是將指針的相關知識以應用為原則,分散到相關章節中,便于學生學習和掌握。同時,《程序設計基礎(C語言)》內容完全覆蓋了“全國計算機等級考試(二級C)考試大綱”中C語言部分的知識點,并且在習題中選入部分歷年考試的原題,為學習者參加全國計算機等級考試提供幫助。
《程序設計基礎(C語言)》可以作為高職高專類學校計算機專業的教材,也適合有關人員自學使用。
本書是按照高等學校基礎教育改革的要求,由西安航空技術高等專科學校計算機工程系組織編寫的。
程序設計技術是信息技術人員的基本功。隨著計算機技術的進步和高校教學改革的不斷深入,C語言由原來計算機專業高年級學生學習的專業課程,逐漸變成了低年級學生學習程序設計的入門課程、基礎課程。教學目的和教學對象的變化,要求必須對這門課程的教學內容和教學方法進行改革。我系近年來在這方面進行了有益的嘗試,對改革的成果進行了總結和提煉,編寫了這本教材。
本書以《程序設計基礎》命名,是為了突出這門課程作為入門性課程的特點。在這門課程中,核心是程序設計的基本思想和方法。但思想和方法又不能憑空存在,必須以某種方式表達出來,C語言是表達這種思想和方法的一種非常優秀的工具。本書以C語言的語法為線索,逐漸地融入程序設計的基礎知識,使學生在學習C語言的過程中,潛移默化地接受、理解和掌握程序設計的基本思想和方法。當然,作為入門性的課程,也不能期望在這門課程中解決所有的問題。因此,在本書中,我們只介紹最基本的、學生能夠理解和掌握的程序設計思想和方法,而程序設計中一些經典的思想和方法,留到其他課程中去解決。
本書還有一個特點,就是把c語言中應用最靈活、學生學習時感覺難度最大的指針進行了分解。在書中,我們把指針的相關知識,按照它的作用分解到各個章節中。這樣不但分散了難點,而且使學生知道什么時候必須使用指針,該如何使用指針。解決了指針這個難點,C語言的教學就成功了一半。
本書由楊俊清教授任主編,負責全書的組織和統稿工作,并編寫了第1章。石鋒擔任副主編,并編寫了第7章。參加編寫的人員還有:程傳旭,編寫了第2、3章;陳慶榮,編寫了第4章;張少應,編寫了第5章;彭寒,編寫了第6章;王建,編寫了第8、9章;曹國震,編寫了第10章。
由于作者水平有限,書中疏漏之處在所難免,懇請讀者批評指正。
第1章 程序設計概述
1.1 程序工作原理
1.1.1 馮·諾伊曼原理
1.1.2 計算機的構成原理
1.2 程序設計語言
1.2.1 程序設計語言的發展
1.2.2 典型高級語言
1.2.3 程序設計語言發展趨勢
1.3 算法概述
1.4 c語言程序設計
1.4.1 C語言的發展歷史
1.4.2 C語言的特點
1.4.3 c語言程序基本結構
1.4.4 C語言程序的開發環境
習題
第2章 C語言基礎
2.1 標識符與關鍵字
2.2 簡單數據類型
2.2.1 常量與變量
2.2.2 整型
2.2.3 實型
2.2.4 字符型
2.2.5 不同類型數據的混合運算
2.3 簡單計算
2.3.1 算術運算與算術表達式
2.3.2 賦值運算符與賦值表達式
2.3.3 自加、自減和逗號運算
習題
第3章 順序結構程序設計
3.1 c語句概述
3.1.1 C程序基本結構
3.1.2 C語句分類
3.1.3 c結構化程序設計
3.2 數據的輸入與輸出
3.2.1 printf函數
3.2.2 scanf函數
3.2.3 其他輸入腧出函數
3.3 編譯預處理命令
3.3.1 宏定義
3.3.2 文件包含
3.3.3 條件編譯
3.4 函數簡介
3.4.1 函數定義和調用的一般方法
3.4.2 庫函數的調用
3.5 順序結構程序設計舉例
習題
第4章 選擇程序設計
4.1 關系運算和邏輯運算
4.1.1 關系運算符和關系表達式
4.1.2 邏輯運算符和邏輯表達式
4.2 分支流程控制語句
4.2.1 if語句
4.2.2 switch語句
4.2.3 條件運算符
4.3 選擇語句的嵌套
4.4 選擇結構程序設計舉例
習題
第5章 循環結構程序設計
5.1 循環流程控制語句
5.1.1 while語句
5.1.2 do-while語句
5.1.3 for語句
5.2 循環嵌套
5.3 break語句和continue語句
5.3.1 break語句
5.3.2 continue語句
5.4 循環結構程序設計舉例
5.4.1 窮舉
5.4.2 迭代
習題
第6章 函數
6.1 函數的定義和調用
6.1.1 函數概述
6.1.2 函數的定義
6.1.3 函數的調用
6.2 函數問地址的傳遞
6.2.1 指針的概念
6.2.2 指針變量
6.2.3 指針變量的對象
6.2.4 函數間傳遞地址
6.3 函數間函數的傳遞
6.3.1 函數的地址
6.3.2 指向函數的指針變量
6.3.3 在函數之間傳遞函數
6.4 函數的遞歸調用
6.5 變量的作用域
6.5.1 內部變量
6.5.2 外部變量
6.5.3 內部函數和外部函數
6.6 變量的存儲屬性
6.6.1 變量及其存儲屬性
6.6.2 動態內部變量和靜態內部變量
習題
第7章 數組
7.1 一維數組
7.1.1 數組概述
7.1.2 一維數組的定義和初始化
7.1.3 一維數組元素的引用
7.1.4 簡單排序算法
7.2 函數問一維數組的傳遞
7.2.1 一維數組元素地址的表示
7.2.2 利用指針變量訪問一維數組
7.2.3 在函數間傳遞一維數組
7.3 二維數組
7.3.1 二維數組的定義和初始化
7.3.2 二維數組元素的引用
7.4 函數問二維數組的傳遞
7.4.1 二維數組元素的地址表示法
7.4.2 利用行指針變量訪問二維數組元素
7.4.3 函數之問二維數組的傳遞
習題
第8章 字符串
8.1 字符串
8.1.1 字符串常量
8.1.2 字符串的存儲
8.1.3 字符串的表示
8.2 函數間字符串的傳遞
8.2.1 單個字符串的傳遞
8.2.2 多個字符串的傳遞
8.2.3 main函數的參數
8.2.4 字符串處理函數
習題
第9章 結構體、共用體和枚舉類型
9.1 結構體
9.1.1 結構體的類型定義
9.1.2 結構體數據的定義和引用
9.2 單鏈表
9.2.1 動態存儲分配
9.2.2 單鏈表概述
9.2.3 單鏈表的基本操作
9.3 共用體和枚舉類型
9.3.1 共用體
9.3.2 枚舉類型
9.4 typedef定義類型
習題
第10章 文件
10.1 文件概述
10.1.1 文件和文件指針
10.1.2 文件操作的一般過程
10.1.3 文件的打開與關閉
10.2 文件的讀寫
10.2.1 fprintf和fscanf函數
10.2.2 fputc和fgetc函數
10.2.3 fputs和fgets函數
10.2.4 fwrite和fread函數
10.3 文件定位
10.3.1 rewind函數
10.3.2 fseek函數
習題
附錄A 常用字符ASCII代碼表
附錄B 運算符的優先級和結合性
附錄C 標準庫函數
(3)健壯性:正確的輸入能得到正確的輸出,這是算法必須具有的特性之一。但當遇到非法輸入時,算法應能做出反應或處理(如提示信息等),而不會產生不需要的或不正確的結果。
例如,在算法中總是采用較簡單的方法以及模塊化函數以增強算法的易讀性;采用步驟較少的求解方法以提高算法的時間效率;對可能發生的各種現象及輸入形式給出應對措施以提高算法的健壯性。
要確定一個算法是適合的、“好”的算法,就需要進行算法分析。算法分析的兩個主要方面是分析算法的時間效率和空間效率,目的是以求改進算法或對不同的算法進行比較。鑒于目前情況下運算空間較為充足,我們把算法的時間效率分析作為主要內容。
算法運行的時間分析和程序運行的時間分析是有區別的。同一算法由不同的程序員所編寫的程序有優劣之分,程序運行的時間也就有所不同;程序在不同的機器上運行的速度又和機器本身的速度有關。而我們感興趣的是對解決問題的算法作時間上的度量分析,或對解決同一問題的兩種或兩種以上的算法運行時問加以比較。