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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、C語言考試復習要點,3.1 數(shù)據(jù)類型 數(shù)據(jù)類型總表,數(shù)據(jù)類型決定: 1. 數(shù)據(jù)占內(nèi)存字節(jié)數(shù) 2. 數(shù)據(jù)取值范圍 3. 其上可進行的操作,基本數(shù)據(jù)類型,整型,字符型,實型,有,無,說明:數(shù)據(jù)類型所占字節(jié)數(shù)隨機器硬件不同而不同,上表以IBM PC機為例:,3.2 常量與變量 標識符 定義:用來標識變量、常量、函數(shù)等的字符序列 組成: 只能由字母、數(shù)字、下劃線組成,且第一個字母必須是字母或下劃線 大小寫敏感 不能使用關鍵字 長度:最長32個字符 命名原則: 見名知意 不宜混淆 如l與I, o與0,例:判斷下列標識符號合法性 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;,變量初始化:定義時賦初值,例: int a,b,c; float data;,決定分配字節(jié)數(shù) 和數(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ù)隨機器不同而不同,一般占一個機器字 shortintlong 可用sizeof(類型標識符)測量,實型變量 float:占4字節(jié),提供7位有效數(shù)字 double:占8字節(jié),提供1516位有效數(shù)字,字符型變量 字符變量存放字符ASCII碼 char與int數(shù)據(jù)間可進行算術運算,例 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ù)間的混合計算 運算轉換規(guī)則:不同類型數(shù)據(jù)運算時先自動轉換成同一類型。 隱式轉換(自動轉換) 運算轉換-不同類型數(shù)據(jù)混合運算時 賦值轉換-把一個值賦給與其類型不同的變量時 輸出轉換-輸出時轉換成指定的輸出格式 函數(shù)調(diào)用轉換-實參與形參類型不一致時轉換,學習運算符應注意: 運算符功能 與運算量關系

5、 要求運算量個數(shù) 要求運算量類型 運算符優(yōu)先級別 結合方向 結果的類型,自增、自減運算符+ - 作用:使變量值加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,自增、自減運算符+ - 作用:使變量值加1或減1 種類: 前

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

7、); c=d+2;,逗號運算符和表達式 形式:表達式1,表達式2,表達式n 結合性:從左向右 優(yōu)先級: 15 逗號表達式的值:等于表達式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,表達式值60,/a=15,表達式值20,/賦值表達式,表達式值18,x=18,/逗號表達式,表達式值18,x=3,/1,2,3,/3,2,3,第4章 最簡單的C程序設計

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

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

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

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

12、一般都用于兩個分支的情況。當有多個分支選擇時,可采用if-else-if語句,其一般形式為: if(表達式1) 語句1; else if(表達式2) 語句2; else if(表達式3) 語句3; else if(表達式m) 語句m; else 語句n; 其語義是:依次判斷表達式的值,當出現(xiàn)某個值為真時,則執(zhí)行其對應的語句。然后跳到整個if語句之外繼續(xù)執(zhí)行程序。 如果所有的表達式均為假,則執(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語句中還應注意以下問題:,在三種形式的if語句中,在if關鍵字之后均為表達式。 該表達式通常是邏輯表達式或關系表達式, 但也可以是其它表達式,如賦值表達式等,甚至也可以是一個變量。例如: if(a=5) 語句; 或者 if(b) 語句; 都是允許的。只要表達式的值為非0,即為“真”。 如在: if(a=5); 中表達式的值永遠為非0,所以其后的語句總是要執(zhí)行的,當然這種情況在程序中不一定會出現(xiàn),但在語法上是合法的。 又如,有程序段: if(a=b) printf(%d,a); else printf(a=0); 本語句的語義是,把b值賦予a,如為非0則輸出該值,

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

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

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

17、體語句。其執(zhí)行過程可用下圖表示。,特點:先判斷表達式,后執(zhí)行循環(huán)體 說明: 循環(huán)體有可能一次也不執(zhí)行 循環(huán)體可為任意類型語句 下列情況,退出while循環(huán) 條件表達式不成立(為零) 循環(huán)體內(nèi)遇break,return,goto 無限循環(huán): while(1) 循環(huán)體;,6.3 while語句,【例6.2】用while語句構成循環(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)變量設初值,循環(huán)變量增值,循環(huán)語句中必須有使循環(huán)趨于結束

18、的語句。 例如上例中多次出現(xiàn)的循環(huán)條件是(i100)使循環(huán)結束。,使用while語句應注意以下幾點:,6.4 do-while語句,do-while語句的一般形式為: do 語句 while(表達式); 這個循環(huán)與while循環(huán)的不同在于:它先執(zhí)行循環(huán)中的語句,然后再判斷表達式是否為真, 如果為真則繼續(xù)循環(huán);如果為假, 則終止循環(huán)。因此, do-while循環(huán)至少要執(zhí)行一次循環(huán)語句。其執(zhí)行過程可用右圖表示。,特點:先執(zhí)行循環(huán)體,后判斷表達式 說明: 至少執(zhí)行一次循環(huán)體 dowhile可轉化成while結構,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)變量設初值,循環(huán)變量增值,6.5 for語句,在C語言中,for語句使用最為靈活,它完全可以取代 while 語句。它的一般形式為: for(表達式1;表達式2;表達式3) 語句 它的執(zhí)行過程如下: 先求解表達式1。 求解表達式2,若其值為真(非0),則執(zhí)行for語句中指定的內(nèi)嵌語句,然后執(zhí)行下面第3)步;若其值為假(0),則結束循環(huán),轉到第5)步。 求解表達式3。 轉回

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

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

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

23、零,就執(zhí)行循環(huán)體。,for語句在使用中需要注意的幾點:,#include main() int i,c; for(i=0;(c=getchar()!=n;i+=c); printf(%dn,i); ,運行結果: ABC 198,#include main() int c; for(;(c=getchar()!=n;) printf(%c,c); ,運行結果: computer computer,6.6 循環(huán)的嵌套,三種循環(huán)可互相嵌套,層數(shù)不限 外層循環(huán)可包含兩個以上內(nèi)循環(huán),但不能相互交叉 嵌套循環(huán)的執(zhí)行流程 嵌套循環(huán)的跳轉 禁止: 從外層跳入內(nèi)層 跳入同層的另一循環(huá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)語句和開關語句中。當break用于開關語句switch中時,可使程序跳出switch而執(zhí)行switch以后的語句。break在switch 中的用法已在前面介紹開關語句時的例子中碰到,這里不再舉例。 當break語句用于do-while、for、while循環(huán)語句中時,可使程序終止當前循環(huán)而執(zhí)行循環(huán)后面的語句。break只能終止并跳出最近一層的結構。通常break語句總是與if語句聯(lián)在一起。即滿足條件時便跳出循環(huán)。,for(r=1;r10

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

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

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

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

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

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

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

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

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

36、否結束的標志。有了0標志后,就不必再用字符數(shù)組的長度來判斷字符串的長度了。 語言允許用字符串的方式對數(shù)組作初始化賦值。,0是由C編譯系統(tǒng)自動加上的。由于采用了0標志,所以在用字符串賦初值時一般無須指定數(shù)組的長度, 而由系統(tǒng)自行處理。,7.3.5 字符數(shù)組的輸入輸出,在采用字符串方式后,字符數(shù)組的輸入輸出將變得簡單方便。 除了上述用字符串賦初值的辦法外,還可用printf函數(shù)和scanf函數(shù)一次性輸出輸入一個字符數(shù)組中的字符串,而不必使用循環(huán)語句逐個地輸入輸出每個字符。,逐個字符I/O: %c 整個字符串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à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、還應該指出的是,在語言中,所有的函數(shù)定義,包括主函數(shù)main在內(nèi),都是平行的。也就是說,在一個函數(shù)的函數(shù)體內(nèi),不能再定義另一個函數(shù),即不能嵌套定義。但是函數(shù)之間允許相互調(diào)用,也允許嵌套調(diào)用。習慣上把調(diào)用者稱為主調(diào)函數(shù)。函數(shù)還可以自己調(diào)用自己,稱為遞歸調(diào)用。 main 函數(shù)是主函數(shù),它可以調(diào)用其它函數(shù),而不允許被其它函數(shù)調(diào)用。因此,程序的執(zhí)行總是從main函數(shù)開始,完成對其它函數(shù)的調(diào)用后再返回到main函數(shù),最后由main函數(shù)結束整個程序。一個源程序必須有,也只能有一個主函數(shù)main。,8.3 函數(shù)的參數(shù)和函數(shù)的值,8.3.1 形式參數(shù)和實際參數(shù),形式參數(shù):定義函數(shù)時函數(shù)名后面括號中的變量名 實

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

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

41、形參中;調(diào)用結束,形參單元被釋放,實參單元仍保留并維持原值 特點: 形參與實參占用不同的內(nèi)存單元 單向傳遞,8.3 函數(shù)的參數(shù)和函數(shù)的值,地址傳遞(數(shù)組或指針作參數(shù)),參數(shù)值傳遞舉例,例 交換兩個數(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)說過,在程序中是通過對函數(shù)的調(diào)用來執(zhí)行函數(shù)體的,其過程與其它語言的子程序調(diào)用相似。 語言中,函數(shù)調(diào)用的一般形式為: 函數(shù)名(實際參數(shù)表) 對無參函數(shù)調(diào)用時則無實際參數(shù)表,但括號不能省。實際參數(shù)表中的參數(shù)可以是常數(shù),變量或其它構造類型數(shù)據(jù)及表達式。各實參之間用逗號分隔。,說明: 實參與形參個數(shù)相等,類型一致,按順序一一對應。 實參表求值順序,因系統(tǒng)而定(Turbo C 自右向左)。,8.4.3 被調(diào)用函數(shù)的聲明和函數(shù)原型,在主調(diào)函數(shù)中調(diào)用某函數(shù)之前應對該被調(diào)函數(shù)進行說明(聲明)。說明的目的是使編譯系統(tǒng)知道被調(diào)函數(shù)返回值的類型及其所需實參的情況,以便在主調(diào)函數(shù)中檢查實參是否正確、并指定類型對返

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

44、此種情形將不檢查參數(shù)類型和個數(shù)。(不建議使用) 當被調(diào)函數(shù)的函數(shù)定義出現(xiàn)在主調(diào)函數(shù)之前時,在主調(diào)函數(shù)中也可以不對被調(diào)函數(shù)再作說明而直接調(diào)用。因為系統(tǒng)在編譯時已經(jīng)知道函數(shù)的相關信息。,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ù)中省去對max函數(shù)的函數(shù)說明int max(int a,int b)。,如在所有函

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

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

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

48、數(shù)組和實參數(shù)組為同一數(shù)組,共同擁有一段內(nèi)存空間。在定義函數(shù)時可以不考慮形參數(shù)組的長度。,前面已經(jīng)討論過,在變量作函數(shù)參數(shù)時,所進行的值傳送是單向的。即只能從實參傳向形參,不能從形參傳回實參。形參的值發(fā)生改變后,實參并不變化。而當用數(shù)組名作函數(shù)參數(shù)時,情況則不同。由于實際上形參和實參為同一數(shù)組,因此當形參數(shù)組發(fā)生變化時,實參數(shù)組也隨之變化。當然這種情況不能理解為發(fā)生了“雙向”的值傳遞。但從實際情況來看,調(diào)用函數(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ù)組和實參數(shù)組的類型必須一致,否則將引起錯誤。 形參數(shù)組和實參數(shù)組的長度可以不相同,因為在調(diào)用時,只傳送首地址而不檢查形參數(shù)組的長度。甚至在函數(shù)形參表中,允許不給出形參數(shù)組的長度,而用一個變量來傳遞實參數(shù)組元素的個數(shù)。 多維數(shù)組也可以作為函數(shù)的參數(shù)。在函數(shù)定義時對形參數(shù)組可以指定每一維的長度,也可省去第一維的長度。,2.數(shù)組名作

溫馨提示

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

評論

0/150

提交評論