Posted on 2008-04-19 23:31
silentneil 閱讀(2349)
評論(0) 編輯 收藏 引用
C語言程序設(shè)計教案
教材類型:新世紀(jì)計算機(jī)基礎(chǔ)教育從書
主教材:C程序設(shè)計(第二版)
編者:譚浩強(qiáng) 著
出版:清華大學(xué)出版社
輔教材:C 程序設(shè)計解題與上機(jī)指導(dǎo)(第二版)
編者:譚浩強(qiáng) 主編
出版:清華大學(xué)出版社
總學(xué)時:102 周數(shù):17 周學(xué)時:4+2
目 錄
1 C語言概述
1.1 C語言出現(xiàn)的歷史背景
1.2 C語言的特點
1.3 簡單的C程序介紹
1.4 C程序的上機(jī)步驟
1.5 Turbo C常用命令簡介
2 程序的靈魂-算法
2.1 算法的概念
2.2 簡單算法舉例
2.3 算法的特性
2.4 怎樣表示一個算法
2.5 結(jié)構(gòu)化程序設(shè)計方法
3 數(shù)據(jù)類型、運(yùn)算符與表達(dá)式
3.1 C的數(shù)據(jù)類型
3.2 常量和變量
3.3 整型數(shù)據(jù)
3.4 實型數(shù)據(jù)
3.5 字符型數(shù)據(jù)
3.6 變量賦初值
3.7 各類數(shù)值型數(shù)據(jù)間的混合運(yùn)算
3.8 算術(shù)運(yùn)算符和逗號表達(dá)式
3.9 賦值運(yùn)算符和賦值表達(dá)式
3.10 逗號運(yùn)算符和逗號表達(dá)式
4 順序結(jié)構(gòu)程序設(shè)計
4.1 C語句概念
4.2 賦值語句
4.3 數(shù)據(jù)輸入輸出的概念及在C語言中的實現(xiàn)
4.4 字符數(shù)據(jù)的輸入與輸出
4.5 格式輸入與輸出
4.6 順序結(jié)構(gòu)程序設(shè)計舉例
5 選擇結(jié)構(gòu)程序設(shè)計
5.1 關(guān)系運(yùn)算符和關(guān)系表達(dá)式
5.2 邏輯運(yùn)算符和邏輯表達(dá)式
5.3 If語句
5.4 Switch語句
5.5 程序舉例
6 循環(huán)結(jié)構(gòu)程序設(shè)計
6.1 概述
6.2 goto語句以及用goto語句構(gòu)成循環(huán)
6.3 while語句
6.4 do-while語句
6.5 for語句
6.6 循環(huán)的嵌套
6.7 幾種循環(huán)的比較
6.8 break語句和continue語句
6.9 程序舉例
7 數(shù)組
7.1 一維數(shù)組的定義和引用
7.2 二維數(shù)組的定義和引用
7.3 字符數(shù)組和字符串
8 函數(shù)
8.1 概述
8.2 函數(shù)定義的一般形式
8.3 函數(shù)參數(shù)和函數(shù)的值
8.4 函數(shù)的調(diào)用
8.5 函數(shù)的嵌套調(diào)用
8.6 函數(shù)的遞歸調(diào)用
8.7 數(shù)組作為函數(shù)參數(shù)
8.8 局部變量和全局變量
8.9 變量的存儲類別
8.10 內(nèi)部函數(shù)和外部函數(shù)
8.11 如何運(yùn)行一個多文件的程序
9 預(yù)處理命令
9.1 宏定義
9.2 文件包含處理
9.3 條件編譯
11 指針
10.1 地址和指10.2 針的概述
10.3 變量的指10.4 針和指10.5 向變量的指10.6 針變量
10.7 數(shù)組與指10.8 針
10.9 字符串與指10.10 針
10.11 指10.12 向函數(shù)的指10.13 針
10.14 返回指10.15 針值的函數(shù)
10.16 指10.17 針數(shù)組和指10.18 向指10.19 針的指10.20 針
10.21 有關(guān)指10.22 針的數(shù)據(jù)類型和指10.23 針運(yùn)算小結(jié)
12 結(jié)構(gòu)體與共用體
11.1 結(jié)構(gòu)體概述
11.2 定義結(jié)構(gòu)體類型變量的方法
11.3 結(jié)構(gòu)體變量的引用
11.4 結(jié)構(gòu)體變量的初始化
11.5 結(jié)構(gòu)體數(shù)組
11.6 指11.7 向結(jié)構(gòu)體類型數(shù)據(jù)的指11.8 針
11.9 用指11.10 針處理鏈表
11.11 共用體
11.12 枚舉類型
11.10 用typedef定義類型
13 位運(yùn)算
12.1 位運(yùn)算符和位運(yùn)算
12.2 位運(yùn)算應(yīng)用舉例
12.3 位段
14 文件
13.1 C文件概述
13.2 文件類型指13.3 針
13.4 文件的打開與關(guān)閉
13.5 文件的順序讀寫
13.6 文件的定位
13.7 出錯的檢測
13.8 文件輸入輸出小結(jié)
第1章 C語言概述
1.1 C語言出現(xiàn)的歷史背景
C語言是國際上廣泛流行的計算機(jī)高級語言,即可用來寫系統(tǒng)軟件,也可用來寫應(yīng)用軟件。
C語言是在B語言的基礎(chǔ)上發(fā)展起來的。
早期的C語言運(yùn)行在UNIX操作系統(tǒng)上,后來運(yùn)行在DOS操作系統(tǒng)上,現(xiàn)在的C語言可運(yùn)行在Windos操作系統(tǒng)上。
C語言有許多版本,我們使用的是Turbo C 2.0。
P1,說明。
1.2 C語言的特點
C語言有許多優(yōu)于其它語言的特點:
(1)語言簡潔、緊湊,使用方便、靈活。
C語言一共只有32個關(guān)鍵字,9個控制語句,書寫形式自由。
P2,表1.1。
(2)運(yùn)算符豐富。
C共有34種運(yùn)算符,如+、-等。
P2,說明。
(3)數(shù)據(jù)結(jié)構(gòu)豐富。
C有整型、實型等多種數(shù)據(jù)結(jié)構(gòu)。
P3,說明。
(4)具有結(jié)構(gòu)化的控制語句。
C有if…else、while等多種結(jié)構(gòu)化的控制語句。
P3,說明。
(5)語法限制不太嚴(yán)格,程序設(shè)計自由度大。
如對數(shù)組下標(biāo)越界不作檢查等。
P3,說明。
(6)C語言可進(jìn)行位運(yùn)算。
這是C區(qū)別于其它高級語言的主要特點。
P3,說明。
(7)生成目標(biāo)代碼質(zhì)量高。
這也是C的優(yōu)于其它高級語言之處。
P3,說明。
(8)C程序可移植性好。
即C程序可基本不做修改移到不同的計算機(jī)上運(yùn)行。
P3,說明。
1.3 簡單的C程序介紹
P4,例1.1,見ex1-1.c。
程序功能:打印一個字符串,并輸出一個換行符。
P4,例1.2,見ex1-2.c。
程序功能:求兩個數(shù)之和。
P5,例1.3,見ex1-3.c。
程序功能:求兩個數(shù)的較大者。
分析這三個例子的執(zhí)行過程。
說明:
4 C程序是由函數(shù)組成的。在上面的例子中的函數(shù)有:main、printf、scanf和max。其中main是主函數(shù),printf、scanf是庫函數(shù),max是自定義函數(shù)。一個C程序一定要有一個主函數(shù)。庫函數(shù)是放在*.h的庫函數(shù)文件中,只要直接調(diào)用就可。自定義函數(shù)要由用戶先定義后調(diào)用。
5 認(rèn)識一下C函數(shù)
C函數(shù)定義的一般格式為:
函數(shù)類型 函數(shù)名(形參類型 形式參數(shù),…)
{
數(shù)據(jù)聲明部分;
函數(shù)執(zhí)行部分;
}
C函數(shù)調(diào)用的一般格式為:
函數(shù)名(實際參數(shù),…)
(3)一個C程序總是從main主函數(shù)開始執(zhí)行的,而不論main函數(shù)在程序中的位置如何。主函數(shù)可以調(diào)用子函數(shù),子函數(shù)還可以調(diào)用子子函數(shù)。因此C程序是層次結(jié)構(gòu)的。
(4)C程序一行可以寫多個語句,每個語句以“;”結(jié)束。C程序是區(qū)分大小寫字母的。C程序本身沒有輸入輸出語句,其輸入輸出是由庫函數(shù)printf和scanf來完成的。/*…*/是C的注釋語句。
1.4 C程序的上機(jī)步驟
C程序編寫好后,要經(jīng)過編輯、編譯、連接與運(yùn)行四個步驟,這四個步驟的作用分別是:
編輯:把C語言源程序輸入計算機(jī)并進(jìn)行修改存盤,生成*.c的源程序文件。
編譯:用C編譯程序?qū)?.c的源程序文件進(jìn)行編譯,生成*.obj的二進(jìn)制文件。
連接:把*.obj的二進(jìn)制文件與系統(tǒng)標(biāo)準(zhǔn)模塊進(jìn)行連接,生成*.exe的可執(zhí)行文件。
運(yùn)行:執(zhí)行*.exe的可執(zhí)行文件,輸出執(zhí)行結(jié)果。
以上步驟均可在Turbo C的工作平臺上進(jìn)行,啟動Turbo C,就可以進(jìn)行編輯,打命令Ctrl+F9,就可以進(jìn)行編譯、連接和運(yùn)行,打命令A(yù)lt+F5,就可看到執(zhí)行結(jié)果。
舉例說明,見ex1-1.c。
1.5 Turbo C常用命令簡介
1. 啟動和退出
啟動:在DOS下打TC,或在Windows下創(chuàng)建快捷命令執(zhí)行。
退出:Alt+X
2. 程序的編輯
簡單編輯:Ins:插入/改寫 Backspace:刪除前一字符
Del:刪除當(dāng)前字符 Ctrl+Y:刪除一行
塊操作:Ctrl+KB、Ctrl+KK:定義塊首、尾
Ctrl+KC、Ctrl+KV、Ctrl+KY:塊復(fù)制、塊移動、塊刪除
Ctrl+KH:取消塊定義
3. 程序載入與存盤
F3:載入程序 F6:切換窗口
F2:存盤 Alt+FN:新建程序
4. 編譯和運(yùn)行
Ctrl+F9:編譯連接執(zhí)行程序 Alt+F5:查看執(zhí)行結(jié)果
Ctrl+F7:添加監(jiān)視表達(dá)式 F7:進(jìn)入子函數(shù)單步執(zhí)行
F8:越過子函數(shù)單步執(zhí)行 Ctrl+F2:取消單步執(zhí)行
舉例說明,見ex1-1.c。
第2章 程序的靈魂-算法
一個程序應(yīng)包括兩個方面的內(nèi)容:
3 對數(shù)據(jù)的描述:即程序中的數(shù)據(jù)要指定它的類型和組織形式,也稱數(shù)據(jù)結(jié)構(gòu)。
4 對操作的描述:即程序中對要做的事要指明它的操作步驟,也稱算法。
算法是程序的靈魂,也就是說,要計算機(jī)解決實際中的問題,“怎么解”是程序設(shè)計的關(guān)鍵。
2.1 算法的概念
(1)算法的定義
計算機(jī)算法:就是要計算機(jī)解決問題的操作步驟。
P13,例。
(2)算法的分類
計算機(jī)算法可分為兩類:數(shù)值算法和非數(shù)值算法。
P14,例。
2.2 簡單算法舉例
P14,例2.1。
注意:解決同一問題可有不同的算法,算法有優(yōu)劣之分。
P15,例2.2。
注意:循環(huán)是算法中常用的手段。
2.3 算法的特性
算法具有如下特性:
(1)有窮性
即經(jīng)過有限步就能夠完成。
P14,例2.1。P15,例2.2。
(2)確定性
即每一步都是確定的。
P14,例2.1。P15,例2.2。
(3)有零個或多個輸入
即一個算法必須輸入的數(shù)據(jù)可以是零個或多個。
P14,例2.1。P15,例2.2。
(4)有一個或多個輸出
即一個算法可以輸出一個或多個數(shù)據(jù)。
P14,例2.1。P15,例2.2。
(5)有效性
即算法中每一步驟都能有效地執(zhí)行,并得到確定的結(jié)果。
P14,例2.1。P15,例2.2。
2.4 怎樣表示一個算法
算法的表示法有多種,敘述如下:
(1)用自然語言表示
即把算法用人們?nèi)粘J褂玫恼Z言表示出來。
P14,例2.1。P15,例2.2。
特點:常常具有不確定性,不宜采用。
(2)用流程圖表示
即把算法用一些特定的符號和圖形表示出來。
P20,例2.6,例2.7。
特點:這是一種較好的表示法,經(jīng)常采用。
(3)用N-S圖表示
即把算法用一些特定的符號和圖形表示出來。
P26,例2.11,例2.12。
特點:這也是一種較好的表示法,經(jīng)常采用。
(4)用偽代碼表示
即把算法用一些稱為偽代碼的文字和符號表示出來。
P29,例2.16,例2.17。
特點:這也是一種較好的表示法,經(jīng)常采用。
(5)用計算機(jī)語言表示
即把算法用某種計算機(jī)語言符號表示出來。
P31,例2.20,例2.21。
特點:這當(dāng)然是一種很好的表示法,可以輸入計算機(jī)執(zhí)行。
2.5 結(jié)構(gòu)化程序設(shè)計方法
算法有三種基本結(jié)構(gòu),它們是:
(1)順序結(jié)構(gòu):即算法的執(zhí)行是按順序一步接著一步的執(zhí)行。
(2)選擇結(jié)構(gòu):即算法的執(zhí)行是對某些步驟可有選擇的執(zhí)行。
(3)循環(huán)結(jié)構(gòu):即算法的執(zhí)行是對某些步驟可有限次的重復(fù)執(zhí)行。
這三種基本結(jié)構(gòu)的流程圖見P23,圖2.14,圖2.15,圖2.16,圖2.17。用這三種基本結(jié)構(gòu)設(shè)計程序稱為結(jié)構(gòu)化程序設(shè)計。
結(jié)構(gòu)化程序設(shè)計的方法指的是:
1 自頂向下
2 逐步細(xì)化
3 模塊化設(shè)計
4 結(jié)構(gòu)化編碼
P32,例。
第3章 數(shù)據(jù)類型、運(yùn)算符與表達(dá)式
3.1 C的數(shù)據(jù)類型
數(shù)據(jù)是程序的必要組成部分,也是程序處理的對象。C規(guī)定,在程序中使用的每一個數(shù)據(jù)必須屬于某一數(shù)據(jù)類型。
C語言中所有的數(shù)據(jù)類型見P38。
3.2 常量與變量
在程序運(yùn)行過程中,值保持不變的量稱為常量,值可能發(fā)生變化的量稱為變量。
3.2.1 常量與符號常量
1. 常量
常量是日常所說的常數(shù)、字符、字符串等。
P38,例。
2. 符號常量
用#define定義的用標(biāo)識符來表示的常量。
格式:#define 常量名 常量
功能:定義一個符號常量
P38,例3.1。
說明:常量名必須是一個標(biāo)識符。
3.2.2 變量
1. 標(biāo)識符
標(biāo)識符是用來表示符號常量、變量、數(shù)組、函數(shù)、過程、類型及文件的名字的。
標(biāo)識符的命名規(guī)則:
(1)以字母或下劃線開頭,由字母、數(shù)字和下劃線組成;
(2)不能與關(guān)鍵字同名,最好不要與庫函數(shù)名同名;
(3)長度無限定,但不同版本的C編譯時有自己的規(guī)定;
(4)區(qū)分大小寫。
P40,例。
2. 變量的聲明
格式:類型名 變量名,… ;
功能:聲明變量。
說明:(1)變量名必須是一個標(biāo)識符,變量必須先聲明后使用;
(2)變量一旦聲明,系統(tǒng)就為它開辟一個相應(yīng)類型的存儲空間;
(3)變量所占用的存儲空間的首地址稱為該變量的地址。
P40,例。
3. 變量的賦值
格式:變量名=表達(dá)式;
功能:把=號右邊表達(dá)式的值賦給=號左邊的變量。
P40,例。
3.3 整型數(shù)據(jù)
3.3.1 整型常量的表示方法
整型常量常用三種形式表示:
(1)十進(jìn)制:直接寫;
(2)八進(jìn)制:前加0;
(3)十六進(jìn)制:前加0X或0x。
P41,例。
3.3.2 整型變量
1. 整型數(shù)據(jù)在內(nèi)存中的存放形式
整型數(shù)據(jù)在內(nèi)存中采用定點表示。
定點表示有原碼、反碼、補(bǔ)碼之分,一般在機(jī)內(nèi)使用補(bǔ)碼。
原碼:最高位為符號位,小數(shù)點定在最低位之后,數(shù)值用二進(jìn)制表示。
反碼:正數(shù)的反碼與原碼一樣,負(fù)數(shù)的反碼除符號位外各位取反。
補(bǔ)碼:正數(shù)的補(bǔ)碼與原碼一樣,負(fù)數(shù)的補(bǔ)碼是反碼加1。
例1:整數(shù)10的16位定點表示
因:(10)10=(1010)2
故:整數(shù)10的16位定點表示為
原碼:
0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0
反碼:
0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0
補(bǔ)碼:
0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0
例2:整數(shù)-10的16位定點表示
因:(-10)10=(-1010)2
故:整數(shù)-10的16位定點表示為
原碼:
1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0
反碼:
1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1
補(bǔ)碼:
1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 0
現(xiàn)代計算機(jī)一般用補(bǔ)碼表示。
2. 整型變量的分類
(1)有三種整型變量
整型: int
短整型:short [int]
長整型:long [int]
(2)整型變量的分類
每種整型變量都可以是無符號的,無符號前加unsigned,有符號前加signed或省缺,于是可有6類整型變量。
P42,例。
(3)整型變量占用的存儲空間及取值范圍
P43,表3.1。
3. 整型變量的聲明
格式:[unsigned] int|short|long 變量名,…;
功能:聲明整型變量。
P44,例,例3.2。
4. 整型數(shù)據(jù)的溢出
int型的取值范圍為-32768~32767(-215~215-1),超出這個范圍稱為溢出,此時可能輸出難以理解的結(jié)果。
P44,例,例3.3。
3.3.3 整型常量的類型
整型常量一般按整型數(shù)據(jù)的取值范圍自動劃定,但也可強(qiáng)制規(guī)定它是什么類型,規(guī)則是:
無符號整型后加u或U;
長整型后加l或L。
P45,(1)~(5)
3.4 實型數(shù)據(jù)
3.4.1 實型常量的表示方法
實型常量常用二種形式表示:
(1)十進(jìn)制小數(shù)形式:直接寫,要有小數(shù)點,前或后至少要有一個數(shù);
(2)指數(shù)形式:用e或E的前后加數(shù)據(jù)表示,前面是一個小數(shù),后面是一個整數(shù)。
P45,例。
3.4.2 實型變量
1. 實型數(shù)據(jù)在內(nèi)存中的存放形式
實型數(shù)據(jù)在內(nèi)存中采用浮點表示
方法:設(shè)總位數(shù)為16,高12位為尾數(shù),低4位為階碼。尾數(shù)與階碼最高位為符號位,尾數(shù)小數(shù)點定在最高位之后,階碼小數(shù)點定在最低位之后。
例1:實數(shù)10.0的16位浮點表示
因:(10.0)10=(0.1)10×10(2)10=(0.1)2×10(10)2
故:實數(shù)10.0的16位浮點表示為
0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0
例2:實數(shù)-10.0的16位浮點表示
因:(-10.0)10=(-0.1)10×10(2)10=(-0.1)2×10(10)2
故:實數(shù)-10.0的16位浮點表示為
1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0
注意:(1)位數(shù)一般實數(shù)是32位,表示法類似;
(2)階碼與尾數(shù)的位數(shù)不同的計算機(jī)有不同的規(guī)定。
(3)數(shù)據(jù)進(jìn)行轉(zhuǎn)化表示時,尾數(shù)表示為±0.a…的形式,且a不為0,故表示是唯一的。
(4)以上階碼與尾數(shù)是原碼表示,實際上應(yīng)轉(zhuǎn)成補(bǔ)碼。
2. 實型變量的分類
(1)有三種實型變量
單精度: float
雙精度: double
長雙精度:long double
(2)占用的存儲空間及取值范圍
P46,表3.2。
(3)實型變量的聲明
格式:float | double |long double 變量名,…;
功能:聲明實型變量。
P46,例。
3. 實型數(shù)據(jù)的舍入誤差
由于單精度實型只保留7位有效數(shù)據(jù),故實型數(shù)據(jù)超出7位時會造成舍入誤差。
P47,例3.4。
3.4.3 實型常量的類型
實型常量一般按雙精度double來處理,但也可強(qiáng)制規(guī)定它是什么類型,規(guī)則是:
單精度后加f或F;
雙精度后加l或L。
P47,例。
3.5 字符型數(shù)據(jù)
3.5.1 字符常量
(1)一般字符常量
是用單撇號括起來的一個字符。
P48,例。
(2)特殊字符常量
是以反斜捍“\”開頭后跟一些字母或數(shù)字組成的字符。
P48,表3.3。
P49,例3.5。
3.5.2 字符變量
只有一種類型:char
聲明格式:char變量名,…;
字符變量可以用來存放一個字符。
P49,例。
3.5.3 字符數(shù)據(jù)在內(nèi)存中的存放形式
字符型數(shù)據(jù)在計算機(jī)內(nèi)以ASCII碼的形式存放,每個字符占用一個字節(jié)。
方法:查ASCII碼表,最高位填0。
例:字符’a’的存儲形式
因:(a)字符=(97)10進(jìn)ASCII碼=(1100001)2進(jìn)ASCII碼
故:字符’a’的存儲形式為
0 1 1 0 0 0 0 1
P50,例3.6,例3.7。
注意:一般字符的ASCII碼值范圍為0~127,無符號字符的ASCII碼值范圍為0~255。
3.5.4 字符串常量
(1)字符串常量
是用雙撇號括起來的若干個字符。
P52,例。
(2)字符串常量的存儲
字符串常量的存儲是每個字符占用一個字節(jié),尾部再加一個\0作為結(jié)束符。于是長度為n的字符串占用n+1個字節(jié)的存儲空間。
P52,例。
3.6 變量賦初值
格式:類型名 變量名=常量表達(dá)式,… ;
功能:聲明變量并賦初值。
P53,例。
3.7 各類數(shù)值型數(shù)據(jù)間的混合運(yùn)算
各類數(shù)值型數(shù)據(jù)間的混合運(yùn)算時會自動進(jìn)行轉(zhuǎn)換。
規(guī)則:(1)char,short型轉(zhuǎn)為int型;
(2)float型轉(zhuǎn)為double型;
(3)不同類型由低向高轉(zhuǎn)換,即int →unsigned →long →double
P54,圖3.10。
P54,例。
3.8 算術(shù)運(yùn)算符與算術(shù)表達(dá)式
3.8.1 C的運(yùn)算符簡介
C語言的運(yùn)算符有13類,P55。
學(xué)習(xí)運(yùn)算符注意如下幾點:
(1)運(yùn)算符的功能:如+號運(yùn)算的意義。
(2)與運(yùn)算量的關(guān)系:如單目、雙目,運(yùn)算量的類型等。
(3)運(yùn)算的優(yōu)先級:如先* /后+-。
(4)結(jié)合方向:如算術(shù)運(yùn)算從左到右,賦值從右到左。
(5)結(jié)果的類型:如兩個整型數(shù)相加還是整型數(shù)。
3.8.2 算術(shù)運(yùn)算符和算術(shù)表達(dá)式
1. 基本的算術(shù)運(yùn)算符
基本的算術(shù)運(yùn)算符有:+、-、*、/、%
P55,例。
注意:(1)+、-可作單目運(yùn)算符,也可作雙目運(yùn)算符。
(2)/ 運(yùn)算對整形是封閉的,如5/3的值是1。
2. 算術(shù)運(yùn)算符的優(yōu)先級和結(jié)合方向
(1)優(yōu)先級:①單目+、-②*、/、%③雙目+、-
(2)結(jié)合方向:從左到右
P55,例。
3. 強(qiáng)制類型轉(zhuǎn)換運(yùn)算符
格式:(類型標(biāo)識符)表達(dá)式
功能:把表達(dá)式強(qiáng)制為類型標(biāo)識符指定的類型。
優(yōu)先級:與單目+-相同。
注意:(1)強(qiáng)制轉(zhuǎn)換是一種單目運(yùn)算;
(2)被強(qiáng)制轉(zhuǎn)換變量本身并未轉(zhuǎn)換。
P56,例,例3.8。
4. 自增、自減運(yùn)算符
(1)運(yùn)算符:+ +、--
(2)優(yōu)先級:與單目+、-相同。
(3)結(jié)合方向:從右到左
P57,例。
注意:(1)自增與自減運(yùn)算符只能用于變量;
(2)前+ +、--:先增值后引用;
后+ +、--:先引用后增值。
5. 有關(guān)表達(dá)式使用中的問題說明
表達(dá)式是把常量、變量、函數(shù)用各種運(yùn)算符連接起來的合法的式子。C中的表達(dá)式簡練、高效,但有時會出現(xiàn)岐義性,使得程序理解有一定的困難,不同版本的C對表達(dá)式的解釋也有所不同。
P58,(1)~(3)
3.9 賦值運(yùn)算符和賦值表達(dá)式
1. 賦值運(yùn)算符
(1)運(yùn)算符:=
(2)優(yōu)先級:僅高于逗號“,”運(yùn)算,低于其它運(yùn)算。
(3)結(jié)合方向:從右到左
P59,例。
2. 類型轉(zhuǎn)換
當(dāng)賦值運(yùn)算兩邊的類型不一致,且都是數(shù)值類型或字符型時,會自動發(fā)生類型轉(zhuǎn)換,轉(zhuǎn)換以左邊變量的類型為準(zhǔn)。
轉(zhuǎn)換規(guī)則:
(1)實型賦給整型:舍去小數(shù)。
(2)整型賦給實型:值不變。
(3)雙精度賦給單精度:取其前7位有效數(shù)字,反之值不變。P59,例。
(4)字符型賦給整型:低8位照搬,高8位視符號位補(bǔ)0或1。P60,例。
(5)整型賦給字符型:低8位照搬,高8位丟失。P60,例。
(6)整型賦給長整型:值不變,反之低16位照搬。P60,例。
(7)無符號型賦給有符號型:長度相同時最高位變?yōu)榉栁唬L度不同時高位補(bǔ)0或截去高位。P61,例。
(8)有符號型賦給無符號型:長度相同時最高位失去符號位,長度不同時高位補(bǔ)0或截去高位。P61,例。
P61,例3.9。
3. 復(fù)合的賦值運(yùn)算
(1)運(yùn)算符:+=、-=、*=、/=、%= 等
(2)優(yōu)先級:與賦值運(yùn)算“=”相同;
(3)結(jié)合方向:從右到左。
P62,例。
4. 賦值表達(dá)式
由賦值語句購成的表達(dá)式稱為賦值表達(dá)式,這種表達(dá)式還可以嵌套,從右到左逐一進(jìn)行賦值運(yùn)算,表達(dá)式的值是最后一次賦值的值。
P63,例。
注意:(1)結(jié)合方向是從右到左的;
(2)復(fù)合的賦值運(yùn)算也可購成賦值表達(dá)式;
(3)賦值表達(dá)式可出現(xiàn)在輸出的語句中。
3.10 逗號運(yùn)算符和逗號表達(dá)式
1. 逗號運(yùn)算符
(1)運(yùn)算符: ,
(2)優(yōu)先級:最低;
(3)結(jié)合方向:從左到右。
P63,例。
2. 逗號表達(dá)式
格式:表達(dá)式1,表達(dá)式2,… ,表達(dá)式n
求解過程:從左到右逐一求表達(dá)式的值,整個表達(dá)式的值為最后一個表達(dá)式的值。
P64,例。
第4章 順序結(jié)構(gòu)程序設(shè)計
4.1 C語句概述
1. C的程序結(jié)構(gòu)
一個C程序由若干個源程序文件組成;一個源程序由預(yù)處理命令、全局變量說明和若干個函數(shù)組成;一個函數(shù)由函數(shù)首部和函數(shù)體組成;一個函數(shù)體由局部變量聲明和執(zhí)行語句組成。
P67,圖4.1。
2. C程序的語句
C程序的語句的語句分為5類:
(1)控制語句
用來控制程序流程的語句。
P68,①~⑨
P68,例。
注意:( )表示其中是一個條件,~表示內(nèi)嵌語句。
(2)函數(shù)調(diào)用語句
由一次函數(shù)調(diào)用加一個分號購成的語句。
P68,例。
注意:函數(shù)有庫函數(shù)與自定義函數(shù)兩種,自定義函數(shù)要先定義后調(diào)用。
(3)表達(dá)式語句
由一個表達(dá)式加一個分號購成的語句。
P68,例。
注意:表達(dá)式語句與表達(dá)式的區(qū)別在于有無分號。
(4)空語句
只由一個分號購成的語句。
P68,例。
注意:空語句不做任何事情。
(5)復(fù)合語句
把多個語句用{ }括起來的語句。
P69,例。
注意:復(fù)合語句構(gòu)成一個分程序,內(nèi)可包含數(shù)據(jù)聲明和執(zhí)行語句兩部分。
4.2 賦值語句
賦值語句是表達(dá)式語句的一種最常用的形式,與其它高級語言相比,C的賦值語句有其獨特之處:
(1)在C中“=”是一個運(yùn)算符;
(2)在C中賦值語句可以包括在其它表達(dá)式中。
P69,例。
4.3 數(shù)據(jù)輸入輸出的概念及在C語言中的實現(xiàn)
(1)把數(shù)據(jù)從外部設(shè)備送到計算機(jī)內(nèi)存稱為輸入,把數(shù)據(jù)從計算機(jī)內(nèi)存送到外部設(shè)備稱為輸出。外部設(shè)備有鍵盤、顯示器、磁盤等。
(2)C本身沒有輸入輸出的語句,C的輸入輸出是由一批庫函數(shù)來實現(xiàn)的。這些庫函數(shù)有:scanf、printf、getchar、putchar、gets、puts等,它們放在名為stdio.h的庫函數(shù)文件中。
(3)一般要使用這些庫函數(shù)時,要在程序頭加上
#include <stdio.h> 或 #include “stdio.h”
的預(yù)編譯命令,其作用是把這些庫函數(shù)包含到本程序中來。
P71,例。
4.4 字符數(shù)據(jù)的輸入與輸出
4.4.1 字符輸出函數(shù)putchar
格式:putchar(字符變量);
功能:把字符變量中的字符輸出到顯示器。
注意:putchar函數(shù)一般作為一個語句來使用。
P71,例4.1。見ex4-1.c。
4.4.2 字符輸入函數(shù)getchar
格式:getchar( )
功能:從鍵盤輸入一個字符并通過函數(shù)名返回這個字符。
注意:getchar函數(shù)一般在在表達(dá)式中使用。
P72,例4.2。
4.5 格式輸入與輸出
4.5.1 格式輸出函數(shù)printf
1. 一般格式
格式:printf(格式控制,輸出表列);
功能:按照“格式控制”中的格式要求輸出“輸出表列”的值。
P72,例。
(1)“格式控制”是一個用雙撇號括起來的字符串,它包括兩種信息:
①格式說明:由%和格式字符組成,不同的格式字符指明了不同的輸出方式。
②普通字符:即要原樣輸出的字符。
P72,例。
(2)“輸出表列”是要輸出的一些數(shù)據(jù),可以是表達(dá)式。
P73,例。
2. 格式字符
(1)d格式符:用來輸出十進(jìn)制整數(shù)。
可有四種用法:%d,%md,%ld,%-d。
其中:m表示輸出寬度,l表示輸出長整數(shù),-表示輸出左對齊。
P73,例。
(2)o格式符:用來輸出八進(jìn)制整數(shù)。
同樣可以附加m,l,- 等。
注意:符號位當(dāng)成數(shù)據(jù)輸出,不會輸出負(fù)數(shù)。
P74,例。
(3)x格式符:用來輸出十六進(jìn)制整數(shù)。
同樣可以附加m,l,- 等。
注意:符號位當(dāng)成數(shù)據(jù)輸出,不會輸出負(fù)數(shù)。
P74,例。
(4)u格式符:用來輸出無符號數(shù)據(jù)。
同樣可以附加m,l,- 等。
P74,例4.3。
(5)c格式符:用來輸出一個字符。
可以附加m,- 等。
P74,例4.4。
(6)s格式符:用來輸出一個字符串。
除了可以附加m,- 外,還可以寫成 %m.ns。
其中:m.n表示寬度為m,只輸出字符串左邊n個字符。
P75,例4.5。
(7)f格式符:用來小數(shù)形式輸出一個實數(shù)。
除了可以附加m,- 外,還可以寫成 %m.nf。
其中:m.n表示寬度為m,保留n位小數(shù)。
P76,例4.6,例4.7,例4.8。
(8)e格式符:用來指數(shù)形式輸出一個實數(shù)。
除了可以附加m,- 外,還可以寫成 %m.nf。
其中:m.n表示寬度為m,小(尾)數(shù)部分保留n位小數(shù)。
P77,例。
(9)g格式符:用來輸出一個實數(shù),形式自動取小數(shù)和指數(shù)中的較短者。
P77,例。
P77,表4.1。
4.5.2 格式輸入函數(shù)scanf
1. 一般格式
格式:scanf(格式控制,地址表列);
功能:按照“格式控制”中的格式要求輸入數(shù)據(jù)到“地址表列”的相應(yīng)變量中。
(1)“格式控制”是一個用雙撇號括起來的字符串,它包括兩種信息:
①格式說明:由%和格式字符組成,不同的格式字符指明了不同的輸入方式。
②普通字符:即要原樣輸入的字符。
P72,例。
(2)“地址表列”是要輸入的變量的地址,一般用地址運(yùn)算符&求得。
P79,例4.9。
2. 格式字符
scanf函數(shù)的格式字符與printf函數(shù)類似,但有微小區(qū)別。
P80,表4.3,表4.4。
說明:P80,(1)~(4)。
3. 使用scanf函數(shù)應(yīng)請注意的問題
(1)“格式控制”后面是變量的地址,而不是變量。
P81,例。
(2)如果在“格式控制”中有格式說明符外的其它字符,要原樣輸入。
P81,例。
(3)用%c輸入字符時,空格、回車符等都作為有效字符輸入。
P82,例。
(4)在輸入數(shù)據(jù)時,遇到空格、回車、跳格、限寬、非法等會結(jié)束輸入。
P82,例。
4.6 順序結(jié)構(gòu)程序設(shè)計舉例
P82,例4.10。見ex4-10.c。
P83,例4.11。見ex4-11.c。
P84,例4.12。見ex4-12.c。
第5章 選擇結(jié)構(gòu)程序設(shè)計
5.1 關(guān)系運(yùn)算符和關(guān)系表達(dá)式
5.1.1 關(guān)系運(yùn)算符及其優(yōu)先次序
(1)運(yùn)算符:>、>=、<、<=、= =、!=
(2)優(yōu)先級:①>、>=、<、<= ②= =、!=
低于算術(shù)運(yùn)算,高于賦值運(yùn)算
(3)結(jié)合方向:從左到右
P88,例。
5.1.2 關(guān)系表達(dá)式
用關(guān)系運(yùn)算符把兩個表達(dá)式連接起來的式子稱為關(guān)系表達(dá)式。
關(guān)系表達(dá)式的值為真(1)或假(0)。
P88,例。
5.2 邏輯運(yùn)算符和邏輯表達(dá)式
5.2.1 邏輯運(yùn)算符及其優(yōu)先次序
(1)運(yùn)算符:&&、||、!
(2)優(yōu)先級:①! ②&& ③||
!與單目+、-同級,&&、||低于關(guān)系運(yùn)算
(3)結(jié)合方向:! 從右到左,&&、|| 從左到右
P89,例。
5.2.2 邏輯表達(dá)式
用邏輯運(yùn)算符把兩個表達(dá)式連接起來的式子稱為邏輯表達(dá)式。
邏輯表達(dá)式的值為真(1)或假(0),判斷時非0是真、0是假。
P89,例。
注意:(1)a&&b&&c的判斷,a為0則表達(dá)式為0,a為1、b為0則表達(dá)式為0,a為1、b為1、c為0則表達(dá)式為0,否則表達(dá)式為1。
(2)a||b||c的判斷,a為1則表達(dá)式為1,a為0、b為1則表達(dá)式為1,a為0、b為0、c為1則表達(dá)式為1,否則表達(dá)式為0。
P91,例。
5.3 If語句
5.3.1 if語句的三種形式
1. 單分支if語句
格式1:if (表達(dá)式) 語句
功能1:如果表達(dá)式為真,則執(zhí)行語句。
P91,例。
2. 雙分支if語句
格式2:if (表達(dá)式) 語句1
else 語句2
功能2:如果表達(dá)式為真,則執(zhí)行語句1,否則執(zhí)行語句2。
P92,例。
3. 多分支if語句
格式3:if (表達(dá)式1) 語句1
else if (表達(dá)式2) 語句2
… …
else if (表達(dá)式n) 語句n
else 語句n+1
功能3:如果直到表達(dá)式i為真,則執(zhí)行語句i,否則表達(dá)式全為假,則執(zhí)行語句n+1。
P92,例。
注意:(1)每個語句都是以分號結(jié)束的;
(2)if或else后只能一個語句,如有多個語句要用{ }括起來。
P93,例5.1,例5.2。
5.3.2 if語句的嵌套
if語句可以嵌套,原則是else與它最近的if配對,如果在內(nèi)層嵌套中要使用單分支if語句,要用{ }把它括起來。
P94,例,例5.3。
5.3.3 條件運(yùn)算符
1 運(yùn)算符:? :
2 優(yōu)先級:低于邏輯運(yùn)算,高于賦值運(yùn)算
3 結(jié)合方向:從右向左
(4) 條件表達(dá)式:
格式:表達(dá)式1? 表達(dá)式2: 表達(dá)式3
功能:若表達(dá)式1為真,則條件表達(dá)式取表達(dá)式2,否則取表達(dá)式3。
P96,例。
注意:表達(dá)式2與表達(dá)式3二者的類型取高的。P37。
P98,例,例5.4。
5.4 Switch語句
格式:switch (表達(dá)式)
{case 常量表達(dá)式1:語句1
case 常量表達(dá)式2:語句2
… …
case 常量表達(dá)式n:語句n
[default:語句n+1]
}
功能:如果表達(dá)式的值等于常量表達(dá)式i,則執(zhí)行語句i及其后面的語句,否則如果都不等,則執(zhí)行語句n+1。
P99,例。
注意:(1)表達(dá)式可以是任何類型的;
(2)常量表達(dá)式的值不能相同;
(3)各case和default出現(xiàn)次序無關(guān);
(4)可用break中斷執(zhí)行后續(xù)語句;
(5)多個case可共用一組執(zhí)行語句。
P99,例。
5.5 程序舉例
P100,例5.5。見ex5-5-1.c,ex5-5-2.c。
P101,例5.6。
P103,例5.7。見ex5-7。
第6章 循環(huán)結(jié)構(gòu)程序設(shè)計
6.1 概述
在C語言中,構(gòu)成循環(huán)的語句有4種:
1 用goto和if語句;
2 用while語句;
3 用do-while語句;
4 用for語句。
6.2 goto語句以及用goto語句構(gòu)成循環(huán)
格式:goto 語句標(biāo)號;
功能:無條件轉(zhuǎn)到語句標(biāo)號指定的語句中去執(zhí)行。
注意:(1)語句標(biāo)號應(yīng)是合法的標(biāo)識符,可放在任何語句的前面。
(2)用goto語句構(gòu)成循環(huán)不是一種很好的方法。
P106,例,例6.1。
6.3 while語句
格式:while (表達(dá)式)
循環(huán)體;
功能:當(dāng)表達(dá)式為真時執(zhí)行循環(huán)體的語句,直到表達(dá)式為假時退出循環(huán)。
P107,例6.2。
注意:(1)循環(huán)體只能一個語句,如有多個語句要用{ }括起來。
(2)循環(huán)體內(nèi)應(yīng)有使循環(huán)趨于結(jié)束的語句,否則構(gòu)成死循環(huán)。
(3)循環(huán)體可能一次也沒執(zhí)行到,當(dāng)條件表達(dá)式為真時進(jìn)入循環(huán)體,故也稱當(dāng)型循環(huán)。
6.4 do-while語句
格式:do
循環(huán)體;
while (表達(dá)式);
功能:先執(zhí)行一次循環(huán)體,然后當(dāng)表達(dá)式為真時再執(zhí)行循環(huán)體,直到表達(dá)式為假時退出循環(huán)。
P108,例6.3,例6.4。
注意:(1)循環(huán)體只能一個語句,如有多個語句要用{ }括起來。
(2)循環(huán)體內(nèi)應(yīng)有使循環(huán)趨于結(jié)束的語句,否則構(gòu)成死循環(huán)。
(3)循環(huán)體至少執(zhí)行一次,直到條件表達(dá)式為假時退出循環(huán),故也稱直到型循環(huán)。
6.5 for語句
格式:for (初值表達(dá)式;條件表達(dá)式;修正表達(dá)式)
循環(huán)體;
功能:先執(zhí)行一次初值表達(dá)式,再執(zhí)行條件表達(dá)式,若為真則執(zhí)行循環(huán)體,然后執(zhí)行修正表達(dá)式,再次執(zhí)行條件表達(dá)式進(jìn)行判斷,直到條件表達(dá)式為假時退出循環(huán)。
P110,例。
注意:(1)循環(huán)體只能一個語句,如有多個語句要用{ }括起來。
(2)可以明顯看出循環(huán)體執(zhí)行的次數(shù),故也稱計數(shù)循環(huán)。
(3)三個表達(dá)式在一定的條件下都可省。
P111,說明(1)~(7)。
6.6 循環(huán)的嵌套
四種循環(huán)可以互相嵌套,此時外層循環(huán)的每一取值,內(nèi)層循環(huán)要轉(zhuǎn)一圈。但是循環(huán)嵌套不得交叉進(jìn)行。
P113,說明(1)~(6)。
6.7 幾種循環(huán)的比較
4 四種循環(huán)可以用來處理同一問題,但一般不用goto循環(huán)。
5 while和do-while循環(huán)在循環(huán)體內(nèi)應(yīng)有使循環(huán)趨于結(jié)束的語句,for可用修正表達(dá)式來實現(xiàn)。
6 while和do-while循環(huán)在循環(huán)前應(yīng)有初始化的操作,for可用初值表達(dá)式來實現(xiàn)。
7 while和do-while及for循環(huán)可用break語句跳出循環(huán)和用continue語句結(jié)束本次循環(huán),而goto循環(huán)不可以用。
6.8 break語句和continue語句
6.8.1 break語句
格式:break;
功能:退出switch選擇或while、do-while、for循環(huán)結(jié)構(gòu)。
P114,例。
6.8.2 contiune語句
格式:contiune;
功能:本次while、do-while、for循環(huán)提前結(jié)束,進(jìn)入下次循環(huán)。
P115,例。
P115,例6.5。
6.9 程序舉例
P116,例6.6。見ex6-6。
P116,例6.7。見ex6-7。
P118,例6.8。
P118,例6.9。見ex6-9。
P119,例6.10。見ex6-10。
第7章 數(shù)組
數(shù)組是由相同類型的一組數(shù)據(jù)構(gòu)成的。前面我們所學(xué)的類型都是基本類型,而本章所學(xué)的數(shù)組是一種構(gòu)造類型。
7.1 一維數(shù)組的定義和引用
7.1.1 一維數(shù)組的定義
格式:類型標(biāo)識符 數(shù)組名[常量表達(dá)式],…;
其中:數(shù)組名是標(biāo)識符,常量表達(dá)式是元素個數(shù)。
功能:定義一維數(shù)組,其數(shù)組名由其“數(shù)組名”指定,元素個數(shù)由“常量表達(dá)式”指定,元素類型由“類型標(biāo)識符”指定。
P122,例。
注意:(1)C語言中數(shù)組的下標(biāo)從0開始;
(2)常量表達(dá)式中可以有符號常量,但不能含有變量;
(3)數(shù)組一旦定義,系統(tǒng)為它分配一個連續(xù)的存儲空間。
7.1.2 一維數(shù)組元素的引用
格式:數(shù)組名[下標(biāo)表達(dá)式]
功能:引用已定義的數(shù)組元素
P123,例,例7.1。
注意:(1)下標(biāo)可以是表達(dá)式。
(2)下標(biāo)的取值為0~常量表達(dá)式-1,超出范圍可能有不可預(yù)料的后果。
7.1.3 一維數(shù)組的初始化
在定義一維數(shù)組時,可對數(shù)組進(jìn)行初始化。
方法:在定義數(shù)組時在數(shù)組名后加上={初始值,初始值,…,初始值}
P123,例。
注意:(1)可對部分元素初始化。
(2)數(shù)組有進(jìn)行初始化時常量表達(dá)式可省。
7.1.4 一維數(shù)組程序舉例
P124,例7.2。
P124,例7.3。見ex7-3.c。
7.2 二維數(shù)組的定義和引用
7.2.1 二維數(shù)組的定義
格式:類型標(biāo)識符 數(shù)組名[常量表達(dá)式][ 常量表達(dá)式],…;
功能:定義二維數(shù)組,其數(shù)組名由其“數(shù)組名”指定,每維下標(biāo)的取值范圍由該維的“常量表達(dá)式”指定,元素類型由“類型標(biāo)識符”指定。
P125,例。
注意:(1)多維數(shù)組的定義與二維數(shù)組類似;
(2)二維數(shù)組常用來描述數(shù)學(xué)中的矩陣;
(3)對于一個m×n的二維數(shù)組,二維數(shù)組與一維數(shù)組元素的對應(yīng):
二維中第i,j個元素←→一維中第i×n+j個元素
P126,例。
7.2.2 二維數(shù)組的引用
格式:數(shù)組名[下標(biāo)表達(dá)式] [下標(biāo)表達(dá)式]
功能:引用已定義的二維數(shù)組元素
P126,例。
注意:設(shè)a是一個m×n二維數(shù)組;則
(1)a[i] (對任意固定的i=0,1,…,m-1)是一個長度為n的一維數(shù)組,它的數(shù)組名就是a[i],每個元素是a[i][j];
(2)a可認(rèn)為是一個長度為m一維數(shù)組,它的數(shù)組名就是a,每個元素是a[i];
(3)由上可知,二維數(shù)組可認(rèn)為是一個元素是一維數(shù)組的一維數(shù)組。
7.2.3 二維數(shù)組的初始化
在定義二維數(shù)組時,也可對數(shù)組進(jìn)行初始化。
方法:在定義數(shù)組時在數(shù)組名后加上={{初始值,…},{初始值,…},…,{初始值,…}}或者加上={初始值,初始值,…,初始值}
P127,例。
注意:(1)可對部分元素初始化;
(2)二維以上數(shù)組有進(jìn)行初始化時第一維的常量表達(dá)式可省。
P128,例。
7.2.4 二維數(shù)組應(yīng)用舉例
P128,例7.4。
P129,例7.5。見ex7-5.c。
7.3 字符數(shù)組和字符串
7.3.1 字符數(shù)組
字符數(shù)組:元素類型為字符型的數(shù)組稱為字符數(shù)組。
格式:char 數(shù)組名[常量表達(dá)式],…;
P130,例。
注意:長度為n的字符數(shù)組可用來存放n個字符。
7.3.2 字符數(shù)組的初始化
與普通數(shù)組一樣,可對字符數(shù)組進(jìn)行初始化。
方法:在定義數(shù)組時在數(shù)組名后加上={字符,字符,…,字符}
P130,例。
注意:初始化時元素個數(shù)可不寫。
7.3.3 字符數(shù)組的引用
字符數(shù)組的每個元素存放的是一個字符。
格式:數(shù)組名[下標(biāo)表達(dá)式]
P131,例7.6,例7.7。
7.3.4 字符串和字符串結(jié)束標(biāo)志
(1)字符串
由若干個字符兩邊用雙撇號括起來的稱字符串。
字符串存放時應(yīng)在尾部加一個\0作為結(jié)束標(biāo)志。
長度為n的字符存儲時占用n+1個字節(jié)的存儲空間。
P131,例。
(2)用字符數(shù)組存放字符串
長度為n的字符數(shù)組可用來存放一個長度為n-1的字符串。
字符數(shù)組可用字符串進(jìn)行整體初始化,且此時會自動在尾部加一個\0。
P132,例。
7.3.5 字符數(shù)組的輸入與輸出
字符數(shù)組輸入輸出的方法有兩種:
(1)逐個元素用scanf和printf函數(shù)輸入輸出
格式:scanf(“%c”,&數(shù)組元素);
printf (“%c”,數(shù)組元素);
功能:前者從鍵盤上取得一個字符送給相應(yīng)的數(shù)組元素;
后者把數(shù)組元素中的字符輸出到顯示器上。
P131,例7.6。
(2)整個字符數(shù)組用scanf和printf函數(shù)輸入輸出
格式:scanf(“%s”,數(shù)組名);
printf (“%s”,數(shù)組名);
功能:前者從鍵盤上取得一個字符串送給相應(yīng)的數(shù)組;
后者把數(shù)組中的整個字符串輸出到顯示器上。
P133,例。
注意:(1)整個字符數(shù)組中的字符串輸出時,\0本身不輸出, 且輸出不換行;
(2)整個字符數(shù)組中的字符串輸出時,是從首地址逐一輸出的,直到遇到第一個\0為止;
(3)C語言中數(shù)組名表示該數(shù)組的首地址,故整個字符數(shù)組輸入時不能在數(shù)組名前加&;
(4)整個字符數(shù)組輸入時遇空格而停止,且會自動在尾部加一個\0。
P133,例。
7.3.6 字符串處理函數(shù)
1. 字符串輸出函數(shù)puts
格式:puts(字符數(shù)組名);
功能:輸出字符數(shù)組中的字符串。
P135,例。
2. 字符串輸入函數(shù)gets
格式:gets(字符數(shù)組名);
功能:從鍵盤輸入一個字符串到字符數(shù)組中。
P135,例。
注意:(1)gets與puts一次只能輸入輸出一個字符串;
(2)gets輸入時不會遇空格而停止,而是遇換行符而停止,也會在尾部自動加上一個\0;
(3)puts輸出時也是到\0為止,還會把\0轉(zhuǎn)成換行符輸出。
3. 字符串連接函數(shù)strcat
格式:strcat(字符串1, 字符串2);
功能:把字符串2的內(nèi)容連接到字符串1之后,函數(shù)返回字符串1。
注意:連接時把第二個字符串的第一個字符覆蓋到第一個字符串的\0上
P136,例。
4. 字符串拷貝函數(shù)strcpy
格式:strcpy(字符串1,字符串2);
功能:把字符串2的內(nèi)容拷貝到字符串1中,函數(shù)返回字符串1。
注意:(1)拷貝時也是到第一個\0為止,連同\0一起拷貝;
(2)對字符串不可有賦值語句:字符串1=字符串2;
P136,例。
5. 字符串比較函數(shù)strcmp
格式:strcmp(字符串1,字符串2);
功能:比較字符串1與的字符串2內(nèi)容:如果字符串1= =字符串2,則返回0;如果字符串1>字符串2,則返回正整數(shù);如果字符串1<字符串2,則返回負(fù)整數(shù)。
注意:比較時是以字符的ASCII值進(jìn)行的。
P137,例。
6. 測字符串長度函數(shù)strlen
格式:strlen(字符串)
功能:返回字符串的實際字符數(shù)。
注意:(1)測字符串長度包括空格,但不包括\0;
(2)遇到\開頭的特殊字符也當(dāng)一個字符對待。
P138,例。
7. 字符換小寫函數(shù)strlwr
格式:strlwr(字符串)
功能:把字符串中的大寫字母換成小寫字母。
8. 字符換大寫函數(shù)strupr
格式:strupr(字符串)
功能:把字符串中的小寫字母換成大寫字母。
7.3.7 字符數(shù)組應(yīng)用舉例
P138,例7.8。見ex7-8.c。
P140,例7.9。見ex7-9.c。
第8章 函數(shù)
8.1 概述
一個C程序是由函數(shù)組成的,所以函數(shù)是C語言中最重要的概念,本章專門討論函數(shù)的定義、函數(shù)的調(diào)用及參數(shù)傳遞等問題。
P143,例8.1。
說明:
(1)一個源程序文件是由一個或多個C函數(shù)組成的,一個源程序文件是一個編譯單位。
(2)一個C程序由一個或多個源程序文件組成,一個源程序文件可以為多個C程序共用。
(3)一個C程序中一定要有一個名為main的主函數(shù),執(zhí)行時總是從主函數(shù)開始,其它函數(shù)只有被調(diào)用時才會執(zhí)行,執(zhí)行完畢返回到調(diào)用處繼續(xù)執(zhí)行,正常情況下總是在主函數(shù)結(jié)束執(zhí)行。
(4)所有的函數(shù)是平行的,即在定義時是互相獨立的,主函數(shù)可以調(diào)用其它函數(shù),其它函數(shù)之間可以互相調(diào)用,但其它函數(shù)不能調(diào)用主函數(shù)。
(5)從用戶使用的角度看,函數(shù)可分為標(biāo)準(zhǔn)函數(shù)(庫函數(shù))和用戶自定義函數(shù)。
(6)從函數(shù)的形式看,函數(shù)可分為無參函數(shù)和有參函數(shù)。
8.2 函數(shù)定義的一般形式
1. 無參函數(shù)的定義形式
格式:函數(shù)類型 函數(shù)名()
{
數(shù)據(jù)聲明部分;
執(zhí)行語句部分;
}
說明:(1)函數(shù)名:函數(shù)名是函數(shù)調(diào)用的依據(jù),函數(shù)值的返回也是通過函數(shù)名實現(xiàn)的,函數(shù)名要符合標(biāo)識符的定義。
(2)函數(shù)體:由數(shù)據(jù)聲明和執(zhí)行語句兩部分組成,數(shù)據(jù)聲明是對數(shù)據(jù)特征的描述,執(zhí)行語句是對數(shù)據(jù)處理的描述,函數(shù)的功能由它們實現(xiàn)。
(3)函數(shù)類型:函數(shù)類型規(guī)定了函數(shù)返回值的類型,int或char可不寫,如不要返回值可定義為void型。
P144,例。
2. 有參函數(shù)的定義形式
格式:函數(shù)類型 函數(shù)名(形式參數(shù)表列)
{
數(shù)據(jù)聲明部分;
執(zhí)行語句部分;
}
說明:(1)形式參數(shù)表列:由格式為“形參類型 形參名”組成的表列,規(guī)定了形參的類型及數(shù)目。
(2)形參是用來接收或傳遞函數(shù)調(diào)用時實參的數(shù)據(jù)的。
P145,例。
3. 空函數(shù)的定義形式
格式:函數(shù)類型 函數(shù)名()
{ }
說明:(1)空函數(shù)什么事情也不做,沒有什么實際作用。
(2)編寫程序時如果某處要寫一個函數(shù),可以先寫一個空函數(shù)放在那里,等后面再來補(bǔ)寫完整,這樣做對編程是有益的。
4. 對函數(shù)聲明的傳統(tǒng)方式
格式:函數(shù)類型 函數(shù)名(形式參數(shù)名表列)
形式參數(shù)名表列類型說明;
{
數(shù)據(jù)聲明部分;
執(zhí)行語句部分;
}
P146,例。這種方法現(xiàn)一般不用,只了解一下就可。
8.3 函數(shù)參數(shù)和函數(shù)的值
8.3.1 形式參數(shù)和實際參數(shù)
函數(shù)定義時的參數(shù)稱為形式參數(shù),函數(shù)調(diào)用時的參數(shù)稱為實際參數(shù)。形式參數(shù)和實際參數(shù)負(fù)責(zé)函數(shù)調(diào)用時的數(shù)據(jù)傳遞。
P146,例8.2。
說明:(1)函數(shù)定義中的形式參數(shù),在函數(shù)未調(diào)用時并不占用存儲空間,只有當(dāng)函數(shù)調(diào)用時才分配存儲空間,函數(shù)調(diào)用完畢這些存儲空間被釋放。
(2)實際參數(shù)可以是常量、變量或表達(dá)式,但它們一般必須有確定的值,函數(shù)調(diào)用時它們的值被傳給形式參數(shù)。
(3)實參和形參的類型要相同或賦值兼容。對變量參數(shù)而言,實參對形參的數(shù)據(jù)傳遞是“值傳遞”,即數(shù)據(jù)有傳入沒傳出。
P146,例8.2。
8.3.2 函數(shù)的返回值
函數(shù)調(diào)用后一般通過函數(shù)名返回一個值,但有的函數(shù)可能不需要返回值。
P146,例8.2。
說明:(1)函數(shù)的返回值是由return語句獲得的;一個函數(shù)如果不需要返回值,可以不用return語句;一個函數(shù)也可以有多個return語句,執(zhí)行到哪一個就那個return語句起作用。
P148,例。
(2)函數(shù)的類型指函數(shù)返回值的類型,由定義函數(shù)時的函數(shù)類型來確定。定義函數(shù)時return語句后表達(dá)式的類型要與函數(shù)的類型相一致。
(3)如果定義函數(shù)時return語句后表達(dá)式的類型與函數(shù)的類型不相一致,則以函數(shù)的類型為準(zhǔn)進(jìn)行強(qiáng)制類型轉(zhuǎn)換。
P148,例8.3。
(4)如果函數(shù)沒有return語句,則函數(shù)調(diào)用后將返回一個不確定的值。為了明確表示不需返回值可把函數(shù)定義為void類型。
P149,例。
8.4 函數(shù)的調(diào)用
8.4.1 函數(shù)的一般調(diào)用方法
格式:函數(shù)名(實際參數(shù)表列)
功能:調(diào)用函數(shù)名指定的函數(shù)。
說明:(1)如果函數(shù)定義時沒有形參,則不要實參,但()不能省。
(2)實參要與形參在數(shù)目、類型、次序上一一對應(yīng)。
(3)Turbo C中實參傳遞是從右到左進(jìn)行的。
P150,例8.4。
8.4.2 函數(shù)調(diào)用的方式
按函數(shù)在程序中出現(xiàn)的位置來分,函數(shù)有三種調(diào)用方式:
1. 函數(shù)語句
就是把函數(shù)調(diào)用作為一個語句,此時函數(shù)的返回值無法使用。
P151,例。
2. 函數(shù)表達(dá)式
就是把函數(shù)調(diào)用放在一個表達(dá)式中,此時函數(shù)的返回值參加表達(dá)式的運(yùn)算。
P151,例。
3. 函數(shù)參數(shù)
就是把函數(shù)調(diào)用作為另一個函數(shù)調(diào)用的實參,此時函數(shù)的返回值將傳給另一個函數(shù)的形參。
P151,例。
8.4.3 函數(shù)的聲明
1. 函數(shù)調(diào)用的條件
(1)被調(diào)用的函數(shù)必須是已存在的函數(shù),即要么是庫函數(shù)要么是已定義好的函數(shù)。
(2)如果是庫函數(shù),一般要在本文件頭用#include命令把有關(guān)庫函數(shù)文件(*.h)包含到本文件中來。
P152,例。
(3)如果是用戶自定義函數(shù),函數(shù)定義必須在函數(shù)調(diào)用之前,否則要在函數(shù)調(diào)用之前進(jìn)行函數(shù)聲明。
P152,例8.5。
2. 函數(shù)聲明的方法
格式:函數(shù)類型 函數(shù)名(形參類型 形參,…);
功能:聲明一個函數(shù),以便在程序中調(diào)用。
P152,例8.5。
說明:(1)函數(shù)聲明就是把函數(shù)頭重抄一遍(故函數(shù)聲明也叫函數(shù)原型),形參可省或形參及形參類型都省。
P153,例。
(2)函數(shù)類型為int的函數(shù)調(diào)用之前還未定義也可不要聲明,但最好還是聲明一下。
P146,例8.2。
(3)如果函數(shù)定義出現(xiàn)在函數(shù)調(diào)用之前,則不需要作函數(shù)聲明。
P154,例。
(4)如果函數(shù)聲明在所有的函數(shù)之前,則不必每個函數(shù)中再作聲明,每個函數(shù)都可以調(diào)用這個函數(shù)。
P154,例。
8.5 函數(shù)的嵌套調(diào)用
在C語言中,函數(shù)不能嵌套定義,但可以嵌套調(diào)用。即主函數(shù)可以調(diào)用子函數(shù),子函數(shù)可以調(diào)用子子函數(shù)。
P155,圖8.5。
P155,例8.6。
說明:P157,(1)~(4)
8.6 函數(shù)的遞歸調(diào)用
在C語言中,函數(shù)可以調(diào)用它本身,函數(shù)自己調(diào)用自己稱為函數(shù)的遞歸調(diào)用。遞歸調(diào)用有兩種情況:直接遞歸和間接遞歸。
P158,圖8.9,圖8.10。
P158,例8.7。
注意:編寫遞歸程序的關(guān)鍵是寫出問題的遞歸描述。
P160,例8.8。
8.7 數(shù)組作為函數(shù)參數(shù)
1. 數(shù)組元素作為函數(shù)的參數(shù)
數(shù)組元素作為函數(shù)的參數(shù),其用法與普通變量相同,數(shù)組元素可以是一維的也可以是多維的。
P164,例8.10。
說明:數(shù)組元素其實與普通變量的性質(zhì)一樣,故數(shù)組元素作為函數(shù)的參數(shù),其傳遞是“值傳遞”。即變量的數(shù)據(jù)有傳入沒傳出。
2. 一維數(shù)組名作為函數(shù)的參數(shù)
一維數(shù)組名也可作為函數(shù)的參數(shù),這時實參和形參都是一維數(shù)組。
P165,例8.11。
說明:(1)實參數(shù)組與形參數(shù)組應(yīng)分別在它們所在函數(shù)中定義,但數(shù)組名可以不一樣。
(2)實參數(shù)組與形參數(shù)組的類型要一致,否則出錯。
(3)形參數(shù)組定義中的元素個數(shù)不起作用,程序編譯時并不對形參數(shù)組的元素個數(shù)進(jìn)行檢查。
(4)形參數(shù)組定義中的元素個數(shù)可空,并可另設(shè)一個變量形參用來傳遞數(shù)組元素個數(shù)。
P166,例8.12。
(5)數(shù)組名作為函數(shù)的參數(shù),是把實參數(shù)組的首地址傳給形參數(shù)組,即讓兩個數(shù)組共享同一存儲空間,其傳遞是“地址傳遞”,即對數(shù)組而言,其數(shù)據(jù)有傳入也有傳出。
P166,例8.13。
3. 多維數(shù)組名作為函數(shù)的參數(shù)
二維數(shù)組名也可作為函數(shù)的參數(shù),這時實參和形參可以都是二維數(shù)組,也可以實參是二維數(shù)組而形參是一維數(shù)組。
P168,例8.14。
說明:(1)如果二維數(shù)組作為形參,其第一維的元素個數(shù)可空。
(2)如果二維數(shù)組作為實參而一維數(shù)組作為形參,則數(shù)據(jù)按二維數(shù)組與一維數(shù)組元素的對應(yīng)關(guān)系進(jìn)行傳遞。
8.8 局部變量和全局變量
8.8.1 局部變量
在一個函數(shù)的內(nèi)部定義的變量稱為局部變量,它從定義時刻開始到本函數(shù)結(jié)束范圍內(nèi)有效。
P169,例。
說明:(1)主函數(shù)內(nèi)定義的變量也只在主函數(shù)內(nèi)有效。
(2)不同函數(shù)可以使用同名的變量,它們互相沒有關(guān)系。
(3)形式參數(shù)也是局部變量。
(4)在一個函數(shù)內(nèi)部中的復(fù)合語句可以定義自己的變量,它只在本復(fù)合語句內(nèi)有效。
P169,例。
8.8.1 全局變量
在一個函數(shù)的外部定義的變量稱為全局(外部)變量,它從定義時刻開始到本文件結(jié)束范圍內(nèi)有效。
P170,例。
說明:(1)設(shè)全局變量的作用是增加了函數(shù)間數(shù)據(jù)聯(lián)系的渠道,最好全局變量第一個字母大寫。
P170,例8.15。
(2)建議在不必要時不要作用全局變量,因為:①可節(jié)省存儲空間,②可使程序通用性強(qiáng),③可使程序可讀性強(qiáng)。
(3)如果全局變量與局部變量不同名,則全局變量與局部變量在本函數(shù)內(nèi)均有效,如果全局變量與局部變量同名,則當(dāng)進(jìn)入本函數(shù)時,全局變量會隱藏起來,局部變量起作用,一旦退出本函數(shù),全局變量恢復(fù)原值。
P172,例8.16。
8.9 變量的存儲類別
8.9.1 動態(tài)存儲方式和靜態(tài)存儲方式
靜態(tài)存儲方式:程序運(yùn)行期間分配固定的存儲空間;
動態(tài)存儲方式:程序運(yùn)行期間分配動態(tài)的存儲空間。
程序運(yùn)行期間用戶使用的存儲區(qū)域稱為用戶區(qū),C語言中用戶區(qū)由三部分組成:
①程序區(qū):用于存放用戶程序;
②靜態(tài)存儲區(qū):用于存放需要固定存儲空間的數(shù)據(jù);
③動態(tài)存儲區(qū):用于存放隨時可能建立或撤消的數(shù)據(jù)。
P173,例。
8.9.2 自動(auto)變量
定義:在函數(shù)內(nèi)部定義的前加auto或省缺的變量。
特征:放在動態(tài)存區(qū),定義變量時建立,退出本函數(shù)時撤消。
P173,例。
說明:(1)自動變量是局部變量
(2)自動變量在賦值前其值是不確定的。
(3)在函數(shù)多次被調(diào)用的過程中,自動變量的值是不保留的。
8.9.3 局部靜態(tài)(static)變量
定義:在函數(shù)內(nèi)部定義的前加static的變量。
特征:放在靜態(tài)存區(qū),程序編譯時創(chuàng)建,結(jié)束執(zhí)行時撤消。
P173,例8.17。
說明:(1)靜態(tài)變量的存儲空間在整個程序運(yùn)行期間是固定的。
(2)靜態(tài)變量的初始化是在程序編譯時進(jìn)行的,未顯式初始化時自動賦0或空串。
(3)在函數(shù)多次被調(diào)用的過程中,靜態(tài)變量的值具有繼承性。
(4)局部靜態(tài)變量只能在本函數(shù)中使用。
P175,例8.18。
8.9.4 寄存器(register)變量
定義:在函數(shù)內(nèi)部定義的前加register的變量。
特征:放在寄存器,定義變量時建立,退出本函數(shù)時撤消。
P175,例8.19。
說明:(1)只有局部自動變量和形式參數(shù)可以作為寄存器變量。
(2)寄存器變量與自動變量性質(zhì)一樣,但速度快、數(shù)量有限。
(3)局部靜態(tài)變量不能定義為寄存器變量。
P176,例。
8.9.5 外部變量及其擴(kuò)展(extern)
定義:定義在所有函數(shù)之外的變量稱為外部變量。
特征:(1)放在靜態(tài)存區(qū),程序編譯時創(chuàng)建,結(jié)束執(zhí)行時撤消。
(2)外部變量可以用extern來擴(kuò)展它的作用域。
1. 作用域擴(kuò)充到本文件內(nèi)
方法:在本文件要用的地方之前使用extern重聲明。
P176,例8.20。
2. 作用域擴(kuò)充到其它文件
方法:在其它文件要用的地方之前使用extern重聲明。
P176,例8.21。
注意:含有多個文件的C程序的執(zhí)行見P183,8.11如何運(yùn)行一個多文件的程序。
8.9.6 外部靜態(tài)(static)變量
定義:在函數(shù)外部定義的前加static的變量。
特征:放在靜態(tài)存區(qū),程序編譯時創(chuàng)建,結(jié)束執(zhí)行時撤消。
P178,例。
說明:(1)外部靜態(tài)變量具有靜態(tài)變量的所有性質(zhì);
(2)外部靜態(tài)變量只能在本文件中使用,而不能被其它文件引用。
8.9.7 關(guān)于變量的聲明和定義
在C語言中,定義和聲明兩個詞是混淆的,實際上,我們可把聲明分為定義性聲明和引用性聲明。
定義性聲明(簡稱定義):是要分配存儲空間的。如int a;
引用性聲明(簡稱聲明):是不要分配存儲空間的。如extern a;
P179,例。
說明:一個變量定義只能一次,聲明可以多次。
8.9.8 存儲類別小結(jié)
可從不同的角度來分類歸納:
(1)作用域:可分為全局的和局部的。
(2)存放時間:可分為動態(tài)存儲和靜態(tài)存儲。
(3)存放位置:可分為動態(tài)存區(qū)、靜態(tài)存區(qū)和寄存器。
P180,小結(jié)。
說明:(1)作用域、存放時間、存放位置是不同的概念,它們有區(qū)別也有聯(lián)系。
(2)static對局部變量和全局變量的作用不同。
P181,例。
8.10 內(nèi)部函數(shù)和外部函數(shù)
8.10.1 內(nèi)部函數(shù)
定義:在函數(shù)定義前加static的函數(shù),稱為內(nèi)部函數(shù)或靜態(tài)函數(shù)。
說明:內(nèi)部函數(shù)只能在本文件中被調(diào)用,而不能被其它文件調(diào)用。
P182,例。
8.10.1 外部函數(shù)
定義:在函數(shù)定義前加extern或省缺的函數(shù),稱為外部函數(shù)。
說明:外部函數(shù)可以在其它文件中被調(diào)用,使用前要用extern重聲明。
P177,例8.21。見ex8-21。
P182,例8.22。
8.11 如何運(yùn)行一個多文件的程序
C程序可以由多個文件組成,由多個文件組成的C程序可有兩種編譯運(yùn)行方法:
1. 用Turbo C的集成環(huán)境
多個文件組成的C程序執(zhí)行的步驟為:
4 先把多個文件的內(nèi)容編輯并存盤為file1.c,file2.c,…,filen.c
5 在編輯狀態(tài)下建立一個項目文件,內(nèi)容為:file1.c file2.c …filen.c,并存盤為:file.prj
6 把Project菜單的子菜單project neme的值修改為:file.prj
7 打編譯執(zhí)行的命令Ctrl+F9,并用Alt+F5查看結(jié)果。
P177,例8.21。見ex8-21-1.c,ex8-21-2.c,ex8-21.prj。
P184,例8.22。
注意:項目文件的內(nèi)容中文件之間用空格隔開,擴(kuò)展名.c可省,也可以寫成一列。
2. 用#include命令
多個文件組成的C程序執(zhí)行的步驟為:
4 先把多個文件的內(nèi)容編輯并存盤為file1.c,file2.c,…,filen.c
5 設(shè)file1.c中含有main函數(shù),則在file1.c的開頭加入如下#include命令:#include “file2.c”
… … …
#include “filen.c”
8 打編譯執(zhí)行的命令Ctrl+F9,并用Alt+F5查看結(jié)果。
P185,例8.22。
注意:此時實際上編譯程序不再認(rèn)為是多個文件,而是用#include命令把其它文件包含到本文件中來一起進(jìn)行編譯。
第9章 預(yù)處理命令
C程序中可以加入一些預(yù)處理命令,其目的是改進(jìn)程序設(shè)計環(huán)境,提高編程效率。這類命令主要包括:宏定義、文件包含和條件編譯三種,為了區(qū)別一般的C語句,這類命令都以#開頭。
9.1 宏定義
9.1.1 不帶參數(shù)的宏定義
格式:#define 宏名 宏體
其中:宏名是一個標(biāo)識符,宏體是一個表達(dá)式字符串。
功能:程序編譯時,用宏體代替宏名。
P187,例,例9.1。
說明:P188,(1)~(9)
P188,例,例9.2。
9.1.2 帶參數(shù)的宏定義
格式:#define 宏名(形參表) 宏體
其中:宏名是一個標(biāo)識符,宏體是一個帶有形參的表達(dá)式字符串。
功能:程序編譯時,用實參代替形參,再用宏體代替宏名(形參表)。
P190,例,例9.3。
說明:P190,(1)~(2)
9.1.3 帶參數(shù)的宏與函數(shù)的區(qū)別
P191,(1)~(6)
P191,例9.4,例9.5。
9.2 文件包含處理
格式1:#include “文件名”
格式2:#include <文件名>
其中:文件名一般是 *.h 的函數(shù)庫文件,也可以是 *.c 的源程序文件,且可帶盤符路徑。
功能:把文件名指定的文件內(nèi)容包含到當(dāng)前文件中來。
注意:使用格式1時,編譯程序先在當(dāng)前目錄上找指定文件,如沒找到就到系統(tǒng)規(guī)定的目錄上找找指定文件。使用格式2時,編譯程序只在系統(tǒng)規(guī)定的目錄上找找指定文件。
P195,例9.6。
說明:P196,(1)~(5)。
9.3 條件編譯
條件編譯是指某些程序段一定的條件下參加編譯或不參加編譯,有關(guān)條件編譯的預(yù)處理命令有三種格式:
1 #ifdef格式
格式:#ifdef 標(biāo)識符
程序段1
[#else
程序段2]
#endif
功能:如果標(biāo)識符用#define命令定義過,則編譯程序段1,否則編譯程序段2。
P197,例。
2 #ifndef格式
格式:#ifndef 標(biāo)識符
程序段1
[#else
程序段2]
#endif
功能:如果標(biāo)識符未用#define命令定義過,則編譯程序段1,否則編譯程序段2。
P198,例。
3 #if格式
格式:#if 表達(dá)式
程序段1
[#else
程序段2]
#endif
功能:如果表達(dá)式的值為真,則編譯程序段1,否則編譯程序段2。
P198,例。
半期考試
試卷講評
第10章 指第11章 針
指針是C語言中一個最重要而又較難掌握的一個概念,也是C語言優(yōu)于其它高級語言的關(guān)鍵所在。掌握指針的應(yīng)用,可以使程序簡潔、緊湊、高效。
10.1 地址和指10.2 針概述
1. 地址與地址運(yùn)算
地址:計算機(jī)中存儲單元的編號稱為地址。在內(nèi)存中每一個字節(jié)都有地址,一個存儲區(qū)域的地址是這個區(qū)域的第一個字節(jié)的地址。
地址運(yùn)算符&:求出變量所占用存儲區(qū)域的地址
P201,例。
注意:(1)地址運(yùn)算符是單目運(yùn)算,與單目+、-相同;
(2)結(jié)合方向同:從右到左。
2. 指針與指針變量
指針:一個存儲區(qū)域的地址稱為指針。
指針變量:用來存放存儲區(qū)域的地址的變量稱為指針變量。
P202,例。
注意:(1)變量的值可以通過變量直接訪問,也可通過指針變量間接訪問;
(2)指針變量只能用來存放地址,不能存放其它類型數(shù)據(jù)。
10.3 變量的指10.4 針和指10.5 向變量的指10.6 針變量
1. 變量的指針和指向變量的指針變量
指向變量的指針:一個變量的地址稱為指向該變量的指針。
指向變量的指針變量:用來存放變量的地址的變量稱為指向該變量的指針變量。
例:int a;則&a就是指向a的指針;若p為指針變量,且p=&a;則p是指向a的指針變量。
2. 指針運(yùn)算符
指針運(yùn)算符*:求出指針變量所指向存儲區(qū)域的值或所指向變量的值
例:int a;若p為指針變量,且p=&a;則*p是p指向的存儲區(qū)域的值,即*p的值就是a的值。
注意:(1)指針運(yùn)算符是單目運(yùn)算,與單目+、-相同;
(2)結(jié)合方向同:從右到左。
P203,例。
10.2.1 指針變量的定義
1. 指針變量的定義
格式:類型名 *指針變量名,…;
功能:定義指向類型名變量的指針變量。
例:int *p;定義一個指向整形變量的指針p。
P203,例。
2. 指針變量的賦值
格式:指針變量=&變量;
功能:把=號右邊變量的地址賦給=號左邊的指針變量。
P203,例。
注意:(1)指針變量賦值后的圖表示。
(2)指向不同類型的指針不能互相賦值。
(3)加了#include “stdio.h”后,指針變量可賦值為NULL。
10.2.2 指針變量的引用
指針變量的引用主要用到地址運(yùn)算符&和指針運(yùn)算符*。
P204,例10.1。見ex10-1.c。
說明:P204,(1)~(4).
注意:(1)若p=&a;則&*p為a的地址,即&a。P205。
(2)若p=&a;則*&a為a的值,即就是a。
(3)(*p)++與a++等價,因*與++同級,又結(jié)合方向為從右向左,故在此()不可省,否則變?yōu)?(p++)。若i=3;p=&i;則這兩個表達(dá)式的值都為3,但執(zhí)行后前者p仍指向i,且i的值會加1,后者p指向i的后一個區(qū)域,i的值未加1。見ex205.c。
P206,例10.2。
說明:此例中p1,p2的指向進(jìn)行變換,而a,b的值并未交換。
10.2.3 指針作為函數(shù)參數(shù)
用指針作為函數(shù)的參數(shù),可以實現(xiàn)“通過被調(diào)函數(shù)改變主調(diào)函數(shù)中變量的值”的目的。
P207,例10.3。
說明:此例中p1,p2的指向并未進(jìn)行變換,而它們指向的值進(jìn)行了交換。
注意:(1)用指針作為函數(shù)的參數(shù),就其指針變量而言仍然是有傳入沒傳出,但它傳送的是地址,故這時是傳址調(diào)用,即對指針?biāo)赶虻闹凳怯袀魅胍灿袀鞒觯矢淖冎羔樦赶虻闹悼梢詫崿F(xiàn)上述目的。
(2)用指針作為函數(shù)的參數(shù),不能通過改變形參指針的值來達(dá)到“改變主調(diào)函數(shù)中變量的值”的目的。P209。
P210,例10.4。
10.7 數(shù)組與指10.8 針
10.3.1 指向數(shù)組元素的指針
設(shè)a為元素個數(shù)為n的一維數(shù)組,p為指向數(shù)組a的元素類型的指針,如果p=a或p=&a[0],即p指向a[0],則p+i指向a[i],此時可把a(bǔ)[i]寫成p[i]。
P211,例。
注意:(1)一維數(shù)組名a表示數(shù)組a的首地址,即a[0]的地址,故a與&a[0]等價。
(2)一維數(shù)組a的第i個元素a[i]的地址可以用a+i表示,故a+i與&a[i]等價。
10.3.2 通過指針引用數(shù)組元素
設(shè)a為元素個數(shù)為n的一維數(shù)組,p為指向數(shù)組a的元素類型的指針,如果p=a或p=&a[0],則數(shù)組a的第i個元素有兩種表示法:
a[i] 或p[i] 下標(biāo)表示法
*(a+i)或*(p+i) 地址表示法
P212,例。
P212,例10.5。見ex10-5-1.c,ex10-5-2.c,ex10-5-3.c。
說明:三種方法比較,P213,(1)~(3)
注意:(1)可以改變p的值,但不能改變a的值;
(2)要注意指針的當(dāng)前值。P214,例10.6。
(3)指針值超出數(shù)組范圍時系統(tǒng)不提示出錯。
(4)要注意指針變量的運(yùn)算。P215①~⑤。
10.3.3 用數(shù)組名作為函數(shù)參數(shù)
在函數(shù)的參數(shù)中,實參與形參可以都是數(shù)組,也可以都是指針,還可以一個是數(shù)組一個是指針。
P216,例,P221,(1)~(4)。
P217,例10.7。見ex10-7-1.c,ex10-7-2.c。
P219,例10.8。
注意:(1)用指針和數(shù)組作為參數(shù),它們傳送的是地址,故是傳址調(diào)用,它們所指向的數(shù)組的值是有傳入也有傳出的。
(2)當(dāng)數(shù)組作為形式參數(shù)時,數(shù)組名不再是常量,與指針意義相同。
P217,例。
P222,例10.9。見ex10-9-1.c,ex10-9-2.c。
P223,例10.10。
10.3.4 多維數(shù)組與指針
1. 多維數(shù)組元素的地址
設(shè)a為元素個數(shù)為m×n的二維數(shù)組,則a+i表示第i行a[i]的地址,*(a+i)+j表示第i行第j個元素a[i][j]的地址,于是數(shù)組a的第i,j個元素有三種表示法:
a[i][j] 下標(biāo)表示法
*(a[i]+j) 下標(biāo)地址表示法
*(*(a+i)+j) 二級地址表示法
P225,例。
P227,例10.11。
注意:(1)二維數(shù)組名a表示數(shù)組a的第0行的地址,即a[0]的地址,故a與&a[0]等價。
(2)二維數(shù)組a的第i個元素a[i]表示第i行第0個元素的地址,即a[i][0]的地址,故a[i]與& a[i][0]等價。
2. 指向多維數(shù)組元素的指針變量
(1)指向數(shù)組元素的指針
設(shè)a為元素個數(shù)為m×n的二維數(shù)組,p為指向a的元素類型的指針,如果p=a[0],即p指向a[0][0],則p+i×n+j指向a[i][j]。
P228,例10.12。
(2)指向一維數(shù)組的指針
指向一維數(shù)組的指針稱為數(shù)組指針。
格式:類型名 (*數(shù)組指針名)[常量表達(dá)式],…;
功能:定義指向元素個數(shù)為常量表達(dá)式的一維數(shù)組的指針。
注意:數(shù)組指針用來存放一維數(shù)組的首地址;
P229,例10.13。
(3)數(shù)組指針與二維數(shù)組的行
數(shù)組指針可用來指向二維數(shù)組的行,故也稱行指針。
設(shè)a為元素個數(shù)為m×n的二維數(shù)組,p為指向元素個數(shù)為n的一維數(shù)組的指針,如果p=a,即p指向a[0],則p+i指向a[i],* (p+i)+j指向a[i][j]。
P229,例10.13。
3. 用指向數(shù)組的指針作為函數(shù)的參數(shù)
普通指針作為函數(shù)的參數(shù),因為可以讓p+i指向a[i](一維數(shù)組元素),故可以用來傳遞一維數(shù)組元素的地址;同樣的道理,指向數(shù)組的指針作為函數(shù)的參數(shù),因為可以讓p+i指向a[i](二維數(shù)組的行),故可以用來傳遞二維數(shù)組的行地址。
P230,例10.14。
P231,例10.15。
10.9 字符串與指10.10 針
10.4.1 字符串的表示形式
在C語言中,字符串有兩種表示形式。
1 用字符數(shù)組存放一個字符串;
2 用字符指針指向一個字符串。
P232,例10.16,例10.17。
注意:(1)字符數(shù)組占有固定的存儲空間,字符數(shù)組名是常量,故不能賦值、不能自增減。
(2)字符指針只是用來存放字符串的首地址,字符指針是變量,故可以賦值、可以自增減。
P234,例10.18,例10.19。
10.4.2 字符串指針作為函數(shù)的參數(shù)
把字符串從一個函數(shù)傳遞到另一個函數(shù),可有兩種方法。
1 用存放一個字符串的字符數(shù)組;
2 用指向一個字符串的字符指針。
P235,例10.20。
解法:(1)用字符數(shù)組作為形參,P235。
(2)用字符指針作為形參,P236。
(3)對copy_string函數(shù)的簡化,P237,①~⑥。
10.4.3 對使用字符指針和字符數(shù)組的討論
(1)字符數(shù)組存放的是若干個字符,字符指針存放的是字符串的首地址。
(2)字符數(shù)組不能對數(shù)組名賦值,字符指針可以對指針名賦值。P238。
(3)字符數(shù)組和字符指針都可以初始化。P239。
(4)字符數(shù)組定義后有分配存儲空間存放字符串,字符指針只分配一個單元存放字符地址(字符串的首地址)。P239。
(5)字符數(shù)組名不能增值,字符指針名可以增值。P240,例10.21,例10.22。
(6)當(dāng)字符數(shù)組存放一個字符串或字符指針指向一個字符串時,可用作printf語句的格式控制。P240。
10.11 指10.12 向函數(shù)的指10.13 針
10.5.1 用函數(shù)指針調(diào)用函數(shù)
一個函數(shù)是一個指令的序列,函數(shù)執(zhí)行時是從第一條指令開始直到最后一條指令結(jié)束,第一條指令的地址稱為函數(shù)的入口地址,函數(shù)名代表這個函數(shù)的入口地址。用來存放函數(shù)入口地址的指針稱為指向函數(shù)的指針,簡稱函數(shù)指針。
(1)指向函數(shù)的指針定義
格式:類型名 (*函數(shù)指針變量名)( );
功能:定義一個指向函數(shù)的指針。
P241,例。
(2)指向函數(shù)的指針的賦值和引用
格式:函數(shù)指針變量=函數(shù)名;
(*函數(shù)指針變量)(實參,…)
功能:前者是把函數(shù)的入口地址賦給指向函數(shù)的指針,后者是用指向函數(shù)的指針調(diào)用該函數(shù)。于是函數(shù)的調(diào)用方法有兩種:
函數(shù)名(實參,…) 用函數(shù)名調(diào)用
(*函數(shù)指針變量)(實參,…) 用函數(shù)指針調(diào)用
P242,例。
P241,例10.23。
注意:(1)用函數(shù)指針調(diào)用函數(shù),必須先給函數(shù)指針賦函數(shù)名;
(2)函數(shù)指針雖然是變量,但p+n、p++、p--等無意義。
10.5.2 用函數(shù)指針作為函數(shù)的參數(shù)
有了函數(shù)指針,可以用一個語句調(diào)用不同的函數(shù);用函數(shù)指針作為函數(shù)的參數(shù),可以把不同的函數(shù)傳遞到同一個子函數(shù)。因此函數(shù)指針可以簡化多個函數(shù)的調(diào)用。
P243,例。
P243,例10.24。
10.14 返回指10.15 針值的函數(shù)
一個函數(shù)的返回值可以是指針類型的,這樣的函數(shù)稱為返回指針值的函數(shù),簡稱指針函數(shù)。
格式:函數(shù)類型 *函數(shù)名(形式參數(shù)表列)
{
數(shù)據(jù)聲明部分;
執(zhí)行語句部分;
}
功能:定義一個指向類型名的指針函數(shù)。
P246,例10.25。
P247,例10.26。
注意:字符串運(yùn)算函數(shù)strcat、strcpy等都是返回指針的函數(shù)。
P136。
10.16 指10.17 針數(shù)組和指10.18 向指10.19 針的指10.20 針
10.7.1 指針數(shù)組的概念
數(shù)組的元素為指針類型的數(shù)組稱為指針數(shù)組。
格式:類型名 *指針數(shù)組名[常量表達(dá)式],…;
功能:定義指向類型名的指針數(shù)組。
注意:(1)指向字符型的指針數(shù)組稱為字符指針數(shù)組;
(2)m×n的二維字符數(shù)組可以用來存放m個長度為n-1的字符串;
元素個數(shù)為m的字符指針數(shù)組可用來指向m個隨意長度的字符串。
P249,例。
P249,例10.27。
10.7.2 指向指針的指針
(1)二級指針與多級指針
指向指針的指針稱為二級指針。
格式:類型名 **指針變量名,…;
功能:定義二級指針。
P251,例。
注意:同理可以定義多級指針。
(2)二級指針與多級指針的引用
設(shè)p為二級指針,則*p為一級指針,**p為所指類型的變量。
P251,例。
注意:不同級別的指針不能互相賦值。
P252,例10.28。
P252,例10.29。
*10.7.3 指針數(shù)組作為main的形參
(1)main函數(shù)的參數(shù)
main函數(shù)一般是不帶參數(shù)的,因為沒有函數(shù)可以調(diào)用main函數(shù)。但main函數(shù)實際上也是可以帶參數(shù)的,一般格式為:
main(int argc,char *argv[])
其中:形參argc是一個整型變量,形參argv是一個字符指針數(shù)組。
(2)DOS下執(zhí)行程序的命令行
C源程序*.c被編譯連接后生成可執(zhí)行程序*.exe,可以DOS下通過命令行執(zhí)行該程序。命令行的一般格式為:
可執(zhí)行程序名 參數(shù) 參數(shù) …↙
其中:可執(zhí)行程序名、參數(shù)、參數(shù)等都是字符串,↙表示回車符。
P253,例。
(3)命令行與源程序的參數(shù)傳遞
當(dāng)用戶鍵入命令行執(zhí)行時,字符串:可執(zhí)行程序名、參數(shù)、參數(shù)、…將傳送給argv[0]、argv[1]、argv[2]、…。Argc將取得命令行中字符串的個數(shù)。
P254,例。
10.21 有關(guān)指10.22 針的數(shù)據(jù)類型和指10.23 針運(yùn)算小結(jié)
10.8.1 有關(guān)指針的數(shù)據(jù)類型小結(jié)
涉及到指針的類型主要有:
變量,一級指針,一維數(shù)組,指針數(shù)組,數(shù)組指針,函數(shù),指針函數(shù),函數(shù)指針,二級指針等。
P255,表10.2。
10.8.2 指針運(yùn)算小結(jié)
(1)指針與整數(shù)相加減
設(shè)指針p是指向某類型的,這個類型占用c個字節(jié),i為整數(shù),則
1 p++,2 p--,3 p+i,4 p-i,5 p+=i,6 p-=i等都是合法的;
7 p+i的值(地址)=p的值(地址)+i×c
P256,例。
(2)指針變量的賦值
可以給指針變量賦值的有:
1 相應(yīng)類型變量的地址值;
2 一維數(shù)組名或其元素的地址值;
3 函數(shù)的入口地址;
4 相應(yīng)類型指針變量。
P256,例。
(3)指針變量可以有空值
空指針值用NULL表示,它是一個符號常量,它在stdio.h中,可以把它賦給指針變量,這時表示指針變量有確定值但沒有指向任何有用單元。
P256,例。
注意:定義了指針變量還末賦值前它是一個不確定的地址值,不是空指針值。
(4)兩個指針的相減
指向同一數(shù)組元素的兩個指針可以相減,其值為兩個指針?biāo)冈刂g的元素個數(shù)。
P257,例。
(5)兩個指針的比較
指向同一數(shù)組元素的兩個指針可以比較大小,其大小取決于所指向元素的序號,相等表示它們指向同一元素。
P257,例。
10.8.3 void指針類型
指向void(空)類型的指針只能用來存放一個地址,但這個地址不與任何類型掛鉤。不同類型的指針之間不能相互賦值,但可強(qiáng)制轉(zhuǎn)換后進(jìn)行賦值。
P257,例。
第12章 結(jié)構(gòu)體與共用體
11.1 結(jié)構(gòu)體類型概述
結(jié)構(gòu)體是由不同類型的一組數(shù)據(jù)構(gòu)成的。與數(shù)組比較,數(shù)組是由相同類型的一組數(shù)據(jù)構(gòu)成的。結(jié)構(gòu)體與數(shù)組都是一種構(gòu)造類型。
結(jié)構(gòu)體類型的定義:
格式:struct 結(jié)構(gòu)體類型名
{類型名 成員名;
… …
};
其中:類型名 成員名;… … 稱為“成員表列”。
功能:定義一個結(jié)構(gòu)體類型。
P260,例。
注意:這是我們所見的第一個用戶自定義類型,以前我們學(xué)過的類型全是C系統(tǒng)預(yù)定義的。數(shù)組類型雖然也是構(gòu)造類型,但不需用戶自定義類型。
11.2 定義結(jié)構(gòu)體類型變量的方法
定義了結(jié)構(gòu)體類型后,就可以用它來定義結(jié)構(gòu)體類型的變量。結(jié)構(gòu)體類型變量的定義方法有三種:
1. 分步定義
格式:struct 結(jié)構(gòu)體類型名 結(jié)構(gòu)體變量名,…;
其中:結(jié)構(gòu)體類型名是事先已定義的。
功能:用已定義的結(jié)構(gòu)體類型定義結(jié)構(gòu)體變量。
P261,例。
2. 同時定義
格式:struct 結(jié)構(gòu)體類型名
{類型名 成員名;
… …
}結(jié)構(gòu)體變量名,…;
其中:結(jié)構(gòu)體類型名事先是未定義的。
功能:同時定義結(jié)構(gòu)體類型與結(jié)構(gòu)體變量。
P262,例。
3. 直接定義
格式:struct
{類型名 成員名;
… …
}結(jié)構(gòu)體變量名,…;
其中:結(jié)構(gòu)體類型被定義但并未取名。
功能:直接定義結(jié)構(gòu)體變量。
P262,例。
說明:
(1)定義一個結(jié)構(gòu)體類型,系統(tǒng)并未為它分配存儲空間。用結(jié)構(gòu)體類型定義變量后才為變量分配存儲空間,其空間大小等于各成員所占空間之和。P261,例。
(2)結(jié)構(gòu)體類型中的成員相當(dāng)于普通變量,但它們與普通變量屬于不同的層次,故成員與程序中的普通變量可以同名。P262,例。
(3)成員也可以是結(jié)構(gòu)體變量,即結(jié)構(gòu)體類型可以嵌套。P262,例。
(4)系統(tǒng)沒有預(yù)定義結(jié)構(gòu)體類型,要用結(jié)構(gòu)體類型,必須先定義后使用。
P261,例。
11.3 結(jié)構(gòu)體變量的引用
定義了結(jié)構(gòu)體變量后,我們可以引用結(jié)構(gòu)體變量及其成員,引用結(jié)構(gòu)體變量的成員格式為:
格式:結(jié)構(gòu)體變量.成員名
功能:引用結(jié)構(gòu)體變量的一個成員
說明:(1)“.”稱為成員運(yùn)算符,其優(yōu)先級最高,與( )相同。
(2)“結(jié)構(gòu)體變量.成員名”的類型與結(jié)構(gòu)體類型定義時的成員名類型相同。
P263,例。
引用規(guī)則:
(1)結(jié)構(gòu)體變量不能整體輸入與輸出,必須要用成員引用的方法來進(jìn)行。P263,例。
(2)如果成員本身又屬于一個結(jié)構(gòu)體類型,則要用多個成員運(yùn)算符,一級一級地找到最低一級的成員。P263,例。
(3)結(jié)構(gòu)體變量的成員可象普通變量一樣進(jìn)行各種運(yùn)算。P264,例。
(4)可以引用結(jié)構(gòu)體變量成員的地址,也可以引用結(jié)構(gòu)體變量的地址。
P264,例。
(5)兩個相同類型的結(jié)構(gòu)體變量可以整體賦值,但結(jié)構(gòu)體變量不能整體賦給一組常量。P262,例。
11.4 結(jié)構(gòu)體變量的初始化
在定義結(jié)構(gòu)體變量時,可對結(jié)構(gòu)體變量進(jìn)行初始化。
方法:在定義結(jié)構(gòu)體變量時加上={初始值,初始值,…,初始值}
P264,例11.1。
注意:(1)結(jié)構(gòu)體變量不能整體賦給一組常量。
(2)兩個相同類型的數(shù)組不可以整體賦值。
11.5 結(jié)構(gòu)體數(shù)組
每個元素為結(jié)構(gòu)體類型的數(shù)組稱為結(jié)構(gòu)體數(shù)組。
11.5.1 結(jié)構(gòu)體數(shù)組的定義
與定義普通數(shù)組一樣,定義結(jié)構(gòu)體數(shù)組只要在定義變量的后面加[常量表達(dá)式]即可。如int a; 是定義整型變量a;
int a[5]; 是定義整型數(shù)組a;
因為定義結(jié)構(gòu)體變量的方法有三種,故定義結(jié)構(gòu)體數(shù)組的方法也有三種:
(1)分步定義
(2)同時定義
(3)直接定義
P265,例。
11.5.2 結(jié)構(gòu)體數(shù)組的初始化
在定義結(jié)構(gòu)體數(shù)組時,可對結(jié)構(gòu)體數(shù)組進(jìn)行初始化。
方法:在定義結(jié)構(gòu)體數(shù)組時加上={{初始值,…},…,{初始值,…}}
P266,例。
11.5.3 結(jié)構(gòu)體數(shù)組的應(yīng)用舉例
P266,例11.2。
說明:(1)引用結(jié)構(gòu)體數(shù)組某一元素的成員要寫成:結(jié)構(gòu)體數(shù)組[i].成員名;
(2)注意leader[j].count++的運(yùn)算次序。
11.6 指11.7 向結(jié)構(gòu)體類型數(shù)據(jù)的指11.8 針
11.6.1 指向結(jié)構(gòu)體變量的指針
用來存放結(jié)構(gòu)體變量的地址的指針稱為結(jié)構(gòu)體指針。
1. 結(jié)構(gòu)體指針的定義
與定義普通指針一樣,定義結(jié)構(gòu)體指針只要在定義變量的前面加個*即可。如 int a; 是定義整型變量a;
int *a; 是定義整型指針a;
因為定義結(jié)構(gòu)體變量的方法有三種,故定義結(jié)構(gòu)體指針的方法也有三種:
(1)分步定義
(2)同時定義
(3)直接定義
P268,例11.3。
2. 結(jié)構(gòu)體指針的引用
定義了結(jié)構(gòu)體指針p后,可以用來存放結(jié)構(gòu)體變量s的地址,即p=&s;這時,設(shè)s有成員num,則結(jié)構(gòu)體變量的成員有三種等價的表示法:
1 s.num
2 (*p).num
3 p->num
P268,例11.3。
注意:“->”稱為指向運(yùn)算符,優(yōu)先級最高,與( )相同。
P269,例。
11.6.2 指向結(jié)構(gòu)體數(shù)組元素的指針
結(jié)構(gòu)體指針可以用來存放結(jié)構(gòu)體數(shù)組的首地址或數(shù)組元素的地址。
設(shè)p為結(jié)構(gòu)體指針,stu為結(jié)構(gòu)體數(shù)組,且p=stu或p=&stu[0],則p++指向結(jié)構(gòu)體數(shù)組stu的下一個元素。于是其下個元素的成員num可表示為:(*p). num或p->num。
P269,例11.4。
注意:(1)(++p)->num與(p++)->num的含義;
(2)p不能用來存放結(jié)構(gòu)體數(shù)組元素成員的地址,但可強(qiáng)制轉(zhuǎn)換。
P270,例。
11.9 用指11.10 針處理鏈表
11.7.1 鏈表概述
鏈表的定義:
4 有一個首指針,指向第一個結(jié)點;
5 每個結(jié)點有一個或多個數(shù)據(jù)成員和一個指針成員,指針成員指向下一個結(jié)點;
6 末結(jié)點指針成員的值為NULL。
P273,圖11.10。
注意:(1)鏈表是一種常見的數(shù)據(jù)結(jié)構(gòu),如一個班的學(xué)生成績可用鏈表來存放,一個程序(指令的有序集)在計算機(jī)內(nèi)也是用鏈表的方式來存放的;
(2)鏈表結(jié)構(gòu)可以是動態(tài)地分配存儲空間的,即結(jié)點是可以動態(tài)的建立或刪除的;
(3)鏈表的一個結(jié)點是一個結(jié)構(gòu)體類型的存儲空間,可用結(jié)構(gòu)體類型來描述。
P273,例。
11.7.2 簡單鏈表
建立和輸出一個簡單鏈表的步驟:
2 定義一個含有數(shù)據(jù)成員和指針成員的結(jié)構(gòu)體類型;
3 用這個結(jié)構(gòu)體類型定義若干個變量(即開創(chuàng)若干個結(jié)點空間)和一個首指針及一個遍歷指針;
4 對這些變量的數(shù)據(jù)成員輸入數(shù)據(jù),并用首指針和這些這些變量的指針成員把結(jié)點連接成一個鏈表;
5 用遍歷指針遍歷所有的結(jié)點,輸出各結(jié)點數(shù)據(jù)成員的值。
P274,例11.7。見ex11-7.c。
注意:用這種方法建立鏈表還不是動態(tài)分配存儲空間的,因為需要幾個結(jié)點必須事先用變量來定義,故稱為靜態(tài)鏈表。
11.7.3 處理動態(tài)鏈表所需的函數(shù)
建立動態(tài)鏈表需要如下幾個庫函數(shù):
1. malloc函數(shù)
原型:void *malloc(unsigned size);
功能:在內(nèi)存開辟一個大小為為size個字節(jié)的存儲空間,并返回這個存儲空間的首地址。
例:int *p;
p=(int *)malloc(2);
2. calloc函數(shù)
原型:void *calloc(unsigned n,unsigned size);
功能:在內(nèi)存開辟n個大小為為size個字節(jié)的存儲空間,并返回這個存儲總空間的首地址。
例:int *p;
p=(int *)calloc(5,2);
通過p++可以遍歷這5個大小為兩個字節(jié)的存儲空間。
3. free函數(shù)
原型:void free(void *p);
功能:釋放由malloc或calloc開辟的且由p指向的存儲空間,本函數(shù)無返回值。
例:int *p;
p=(int *)malloc(2);
free(p);
11.7.4 建立動態(tài)鏈表
建立一個動態(tài)鏈表的步驟:
4 用結(jié)構(gòu)體類型定義一個首指針、一個開辟指針和一個末指針;
5 用開辟指針和malloc函數(shù)開辟一個結(jié)點,并對這個結(jié)點的數(shù)據(jù)成員輸入數(shù)據(jù);
6 當(dāng)這個結(jié)點的數(shù)據(jù)成員的值不為0,則用首指針或前一結(jié)點的指針成員指向它,并讓末指針也指向它;
7 用開辟指針和malloc函數(shù)開辟一個新結(jié)點,并對這個結(jié)點的數(shù)據(jù)成員輸入數(shù)據(jù),回到(3);
8 置末結(jié)點的指針成員值為NULL。
P276,例11.8。見ex11-8.c。
注意:用這種方法建立鏈表是動態(tài)分配存儲空間的,因為需要幾個結(jié)點事先并未確定,故稱為動態(tài)鏈表。
11.7.5 輸出動態(tài)鏈表
輸出一個動態(tài)鏈表的步驟:
2 用結(jié)構(gòu)體類型定義一個遍歷指針;
3 用遍歷指針遍歷所有的結(jié)點,輸出各結(jié)點數(shù)據(jù)成員的值。
P279,例11.9。見ex11-8.c。
11.7.6 動態(tài)鏈表的刪除結(jié)點
動態(tài)鏈表刪除結(jié)點的步驟:
3 用結(jié)構(gòu)體類型定義一個搜索指針和一個跟蹤指針;
4 用搜索指針遍歷所有的結(jié)點,目的是查找要刪除的結(jié)點,并用跟蹤指針跟蹤搜索指針指向結(jié)點的前一個結(jié)點;
5 如果搜索指針找到要刪除的結(jié)點,則讓跟蹤指針?biāo)附Y(jié)點的指針成員指向搜索指針?biāo)附Y(jié)點的后一結(jié)點(即刪除了搜索指針?biāo)傅慕Y(jié)點)。
P280,例11.10。見ex11-8.c。
11.7.7 動態(tài)鏈表的插入結(jié)點
動態(tài)鏈表插入結(jié)點的步驟:
4 用結(jié)構(gòu)體類型定義一個插入指針、一個搜索指針和一個跟蹤指針;
5 用搜索指針遍歷所有的結(jié)點,目的是查找要插入的位置,并用跟蹤指針跟蹤搜索指針?biāo)附Y(jié)點的前一個結(jié)點;
6 如果搜索指針找到要(前)插入結(jié)點的位置,則讓跟蹤指針?biāo)附Y(jié)點的指針成員指向插入指針?biāo)傅慕Y(jié)點,讓插入指針?biāo)附Y(jié)點的指針成員指向搜索指針?biāo)傅慕Y(jié)點(即在搜索指針?biāo)附Y(jié)點之前插入新結(jié)點)。
P282,例11.11。見ex11-8.c。
11.7.8 動態(tài)鏈表的綜合操作
動態(tài)鏈表的綜合操作步驟:
2 在所有函數(shù)外定義一個含有數(shù)據(jù)成員和指針成員的結(jié)構(gòu)體類型;
3 在主函數(shù)中定義一個首指針,一個刪除數(shù)據(jù)變量和一個插入結(jié)點;
4 調(diào)用建立鏈表、輸出鏈表進(jìn)行鏈表的建立與輸出的操作;
5 輸入必要的數(shù)據(jù),調(diào)用刪除結(jié)點、插入結(jié)點的子函數(shù)進(jìn)行刪除與插入的操作,并輸出操作之后的鏈表。
P284,例。見ex11-8.c。
11.11 共用體
11.8.1 共用體類型的概念
共用體類型一種與結(jié)構(gòu)體類型有點類似的構(gòu)造類型。
格式:union 共用體類型名
{類型名 成員名;
… …
};
其中:類型名 成員名;… … 稱為“成員表列”。
功能:定義一個共用體類型。
與結(jié)構(gòu)體類型類似,共用體類型變量的定義有三種:(1)分步定義,(2)同時定義,(3)直接定義。
P287,例。
結(jié)構(gòu)體與共用體的區(qū)別:
(1)結(jié)構(gòu)體每個成員占用不同的存儲空間,故結(jié)構(gòu)體變量占用的存儲空間是各成員占用空間的總和。
(2)共用體每個成員占用相同的存儲空間,故共用體變量占用的存儲空間是各成員占用空間的最大者。
P288,例。
11.8.2 共用體變量的引用
格式:共用體變量.成員名
功能:引用共用體變量的一個成員
說明:可見形式上引用方法與結(jié)構(gòu)體相同。
P288,例。
11.8.3 共用體類型數(shù)據(jù)的特點
(1)每一瞬時只有一個成員起作用,其它成員不起作用。
(2)起作用的成員是最后一次存放的成員,其它成員的值無意義。
(3)各成員的地址是相同的。
(4)不能對共用體變量賦值,也不能進(jìn)行初始化。
(5)不能把共用體變量作為函數(shù)的參數(shù),但可以用指向共用體變量的指針。
(6)定義共用體與結(jié)構(gòu)體類型時可以互相嵌套。
P289,例。
P289,例11.12。
11.12 枚舉類型
枚舉類型是可以把變量的可能值一一列出的一種構(gòu)造類型。
格式:enum 枚舉類型名
{枚舉值,…,枚舉值};
功能:定義一個枚舉類型。
枚舉類型變量的定義也有三種:(1)分步定義,(2)同時定義,(3)直接定義。
P291,例。
定義了枚舉型變量后,可以使用枚舉型變量,但它的取值只可能是這些枚舉值之一。
說明:
3 枚舉值是常量,不能對枚舉值賦值。
4 枚舉值的值就是定義它時的序號(從0開始,按次序遞增),定義時也可改變枚舉值的值。
5 枚舉值可以作關(guān)系運(yùn)算,大小取決于它的序號。
6 枚舉變量不能直接賦給一個整數(shù),但可強(qiáng)制轉(zhuǎn)換后進(jìn)行賦值。
P291,例。
P292,例11.13。
11.13 用typedef定義類型
用typedef可以定義新的類型名,主要有如下幾種情況:
(1)簡單的類型名替換
格式:typedef 原類型名 新類型名
P294,例。
(2)定義一個類型名代表一個結(jié)構(gòu)體類型
格式:typedef strut
{成員列表;
}類型名;
P294,例。
(3)定義一個類型名代表某一個數(shù)據(jù)類型
格式:typedef 數(shù)組元素類型 類型名[元素個數(shù)];
typedef 指針指向類型 *類型名;
typedef 函數(shù)返回類型 (*類型名)( );
P295,例。
定義新類型名方法步驟小結(jié):
1 先按定義變量的方法寫出定義體;
2 將變量名換成新類型名;
3 在最前面加上typedef;
4 然后用可以用新類型名去定義變量。
P295,例。
第13章 位運(yùn)算
可以進(jìn)行位運(yùn)算是C語言的重要特色,因此,C語言具有高級語言的特點,又具有低級語言的功能。
12.1 位運(yùn)算符和位運(yùn)算
位運(yùn)算符共有6個,見P298表12.1。
說明:(1)~是單目運(yùn)算,其它是雙目運(yùn)算。
(2)運(yùn)算量只能是整型或字符型。
(3)優(yōu)先級:① ~ ②<<,>>③ & ④ ^ ⑤ |
12.1.1 按位與運(yùn)算&
運(yùn)算規(guī)則:0&0=0,0&1=0,1&0=0,1&1=1。
P298,例。
按位與運(yùn)算的用途:
(1)指定位清0:用一個原數(shù)指定位上為0的數(shù)進(jìn)行按位與運(yùn)算。
(2)取指定位:用一個原數(shù)指定位上為1的數(shù)進(jìn)行按位與運(yùn)算。
(3)保留指定位:與取指定位相同。
P299,例。
12.1.2 按位或運(yùn)算|
運(yùn)算規(guī)則:0|0=0,0|1=1,1|0=1,1|1=1。
P299,例。
按位或運(yùn)算的用途:
(1)指定位置1:用一個原數(shù)指定位上為1的數(shù)進(jìn)行按位或運(yùn)算。
P300,例。
12.1.3 按位異或運(yùn)算^
運(yùn)算規(guī)則:0^0=0,0^1=1,1^0=1,1^1=0。
P300,例。
按位異或運(yùn)算的用途:
(1)指定位翻轉(zhuǎn):用一個原數(shù)指定位上為1的數(shù)進(jìn)行按位異或運(yùn)算。
(2)保留指定位:用一個原數(shù)指定位上為0的數(shù)進(jìn)行按位異或運(yùn)算。
(3)交換兩個值:只要執(zhí)行a=a^b;b=b^a;a=a^b;則a,b值交換。
P300,例。
12.1.4 按位反運(yùn)算~
運(yùn)算規(guī)則:~0=1,~1=0。
P301,例。
按位反運(yùn)算的用途:
(1)最低位清0:只要執(zhí)行a=a&~1;則a的最低位被清0。
P301,例。
12.1.5 按位左移運(yùn)算<<
運(yùn)算規(guī)則:低位補(bǔ)0,高位丟失。
P302,例。
按位反運(yùn)算的用途:
(1)在不溢出的情況下,左移n位,相當(dāng)于原數(shù)乘以2n。
P302,例。
12.1.6 按位右移運(yùn)算>>
運(yùn)算規(guī)則:(1)無符號數(shù),高位補(bǔ)0,低位丟失;
(2)有符號數(shù),補(bǔ)與高位相同的數(shù),低位丟失。
P302,例。
按位反運(yùn)算的用途:
(1)右移n位,相當(dāng)于原數(shù)除以2n。
P303,例。
12.1.7 位運(yùn)算賦值
位運(yùn)算賦值符有:
&=、|=、>>=、<<=、^=
其意義與“+=”等類似,也是復(fù)合賦值運(yùn)算符。
P303,例。
12.1.8 不同長度的位運(yùn)算
運(yùn)算規(guī)則:(1)無符號數(shù),較短的高位補(bǔ)0,再參與運(yùn)算;
(2)有符號數(shù),較短的補(bǔ)與高位相同的數(shù),再參與運(yùn)算。
P303,例。
12.2 位運(yùn)算應(yīng)用舉例
P303,例12.1。見ex12-1.c。
P304,例12.2。
12.3 位段
1. 位段的定義
位段是由若干個位組成的,C語言充許對由若干個位組成的位段進(jìn)行存取操作。位段用類似于結(jié)構(gòu)體成員的方式來描述,定義格式如下:
格式:struct 結(jié)構(gòu)體類型名
{類型名 成員名:位數(shù);
… …
};
其中:“類型名 成員名:位數(shù)”是定義位段成員。
功能:定義一個含有位段成員的結(jié)構(gòu)體類型。
P306,例。
注意:定義位段成員的類型名必須是unsigned或int。
2. 位段的引用
定義了含有位段成員的結(jié)構(gòu)體類型后,可以用來聲明這種結(jié)構(gòu)體類型的變量,方法仍有分步定義、同時定義、直接定義三種。
P306,例。
含有位段成員結(jié)構(gòu)體變量的位段成員的引用,方法與結(jié)構(gòu)體變量成員的引用一樣,用“.”成員運(yùn)算符。
P307,例。見ex12-3.c。
注意:位段成員值不能溢出;位段不能引用地址。
說明P307(1)~(7)
第14章 文件
13.1 C文件概述
文件:是存儲在外部介質(zhì)上的指令或數(shù)據(jù)的集合。
分類:(1)文件可分為程序文件和數(shù)據(jù)文件;
(2)文件保存有ASCII形式和二進(jìn)制形式兩種;
(3)文件中數(shù)據(jù)的輸入輸出要有一個緩沖區(qū);
(4)緩沖區(qū)可由系統(tǒng)自動開辟(緩沖文件系統(tǒng))和人工開辟(非緩沖文件系統(tǒng))。
注意:本章只討論緩沖文件系統(tǒng)下數(shù)據(jù)文件的讀寫。
P309,例。
13.2 文件類型指13.3 針
在C中,文件的讀寫是通過文件類型指針來進(jìn)行的。
1. 文件類型
文件類型是一個結(jié)構(gòu)體類型,已由系統(tǒng)預(yù)定義,且放在庫函數(shù)文件“stdio.h”中,名為FILE。
P310,文件類型定義原型。
注意:(1)要使用文件類型,程序頭要有:#include “stdio.h”
(2)FILE是系統(tǒng)預(yù)定義的,無須用戶定義,只能大寫。
2. 文件指針
格式:FILE *文件指針名;
功能:定義一個文件指針。
P311,例。
注意:(1)文件指針是用來指向文件中的數(shù)據(jù)的,一般開始指向文件中的第一個數(shù)據(jù),即開始存放的是文件的起始地址。
(2)系統(tǒng)預(yù)定義了兩個文件指針:stdin和stdout,分別指向鍵盤和顯示器。
13.4 文件的打開與關(guān)閉
13.3.1 文件的打開
格式:fopen(文件名,文件使用方式)
其中:(1)文件名是一個字符串,指明了要打開的文件的路徑和名字;
(2)文件使用方式由特定字符串組成,含義見P312表13.1。
功能:以指定的使用方式打開文件,為該文件開辟一個緩沖區(qū),并返回該文件的起始地址。
P311,例。
注意:(1)以讀的方式打開,若不存在該文件,或無法打開,則出錯,返回NULL;
(2)以寫的方式打開,若已存在該文件,則覆蓋;若不存在該文件,則新建;
(3)文件使用方式要與文件的類別(文本還是二進(jìn)制)相匹配。
13.3.2 文件的關(guān)閉
格式:fclose(文件指針)
其中:文件指針是指向要關(guān)閉的文件的。
功能:關(guān)閉文件指針?biāo)赶虻奈募⑨尫旁撐募木彌_區(qū)。
P312,例。
注意:fclose也有一個返回值,正常關(guān)閉返回0,否則返回EOF(-1)。
13.5 文件的順序讀寫
13.4.1 輸入和輸出一個字符
1. 把一個字符寫到文件中
格式:fputc(ch,fp)
功能:把ch中的字符寫到fp指向的文件中。
P314,例。
注意:(1)fputc函數(shù)正常返回字符ch,輸出失敗返回EOF(-1)。
(2)fputc(ch,stdout)等價于putchar(ch)。
2. 從文件中讀取一個字符
格式:fgetc(fp)
功能:從fp指向的文件中讀取一個字符。
P314,例。
注意:(1)fgetc函數(shù)正常返回一個字符,輸入失敗返回EOF(-1)。
(2)fgetc(stdin)等價于getchar()。
(3)可用feof(fp)來檢測是否讀到文末符,是返回1,不是返回0。
3. fput和fget函數(shù)應(yīng)用舉例
P315,例13.1。見ex13-1.c。
P316,例13.2。見ex13-2.c。
(下面的次序與書不同,見P332)
13.4.2 輸入和輸出一個整數(shù)或一個字符串
1. 輸入和輸出一個整數(shù)
格式:putw(i,fp)
功能:把i中的整數(shù)寫到fp指向的文件中。
格式:getw(fp)
功能:從fp指向的文件中讀取一個整數(shù)。
P322,例。見ex13-6.c。
注意:(1)有的C語言不提供putw與getw函數(shù),這時我們可以自己定義;
(2)Turbo C提供putw與getw函數(shù)。
2. 輸入和輸出一個字符串
格式:fputs(str,fp)
功能:把字符串str寫到fp指向的文件中,但不寫\0。
格式:fgets(str,n,fp)
功能:從fp指向的文件中讀取n-1個字符到str中,包括\n并自動加上\0。
P323,例。
(下面的內(nèi)容見P321)
13.4.3 格式化輸入和輸出
格式:fprintf(fp,格式控制,輸出表列)
功能:把輸出表列中的數(shù)據(jù)按格式控制寫到fp指向的文件中,但不寫\0。
格式:fscanf(fp,格式控制,輸入表列)
功能:從fp指向的文件中按格式控制讀取數(shù)據(jù)到輸入地址表列的變量中,如果是字符串會自動加上\0。
P321,例。
注意:(1)讀取時的格式要與寫入文件時的格式相匹配。
(2)fprintf(stdout,格式控制,輸出表列)等價于printf(格式控制,輸出表列)
(3)fscanf(stdin,格式控制,輸入表列) 等價于scanf(格式控制,輸入表列)
(下面的內(nèi)容見P317)
13.4.4 按記錄輸入和輸出
格式:fwrite(buffer,size,count,fp)
功能:從buffer指向的存儲區(qū)域中count次讀取大小size的數(shù)據(jù)寫到fp指向的文件中。
格式:fread(buffer,size,count,fp)
功能:從fp指向的文件中count次讀取大小size的數(shù)據(jù)送到buffer指向的存儲區(qū)域中。
其中:buffer 為內(nèi)存中要讀寫數(shù)據(jù)的存儲地址;
size 為要讀寫數(shù)據(jù)的字節(jié)數(shù);
count 為要讀寫數(shù)據(jù)的次數(shù);
fp 為要進(jìn)行讀寫操作的文件指針。
P318,例。
注意:(1)按記錄讀寫只能是二進(jìn)制文件;
(2)函數(shù)的返回值是成功讀寫的次數(shù)。
P318,例13.3。見ex13-3.c。
(下面的內(nèi)容見P323)
13.6 文件的定位
13.5.1 指針重置文首函數(shù)rewind
格式:rewind(fp);
功能:使fp重新指向文件開頭。
P323,例13.4。
13.5.2 指針重定位函數(shù)fseek
格式:fseek(fp,m,n);
其中:(1)m為字節(jié)數(shù),要在后面加L;
(2)n為起始點,可取0、1、2,見P324,表13.2。
功能:使fp移到離起始點n的m個字節(jié)處。
P324,例13.5。
13.7 出錯的檢測
略
13.8 文件輸入輸出小結(jié)
P326,表13.3。