華東理工大學(xué)C程序設(shè)計.ppt
《華東理工大學(xué)C程序設(shè)計.ppt》由會員分享,可在線閱讀,更多相關(guān)《華東理工大學(xué)C程序設(shè)計.ppt(423頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、C程序設(shè)計,計算機基礎(chǔ)教研室 高建良,2,關(guān)于本課程的學(xué)習(xí),為什么要學(xué)本課程 怎么來學(xué)習(xí)本課程,3,關(guān)于本課程的學(xué)習(xí),為什么要學(xué)程序設(shè)計?,4,關(guān)于本課程的學(xué)習(xí),為什么要學(xué)C?,C不實用? C落后了? C難學(xué)?,5,關(guān)于本課程的學(xué)習(xí),怎么來學(xué)習(xí)本課程?,6,C程序設(shè)計,第一章C語言概述 第二章數(shù)據(jù)類型及基本運算 第三章順序結(jié)構(gòu)程序設(shè)計 第四章選擇結(jié)構(gòu)程序設(shè)計 第五章循環(huán)結(jié)構(gòu)程序設(shè)計 第六章數(shù)組 第七章函數(shù) 第八章指針 第九章結(jié)構(gòu)與其他自定義類型 第十章文件,7,第一章C語言概述,概述 C程序簡介,,8,概述,程序設(shè)計與高級語言 C語言的產(chǎn)生與發(fā)展 C語言的特點,9,程序設(shè)計與高級語言,機器指令
2、 指令系統(tǒng) 機器語言 機器程序,10,程序設(shè)計與高級語言,匯編指令 匯編語言 匯編語言源程序 匯編程序,例,11,程序設(shè)計與高級語言,程序設(shè)計語言 低級語言和高級語言 高級語言源程序、編譯程序 集成環(huán)境 例:TC、VC等,12,C語言的產(chǎn)生與發(fā)展,C語言發(fā)明于1972年 C++發(fā)明于1980年,13,C語言的特點,語言描述簡潔、靈活、高效 有豐富的數(shù)據(jù)類型和運算符 提供了功能齊全的函數(shù)庫 具有結(jié)構(gòu)化程序設(shè)計風(fēng)格 具有匯編語言特征 具有良好的通用性和程序的可移埴性,14,C程序簡介,C程序設(shè)計規(guī)則 C程序的編譯與運行,簡單的C程序(一),簡單的C程序(二),簡單的C程序(三),15,C程序設(shè)計規(guī)
3、則,程序中使用到的一切數(shù)據(jù)都必須在使用之前對其類型和存儲屬性加以定義和說明 函數(shù)是C程序的基本模塊,它應(yīng)該包括函數(shù)名、參數(shù)說明表和函數(shù)體三個部分,16,C程序設(shè)計規(guī)則,一行上允許寫多個語句,或一句語句分寫在多行上,但語句結(jié)束前必須加分號 允許在程序中插入注釋,注釋行必須以規(guī)定的符號“/*”開頭,以符號“*/”結(jié)束 書寫格式自由,為提高程序的可讀性,可采用“縮進”方式書寫,17,C程序的編譯與運行,C C++ TC VC,18,第1章作業(yè):,利用printf函數(shù)打印自己的姓名。將源文件hw1_1.c上傳,,19,第二章數(shù)據(jù)類型及基本運算,數(shù)據(jù)的表示 基本數(shù)據(jù)類型及其表示 算術(shù)運算符和算術(shù)表達(dá)式,
4、,20,數(shù)據(jù)的表示,信息與數(shù)據(jù)的特征 數(shù)據(jù)類型,21,信息與數(shù)據(jù)的特征,信息 數(shù)據(jù) 數(shù)據(jù)處理,22,數(shù)據(jù)類型,在C語言中,數(shù)據(jù)總體上可分為 基本類型 構(gòu)造類型 指針類型,23,基本數(shù)據(jù)類型及其表示,標(biāo)識符、常量與變量 整型數(shù)據(jù) 實型數(shù)據(jù) 字符型數(shù)據(jù),24,標(biāo)識符、常量與變量,標(biāo)識符 常量 變量,25,標(biāo)識符必須滿足以下定義規(guī)則: 必須由字母或下劃線開始,由字母、數(shù)字和下劃線組成的長度不超過32的字符串 大、小寫字母表示不同意義 不能與C關(guān)鍵字同名,標(biāo)識符、常量與變量,有關(guān)標(biāo)識符練習(xí),26,常量可分為: 數(shù)值常量 符號常量,標(biāo)識符、常量與變量,27,符號常量 符號常量的定義: #define 例
5、: #define PI 3.1415926 #define N 50,標(biāo)識符、常量與變量,28,變量 規(guī)定變量在使用前必須說明 變量的說明: 例: int a,b,x;,標(biāo)識符、常量與變量,29,在程序中,一個變量占據(jù)著一個實際的存儲單元,變量名實際上是存儲單元的標(biāo)志,存儲單元中的內(nèi)容是變量的值。 允許在定義變量的同時對其賦初值,標(biāo)識符、常量與變量,30,整型數(shù)據(jù),int a,b; short c,d; long m=6; long n=j=8; unsigned long k; a=123; b=045; c=d=0 x3d8; k=0773L;,簡單的C程序(二),31,實型數(shù)據(jù),flo
6、at a,b; double x,sum; a=29.56; b=6.8e-07; x=.33; sum=55.;,錯誤的數(shù)據(jù)表示,簡單的C程序(三),32,字符型數(shù)據(jù),字符型常量 字符型常量中字母區(qū)分大小寫 轉(zhuǎn)義字符以“”開頭來標(biāo)記,33,字符型數(shù)據(jù),char c1,c2,c3=A; c1=98 int a,b=49; c2=b; a=c1;,34,基本運算符和表達(dá)式,算術(shù)運算符和算術(shù)表達(dá)式 賦值運算符和賦值表達(dá)式 逗號運算符和逗號表達(dá)式 關(guān)系運算符和關(guān)系表達(dá)式 邏輯運算符和邏輯表達(dá)式 位運算符和位表達(dá)式,35,算術(shù)運算符和算術(shù)表達(dá)式,算術(shù)運算符,簡單的C程序(四),36,算術(shù)運算符和算術(shù)表
7、達(dá)式,算術(shù)運算符的運算優(yōu)先級和結(jié)合性,37,算術(shù)運算符和算術(shù)表達(dá)式,算術(shù)表達(dá)式 說明: 在算術(shù)表達(dá)式中沒有上標(biāo)和下標(biāo) 乘號必須用*表示,不能省略 括號一律使用圓括號,38,算術(shù)運算符和算術(shù)表達(dá)式,寫出下列代數(shù)式的C表達(dá)式: x是個三位數(shù),寫出取其各位數(shù)的表達(dá)式,39,算術(shù)運算符和算術(shù)表達(dá)式,自動類型轉(zhuǎn)換: main() float y,z=242.5; unsigned x=2; short s=4; y=10+b+5.7*x+z/a-s*12.5; printf(y=%f,y);,40,算術(shù)運算符和算術(shù)表達(dá)式,強制類型轉(zhuǎn)換: main() float x=4.55; printf((int)
8、x=%d,x=%f,(int)x,x); x=8*(int)(1/2+5/(float)2);,41,算術(shù)運算符和算術(shù)表達(dá)式,例:設(shè)float x,y,z; x=6/4; y=6./4; z=-6.8%4 結(jié)果:x的值為1.0,y的值為1.5,42,算術(shù)運算符和算術(shù)表達(dá)式,自增1、自減1運算符為單目運算符 其有兩種運算形式:前綴形式和后綴形式,功能不同 前綴形式的自增、自減1運算的優(yōu)先級高于算術(shù)運算符中的所有雙目運算符 其運算對象只能是變量(可以是實數(shù)),43,算術(shù)運算符和算術(shù)表達(dá)式,例:設(shè)int x=5;則: y=++x;結(jié)果:y=6,x=6 y=x++;結(jié)果:y=5,x=6 x++;結(jié)果:
9、x=6 y=x++*--x結(jié)果:?,44,賦值運算符和賦值表達(dá)式,基本賦值運算符 形式:= 功能:將賦值運算符右邊的表達(dá)式的值賦給其左邊的變量。,45,賦值運算符和賦值表達(dá)式,注意: 賦值號左邊只能是變量 如果右邊表達(dá)式類型與左邊變量的類型不一致,則先將右邊表達(dá)式的值自動轉(zhuǎn)換成與左邊變量相同的類型,再進行賦值,46,賦值運算符和賦值表達(dá)式,復(fù)合賦值運算符 形式:= 功能:對賦值運算符左、右兩邊的運算對象進行指定的算術(shù)運算符的運算,再將運算結(jié)果賦予左邊的變量。,47,賦值運算符和賦值表達(dá)式,a+=b;等價于a=a+b; a-=b; 等價于a=a-b; a*=b+1; 等價于a=a*(b+1);
10、x+=3+x%(-3);設(shè)x=11,48,賦值運算符和賦值表達(dá)式,賦值表達(dá)式 k=j=1; int k,a=1,j=5; a+=j++; a=20+(j=7); a=(j=9)+(k=7);,49,逗號運算符和逗號表達(dá)式,逗號的用法有兩種:分隔符;運算符。 C允許用逗號連接表達(dá)式,雙目運算符,運算優(yōu)先級最低。 a=2*6,a-4,a+15;,50,逗號運算符和逗號表達(dá)式,逗號表達(dá)式 t=a;a=b;b=t;t=a,a=b,b=t; x=(5+5,10+10);x=? int j=5; a=(a=j+1,a+2,a+3);a=?,51,關(guān)系運算符和關(guān)系表達(dá)式,關(guān)系運算符 6種關(guān)系運算符:、=、<
11、、<=(優(yōu)先級高)、==、!=(優(yōu)先級低) 關(guān)系運算符優(yōu)先級低于算術(shù)運算符,高于賦值運算符。,52,關(guān)系運算符和關(guān)系表達(dá)式,關(guān)系表達(dá)式 fabs(x-y)y+x x!=y==z-2 x=y==z-1 若關(guān)系表達(dá)式成立,其值為非零,否則為零,53,邏輯運算符和邏輯表達(dá)式,邏輯運算符 3種邏輯運算符:!、 x+y; i++; printf(“%d”,x); a=b=c=2; i+=5+j;,69,表達(dá)式語句,注意: 表達(dá)式語句和賦值語句、賦值表達(dá)式的關(guān)系 賦值表達(dá)式可以出現(xiàn)在任何表達(dá)式允許出現(xiàn)的地方 聲明變量時不能采用多重賦值形式,70,數(shù)據(jù)的輸出,C語言有輸入、輸出函數(shù),而沒有輸入、輸出語句。
12、include命令的格式: #include 或 #include “stdio.h”,71,putchar函數(shù),形式:putchar (); 功能:在顯示器上輸出一個字符 參數(shù):可以是字符型變量、整型變量或相應(yīng)的常量,72,putchar函數(shù),例:使用庫函數(shù)putchar()輸出各種字符。 main() char ch1,ch2;int i; ch1=C;ch2=h; i=105; putchar(ch1);putchar(ch2); putchar(i);putchar(n); putchar(141);putchar(n);,73,printf函數(shù),形式: printf(“”,,,);,
13、74,printf函數(shù),功能: 將各輸出項的值按指定的格式顯示在屏幕上,printf函數(shù)示例,75,printf函數(shù),參數(shù): 輸出項可以是變量、常量和表達(dá)式 格式控制字符串中允許包含格式編輯符和原樣輸出的字符串 格式編輯符形式:% 格式修飾包括:標(biāo)志、類型修飾、輸出最小寬度和精度等,76,printf函數(shù),標(biāo)志: 標(biāo)志字符主要有-、+等。,77,printf函數(shù),輸出寬度: 可以用十進制數(shù)限定輸出數(shù)據(jù)的位數(shù),78,printf函數(shù),精度: 對于float或double類型的實型數(shù),可以用“m.n”的形式指定數(shù)據(jù)的輸出寬度和小數(shù)位數(shù),79,printf函數(shù),類型修飾: 類型修飾符有h和l兩種,l
14、表示輸出項是長整型、無符號長整型或雙精度實型,80,printf函數(shù),特殊字符的輸出: 可以用“”輸出一個“”;用“%%”輸出一個“%”,81,printf函數(shù),注意: 格式控制字符串中的格式說明與輸出項必須保持類型相同和個數(shù)一致,82,數(shù)據(jù)的輸入,,83,getchar函數(shù),形式:getchar (); 功能:從鍵盤上讀取一個字符 參數(shù):不帶任何參數(shù),函數(shù)的返回值是輸入字符的ASCII碼,84,getchar函數(shù),main() char c; c=getchar(); printf(%c:%dn,c,c);,85,scanf函數(shù),形式: scanf (“”,輸入項1,輸入項2,);,86,s
15、canf函數(shù),功能: 按指定的格式接收由鍵盤輸入的數(shù)據(jù),并存入輸入項變量所在的內(nèi)存單元中,87,scanf函數(shù),參數(shù): 格式控制字符串與printf函數(shù)類似,包含格式編輯符和原樣輸入字符 輸入項必須為地址引用,通常由“,103,條件運算,說明: 條件表達(dá)式中的表達(dá)式2和表達(dá)式3應(yīng)該有確定的值,二者通常為同類型 表達(dá)式2和表達(dá)式3中有一個表達(dá)式不會被計算。,104,if語句,if語句是用于選擇結(jié)構(gòu)的控制語句,根據(jù)給定條件進行判斷,以決定所要執(zhí)行的操作。,105,單邊形式if語句,形式: if(); 語義: 先計算“表達(dá)式”的值,若結(jié)果為非0,就執(zhí)行“語句”,否則直接執(zhí)行if語句的后續(xù)語句,106
16、,單邊形式if語句,注意: if是C語言的關(guān)鍵字 “表達(dá)式”允許是任何表達(dá)式,其兩側(cè)的圓括號不可少 “語句”為if的執(zhí)行塊,如果其中包含多個語句,必須用將其括成復(fù)合語句,107,雙邊形式if語句,形式: if();else; 語義: 先計算“表達(dá)式”的值,若結(jié)果為非0,則執(zhí)行“語句1”;若為0,則執(zhí)行“語句2”。,108,雙邊形式if語句,說明: else必須與if語句配對使用 else前面的語句必須用分號結(jié)束 雖然條件表達(dá)式和if語句都能構(gòu)成選擇結(jié)構(gòu),但條件表達(dá)式不能取代所有的if語句,109,if語句的嵌套,當(dāng)if語句或else語句的執(zhí)行塊中又出現(xiàn)if語句時,就形成了if語句的嵌套。,11
17、0,if語句的嵌套,說明: 在多層嵌套中,C語句規(guī)定,else總是與前面最近的沒有配過對的if配對,與程序書寫格式無關(guān),111,應(yīng)用舉例,編寫程序,從鍵盤輸入三個數(shù),按從小到大的順序依次輸出。 編寫程序,從鍵盤輸入一個成績,輸出其成績等級。,112,switch語句,形式: switch() case :;break; case :;break; case :;break; default: ;,switch語句示例,113,switch語句,語義: 先計算switch右邊“表達(dá)式”的值,并將其逐個與case行中的“常量表達(dá)式”的值相比較,若相等,則執(zhí)行該case行給出的語句,然后跳出sw
18、itch語句;若“表達(dá)式”的值不等于任何case行給出的“常量表達(dá)式”的值,則轉(zhuǎn)向并執(zhí)行default行指引的語句;若沒有default行,則直接跳出switch結(jié)構(gòu),轉(zhuǎn)去執(zhí)行后續(xù)語句。,114,switch語句,說明: switch是關(guān)鍵字,其后面用括起來的部分是其語句體 case也是關(guān)鍵字,其后跟的“常量表達(dá)式”與冒號一起構(gòu)成語句標(biāo)號,case與“常量表達(dá)式”之間必須有空格,115,switch語句,說明: 在同一個switch語句中,“常量表達(dá)式”的值必須唯一 switch后面的“表達(dá)式”可以是整型、字符型和枚舉型,但不能是實型,“表達(dá)式”的值與“常量表達(dá)式”的值應(yīng)保持類型一致,116,
19、switch語句,說明: default行可以出現(xiàn)在switch語句體的任何位置,也可以省略 case標(biāo)號后面跟的語句允許是多個語句,可以不加語句括號 一個語句也可以被多個case行共用 break也是關(guān)鍵字,其可以中止switch語句繼續(xù)往下執(zhí)行,117,應(yīng)用舉例,編寫程序,從鍵盤輸入1到7之間的一個整數(shù),要求:輸入正確則輸出相應(yīng)的星期名稱,否則輸出錯誤提示。,118,第4章作業(yè):,作業(yè)上傳系統(tǒng)中N4.doc中的習(xí)題。 完成教材中第4章習(xí)題4.2 、4.4、4.7、4.9,上傳源文件。,,119,第五章循環(huán)結(jié)構(gòu)程序設(shè)計,循環(huán)結(jié)構(gòu)是結(jié)構(gòu)化程序設(shè)計的三種基本結(jié)構(gòu)之一,它與順序結(jié)構(gòu)、選擇結(jié)構(gòu)一起,
20、構(gòu)成各種復(fù)雜的程序。 在C語言中,用于循環(huán)結(jié)構(gòu)程序設(shè)計的語句有:while語句、do-while語句和for語句。,,120,第五章循環(huán)結(jié)構(gòu)程序設(shè)計,while語句 do-while語句 for語句 循環(huán)結(jié)構(gòu)中的轉(zhuǎn)移語句 循環(huán)結(jié)構(gòu)的嵌套 應(yīng)用舉例,,121,while語句,形式: while();,122,while語句,語義: 先計算圓括號中表達(dá)式的值,判斷其是否為0,若為非0,表示循環(huán)條件滿足,執(zhí)行循環(huán)體,如此重復(fù),直至表達(dá)式的值為0,退出while循環(huán),執(zhí)行后續(xù)語句。,123,while語句,k=4; while(k2)printf(“*”);k=k-1; printf(“k=%d”,k
21、);,124,while語句,說明: while是C關(guān)鍵字,圓括號內(nèi)的“表達(dá)式”可以是任意合法的表達(dá)式 循環(huán)體只包含一句語句 注意if語句和while語句的差別 循環(huán)體要有使循環(huán)結(jié)束的語句,125,while語句,實例: 求正整數(shù)n的階乘 用字符打印圖形,126,do-while語句,形式: do ; while();,127,do-while語句,語義: 先執(zhí)行循環(huán)體一次,然后判斷表達(dá)式是否成立,若為非0,表示成立,就繼續(xù)執(zhí)行循環(huán)體,否則結(jié)束循環(huán),執(zhí)行do-while語句的后續(xù)語句。,128,do-while語句,int sum=0,i=1; do sum=sum+i;i++; while(
22、i<=5);,129,do-while語句,說明: do和while是C關(guān)鍵字,圓括號內(nèi)的“表達(dá)式”可以是任意合法的表達(dá)式 循環(huán)體至少被執(zhí)行一次 循環(huán)體只包含一句語句 循環(huán)體要有使循環(huán)結(jié)束的語句,130,do-while語句,實例: 求正整數(shù)n的階乘 求 或的值,131,for語句,形式: for(;;) ;,等價于: ; while() ; ;,132,for語句,語義: 先計算表達(dá)式1的值; 再計算表達(dá)式2的值,并判斷其是否為0,若為0,則跳出循環(huán),執(zhí)行for語句的后續(xù)語句; 表達(dá)式2的值若為非0,則執(zhí)行循環(huán)體一次,再計算表達(dá)式3的值,轉(zhuǎn)到步驟2重復(fù)執(zhí)行。,133,for語句,produc
23、t=1 for(i=1;i<5;i++) product=product*i;,134,for語句,說明: for是C關(guān)鍵字,圓括號內(nèi)的三個“表達(dá)式”可以是任意合法的表達(dá)式 循環(huán)體只包含一句語句 循環(huán)體要有使循環(huán)結(jié)束的語句,135,for語句,說明: for語句中的各表達(dá)式都可以省略,但分號間隔符不能少 若表達(dá)式2省略,則循環(huán)體中必須有控制循環(huán)結(jié)束的break語句,否則將造成死循環(huán) 循環(huán)體可以是空語句,136,for語句,實例: 求正整數(shù)n的階乘 求 或的值,137,循環(huán)結(jié)構(gòu)中的轉(zhuǎn)移語句,break語句 形式:break; break語句只能用在switch語句或循環(huán)語句中,當(dāng)用在循環(huán)中時,其
24、功能是終止當(dāng)前的循環(huán),轉(zhuǎn)向后續(xù)語句執(zhí)行。,138,循環(huán)結(jié)構(gòu)中的轉(zhuǎn)移語句,例: for(x=1,y=0;x5)break; printf(“y=%dn”,y); 實例: 判斷一個整數(shù)是否為素數(shù),139,循環(huán)結(jié)構(gòu)中的轉(zhuǎn)移語句,continue語句 形式:continue; 該語句只能用在循環(huán)中,其功能是結(jié)束本次循環(huán),即跳過循環(huán)體中位于continue語句后面的語句,轉(zhuǎn)入下一次循環(huán)條件的判斷與執(zhí)行,并不結(jié)束循環(huán)。,140,循環(huán)結(jié)構(gòu)的嵌套,當(dāng)一個循環(huán)語句的循環(huán)體中又出現(xiàn)另一個循環(huán)語句時,就構(gòu)成了循環(huán)的嵌套。,141,循環(huán)結(jié)構(gòu)的嵌套,注意: 內(nèi)循環(huán)是外循環(huán)的循環(huán)體,外循環(huán)每執(zhí)行一遍,內(nèi)循環(huán)就執(zhí)行一周,1
25、42,應(yīng)用舉例,用字符打印圖形(楊輝三角形) 求解百雞問題 輸出2到200之間的所有素數(shù) 求兩個整數(shù)的最大公約數(shù)和最小公倍數(shù),,143,第5章作業(yè):,作業(yè)上傳系統(tǒng)中N5.doc中的習(xí)題。 完成教材中第5章習(xí)題5.1 、5.9,上傳源文件。,,144,第六章數(shù)組,例:求一個班級50個學(xué)生的平均成績。 如果還要找出高于平均成績的學(xué)生名單,如何實現(xiàn)?,,145,第六章數(shù)組,C語言支持兩種構(gòu)造數(shù)據(jù)類型:數(shù)組類型和結(jié)構(gòu)類型 構(gòu)造類型的數(shù)據(jù)可分解為多個元素,其中每一個元素可以是基本類型或又是一個構(gòu)造類型。作為構(gòu)造類型的最低層元素只能是基本類型,,146,第六章數(shù)組,數(shù)組概念的引入 數(shù)組的說明 數(shù)組的引用
26、數(shù)組的存儲結(jié)構(gòu) 數(shù)組的賦初值 數(shù)組應(yīng)用舉例 字符數(shù)組與字符串處理,147,數(shù)組概念的引入,數(shù)組是個多值變量,一個數(shù)組變量由一組同名但不同下標(biāo)的元素構(gòu)成 用數(shù)組來存儲邏輯相關(guān)的數(shù)據(jù)實體,程序可方便地按下標(biāo)組織循環(huán),148,數(shù)組概念的引入,數(shù)組包含的所有元素都具有相同名字和相同的數(shù)據(jù)類型 用數(shù)組名和元素在數(shù)組中的序號可唯一地確定某個數(shù)組元素 多維數(shù)組,149,數(shù)組的說明,形式: 例: int a5,b45; float x4;,150,數(shù)組的說明,數(shù)組說明的作用是為數(shù)組預(yù)留空間 數(shù)據(jù)類型為數(shù)組的“基類型”,整數(shù)表達(dá)式定義了數(shù)組中所含元素的個數(shù),運算符的個數(shù)決定了數(shù)組的維數(shù)。,151,數(shù)組的說明,
27、注意: 在C語言中,數(shù)組元素的下標(biāo)起始值為0而不是1 下標(biāo)運算符中的整數(shù)表達(dá)式代表數(shù)組每一維的長度 下標(biāo)運算符中不允許使用變量定義數(shù)組長度,允許包含常量和sizeof表達(dá)式,152,數(shù)組的說明,#define N 50 int a3+2; char cN; float dsizeof(double); double fsizeof(a);,153,數(shù)組的引用,形式: 其中:“下標(biāo)1”、“下標(biāo)2”等為整型表達(dá)式,代表了該元素在內(nèi)存中的排列位置。,154,數(shù)組的引用,說明: 引用下標(biāo)變量時,所給出的下標(biāo)個數(shù)必須與所定義的數(shù)組維數(shù)相一致,而且每一個下標(biāo)表達(dá)式的值不得超界 凡是數(shù)組基類型變量能使用的運
28、算,數(shù)組元素也能使用,155,一維數(shù)組遍歷,for(i=0;i 29、少于數(shù)組元素的個數(shù),這表示僅對數(shù)組中排列靠前的元素賦初值,后面元素的值自動賦0;若初值表中給定的初值多于下標(biāo)變量的個數(shù),將出現(xiàn)編譯錯誤,160,數(shù)組的賦初值,注意: C語言允許使用一維數(shù)組賦初值的方法對多維數(shù)組賦初值 C語言允許在數(shù)組定義時不指定維的長度(只能是第一維),由初值表中初值的個數(shù)來間接決定長度,161,數(shù)組的賦初值,float x=-1.0,0.0,2.7,5.2E-8; int y2=0,1,2,3,4,5; int z2=0,1,2,3,4,5; char s=“hello”,162,數(shù)組應(yīng)用舉例,閱讀程序?qū)懗鼋Y(jié)果: 冒泡排序(選擇排序) 打印楊輝三角形,數(shù)組應(yīng)用,163,數(shù)組 30、的存儲結(jié)構(gòu),一維數(shù)組的存儲結(jié)構(gòu) 二維數(shù)組的存儲結(jié)構(gòu),164,數(shù)組的存儲結(jié)構(gòu),數(shù)組第一個元素的存儲地址就是整個數(shù)組的存儲首地址,該地址放在數(shù)組名中 一維數(shù)組的存儲結(jié)構(gòu),165,數(shù)組的存儲結(jié)構(gòu),二維數(shù)組的存儲結(jié)構(gòu)為“按行線性展開,順序存放”,即按: a00,a01,a02, a10,a11,a12, 二維數(shù)組的存儲結(jié)構(gòu),166,數(shù)組的存儲結(jié)構(gòu),比較兩組程序段: for i=0 to 3 for j=0 to 4 aij=i*10+j 和: for j=0 to 4 for i=0 to 3 aij=i*10+j,167,字符數(shù)組與字符串處理,在C語言中,沒有標(biāo)準(zhǔn)的字符串定義類型,字符串被當(dāng)作字 31、符數(shù)組來處理。,168,字符數(shù)組的定義,形式: char ,169,字符數(shù)組的定義,說明 字符數(shù)組中的元素只能存放一個字符型數(shù)據(jù) 與普通數(shù)組一樣,字符數(shù)組也可以在定義時賦初值,170,字符數(shù)組的定義,char string100,cblock2020; string0=T;cblock25=h; char chr6=C,h,i,n,a; char line1100=“Shanghai”; 或char line1100=”Shanghai”; line1=“Shanghai”;,171,字符串的結(jié)束標(biāo)記,為了便于識別一個字符串的結(jié)尾,C語言約定,字符串的末尾以轉(zhuǎn)義字符0作為結(jié)束標(biāo)記。,172,字 32、符串的輸入與輸出,使用scanf和printf函數(shù)輸入與輸出 main() char str80; scnaf(“%s”,str); printf(“%s”,str);,173,字符串的輸入與輸出,注意: 用%s格式輸入輸出字符串時,輸出項應(yīng)該為字符數(shù)組名,不能是數(shù)組元素名 數(shù)組名是個不占實際內(nèi)存的地址常量,它代表整個字符數(shù)組的存儲首地址,本身已經(jīng)是地址,不能再對它加地址運算符“ 其中,str_adr為字符數(shù)組名或字符指針名,代表輸入字符串的存儲起始地址。,176,字符串的輸入與輸出,功能: 接受由鍵盤輸入的字符串(包括空格符),并將它原樣存儲到由str_adr所指向的內(nèi)存段中,系統(tǒng)并不保存字 33、符串末尾的換行符,而是自動將0作為字符串的內(nèi)容存放在串尾。,177,字符串的輸入與輸出,使用gets和puts函數(shù)輸入與輸出: puts函數(shù)調(diào)用形式: puts(); 其中,str_adr為字符數(shù)組名或字符指針名,代表輸出字符串的存儲起始地址。,178,字符串的輸入與輸出,功能: 由str_adr所指向的地址開始,依次輸出存儲單元中的字符,直到遇到第一個0結(jié)束輸出,并自動輸出一個回車換行。,179,字符串的輸入與輸出,注意: gets和puts函數(shù)只能有一個輸出項和輸入項 gets函數(shù)不識別字符串中的轉(zhuǎn)義字符,它原樣輸入,而puts函數(shù)能識別字符串中包含的轉(zhuǎn)義字符 可以將二維字符數(shù)組看作一維字 34、符串?dāng)?shù)組,180,字符串遍歷,使用字符數(shù)組: for(i=0;si;i++) si ,已知字符串長度為n: for(i=0;i 35、(字符串結(jié)束標(biāo)志不計入內(nèi)),184,常用的字符串處理函數(shù),strcmp函數(shù) 形式:strcmp(,); 功能:比較str1和str2兩個字符串的大小 注意:只比較結(jié)束標(biāo)記前內(nèi)容,185,常用的字符串處理函數(shù),strcpy函數(shù) 形式:strcpy(,); 功能:將字符串str2的內(nèi)容連同結(jié)束符0一起復(fù)制到str1中。 注意:str1必須有足夠的長度以容納str2的內(nèi)容。 char str120,str2=”China”; strcpy(str1,str2);,186,常用的字符串處理函數(shù),strcat函數(shù) 形式:strcat(,); 功能:將字符串str1與字符串str2尾首相接,生成的新串存于 36、str1中,函數(shù)返回str1的首地址。 注意:str1必須有足夠的長度以容納新增加的內(nèi)容。,187,常用的字符串處理函數(shù),strcat函數(shù) main() char str180,str220; strcpy(str1,Hello); strcpy(str2, Tom); strcat(str1,str2); printf(%s,str1);,188,字符數(shù)組應(yīng)用舉例,字符串的加密解密 編寫程序,實現(xiàn)通訊錄查詢功能,,189,第6章作業(yè):,作業(yè)上傳系統(tǒng)中N6.doc中的習(xí)題。 完成教材中第6章習(xí)題6.4 、6.5,上傳源文件。,,190,第七章函數(shù),函數(shù)的概念 函數(shù)的定義 函數(shù)的調(diào)用 函數(shù)的嵌套 37、與遞歸 變量的作用域 變量的存儲類別,,191,函數(shù)的概念,將具有特定功能,或者被重復(fù)多次使用的語句序列單獨設(shè)計成一個模塊,這個模塊就稱為函數(shù)。 “模塊化程序設(shè)計”方法。,192,實例分析,求組合的值: 求楊輝三角形:,函數(shù)(一),函數(shù)(二),193,實例分析,說明: 一個C程序可以僅由一個main函數(shù)組成,也可以由一個(只能一個)main函數(shù)和一個或多個其他函數(shù)組成 定義函數(shù)時出現(xiàn)的參數(shù)稱為形式參數(shù),調(diào)用函數(shù)時出現(xiàn)的參數(shù)稱為實在參數(shù),194,實例分析,說明: 在C程序中,main函數(shù)能調(diào)用其他一切函數(shù),反之不行,其他函數(shù)之間允許相互調(diào)用 函數(shù)可以分為兩大類:標(biāo)準(zhǔn)函數(shù)、自定義函數(shù),195,函數(shù) 38、的定義,形式: () 函數(shù)體 ,實例1:求n的階乘,196,函數(shù)的定義,形式: () ,197,函數(shù)的定義,參數(shù): 函數(shù)類型:代表該函數(shù)所返回的值的類型,可以是int,float,char等標(biāo)準(zhǔn)的預(yù)定義類型,也可以是用戶自己定義的類型,也可以是無值型void,若省略,將自動賦予函數(shù)的類型為int,198,函數(shù)的定義,參數(shù): 函數(shù)名:用戶標(biāo)識符,命名規(guī)則與變量名相同,199,函數(shù)的定義,參數(shù): 形式參數(shù)表:代表函數(shù)的自變量,可有可無,若無,一對圓括號不能省略;各形式參數(shù)間用逗號分隔,如果在圓括號中說明形式參數(shù)的數(shù)據(jù)類型,則必須為每個形式參數(shù)指定類型,200,函數(shù)的定義,參數(shù): 函數(shù)體:在一對花 39、括號之間,是實現(xiàn)函數(shù)功能的語句序列,201,函數(shù)的定義,說明: 第一行函數(shù)頭的句末不能加分號 函數(shù)要返回值,在函數(shù)體必須使用return 語句實現(xiàn),其作用除了將函數(shù)值返回給調(diào)用函數(shù),并結(jié)束自身函數(shù)的運行,202,函數(shù)的定義,說明: 通常要求所返回的函數(shù)值類型與所定義的函數(shù)類型相一致。如果類型不一致,對于數(shù)值型數(shù)據(jù),系統(tǒng)將自動進行類型轉(zhuǎn)換,203,函數(shù)的調(diào)用,形式: (),204,函數(shù)的調(diào)用,說明: 在實在參數(shù)列表中,參數(shù)與參數(shù)之間用逗號分隔 若被調(diào)用的函數(shù)無參數(shù),一對圓括號不能省略 必須保證實在參數(shù)與形式參數(shù)個數(shù)相同、類型一致、位置對應(yīng),205,函數(shù)的調(diào)用,函數(shù)調(diào)用方式 函數(shù)的調(diào)用出現(xiàn)在表達(dá)式 40、中 以獨立的函數(shù)語句調(diào)用,實例2:判別素數(shù),206,函數(shù)的調(diào)用,參數(shù)的傳遞 “傳值”調(diào)用 “傳地址”調(diào)用 “指針”的概念,函數(shù)傳值調(diào)用,函數(shù)傳地址調(diào)用,實例3:百分第2套,207,函數(shù)的調(diào)用,函數(shù)調(diào)用聲明 自定義函數(shù)調(diào)用聲明 庫函數(shù)調(diào)用聲明,208,函數(shù)調(diào)用聲明,自定義函數(shù)調(diào)用聲明 (); 或 ();,函數(shù)調(diào)用聲明,209,函數(shù)調(diào)用聲明,庫函數(shù)調(diào)用聲明 #include 或 #include “”,210,函數(shù)的嵌套與遞歸,“嵌套”調(diào)用 “遞歸”調(diào)用,求階乘,求最大公約數(shù),排序,練習(xí),211,函數(shù)的嵌套與遞歸,注意: 一個正確的遞歸函數(shù)必須保證遞推過程是有限制的 遞歸函數(shù)的主要優(yōu)點是算法設(shè)計容 41、易,用于迭代、級數(shù)、鏈表等方面的算法有特殊效果,但遞歸函數(shù)對存儲空間的使用非常大,時間效率也偏低,212,變量的作用域,變量的作用域 局部變量 全局變量,兩數(shù)交換,213,變量的存儲類別,變量具有三大屬性: 類型:確定變量的存儲長度和運算方式 作用域:確定變量存在的空間 存儲類別:確定變量存在的時間,214,變量的存儲類別,TC支持四種存儲類別: auto(動態(tài)存儲) static(靜態(tài)存儲) register(寄存器型存儲) extern(外部存儲),215,動態(tài)存儲,動態(tài)存儲的特點是指變量的存儲單元隨函數(shù)的調(diào)用而取得,隨函數(shù)調(diào)用的結(jié)束而釋放。,216,動態(tài)存儲,動態(tài)存儲類別的聲明形式: a 42、uto 數(shù)據(jù)類型 變量名列表;,217,動態(tài)存儲,說明: 在函數(shù)內(nèi)部(包括主函數(shù))定義的沒有經(jīng)過特殊聲明的一切局部變量(包括形式參數(shù))均為動態(tài)變量,它們自動服從動態(tài)存儲規(guī)則,并存儲在稱為“?!钡膭討B(tài)內(nèi)存區(qū)域中 局部變量默認(rèn)的存儲類別為動態(tài)存儲 引用一個從未被賦過值的動態(tài)變量,其初值是不確定的,218,靜態(tài)存儲,靜態(tài)存儲的特點是在程序執(zhí)行的全過程中,變量始終占據(jù)著大小固定的存儲單元直至程序運行結(jié)束才予以釋放。,219,靜態(tài)存儲,靜態(tài)存儲類別的聲明形式: static 數(shù)據(jù)類型 變量名列表;,220,靜態(tài)存儲,說明: 函數(shù)調(diào)用結(jié)束后,變量的值需要保存到下一次調(diào)用時使用,可以使用靜態(tài)存儲類別 靜態(tài)局 43、部變量的生命周期與全局變量相同,其作用域仍局限于說明其自身的函數(shù)或復(fù)合語句內(nèi),221,靜態(tài)存儲,說明: 靜態(tài)局部變量若在定義時被賦初值,它僅在程序開始執(zhí)行時賦值一次,以后調(diào)用時不再重新賦值 若定義靜態(tài)變量時未指定初值,則系統(tǒng)自動對算術(shù)型變量賦0值;對字符型變量賦空值;對指針型變量賦NULL值,222,靜態(tài)存儲,說明: 若對全局變量加上static說明,該全局變量只能在自身定義的文件中使用,其他程序無法引用或修改它,若希望全局變量不受外界程序和數(shù)據(jù)的影響,將其定義為靜態(tài)全局變量能直到良好的隱藏作用,223,寄存器型存儲,寄存器型存儲就是將變量的存儲單元分配在CPU的寄存器中,而不是常規(guī)的內(nèi)存中。 44、 由于數(shù)據(jù)直接從CPU中存取,因此訪問變量的時間初縮短,程序運行的速度被加快。,224,寄存器型存儲,寄存器型存儲類別的聲明形式: register 數(shù)據(jù)類型 變量名列表;,225,寄存器型存儲,說明: 一個計算機的寄存器數(shù)量是有限的,而且通用寄存器都是16位的,所以寄存器型存儲類別僅適用于int型和char型,而且每個函數(shù)只能定義極少量的寄存器變量 寄存器存儲只能用于局部動態(tài)變量和函數(shù)的形式參數(shù),226,寄存器型存儲,說明: 不同的計算機系統(tǒng)允許使用的寄存器變量數(shù)目不盡相同,通常,TC允許一個函數(shù)中同時定義兩個寄存器變量 如果定義的寄存器變量數(shù)目超過系統(tǒng)可以提供的數(shù)目,則C會自動將超限的寄存 45、器變量當(dāng)作普通的動態(tài)變量處理,227,外部存儲,如果一個全局變量要被同一個程序中的位于其前的函數(shù)引用或被另一個源程序文件引用,就必須在引用之前對該全局變量作外部存儲聲明。,228,外部存儲,外部存儲類別的聲明形式: extern 數(shù)據(jù)類型 變量名列表;,229,外部存儲,說明: 外部存儲類別主要是為多文件共享而設(shè)置的,230,第7章作業(yè):,作業(yè)上傳系統(tǒng)中N7.doc中的習(xí)題。 完成教材中第6章習(xí)題7.2 、7.3、7.7,上傳源文件。,,231,第八章 編譯預(yù)處理,所謂“編譯預(yù)處理”是指對源程序編譯之前先調(diào)用C的預(yù)處理程序?qū)σ浴?”開頭的命令行進行解釋、替換,產(chǎn)生一個新的源程序,然后才對源程序 46、進行通常意義下的編譯。,,232,第八章 編譯預(yù)處理,宏定義 文件包含處理 條件編譯 應(yīng)用舉例,233,宏定義,無參數(shù)宏定義 有參數(shù)宏定義 宏調(diào)用 宏調(diào)用與函數(shù)調(diào)用的區(qū)別,234,無參數(shù)宏定義,形式: #define 例: #define N 50 #define PI 3.1415926,235,無參數(shù)宏定義,所謂無參數(shù)宏定義是指用一個指定的標(biāo)識符來代表一個字符串,該標(biāo)識符也稱為“宏名”。預(yù)處理時,“宏名”被替換成字符串,這一過程稱為“宏展開”。,236,無參數(shù)宏定義,說明: 宏名一般用大寫字母表示 在宏展開時,系統(tǒng)不作任何正確性檢查,僅作原形替換 #undef命令可用來終止宏定義的作用范圍 47、 宏定義可以嵌套,237,無參數(shù)宏定義,說明: 宏定義中的字符串不加引號,結(jié)束處不加分號,若加了,系統(tǒng)將認(rèn)為引號、分號也是置換內(nèi)容 #define命令一般出現(xiàn)在源文件的開頭處,238,有參數(shù)宏定義,形式: #define () 例: #define S(a,b) ab?a:b,239,有參數(shù)宏定義,有參數(shù)宏定義是指用一個帶參數(shù)表的宏名代表一個字符串,預(yù)處理時不僅作字符串替換,還要進行參數(shù)替換。,240,有參數(shù)宏定義,說明: 宏名與其右邊的圓括號之間不能有空格 當(dāng)參數(shù)為表達(dá)式時,對參數(shù)表達(dá)式加括號可防止二義性,有參數(shù)宏,241,有參數(shù)宏定義,說明: 應(yīng)盡量避免用自增變量作為宏替換的實參,242, 48、宏調(diào)用,,求園面積,243,宏調(diào)用與函數(shù)調(diào)用的區(qū)別,在程序控制上,調(diào)用帶參數(shù)宏時,宏實參只是簡單地對宏形參進行原形替換;調(diào)用函數(shù)時,則是先求出實參表達(dá)式的值,再代入形參變量中,楊輝三角形,有參數(shù)宏,244,宏調(diào)用與函數(shù)調(diào)用的區(qū)別,與函數(shù)的參數(shù)不同,宏參數(shù)沒有固定的數(shù)據(jù)類型,因此宏定義時不涉及類型,宏名和宏參數(shù)均無類型,245,宏調(diào)用與函數(shù)調(diào)用的區(qū)別,函數(shù)調(diào)用是在程序運行時發(fā)生的,并動態(tài)分配所用的內(nèi)存單元;而宏調(diào)用是在編譯預(yù)處理時進行的,而且不分配內(nèi)存單元,不進行值傳送,也無返回值,246,宏調(diào)用與函數(shù)調(diào)用的區(qū)別,使用函數(shù)調(diào)用不增加運行程序的長度,而每使用一次宏調(diào)用,都會使運行程序篇幅有所增長, 49、使編譯、鏈接后的執(zhí)行程序也增長。,247,宏調(diào)用與函數(shù)調(diào)用的區(qū)別,宏定義主要用于需要少量參數(shù)的簡單表達(dá)式中,而且調(diào)用時不作數(shù)據(jù)類型檢查 使用函數(shù)不會給程序帶來意想不到的副作用,而宏則可能給程序帶來意想不到的副作用,248,文件包含處理,文件包含處理是指將另一個源文件嵌入到當(dāng)前文件中。,249,文件包含處理,形式: #include “文件名” 或 #include ,250,文件包含處理,說明 一個#include只能包含一個文件,除了預(yù)定義的標(biāo)準(zhǔn)頭文件外,還可包含用戶自己設(shè)計的文件 文件包含命令中的一對尖括號和一對雙引號是有區(qū)別的,編譯系統(tǒng)會使用不同的方法搜索包含文件,251,文件包含處理, 50、說明 C語言提供了若干標(biāo)準(zhǔn)函數(shù)庫,每個標(biāo)準(zhǔn)函數(shù)庫都與某個預(yù)定義的頭文件相對應(yīng) 允許使用嵌套包含,252,文件包含處理,說明 當(dāng)用戶文件由多個源程序文件組成時,為了避免重復(fù)的說明和定義,提高工作效率,提高程序的可靠性和可維護性,可以把各個源文件共同使用的函數(shù)類型說明以及符號常量的宏定義等組建為單獨的用戶包含文件,253,條件編譯,條件編譯預(yù)處理可以使源程序有選擇性地編譯。 使用條件編譯有利于程序的調(diào)試,能增強程序的通用性,可以將程序方便地定制成不同的版本。,254,條件編譯,形式1: #if #else #endif 功能: 當(dāng)表達(dá)式的值為非0時,編譯語句1,否則編譯語句段2,255,條件編譯, 51、形式2: #ifdef #else #endif 功能: 當(dāng)指定的宏名已經(jīng)在#define預(yù)處理行中被定義時,編譯語句段1,否則編譯語句段2,256,條件編譯,形式3: ##ifndef #else #endif 功能: 當(dāng)指定的宏名未在#define預(yù)處理行中被定義時,編譯語句段1,否則編譯語句段2,257,條件編譯,注意: #if命令行中的表達(dá)式只能是常量表達(dá)式 #else命令行是任選的,若缺省,條件不成立時直接跳出#endif命令行 要使用嵌套條件編譯,需要使用#elif命令,,258,第八章 指針,指針的概念 指針與數(shù)組 指針與函數(shù) 指針與字符串 多級指針 命令行參數(shù),,259,指針的 52、概念,指針變量 當(dāng)變量a存儲了變量b的地址,就稱變量a指向了變量b。,260,指針變量的定義,形式: *;,261,指針變量的定義,例: int m,n,*p1,*q4; double y,z,*p2=,262,指針變量的運算符,,275,通過指針變量引用二維數(shù)組元素,注意: 指針名外面的一對圓括號不能漏寫,否則就定義了指針數(shù)組而不是數(shù)組指針了,指針定義,276,通過指針變量引用二維數(shù)組元素,例: int a43,b35; int (*pa)3,(*pb)5=b;,277,通過指針變量引用二維數(shù)組元素,說明: p是行指針,p+i、p++或p均表示指針移動的單位為“行” p只能指向二維數(shù)組中的行 53、,而不能指向一行中的某個元素 指針名p與二維數(shù)組名雖然都代表“行指針”,但p為變量,所以它可以被賦值,而二維數(shù)組名為常量,不能被賦值,278,指針與函數(shù)(一),指針變量可以作為函數(shù)的參數(shù),當(dāng)函數(shù)的參數(shù)為指針變量時,函數(shù)就能方便地通過形式參數(shù)將函數(shù)值帶出函數(shù)體反傳給主調(diào)函數(shù)。,指針作為參數(shù),279,指針與函數(shù)(二),函數(shù)名雖然不是變量,但它與數(shù)組名一樣在內(nèi)存中有確切的物理地址,是個地址常量,函數(shù)名存儲了函數(shù)目標(biāo)碼的入口地址。,280,指針與函數(shù)(二),可以定義一個指向函數(shù)的指針,借助于該指針能使函數(shù)如同普通變量一樣被復(fù)制、存儲,使函數(shù)的通用性得以提高。 指向函數(shù)的指針變量稱為“函數(shù)指針”。,28 54、1,函數(shù)指針,形式: (*)(); 其中,數(shù)據(jù)類型代表被指向函數(shù)的類型。,282,函數(shù)指針,注意: “*指針名”必須包含在一對圓括號之中 指針名后面的一對空括號不能漏寫,283,函數(shù)指針,例: double (*f)();,指針定義,284,函數(shù)指針,形式: (*)();,函數(shù)指針,285,函數(shù)指針,注意: 實參表所包含的實參個數(shù)、類型必須與被指向的函數(shù)的形式參數(shù)一致 調(diào)用之前函數(shù)指針必須已經(jīng)指向某個實際函數(shù),286,指針與函數(shù)(二),函數(shù)指針應(yīng)用舉例: 求下列分段函數(shù)的函數(shù)值:,287,指針與函數(shù)(三),函數(shù)的返回值類型為指針類型 鏈表,函數(shù)指針,288,指針與字符串,單個字符串的表示 多字 55、符串的表示,289,指針與字符串,單個字符串的表示:,單字符串,字符串操作1,字符串操作2,字符串操作3,290,指針與字符串,多字符串的表示:,字符串排序,多字符串,291,多級指針,多級指針就是“指向指針的指針”,292,二級指針的定義,形式: ** 例:int **p; 或:char x=%,*p=,293,二級指針與指針數(shù)組的聯(lián)系,,字符串?dāng)?shù)組,294,命令行參數(shù),在C語言中,main函數(shù)與其他函數(shù)一樣可以帶形式參數(shù)。,295,命令行參數(shù),形式: main(int ,char *) 或者: main(int ,char **),296,命令行參數(shù),說明: 兩個形式參數(shù)的名字可以隨意取( 56、一般都習(xí)慣記作argc和argv),但是它們的類型與順序必須與參數(shù)表中規(guī)定的相一致,297,命令行參數(shù),說明: 當(dāng)執(zhí)行main函數(shù)時,參數(shù)1將自動被賦予由系統(tǒng)計算出的命令行上的單詞個數(shù),298,命令行參數(shù),說明: 當(dāng)參數(shù)1(argc)獲得整數(shù)值后,編譯系統(tǒng)自動建立一個長度為argc的字符指針數(shù)組*argvargc,并使argv0指向命令行上的第一個實參數(shù),使argv1指向命令行上的第二個實參數(shù),,299,命令行參數(shù),說明: 命令行可以帶任意個參數(shù),參數(shù)與參數(shù)之間必須以空格分隔,命令行參數(shù),,300,第九章 結(jié)構(gòu)與其他自定義類型,結(jié)構(gòu)類型的認(rèn)識 結(jié)構(gòu)類型的定義 結(jié)構(gòu)變量 結(jié)構(gòu)數(shù)組 結(jié)構(gòu)指針 動態(tài) 57、數(shù)據(jù)結(jié)構(gòu)“鏈表” 共用體 枚舉類型 類型自定義,,301,結(jié)構(gòu)類型的認(rèn)識,使用結(jié)構(gòu)能夠有效地表示類型互異,又邏輯相關(guān)的數(shù)據(jù)實體。,302,結(jié)構(gòu)類型的定義,形式: struct ; ;,結(jié)構(gòu)類型,303,結(jié)構(gòu)變量,結(jié)構(gòu)變量的定義 結(jié)構(gòu)變量的引用 結(jié)構(gòu)變量的初始化,304,結(jié)構(gòu)變量的定義,先定義結(jié)構(gòu)類型,后說明變量 定義結(jié)構(gòu)類型的同時說明變量,結(jié)構(gòu)變量1,結(jié)構(gòu)變量2,305,結(jié)構(gòu)變量的引用,形式: .,結(jié)構(gòu)變量引用,306,結(jié)構(gòu)變量的引用,說明: 當(dāng)結(jié)構(gòu)變量的成員是另一個結(jié)構(gòu)變量時,必須使用多級成員運算符逐級引用其最底層的成員 只有當(dāng)兩個結(jié)構(gòu)變量具有完全相同的結(jié)構(gòu)類型時,相互之間才可以整體賦值,結(jié) 58、構(gòu)變量3,307,結(jié)構(gòu)變量的初始化,與普通變量一樣,結(jié)構(gòu)變量也能在定義時被賦初值。,結(jié)構(gòu)變量4,308,結(jié)構(gòu)數(shù)組,結(jié)構(gòu)數(shù)組是一種非常有用的數(shù)據(jù)結(jié)構(gòu),它集“結(jié)構(gòu)”和“數(shù)組”的優(yōu)點于一身,既描述了個體數(shù)據(jù)集合,又實現(xiàn)了利用下標(biāo)法快速存取數(shù)據(jù)的目的。,309,結(jié)構(gòu)數(shù)組的定義,形式: ,結(jié)構(gòu)數(shù)組定義,310,結(jié)構(gòu)數(shù)組的引用,形式: .,結(jié)構(gòu)數(shù)組引用,311,結(jié)構(gòu)數(shù)組的初始化,例: struct char *name; long num; int score; p=“Zhang san”,1001,536,“Li si”,1002,494,“Tao da”,1003,501;,結(jié)構(gòu)變量應(yīng)用,312,應(yīng)用 59、舉例,定義一個名字為worker的結(jié)構(gòu)類型,用于存儲職工信息,數(shù)據(jù)項包括:num(工號)、name(姓名)、sex(性別)、title(職稱)、pay(工資) 定義一個結(jié)構(gòu)數(shù)組person(5個元素),并對其初始化 編寫程序,對person數(shù)組排序,結(jié)構(gòu)數(shù)組應(yīng)用,313,結(jié)構(gòu)指針,定義一個指針,使其指向結(jié)構(gòu)變量,這樣的指針稱為“結(jié)構(gòu)指針”。結(jié)構(gòu)指針除了可以作為函數(shù)的參數(shù),將整個結(jié)構(gòu)作為一個參數(shù)傳遞給另一個函數(shù),其更重要的應(yīng)用領(lǐng)域是動態(tài)數(shù)據(jù)結(jié)構(gòu)“鏈表”。,314,結(jié)構(gòu)指針的定義,形式: *,結(jié)構(gòu)指針定義,315,通過結(jié)構(gòu)指針引用結(jié)構(gòu)變量,形式: (*). 或: -,結(jié)構(gòu)指針使用,結(jié)構(gòu)指針練習(xí),3 60、16,結(jié)構(gòu)指針作為函數(shù)的參數(shù),若函數(shù)的參數(shù)為結(jié)構(gòu)變量,調(diào)用時,形參與實參的結(jié)合是個“傳值”的過程,系統(tǒng)開銷會很大,程序效率會降低。此外,函數(shù)無法通過參數(shù)返回值。 使用結(jié)構(gòu)指針作為函數(shù)的參數(shù),可以徹底解決上述問題。,317,應(yīng)用舉例,定義一個名字為worker的結(jié)構(gòu)類型,用于存儲職工信息,數(shù)據(jù)項包括:num(工號)、name(姓名)、sex(性別)、title(職稱)、pay(工資) 編寫函數(shù),對有n個元素的worker結(jié)構(gòu)類型數(shù)組進行排序,結(jié)構(gòu)指針應(yīng)用,318,動態(tài)數(shù)據(jù)結(jié)構(gòu)“鏈表”,動態(tài)數(shù)據(jù)結(jié)構(gòu)最大的優(yōu)點是數(shù)據(jù)的多少及其相互之間的邏輯關(guān)系可以在程序執(zhí)行的過程中按需得到改變。常用的動態(tài)數(shù)據(jù)結(jié)構(gòu)有 61、鏈表、樹、圖等等。,319,鏈表概述,將邏輯上相鄰的數(shù)據(jù)分配在物理上相鄰的存儲單元中,數(shù)據(jù)之間的邏輯關(guān)系通過存儲單元的鄰接關(guān)系來體現(xiàn),這樣的存儲方式稱為“順序存儲”。,320,鏈表概述,將邏輯上相鄰的數(shù)據(jù)分配在物理上離散的存儲單元中,然后在每一個存儲單元中存入相鄰者的存儲地址,使數(shù)據(jù)之間的邏輯關(guān)系通過地址的鏈接關(guān)系來體現(xiàn),這樣的存儲方式稱為“鏈接存儲”。,321,鏈表概述,所謂“鏈表”就是指把存放在不同地點的數(shù)據(jù)用地址鏈條串接而成的數(shù)據(jù)鏈。,322,鏈表概述,把構(gòu)成鏈表的元素稱為“結(jié)點”,把第一個結(jié)點稱為“頭結(jié)點”,最后一個結(jié)點稱為“未結(jié)點”,把指向頭結(jié)點的指針稱為“頭指針”,把結(jié)點中的存放數(shù) 62、據(jù)的單元稱為“數(shù)據(jù)域”,把結(jié)點中存放地址的單元稱為“指針域”。 末結(jié)點的指針域一定為空(NULL)。,素數(shù)鏈表結(jié)構(gòu),323,單鏈表結(jié)點的類型定義,單鏈表的結(jié)點是一個結(jié)構(gòu)類型,其指針域所指對象是一個與自身類型完全相同的結(jié)構(gòu)體變量,這就形成了結(jié)構(gòu)類型的遞歸定義。,324,單鏈表結(jié)點的類型定義,單鏈表結(jié)點的類型定義: struct ; struct *; ;,325,單鏈表結(jié)點的類型定義,例:定義素數(shù)鏈表的結(jié)點類型 struct prime int data; struct prime *next; ;,素數(shù)鏈表結(jié)構(gòu),326,單鏈表結(jié)點的類型定義,例:定義學(xué)生記錄結(jié)點類型。 struct stude 63、nt long num; char *name; char sex; int score; char *place; struct student *next; ;,學(xué)生記錄結(jié)構(gòu),327,動態(tài)存儲分配函數(shù),鏈表是動態(tài)數(shù)據(jù)結(jié)構(gòu),結(jié)點的存儲空間都是在需要的時候臨時向系統(tǒng)申請獲得的。在C語言中,申請動態(tài)存儲空間是借助于動態(tài)存儲分配函數(shù)實現(xiàn)的。,328,動態(tài)存儲分配函數(shù),函數(shù)原型: void *malloc(unsigned size) 函數(shù)功能:在內(nèi)存的動態(tài)存儲區(qū)中分配一塊長度為size字節(jié)的連續(xù)空間,并返回該存儲區(qū)域的首地址。若函數(shù)調(diào)用失敗,就返回空指針NULL。 格式: (結(jié)點類型 *)mall 64、oc(結(jié)點長度),329,動態(tài)存儲分配函數(shù),函數(shù)原型: void *calloc(unsigned n,unsigned size) 函數(shù)功能:在內(nèi)存的動態(tài)存儲區(qū)中分配長度為size字節(jié)的連續(xù)空間n塊,并返回該存儲區(qū)域的首地址。若函數(shù)調(diào)用失敗,就返回空指針NULL。,330,動態(tài)存儲分配函數(shù),函數(shù)原型: void free(void *p) 函數(shù)功能:釋放當(dāng)前正被指針p所指向的內(nèi)存區(qū)域(該內(nèi)存區(qū)域必須是由malloc或calloc函數(shù)創(chuàng)建的),將它歸還給系統(tǒng)以作它用。,331,動態(tài)存儲分配函數(shù),說明: 動態(tài)存儲分配函數(shù)的原型在頭文件或中 這里的void并不是表示函數(shù)無返回值,而是表示函數(shù)返回的 65、是通用類型的指針值,結(jié)點的產(chǎn)生與消亡,332,創(chuàng)建鏈表,創(chuàng)建鏈表就是從空表開始,循環(huán)地將新結(jié)點逐一產(chǎn)生出來,并按預(yù)定的鏈接關(guān)系插入到鏈表中去的過程。,333,創(chuàng)建鏈表,結(jié)點插入通常有兩種預(yù)定關(guān)系: 新結(jié)點總是從表首插入,這種方式稱為“?!笔浇Y(jié)構(gòu)或“先進后出”式結(jié)構(gòu) 新結(jié)點總是從表尾插入,這種方式稱為“隊列”式結(jié)構(gòu)或“先進先出”式結(jié)構(gòu)。,334,創(chuàng)建鏈表,創(chuàng)建棧式鏈表的算法步驟: 建空表:head=NULL; 創(chuàng)建新結(jié)點:p=(*)mallco(); 給新結(jié)點數(shù)據(jù)域賦值 新結(jié)點進棧:p-next=head;head=p; 重復(fù)第2步到第4步若干次,創(chuàng)建棧式鏈表,棧式鏈表實例,335,創(chuàng)建鏈表,創(chuàng) 66、建隊列式鏈表的算法步驟: 創(chuàng)建首結(jié)點,并對數(shù)據(jù)域賦值:head=(*)malloc(); 對末結(jié)點指針last初始化:last=head; 開辟后續(xù)新結(jié)點:p=(*)malloc(); 新結(jié)點插入表尾:last-next=p; last指針后移至末結(jié)點:last=p; 重復(fù)第3步到第5步若干次 終止鏈表的延伸:last-next=NULL;,創(chuàng)建隊式鏈表,隊式鏈表實例,336,鏈表數(shù)據(jù)的輸出,輸出整個鏈表數(shù)據(jù)的算法步驟: p=頭指針; 輸出p指向結(jié)點的數(shù)據(jù); p指向下一個結(jié)點; 重復(fù)后二個步驟,直至p=NULL,337,結(jié)點的刪除與插入,被刪結(jié)點為鏈表首結(jié)點時的算法步驟: p=head; head=head-next; free(p);,338,結(jié)點的刪除與插入,被刪結(jié)點為鏈表的中間結(jié)點或末結(jié)點時的算法步驟: pre-next=p-next; free(p);,339,結(jié)點的刪除與插入,假設(shè)指針insert指向的結(jié)點將被插入到頭指針為head的鏈表中去,而且插入點已經(jīng)被指針p指向。 若在已知結(jié)點之后插入,則步驟: insert-next=p-next; p-next=insert;,3
- 溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2023年六年級數(shù)學(xué)下冊6整理和復(fù)習(xí)2圖形與幾何第7課時圖形的位置練習(xí)課件新人教版
- 2023年六年級數(shù)學(xué)下冊6整理和復(fù)習(xí)2圖形與幾何第1課時圖形的認(rèn)識與測量1平面圖形的認(rèn)識練習(xí)課件新人教版
- 2023年六年級數(shù)學(xué)下冊6整理和復(fù)習(xí)1數(shù)與代數(shù)第10課時比和比例2作業(yè)課件新人教版
- 2023年六年級數(shù)學(xué)下冊4比例1比例的意義和基本性質(zhì)第3課時解比例練習(xí)課件新人教版
- 2023年六年級數(shù)學(xué)下冊3圓柱與圓錐1圓柱第7課時圓柱的體積3作業(yè)課件新人教版
- 2023年六年級數(shù)學(xué)下冊3圓柱與圓錐1圓柱第1節(jié)圓柱的認(rèn)識作業(yè)課件新人教版
- 2023年六年級數(shù)學(xué)下冊2百分?jǐn)?shù)(二)第1節(jié)折扣和成數(shù)作業(yè)課件新人教版
- 2023年六年級數(shù)學(xué)下冊1負(fù)數(shù)第1課時負(fù)數(shù)的初步認(rèn)識作業(yè)課件新人教版
- 2023年六年級數(shù)學(xué)上冊期末復(fù)習(xí)考前模擬期末模擬訓(xùn)練二作業(yè)課件蘇教版
- 2023年六年級數(shù)學(xué)上冊期末豐收園作業(yè)課件蘇教版
- 2023年六年級數(shù)學(xué)上冊易錯清單十二課件新人教版
- 標(biāo)準(zhǔn)工時講義
- 2021年一年級語文上冊第六單元知識要點習(xí)題課件新人教版
- 2022春一年級語文下冊課文5識字測評習(xí)題課件新人教版
- 2023年六年級數(shù)學(xué)下冊6整理和復(fù)習(xí)4數(shù)學(xué)思考第1課時數(shù)學(xué)思考1練習(xí)課件新人教版