C語言考試復(fù)習(xí)要點(diǎn).ppt_第1頁
C語言考試復(fù)習(xí)要點(diǎn).ppt_第2頁
C語言考試復(fù)習(xí)要點(diǎn).ppt_第3頁
C語言考試復(fù)習(xí)要點(diǎn).ppt_第4頁
C語言考試復(fù)習(xí)要點(diǎn).ppt_第5頁
已閱讀5頁,還剩83頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、C語言考試復(fù)習(xí)要點(diǎn),3.1 數(shù)據(jù)類型 數(shù)據(jù)類型總表,數(shù)據(jù)類型決定: 1. 數(shù)據(jù)占內(nèi)存字節(jié)數(shù) 2. 數(shù)據(jù)取值范圍 3. 其上可進(jìn)行的操作,基本數(shù)據(jù)類型,整型,字符型,實(shí)型,有,無,說明:數(shù)據(jù)類型所占字節(jié)數(shù)隨機(jī)器硬件不同而不同,上表以IBM PC機(jī)為例:,3.2 常量與變量 標(biāo)識(shí)符 定義:用來標(biāo)識(shí)變量、常量、函數(shù)等的字符序列 組成: 只能由字母、數(shù)字、下劃線組成,且第一個(gè)字母必須是字母或下劃線 大小寫敏感 不能使用關(guān)鍵字 長度:最長32個(gè)字符 命名原則: 見名知意 不宜混淆 如l與I, o與0,例:判斷下列標(biāo)識(shí)符號(hào)合法性 sum Sum M.D.John day Date 3days studen

2、t_name #33 lotus_1_2_3 char ab _above $123,M.D.John,3days,#33,char,$123,ab,變量 概念:其值可以改變的量 變量名與變量值 變量定義的一般格式: 數(shù)據(jù)類型 變量1,變量2,變量n;,變量初始化:定義時(shí)賦初值,例: int a,b,c; float data;,決定分配字節(jié)數(shù) 和數(shù)的表示范圍,合法標(biāo)識(shí)符,例: int a=2,b,c=4; float data=3.67; char ch=A; int x=1,y=1,z=1; int x=y=z=1;,變量的使用:先定義,后使用,例1 int student; staden

3、t=19; /Undefined symbol statent in function main,例2 float a,b,c; c=a%b; /Illegal use of floating point in function main,變量定義位置:一般放在函數(shù)開頭,整型變量 占字節(jié)數(shù)隨機(jī)器不同而不同,一般占一個(gè)機(jī)器字 shortintlong 可用sizeof(類型標(biāo)識(shí)符)測(cè)量,實(shí)型變量 float:占4字節(jié),提供7位有效數(shù)字 double:占8字節(jié),提供1516位有效數(shù)字,字符型變量 字符變量存放字符ASCII碼 char與int數(shù)據(jù)間可進(jìn)行算術(shù)運(yùn)算,例 float a; double

4、 b; a=111111.111; /* a=111111.1*/ b=111111.111; /* b=111111.111*/,例 a=D; /* a=68; */ x=A+5; /* x=65+5; */ s=!+G /* s=33+71; */,沒有字符串變量,用字符數(shù)組存放,3.7各類數(shù)值型數(shù)據(jù)間的混合計(jì)算 運(yùn)算轉(zhuǎn)換規(guī)則:不同類型數(shù)據(jù)運(yùn)算時(shí)先自動(dòng)轉(zhuǎn)換成同一類型。 隱式轉(zhuǎn)換(自動(dòng)轉(zhuǎn)換) 運(yùn)算轉(zhuǎn)換-不同類型數(shù)據(jù)混合運(yùn)算時(shí) 賦值轉(zhuǎn)換-把一個(gè)值賦給與其類型不同的變量時(shí) 輸出轉(zhuǎn)換-輸出時(shí)轉(zhuǎn)換成指定的輸出格式 函數(shù)調(diào)用轉(zhuǎn)換-實(shí)參與形參類型不一致時(shí)轉(zhuǎn)換,學(xué)習(xí)運(yùn)算符應(yīng)注意: 運(yùn)算符功能 與運(yùn)算量關(guān)系

5、 要求運(yùn)算量個(gè)數(shù) 要求運(yùn)算量類型 運(yùn)算符優(yōu)先級(jí)別 結(jié)合方向 結(jié)果的類型,自增、自減運(yùn)算符+ - 作用:使變量值加1或減1 種類: 前置 +i, -i (先執(zhí)行i+1或i-1,再使用i值) 后置 i+,i- (先使用i值,再執(zhí)行i+1或i-1),例 j=3; k=+j; j=3; k=j+; j=3; printf(“%d”,+j); j=3; printf(“%d”,j+); a=3;b=5;c=(+a)*b; a=3;b=5;c=(a+)*b;,/k=4,j=4,/k=3,j=4,/4,/3,/c=20,a=4,/c=15,a=4,自增、自減運(yùn)算符+ - 作用:使變量值加1或減1 種類: 前

6、置 +i, -i (先執(zhí)行i+1或i-1,再使用i值) 后置 i+,i- (先使用i值,再執(zhí)行i+1或i-1),說明: + - 不能用于常量和表達(dá)式,如5+,(a+b)+ + -結(jié)合方向: 自右向左 優(yōu)先級(jí):- + - -* / % -+ - (2) (3) (4),例 -i+ -(i+) i=3; printf(“%d”,-i+); /-3,例 -i+ i=3; printf(“%d”,-i+);,賦值運(yùn)算符和表達(dá)式 簡單賦值運(yùn)算符 符號(hào): = 格式: 變量標(biāo)識(shí)符=表達(dá)式 作用:將一個(gè)數(shù)據(jù)(常量或表達(dá)式)賦給一個(gè)變量,復(fù)合賦值運(yùn)算符 種類:+= -= *= /= %= = = d=func(

7、); c=d+2;,逗號(hào)運(yùn)算符和表達(dá)式 形式:表達(dá)式1,表達(dá)式2,表達(dá)式n 結(jié)合性:從左向右 優(yōu)先級(jí): 15 逗號(hào)表達(dá)式的值:等于表達(dá)式n的值 用途:常用于循環(huán)for語句中,例 a=3*5,a*4 a=3*5,a*4,a+5 例 x=(a=3,6*3) x=a=3,6*a 例 a=1;b=2;c=3; printf(“%d,%d,%d”,a,b,c); printf(“%d,%d,%d”,(a,b,c),b,c);,/a=15,表達(dá)式值60,/a=15,表達(dá)式值20,/賦值表達(dá)式,表達(dá)式值18,x=18,/逗號(hào)表達(dá)式,表達(dá)式值18,x=3,/1,2,3,/3,2,3,第4章 最簡單的C程序設(shè)計(jì)

8、,順序程序設(shè)計(jì),輸入語句 賦值語句 輸出語句,4. 復(fù)合語句:把多個(gè)語句用括號(hào)括起來組成的一個(gè)語句稱復(fù)合語句。,在程序中應(yīng)把復(fù)合語句看成是單條語句,而不是多條語句。 例如: x=y+z; a=b+c; printf(“%d%d”,x,a); 是一條復(fù)合語句。 復(fù)合語句內(nèi)的各條語句都必須以分號(hào)“;”結(jié)尾,在括號(hào)“”外不能再加分號(hào)。,在賦值語句的使用中需要注意以下幾點(diǎn):,3. 在變量說明中,不允許連續(xù)給多個(gè)變量賦初值。,如下述說明是錯(cuò)誤的: int a=b=c=5; /* 此句是錯(cuò)誤寫法*/ 必須寫為 int a=5,b=5,c=5; 而賦值語句允許連續(xù)賦值,寫成下面兩句也是正確的 int a,b

9、,c; a=b=c=5;,格式:printf(“格式控制串”,輸出表) 功能:按指定格式向顯示器輸出數(shù)據(jù) 返值:正常,返回輸出字節(jié)數(shù);出錯(cuò),返回EOF(-1),格式輸出函數(shù),輸出表:要輸出的數(shù)據(jù)(可以沒有,多個(gè)時(shí)以“,”分隔) 格式控制串:包含兩種信息 格式說明: %修飾符格式字符 ,用于指定輸出格式 普通字符或轉(zhuǎn)義序列:原樣輸出 格式字符 只有9個(gè):d、o、x、u、c、s、f、e、g,每個(gè)格式說明都是以其中一個(gè)結(jié)尾 如: printf(“c=%cf=%fs=%s”,c,f,s);,附加格式說明符(修飾符),第五章 選擇結(jié)構(gòu)程序設(shè)計(jì),在程序中經(jīng)常需要根據(jù)條件做出判斷(大多數(shù)是比較兩個(gè)量的大小關(guān)

10、系),以決定程序下一步的工作。比較兩個(gè)量的運(yùn)算稱為關(guān)系運(yùn)算(也是邏輯運(yùn)算的一種),運(yùn)算的結(jié)果稱為邏輯量,邏輯量也可以進(jìn)行邏輯運(yùn)算。,5.1.2關(guān)系表達(dá)式,關(guān)系表達(dá)式的一般形式為: 表達(dá)式 關(guān)系運(yùn)算符 表達(dá)式,例如: a+bc-d,x3/2,a+1c,-i-5*j=k+1都是合法的關(guān)系表達(dá)式。,由于關(guān)系運(yùn)算符左右的“表達(dá)式”也可以又是關(guān)系表達(dá)式。 因此也允許出現(xiàn)嵌套的情況。例如: abc,a!=c=d等。,關(guān)系表達(dá)式自身的值是邏輯量,但在C語言中是用數(shù)字1和0來代替的。1代表“真”(“成立”),0代表“假” (“不成立”)。在關(guān)系表達(dá)式嵌套的情況中也是按這個(gè)規(guī)則來處理的。,例:a=3,b=2,c

11、=1 ab 為真,此表達(dá)式的值為1 ab=c 為真,此表達(dá)式的值為1 b+cbc ? 若a=0; b=0.3; c=0.5; aba ?,語言中提供了三種邏輯運(yùn)算符: printf(n input two numbers:); scanf(%d%d, ,5.3.1 if語句的三種形式,第二種形式為: if-else if(表達(dá)式) 語句1 else 語句2 其語義是:如果表達(dá)式的值為真,則執(zhí)行語句1,否則執(zhí)行語句2 。,main() int a, b; printf(input two numbers: ); scanf(%d%d, ,第三種形式為if-else-if形式 前二種形式的if語句

12、一般都用于兩個(gè)分支的情況。當(dāng)有多個(gè)分支選擇時(shí),可采用if-else-if語句,其一般形式為: if(表達(dá)式1) 語句1; else if(表達(dá)式2) 語句2; else if(表達(dá)式3) 語句3; else if(表達(dá)式m) 語句m; else 語句n; 其語義是:依次判斷表達(dá)式的值,當(dāng)出現(xiàn)某個(gè)值為真時(shí),則執(zhí)行其對(duì)應(yīng)的語句。然后跳到整個(gè)if語句之外繼續(xù)執(zhí)行程序。 如果所有的表達(dá)式均為假,則執(zhí)行語句n。然后繼續(xù)執(zhí)行后續(xù)程序。,5.3.1 if語句的三種形式,#includestdio.h main() char c; printf(input a character: ); c=getchar(

13、); if(c=0 ,在使用if語句中還應(yīng)注意以下問題:,在三種形式的if語句中,在if關(guān)鍵字之后均為表達(dá)式。 該表達(dá)式通常是邏輯表達(dá)式或關(guān)系表達(dá)式, 但也可以是其它表達(dá)式,如賦值表達(dá)式等,甚至也可以是一個(gè)變量。例如: if(a=5) 語句; 或者 if(b) 語句; 都是允許的。只要表達(dá)式的值為非0,即為“真”。 如在: if(a=5); 中表達(dá)式的值永遠(yuǎn)為非0,所以其后的語句總是要執(zhí)行的,當(dāng)然這種情況在程序中不一定會(huì)出現(xiàn),但在語法上是合法的。 又如,有程序段: if(a=b) printf(%d,a); else printf(a=0); 本語句的語義是,把b值賦予a,如為非0則輸出該值,

14、否則輸出“a=0”字符串。,在if語句中,條件判斷表達(dá)式必須用括號(hào)括起來,在語句之后必須加分號(hào)。,在使用if語句中還應(yīng)注意以下問題:,if (x0) printf(“%f”,x); else printf(“%f”,-x);,在if語句的三種形式中,所有的語句應(yīng)為單個(gè)語句,如果要想在滿足條件時(shí)執(zhí)行一組(多個(gè))語句,則必須把這一組語句用括起來組成一個(gè)復(fù)合語句。但要注意的是在之后不能再加分號(hào)。 例如: if(ab) a+; b+; else a=0; b=10;,在使用if語句中還應(yīng)注意以下問題:,5.3.2 if語句的嵌套,當(dāng) if 語句中的執(zhí)行語句又是 if 語句時(shí),則構(gòu)成了if 語句嵌套的情

15、形。 其一般形式可表示如下: if(表達(dá)式1) if(表達(dá)式2) 語句1 else 語句2 else if(表達(dá)式3) 語句3 else 語句4 上面的三個(gè)IF語句都可以是不完整的,但那時(shí)候要注意 if 和 else 的配對(duì)問題。,if 和 else 的配對(duì)原則,if(表達(dá)式1) if(表達(dá)式2) 語句1; else 語句2; 其中的else究竟是與哪一個(gè) if 配對(duì)呢?,if(表達(dá)式1) if(表達(dá)式2) 語句1; else 語句2;,if(表達(dá)式1) if(表達(dá)式2) 語句1; else 語句2;,if(表達(dá)式1) if(表達(dá)式2) 語句1; else 語句2;,為了避免這種二義性,語言規(guī)

16、定,else 總是與它前面最近的 if 配對(duì),因此對(duì)上述例子應(yīng)按前一種情況理解。,6.1 循環(huán)語句概述,循環(huán)結(jié)構(gòu)是程序中一種很重要的結(jié)構(gòu)。其特點(diǎn)是,在給定條件成立時(shí),反復(fù)執(zhí)行某程序段,直到條件不成立為止。給定的條件稱為循環(huán)條件,反復(fù)執(zhí)行的程序段稱為循環(huán)體。語言提供了多種循環(huán)語句,可以組成各種不同形式的循環(huán)結(jié)構(gòu)。,用goto語句和if語句構(gòu)成循環(huán); 用while語句; 用do-while語句; 用for語句;,6.3 while語句,while語句的一般形式為: while(表達(dá)式)語句 其中表達(dá)式是循環(huán)條件,語句為循環(huán)體。 while語句的語義是:計(jì)算表達(dá)式的值,當(dāng)值為真(非0)時(shí), 執(zhí)行循環(huán)

17、體語句。其執(zhí)行過程可用下圖表示。,特點(diǎn):先判斷表達(dá)式,后執(zhí)行循環(huán)體 說明: 循環(huán)體有可能一次也不執(zhí)行 循環(huán)體可為任意類型語句 下列情況,退出while循環(huán) 條件表達(dá)式不成立(為零) 循環(huán)體內(nèi)遇break,return,goto 無限循環(huán): while(1) 循環(huán)體;,6.3 while語句,【例6.2】用while語句構(gòu)成循環(huán),求1到100的和。,6.3 while語句,main() int i,sum=0; i=1; while(i=100) sum=sum+i; i+; printf(%d,sum); ,循環(huán)體,循環(huán)(中止)條件,循環(huán)變量設(shè)初值,循環(huán)變量增值,循環(huán)語句中必須有使循環(huán)趨于結(jié)束

18、的語句。 例如上例中多次出現(xiàn)的循環(huán)條件是(i100)使循環(huán)結(jié)束。,使用while語句應(yīng)注意以下幾點(diǎn):,6.4 do-while語句,do-while語句的一般形式為: do 語句 while(表達(dá)式); 這個(gè)循環(huán)與while循環(huán)的不同在于:它先執(zhí)行循環(huán)中的語句,然后再判斷表達(dá)式是否為真, 如果為真則繼續(xù)循環(huán);如果為假, 則終止循環(huán)。因此, do-while循環(huán)至少要執(zhí)行一次循環(huán)語句。其執(zhí)行過程可用右圖表示。,特點(diǎn):先執(zhí)行循環(huán)體,后判斷表達(dá)式 說明: 至少執(zhí)行一次循環(huán)體 dowhile可轉(zhuǎn)化成while結(jié)構(gòu),6.4 do-while語句,do-while循環(huán),【例6.3】用do-while語句求

19、1到100的和。,6.4 do-while語句,main() int i,sum=0; i=1; do sum=sum+i; i+; while(i=100) printf(%dn,sum); ,循環(huán)體,循環(huán)(中止)條件,循環(huán)變量設(shè)初值,循環(huán)變量增值,6.5 for語句,在C語言中,for語句使用最為靈活,它完全可以取代 while 語句。它的一般形式為: for(表達(dá)式1;表達(dá)式2;表達(dá)式3) 語句 它的執(zhí)行過程如下: 先求解表達(dá)式1。 求解表達(dá)式2,若其值為真(非0),則執(zhí)行for語句中指定的內(nèi)嵌語句,然后執(zhí)行下面第3)步;若其值為假(0),則結(jié)束循環(huán),轉(zhuǎn)到第5)步。 求解表達(dá)式3。 轉(zhuǎn)回

20、上面第2)步繼續(xù)執(zhí)行。 循環(huán)結(jié)束,執(zhí)行for語句下面的一個(gè)語句。 其執(zhí)行過程可用右圖表示。,for語句最簡單的應(yīng)用形式也是最容易理解的形式如下: for(循環(huán)變量賦初值;循環(huán)條件;循環(huán)變量增量) 語句 循環(huán)變量賦初值總是一個(gè)賦值語句, 它用來給循環(huán)控制變量賦初值; 循環(huán)條件是一個(gè)關(guān)系表達(dá)式,它決定什么時(shí)候退出循環(huán);循環(huán)變量增量,定義循環(huán)控制變量每循環(huán)一次后按什么方式變化。這三個(gè)部分之間用“;”分開。,6.5 for語句,for語句在使用中需要注意的幾點(diǎn):,for循環(huán)中的“表達(dá)式1(循環(huán)變量賦初值)”、“表達(dá)式2(循環(huán)條件)”和“表達(dá)式3(循環(huán)變量增量)”都是選擇項(xiàng), 可以缺省,但“;”不能缺省

21、。,for(i=1; i=100; i+) sum=sum+i; i1; for(; i=100; i+) sum=sum+i; /*for語句中省略表達(dá)式1*/ for(i=1; i=100;) sum=sum+i;i+; /* for語句中省略表達(dá)式3*/ i1; for(; i=100;) sum=sum+i;i+; /* for語句中省略表達(dá)式1和3*/,省略了“表達(dá)式2(循環(huán)條件)”, 則不做其它處理時(shí)便成為死循環(huán)。,for語句在使用中需要注意的幾點(diǎn):,例如: for(i=1;i+) sum=sum+i; 相當(dāng)于: i=1; while(1) sum=sum+i; i+;,這種情況下

22、,必須在循環(huán)體內(nèi)設(shè)置條件判斷語句,使之有可能在滿足一定條件時(shí)退出循環(huán),否則就夠成“死循環(huán)”,程序出錯(cuò)。,表達(dá)式1和3可以是,設(shè)置循環(huán)變量的初值的賦值表達(dá)式和使循環(huán)變量增量的表達(dá)式,也可以是其他表達(dá)式。特別是當(dāng)它們是逗號(hào)表達(dá)式的時(shí)候,就可以完成幾項(xiàng)任務(wù)。,for語句在使用中需要注意的幾點(diǎn):,例如以下幾種情況都是合法的: for(sum=0;i=100;i+) sum=sum+i; for(sum=0,i=1;i=100;i+) sum=sum+i; for(i=0,j=100;i=100;i+,j-) k=i+j;,表達(dá)式2一般是關(guān)系表達(dá)式或邏輯表達(dá)式,但也可是數(shù)值表達(dá)式或字符表達(dá)式,只要其值非

23、零,就執(zhí)行循環(huán)體。,for語句在使用中需要注意的幾點(diǎn):,#include main() int i,c; for(i=0;(c=getchar()!=n;i+=c); printf(%dn,i); ,運(yùn)行結(jié)果: ABC 198,#include main() int c; for(;(c=getchar()!=n;) printf(%c,c); ,運(yùn)行結(jié)果: computer computer,6.6 循環(huán)的嵌套,三種循環(huán)可互相嵌套,層數(shù)不限 外層循環(huán)可包含兩個(gè)以上內(nèi)循環(huán),但不能相互交叉 嵌套循環(huán)的執(zhí)行流程 嵌套循環(huán)的跳轉(zhuǎn) 禁止: 從外層跳入內(nèi)層 跳入同層的另一循環(huán) 向上跳轉(zhuǎn),(1) whil

24、e() while() . ,(2) do do while( ); . while( );,(3) while() do while( ); . ,(4) for( ; ;) do while(); while() . ,main() int i=1,j; while(i=9) j=1; while(j=i) printf(%d*%d=%d ,j,i,i*j); j+; printf(n); i+; ,6.6 循環(huán)的嵌套,例:用循環(huán)語句編程輸出九九乘法表,1*1=1 1*2=2 2*2=4 1*3=3 2*3=6 3*3=9 1*4=4 2*4=8 3*4=12 4*4=16 1*5=5 2

25、*5=10 3*5=15 4*5=20 5*5=25 1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36 1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49 1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64 1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81,main() int i=1,j; for(;i=9;i+) for(j=1;j=i;j+) printf(%d*%d=%d ,j,i

26、,i*j); printf(n); ,外層循環(huán)體,內(nèi)層循環(huán)體,6.8 break和continue語句,6.8.1 break語句,break語句只能用在循環(huán)語句和開關(guān)語句中。當(dāng)break用于開關(guān)語句switch中時(shí),可使程序跳出switch而執(zhí)行switch以后的語句。break在switch 中的用法已在前面介紹開關(guān)語句時(shí)的例子中碰到,這里不再舉例。 當(dāng)break語句用于do-while、for、while循環(huán)語句中時(shí),可使程序終止當(dāng)前循環(huán)而執(zhí)行循環(huán)后面的語句。break只能終止并跳出最近一層的結(jié)構(gòu)。通常break語句總是與if語句聯(lián)在一起。即滿足條件時(shí)便跳出循環(huán)。,for(r=1;r10

27、0) break; printf(“%.2fn”,area);,6.8.2 continue 語句,continue語句的作用是跳過本次循環(huán)中剩余的語句而強(qiáng)行執(zhí)行下一次循環(huán)。continue語句只用在for、while、do-while等循環(huán)體中,常與if條件語句一起使用,用來加速循環(huán)。其執(zhí)行過程可用下圖表示。,數(shù)組概述,在程序設(shè)計(jì)中,為了處理方便,把具有相同類型的若干變量按有序的形式組織起來。這些按序排列的同類數(shù)據(jù)元素的集合稱為數(shù)組。,在語言中,數(shù)組屬于構(gòu)造數(shù)據(jù)類型。,一個(gè)數(shù)組可以分解為多個(gè)數(shù)組元素,這些數(shù)組元素可以是基本數(shù)據(jù)類型或是構(gòu)造類型。,按數(shù)組元素的類型不同,數(shù)組又可分為數(shù)值數(shù)組、字

28、符數(shù)組、指針數(shù)組、結(jié)構(gòu)數(shù)組等各種類別。本章介紹數(shù)值數(shù)組和字符數(shù)組,其余的在以后各章陸續(xù)介紹。,內(nèi)存操作: int a6;,7.1 一維數(shù)組的定義和引用,編譯時(shí)分配連續(xù)內(nèi)存 內(nèi)存字節(jié)數(shù)=數(shù)組元素個(gè)數(shù)*該類型數(shù)據(jù)長度,數(shù)組名表示內(nèi)存首地址,a就成了地址常量,對(duì)于數(shù)組類型說明應(yīng)注意以下幾點(diǎn):,7.1 一維數(shù)組的定義和引用,數(shù)組的類型實(shí)際上是指數(shù)組元素的取值類型。對(duì)于同一個(gè)數(shù)組,其所有元素的數(shù)據(jù)類型都是相同的。,數(shù)組名的書寫規(guī)則應(yīng)符合標(biāo)識(shí)符的書寫規(guī)定。 和變量名的要求相同。,數(shù)組名不能與其它變量名相同。,例如: main() int a; float a10; 是錯(cuò)誤的。,方括號(hào)中常量表達(dá)式表示數(shù)組元

29、素的個(gè)數(shù),如a5表示數(shù)組a有 5個(gè)元素。但是其下標(biāo)從0開始計(jì)算。因此5個(gè)元素分別為a0,a1,a2,a3,a4,沒有a5。,不能在方括號(hào)中用變量來表示元素的個(gè)數(shù),但是可以是符號(hào)常數(shù)或常量表達(dá)式。,例如: #define FD 5 main() int a3+2,b7+FD; 是合法的。 但是下述說明方式是錯(cuò)誤的。 main() int n=5; int an; ,允許在同一個(gè)類型說明中,說明多個(gè)數(shù)組和多個(gè)變量。,int a,b,c,d,k110,k220; 是合法的,數(shù)組元素通常也稱為下標(biāo)變量。必須先定義數(shù)組,才能使用下標(biāo)變量。在語言中只能逐個(gè)地使用下標(biāo)變量,而不能一次引用整個(gè)數(shù)組。,一維數(shù)組

30、元素的引用,例如 輸出有10個(gè)元素的數(shù)組a必須使用循環(huán)語句逐個(gè)輸出各下標(biāo)變量: int a10; for(i=0; i10; i+) printf(%d,ai); 而不能用一個(gè)語句輸出整個(gè)數(shù)組。下面的寫法是錯(cuò)誤的: int a10; printf(%d,a);,7.1.3 一維數(shù)組的初始化,給數(shù)組賦值的方法除了用賦值語句對(duì)數(shù)組元素逐個(gè)賦值外, 還可采用初始化賦值的方法。 數(shù)組初始化賦值是指在數(shù)組定義時(shí)給數(shù)組元素賦予初值。數(shù)組初始化是在編譯階段進(jìn)行的。這樣將減少運(yùn)行時(shí)間,提高效率。未初始化的數(shù)組元素的值為隨機(jī)數(shù)。 初始化賦值的一般形式為: 類型說明符 數(shù)組名常量表達(dá)式=值,值值; 其中在 中的各

31、數(shù)據(jù)值即為各元素的初值,各值之間用逗號(hào)間隔。 例如: int a10= 0,1,2,3,4,5,6,7,8,9 ; 相當(dāng)于 int a10; a0=0;a1=1.a9=9;,可以只給部分元素賦初值。 當(dāng) 中值的個(gè)數(shù)少于元素個(gè)數(shù)時(shí),只給前面部分元素賦值,其余元素全賦為0。 例如: int a6=1,2,3; 表示只給a0a23個(gè)元素賦值,而后3個(gè)元素自動(dòng)賦0值。 a0=1; a1=2;a2=3; a3=0; a4=0; a5=0;,7.1.3 一維數(shù)組的初始化的說明,只能給元素逐個(gè)賦值,不能給數(shù)組整體賦值。 例如給十個(gè)元素全部賦1值,只能寫為: int a10=1,1,1,1,1,1,1,1,1

32、,1; 而不能寫為: int a10=1; (),如給全部元素賦值,則在數(shù)組說明中,可以不給出數(shù)組元素的個(gè)數(shù)。 例如: int a5=1,2,3,4,5; 可寫為: int a =1,2,3,4,5;,如想給某個(gè)數(shù)組所有元素賦為0,則可這樣: int a100=0;,例 用冒泡(沉底)法對(duì)10個(gè)數(shù)排序,一維數(shù)組程序舉例,排序過程(以排成前小后大為例): (1)比較第一個(gè)數(shù)與第二個(gè)數(shù),若為大小關(guān)系與要求的不同(如a0a1),則交換;然后比較第二個(gè)數(shù)與第三個(gè)數(shù),并視情況決定是否交換;依次類推,直至第n-1個(gè)數(shù)和第n個(gè)數(shù)(最后一個(gè)數(shù))比較為止第一趟沉底排序,結(jié)果最大的數(shù)被安置在最后一個(gè)元素的位置上。

33、 (2)對(duì)前n-1個(gè)數(shù)進(jìn)行第二趟沉底排序(最后那個(gè)最大的數(shù)就不再參加了),結(jié)果使次大的數(shù)被安置在第n-1個(gè)(倒數(shù)第二個(gè))元素的位置上。 (3)重復(fù)上述過程,共經(jīng)過n-1趟冒泡排序后,排序結(jié)束。,簡單選擇法排序,排序過程(以10個(gè)數(shù)排成前小后大為例) : (1)首先通過n-1次比較,從n個(gè)數(shù)中找出最小的(將最小元素的下標(biāo)存在另一個(gè)變量中),將最小元素與第一個(gè)元素交換第一趟選擇排序,結(jié)果最小的數(shù)被安置在第一個(gè)元素的位置上。 (2)再通過n-2次比較,從剩余的后n-1個(gè)數(shù)中找出最小的元素(也就是所有n個(gè)數(shù)中次小的),將它與第二個(gè)數(shù)交換第二趟選擇排序。 (3)重復(fù)上述過程,共經(jīng)過n-1趟排序后,排序結(jié)

34、束。,數(shù)組元素的存放順序,7.2.1 二維數(shù)組的定義,二維數(shù)組在概念上是二維的,即是說其下標(biāo)在兩個(gè)方向上變化,下標(biāo)變量在數(shù)組中的位置也處于一個(gè)平面之中。但是,實(shí)際的硬件存儲(chǔ)器卻是連續(xù)編址的,也就是說存儲(chǔ)器單元是按一維線性排列的。如何在一維存儲(chǔ)器中存放二維數(shù)組。在語言中,二維數(shù)組是按行序優(yōu)先排列的。,多維數(shù)組:最右邊的下標(biāo)變化最快,二維數(shù)組的初始化的說明,正常的全部初始化:,部分初始化:,第一維長度省略初始化:,二維數(shù)組和一維數(shù)組的關(guān)系,數(shù)組是一種構(gòu)造類型的數(shù)據(jù)。二維數(shù)組可以看作是由一維數(shù)組的嵌套而構(gòu)成的。設(shè)一維數(shù)組的每個(gè)元素都又是一個(gè)一維數(shù)組,就組成了二維數(shù)組。當(dāng)然,前提是各元素類型必須相同。

35、根據(jù)這樣的分析,一個(gè)二維數(shù)組也可以分解為多個(gè)一維數(shù)組。語言允許這種分解。,每個(gè)元素ai由包含4個(gè)元素 的一維數(shù)組組成,二維數(shù)組a是由3個(gè)元素組成,當(dāng)對(duì)全體元素賦初值時(shí)也可以省去長度說明。 例如: char c=c, ,p,r,o,g,r,a,m; 這時(shí)C數(shù)組的長度自動(dòng)定為9。,若字符個(gè)數(shù)少于數(shù)組長度,則后面元素的都賦為“空字符”。,7.3.2 字符數(shù)組的初始化,7.3.4 字符串和字符串結(jié)束標(biāo)志,在語言中沒有專門的字符串變量,通常用一個(gè)字符數(shù)組來存放一個(gè)字符串。前面介紹字符串常量時(shí),已說明字符串總是以0作為串的結(jié)束符。因此當(dāng)把一個(gè)字符串存入一個(gè)數(shù)組時(shí),也把結(jié)束符0存入數(shù)組,并以此作為該字符串是

36、否結(jié)束的標(biāo)志。有了0標(biāo)志后,就不必再用字符數(shù)組的長度來判斷字符串的長度了。 語言允許用字符串的方式對(duì)數(shù)組作初始化賦值。,0是由C編譯系統(tǒng)自動(dòng)加上的。由于采用了0標(biāo)志,所以在用字符串賦初值時(shí)一般無須指定數(shù)組的長度, 而由系統(tǒng)自行處理。,7.3.5 字符數(shù)組的輸入輸出,在采用字符串方式后,字符數(shù)組的輸入輸出將變得簡單方便。 除了上述用字符串賦初值的辦法外,還可用printf函數(shù)和scanf函數(shù)一次性輸出輸入一個(gè)字符數(shù)組中的字符串,而不必使用循環(huán)語句逐個(gè)地輸入輸出每個(gè)字符。,逐個(gè)字符I/O: %c 整個(gè)字符串I/O: %s,例 用%c main() char str5; int i; for(i=0

37、;i5;i+) scanf(“%c”, ,例 用%s main() char str5; scanf(“%s”, str); printf(“%s”, str); ,用字符數(shù)組名,不要加,數(shù)組名的特別含義,在前面介紹過,scanf的各輸入項(xiàng)必須以地址方式出現(xiàn),如 與 int a23=5,6,7,8;,例 int a10; float f2=1.2 ,2.2;,例 int a5; a=2,4,6,8,10;,例 char name0; float weight10.3; int array-100;,例 char str=“Hello”; char str=H,e,l,l,o;,函數(shù)嵌套與調(diào)用,

38、還應(yīng)該指出的是,在語言中,所有的函數(shù)定義,包括主函數(shù)main在內(nèi),都是平行的。也就是說,在一個(gè)函數(shù)的函數(shù)體內(nèi),不能再定義另一個(gè)函數(shù),即不能嵌套定義。但是函數(shù)之間允許相互調(diào)用,也允許嵌套調(diào)用。習(xí)慣上把調(diào)用者稱為主調(diào)函數(shù)。函數(shù)還可以自己調(diào)用自己,稱為遞歸調(diào)用。 main 函數(shù)是主函數(shù),它可以調(diào)用其它函數(shù),而不允許被其它函數(shù)調(diào)用。因此,程序的執(zhí)行總是從main函數(shù)開始,完成對(duì)其它函數(shù)的調(diào)用后再返回到main函數(shù),最后由main函數(shù)結(jié)束整個(gè)程序。一個(gè)源程序必須有,也只能有一個(gè)主函數(shù)main。,8.3 函數(shù)的參數(shù)和函數(shù)的值,8.3.1 形式參數(shù)和實(shí)際參數(shù),形式參數(shù):定義函數(shù)時(shí)函數(shù)名后面括號(hào)中的變量名 實(shí)

39、際參數(shù):調(diào)用函數(shù)時(shí)函數(shù)名后面括號(hào)中的表達(dá)式,形參出現(xiàn)在函數(shù)定義中,在整個(gè)函數(shù)體內(nèi)都可以使用,離開該函數(shù)則不能使用。實(shí)參出現(xiàn)在主調(diào)函數(shù)中,進(jìn)入被調(diào)函數(shù)后,實(shí)參變量也不能使用。 形參和實(shí)參的功能是作數(shù)據(jù)傳送。發(fā)生函數(shù)調(diào)用時(shí),主調(diào)函數(shù)把實(shí)參的值傳送給被調(diào)函數(shù)的形參從而實(shí)現(xiàn)主調(diào)函數(shù)向被調(diào)函數(shù)的數(shù)據(jù)傳送。,例 比較兩個(gè)數(shù)并輸出大者,8.3 函數(shù)的參數(shù)和函數(shù)的值,main() int a,b,c; scanf(%d,%d, ,關(guān)于形參和實(shí)參的說明:,形參變量只有在被調(diào)用時(shí)才臨時(shí)分配內(nèi)存單元,在調(diào)用結(jié)束時(shí),即刻釋放所分配的內(nèi)存單元。因此,形參只有在函數(shù)內(nèi)部有效。函數(shù)調(diào)用結(jié)束返回主調(diào)函數(shù)后則不能再使用該形參變

40、量。 實(shí)參可以是常量、變量、表達(dá)式、函數(shù)等,無論實(shí)參是何種類型的量,在進(jìn)行函數(shù)調(diào)用時(shí),它們都必須具有確定的值,以便把這些值傳送給形參。因此應(yīng)預(yù)先用賦值,輸入等辦法使實(shí)參獲得確定值。 實(shí)參和形參在數(shù)量上、順序上應(yīng)嚴(yán)格一致,否則會(huì)發(fā)生類型不匹配的錯(cuò)誤。若類型上不一致,自動(dòng)按形參類型轉(zhuǎn)換函數(shù)調(diào)用轉(zhuǎn)換 函數(shù)調(diào)用中發(fā)生的數(shù)據(jù)傳送是單向的。即只能把實(shí)參的值傳送給形參,而不能把形參的值反向地傳送給實(shí)參。實(shí)參和形參在內(nèi)存中占用的是不同的單元,因此在函數(shù)調(diào)用過程中,形參的值發(fā)生改變,而實(shí)參中的值不會(huì)變化。,參數(shù)傳遞方式 值傳遞方式(一般變量或下標(biāo)變量作參數(shù)) 方式:函數(shù)調(diào)用時(shí),為形參分配單元,并將實(shí)參的值復(fù)制到

41、形參中;調(diào)用結(jié)束,形參單元被釋放,實(shí)參單元仍保留并維持原值 特點(diǎn): 形參與實(shí)參占用不同的內(nèi)存單元 單向傳遞,8.3 函數(shù)的參數(shù)和函數(shù)的值,地址傳遞(數(shù)組或指針作參數(shù)),參數(shù)值傳遞舉例,例 交換兩個(gè)數(shù),/*ch7_2.c*/ #include main() int x=7,y=11; printf(x=%d,ty=%dn,x,y); printf(swapped:n); swap(x,y); printf(x=%d,ty=%dn,x,y); swap(int a,int b) int temp; temp=a; a=b; b=temp; ,8.4 函數(shù)的調(diào)用,8.4.1 函數(shù)調(diào)用的一般形式,前面

42、已經(jīng)說過,在程序中是通過對(duì)函數(shù)的調(diào)用來執(zhí)行函數(shù)體的,其過程與其它語言的子程序調(diào)用相似。 語言中,函數(shù)調(diào)用的一般形式為: 函數(shù)名(實(shí)際參數(shù)表) 對(duì)無參函數(shù)調(diào)用時(shí)則無實(shí)際參數(shù)表,但括號(hào)不能省。實(shí)際參數(shù)表中的參數(shù)可以是常數(shù),變量或其它構(gòu)造類型數(shù)據(jù)及表達(dá)式。各實(shí)參之間用逗號(hào)分隔。,說明: 實(shí)參與形參個(gè)數(shù)相等,類型一致,按順序一一對(duì)應(yīng)。 實(shí)參表求值順序,因系統(tǒng)而定(Turbo C 自右向左)。,8.4.3 被調(diào)用函數(shù)的聲明和函數(shù)原型,在主調(diào)函數(shù)中調(diào)用某函數(shù)之前應(yīng)對(duì)該被調(diào)函數(shù)進(jìn)行說明(聲明)。說明的目的是使編譯系統(tǒng)知道被調(diào)函數(shù)返回值的類型及其所需實(shí)參的情況,以便在主調(diào)函數(shù)中檢查實(shí)參是否正確、并指定類型對(duì)返

43、回值作相應(yīng)的處理。,其一般形式為: 類型說明符 被調(diào)函數(shù)名(類型 形參,類型 形參); 或?yàn)椋?類型說明符 被調(diào)函數(shù)名(類型,類型); 括號(hào)內(nèi)給出了形參的類型和形參名,或只給出形參類型。這便于編譯系統(tǒng)進(jìn)行檢錯(cuò),以防止可能出現(xiàn)的錯(cuò)誤。,注意“聲明”和“定義”的不同!,這就是函數(shù)原型,可在編譯階段對(duì)調(diào)用函數(shù)的合法性進(jìn)行檢查,這就是函數(shù)原型,可在編譯階段對(duì)調(diào)用函數(shù)的合法性進(jìn)行檢查,“聲明”是動(dòng)詞;“函數(shù)原型”是名詞。 我們是用“函數(shù)原型”去對(duì)函數(shù)進(jìn)行“聲明”。,對(duì)函數(shù)聲明的幾點(diǎn)說明,如果被調(diào)函數(shù)的返回值是整型或字符型時(shí),可以不對(duì)被調(diào)函數(shù)作說明,而直接調(diào)用。這時(shí)系統(tǒng)將自動(dòng)對(duì)被調(diào)函數(shù)返回值按整型處理。但

44、此種情形將不檢查參數(shù)類型和個(gè)數(shù)。(不建議使用) 當(dāng)被調(diào)函數(shù)的函數(shù)定義出現(xiàn)在主調(diào)函數(shù)之前時(shí),在主調(diào)函數(shù)中也可以不對(duì)被調(diào)函數(shù)再作說明而直接調(diào)用。因?yàn)橄到y(tǒng)在編譯時(shí)已經(jīng)知道函數(shù)的相關(guān)信息。,int max(int a,int b) if(ab)return a; else return b; main() int max(int a,int b); int x,y,z; printf(input two numbers:n); scanf(%d%d, ,右例中,函數(shù)max的定義放在main 函數(shù)之前,因此可在main函數(shù)中省去對(duì)max函數(shù)的函數(shù)說明int max(int a,int b)。,如在所有函

45、數(shù)定義之前,在函數(shù)外預(yù)先說明了各個(gè)函數(shù)的類型,則在以后的各主調(diào)函數(shù)中,可不再對(duì)被調(diào)函數(shù)作說明。,對(duì)函數(shù)聲明的幾點(diǎn)說明,char str(int a); float f(float b); main() char str(int a) float f(float b) ,其中第一,二行對(duì)str函數(shù)和f函數(shù)預(yù)先作了說明。因此在以后各函數(shù)中無須對(duì)str和f函數(shù)再作說明就可直接調(diào)用。,對(duì)庫函數(shù)的調(diào)用不需要再作說明,但必須把該函數(shù)的頭文件用include命令包含在源文件前部。,8.5函數(shù)的嵌套調(diào)用(例),本題可編寫三個(gè)函數(shù),兩個(gè)分別是用來求三個(gè)數(shù)中最大、最小值的函數(shù)max和min,另一個(gè)是用來計(jì)算差值的

46、函數(shù)dif。主函數(shù)調(diào)dif計(jì)算差值,在dif中先以三個(gè)數(shù)為實(shí)參,分別調(diào)用max和min求最值,然后返回dif,再返回主函數(shù),得出結(jié)果。,例 求三個(gè)數(shù)中最大數(shù)和最小數(shù)的差值,8.6函數(shù)的遞歸調(diào)用,一個(gè)函數(shù)在它的函數(shù)體內(nèi)調(diào)用它自身稱為遞歸調(diào)用。這種函數(shù)稱為遞歸函數(shù)。語言允許函數(shù)的遞歸調(diào)用。在遞歸調(diào)用中,主調(diào)函數(shù)又是被調(diào)函數(shù)。執(zhí)行遞歸函數(shù)將反復(fù)調(diào)用其自身,每調(diào)用一次就進(jìn)入新的一層。,例如有函數(shù)f如下: int f(int x) int z; z=x*f(x-1); return z; ,這個(gè)函數(shù)是一個(gè)遞歸函數(shù)。但是運(yùn)行該函數(shù)將無休止地調(diào)用其自身,這當(dāng)然是不正確的。為了防止遞歸調(diào)用無終止地進(jìn)行,必須在

47、函數(shù)內(nèi)有終止遞歸調(diào)用的手段。常用的辦法是加條件判斷,滿足某種條件后就不再作遞歸調(diào)用,然后逐層返回。,2.數(shù)組名作為函數(shù)參數(shù)(地址傳遞),用數(shù)組名作函數(shù)參數(shù)時(shí),則要求形參和相對(duì)應(yīng)的實(shí)參都必須是類型相同的數(shù)組,都必須有明確的數(shù)組說明。當(dāng)形參和實(shí)參二者不一致時(shí),即會(huì)發(fā)生錯(cuò)誤。 在用數(shù)組名作函數(shù)參數(shù)時(shí),不是進(jìn)行值的傳送,實(shí)際上形參數(shù)組并不存在,編譯系統(tǒng)也不為形參數(shù)組分配內(nèi)存。那么,數(shù)據(jù)的傳送是如何實(shí)現(xiàn)的呢?在我們?cè)榻B過,數(shù)組名就是數(shù)組的首地址。因此在數(shù)組名作函數(shù)參數(shù)時(shí)所進(jìn)行的傳送只是地址的傳送,也就是說把實(shí)參數(shù)組的首地址賦予形參數(shù)組名。形參數(shù)組名取得該首地址之后,也就等于有了實(shí)在的數(shù)組。實(shí)際上是形參

48、數(shù)組和實(shí)參數(shù)組為同一數(shù)組,共同擁有一段內(nèi)存空間。在定義函數(shù)時(shí)可以不考慮形參數(shù)組的長度。,前面已經(jīng)討論過,在變量作函數(shù)參數(shù)時(shí),所進(jìn)行的值傳送是單向的。即只能從實(shí)參傳向形參,不能從形參傳回實(shí)參。形參的值發(fā)生改變后,實(shí)參并不變化。而當(dāng)用數(shù)組名作函數(shù)參數(shù)時(shí),情況則不同。由于實(shí)際上形參和實(shí)參為同一數(shù)組,因此當(dāng)形參數(shù)組發(fā)生變化時(shí),實(shí)參數(shù)組也隨之變化。當(dāng)然這種情況不能理解為發(fā)生了“雙向”的值傳遞。但從實(shí)際情況來看,調(diào)用函數(shù)之后實(shí)參數(shù)組的值將由于形參數(shù)組值的變化而變化。,2.數(shù)組名作為函數(shù)參數(shù)(地址傳遞),2.數(shù)組名作為函數(shù)參數(shù)(例),例 數(shù)組元素與 數(shù)組名作函數(shù)參數(shù)比較。,#include void swap2(int x) int z; z=x0; x0=x1; x1=z; main() int a2=1,2; swap2(a); printf(a0=%dna1=%dn,a0,a1); ,地址傳遞,用數(shù)組名作為函數(shù)參數(shù)時(shí)還應(yīng)注意以下幾點(diǎn): 形參數(shù)組和實(shí)參數(shù)組的類型必須一致,否則將引起錯(cuò)誤。 形參數(shù)組和實(shí)參數(shù)組的長度可以不相同,因?yàn)樵谡{(diào)用時(shí),只傳送首地址而不檢查形參數(shù)組的長度。甚至在函數(shù)形參表中,允許不給出形參數(shù)組的長度,而用一個(gè)變量來傳遞實(shí)參數(shù)組元素的個(gè)數(shù)。 多維數(shù)組也可以作為函數(shù)的參數(shù)。在函數(shù)定義時(shí)對(duì)形參數(shù)組可以指定每一維的長度,也可省去第一維的長度。,2.數(shù)組名作

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論