華東理工大學C程序設(shè)計.ppt
《華東理工大學C程序設(shè)計.ppt》由會員分享,可在線閱讀,更多相關(guān)《華東理工大學C程序設(shè)計.ppt(423頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、C程序設(shè)計,計算機基礎(chǔ)教研室 高建良,2,關(guān)于本課程的學習,為什么要學本課程 怎么來學習本課程,3,關(guān)于本課程的學習,為什么要學程序設(shè)計?,4,關(guān)于本課程的學習,為什么要學C?,C不實用? C落后了? C難學?,5,關(guān)于本課程的學習,怎么來學習本課程?,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è)計風格 具有匯編語言特征 具有良好的通用性和程序的可移埴性,14,C程序簡介,C程序設(shè)計規(guī)則 C程序的編譯與運行,簡單的C程序(一),簡單的C程序(二),簡單的C程序(三),15,C程序設(shè)計規(guī)
3、則,程序中使用到的一切數(shù)據(jù)都必須在使用之前對其類型和存儲屬性加以定義和說明 函數(shù)是C程序的基本模塊,它應該包括函數(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ù)表達式,
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ù)類型及其表示,標識符、常量與變量 整型數(shù)據(jù) 實型數(shù)據(jù) 字符型數(shù)據(jù),24,標識符、常量與變量,標識符 常量 變量,25,標識符必須滿足以下定義規(guī)則: 必須由字母或下劃線開始,由字母、數(shù)字和下劃線組成的長度不超過32的字符串 大、小寫字母表示不同意義 不能與C關(guān)鍵字同名,標識符、常量與變量,有關(guān)標識符練習,26,常量可分為: 數(shù)值常量 符號常量,標識符、常量與變量,27,符號常量 符號常量的定義: #define 例
5、: #define PI 3.1415926 #define N 50,標識符、常量與變量,28,變量 規(guī)定變量在使用前必須說明 變量的說明: 例: int a,b,x;,標識符、常量與變量,29,在程序中,一個變量占據(jù)著一個實際的存儲單元,變量名實際上是存儲單元的標志,存儲單元中的內(nèi)容是變量的值。 允許在定義變量的同時對其賦初值,標識符、常量與變量,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)義字符以“”開頭來標記,33,字符型數(shù)據(jù),char c1,c2,c3=A; c1=98 int a,b=49; c2=b; a=c1;,34,基本運算符和表達式,算術(shù)運算符和算術(shù)表達式 賦值運算符和賦值表達式 逗號運算符和逗號表達式 關(guān)系運算符和關(guān)系表達式 邏輯運算符和邏輯表達式 位運算符和位表達式,35,算術(shù)運算符和算術(shù)表達式,算術(shù)運算符,簡單的C程序(四),36,算術(shù)運算符和算術(shù)表
7、達式,算術(shù)運算符的運算優(yōu)先級和結(jié)合性,37,算術(shù)運算符和算術(shù)表達式,算術(shù)表達式 說明: 在算術(shù)表達式中沒有上標和下標 乘號必須用*表示,不能省略 括號一律使用圓括號,38,算術(shù)運算符和算術(shù)表達式,寫出下列代數(shù)式的C表達式: x是個三位數(shù),寫出取其各位數(shù)的表達式,39,算術(shù)運算符和算術(shù)表達式,自動類型轉(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ù)表達式,強制類型轉(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ù)表達式,例:設(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ù)表達式,自增1、自減1運算符為單目運算符 其有兩種運算形式:前綴形式和后綴形式,功能不同 前綴形式的自增、自減1運算的優(yōu)先級高于算術(shù)運算符中的所有雙目運算符 其運算對象只能是變量(可以是實數(shù)),43,算術(shù)運算符和算術(shù)表達式,例:設(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,賦值運算符和賦值表達式,基本賦值運算符 形式:= 功能:將賦值運算符右邊的表達式的值賦給其左邊的變量。,45,賦值運算符和賦值表達式,注意: 賦值號左邊只能是變量 如果右邊表達式類型與左邊變量的類型不一致,則先將右邊表達式的值自動轉(zhuǎn)換成與左邊變量相同的類型,再進行賦值,46,賦值運算符和賦值表達式,復合賦值運算符 形式:= 功能:對賦值運算符左、右兩邊的運算對象進行指定的算術(shù)運算符的運算,再將運算結(jié)果賦予左邊的變量。,47,賦值運算符和賦值表達式,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,賦值運算符和賦值表達式,賦值表達式 k=j=1; int k,a=1,j=5; a+=j++; a=20+(j=7); a=(j=9)+(k=7);,49,逗號運算符和逗號表達式,逗號的用法有兩種:分隔符;運算符。 C允許用逗號連接表達式,雙目運算符,運算優(yōu)先級最低。 a=2*6,a-4,a+15;,50,逗號運算符和逗號表達式,逗號表達式 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)系表達式,關(guān)系運算符 6種關(guān)系運算符:、=、<
11、、<=(優(yōu)先級高)、==、!=(優(yōu)先級低) 關(guān)系運算符優(yōu)先級低于算術(shù)運算符,高于賦值運算符。,52,關(guān)系運算符和關(guān)系表達式,關(guān)系表達式 fabs(x-y)y+x x!=y==z-2 x=y==z-1 若關(guān)系表達式成立,其值為非零,否則為零,53,邏輯運算符和邏輯表達式,邏輯運算符 3種邏輯運算符:!、 x+y; i++; printf(“%d”,x); a=b=c=2; i+=5+j;,69,表達式語句,注意: 表達式語句和賦值語句、賦值表達式的關(guān)系 賦值表達式可以出現(xiàn)在任何表達式允許出現(xiàn)的地方 聲明變量時不能采用多重賦值形式,70,數(shù)據(jù)的輸出,C語言有輸入、輸出函數(shù),而沒有輸入、輸出語句。
12、include命令的格式: #include 或 #include “stdio.h”,71,putchar函數(shù),形式:putchar (); 功能:在顯示器上輸出一個字符 參數(shù):可以是字符型變量、整型變量或相應的常量,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ù): 輸出項可以是變量、常量和表達式 格式控制字符串中允許包含格式編輯符和原樣輸出的字符串 格式編輯符形式:% 格式修飾包括:標志、類型修飾、輸出最小寬度和精度等,76,printf函數(shù),標志: 標志字符主要有-、+等。,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,條件運算,說明: 條件表達式中的表達式2和表達式3應該有確定的值,二者通常為同類型 表達式2和表達式3中有一個表達式不會被計算。,104,if語句,if語句是用于選擇結(jié)構(gòu)的控制語句,根據(jù)給定條件進行判斷,以決定所要執(zhí)行的操作。,105,單邊形式if語句,形式: if(); 語義: 先計算“表達式”的值,若結(jié)果為非0,就執(zhí)行“語句”,否則直接執(zhí)行if語句的后續(xù)語句,106
16、,單邊形式if語句,注意: if是C語言的關(guān)鍵字 “表達式”允許是任何表達式,其兩側(cè)的圓括號不可少 “語句”為if的執(zhí)行塊,如果其中包含多個語句,必須用將其括成復合語句,107,雙邊形式if語句,形式: if();else; 語義: 先計算“表達式”的值,若結(jié)果為非0,則執(zhí)行“語句1”;若為0,則執(zhí)行“語句2”。,108,雙邊形式if語句,說明: else必須與if語句配對使用 else前面的語句必須用分號結(jié)束 雖然條件表達式和if語句都能構(gòu)成選擇結(jié)構(gòu),但條件表達式不能取代所有的if語句,109,if語句的嵌套,當if語句或else語句的執(zhí)行塊中又出現(xiàn)if語句時,就形成了if語句的嵌套。,11
17、0,if語句的嵌套,說明: 在多層嵌套中,C語句規(guī)定,else總是與前面最近的沒有配過對的if配對,與程序書寫格式無關(guān),111,應用舉例,編寫程序,從鍵盤輸入三個數(shù),按從小到大的順序依次輸出。 編寫程序,從鍵盤輸入一個成績,輸出其成績等級。,112,switch語句,形式: switch() case :;break; case :;break; case :;break; default: ;,switch語句示例,113,switch語句,語義: 先計算switch右邊“表達式”的值,并將其逐個與case行中的“常量表達式”的值相比較,若相等,則執(zhí)行該case行給出的語句,然后跳出sw
18、itch語句;若“表達式”的值不等于任何case行給出的“常量表達式”的值,則轉(zhuǎn)向并執(zhí)行default行指引的語句;若沒有default行,則直接跳出switch結(jié)構(gòu),轉(zhuǎn)去執(zhí)行后續(xù)語句。,114,switch語句,說明: switch是關(guān)鍵字,其后面用括起來的部分是其語句體 case也是關(guān)鍵字,其后跟的“常量表達式”與冒號一起構(gòu)成語句標號,case與“常量表達式”之間必須有空格,115,switch語句,說明: 在同一個switch語句中,“常量表達式”的值必須唯一 switch后面的“表達式”可以是整型、字符型和枚舉型,但不能是實型,“表達式”的值與“常量表達式”的值應保持類型一致,116,
19、switch語句,說明: default行可以出現(xiàn)在switch語句體的任何位置,也可以省略 case標號后面跟的語句允許是多個語句,可以不加語句括號 一個語句也可以被多個case行共用 break也是關(guān)鍵字,其可以中止switch語句繼續(xù)往下執(zhí)行,117,應用舉例,編寫程序,從鍵盤輸入1到7之間的一個整數(shù),要求:輸入正確則輸出相應的星期名稱,否則輸出錯誤提示。,118,第4章作業(yè):,作業(yè)上傳系統(tǒng)中N4.doc中的習題。 完成教材中第4章習題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)成各種復雜的程序。 在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)的嵌套 應用舉例,,121,while語句,形式: while();,122,while語句,語義: 先計算圓括號中表達式的值,判斷其是否為0,若為非0,表示循環(huán)條件滿足,執(zhí)行循環(huán)體,如此重復,直至表達式的值為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)的“表達式”可以是任意合法的表達式 循環(huán)體只包含一句語句 注意if語句和while語句的差別 循環(huán)體要有使循環(huán)結(jié)束的語句,125,while語句,實例: 求正整數(shù)n的階乘 用字符打印圖形,126,do-while語句,形式: do ; while();,127,do-while語句,語義: 先執(zhí)行循環(huán)體一次,然后判斷表達式是否成立,若為非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)的“表達式”可以是任意合法的表達式 循環(huán)體至少被執(zhí)行一次 循環(huán)體只包含一句語句 循環(huán)體要有使循環(huán)結(jié)束的語句,130,do-while語句,實例: 求正整數(shù)n的階乘 求 或的值,131,for語句,形式: for(;;) ;,等價于: ; while() ; ;,132,for語句,語義: 先計算表達式1的值; 再計算表達式2的值,并判斷其是否為0,若為0,則跳出循環(huán),執(zhí)行for語句的后續(xù)語句; 表達式2的值若為非0,則執(zhí)行循環(huán)體一次,再計算表達式3的值,轉(zhuǎn)到步驟2重復執(zhí)行。,133,for語句,produc
23、t=1 for(i=1;i<5;i++) product=product*i;,134,for語句,說明: for是C關(guān)鍵字,圓括號內(nèi)的三個“表達式”可以是任意合法的表達式 循環(huán)體只包含一句語句 循環(huán)體要有使循環(huán)結(jié)束的語句,135,for語句,說明: for語句中的各表達式都可以省略,但分號間隔符不能少 若表達式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)語句中,當用在循環(huán)中時,其
24、功能是終止當前的循環(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)的嵌套,當一個循環(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,應用舉例,用字符打印圖形(楊輝三角形) 求解百雞問題 輸出2到200之間的所有素數(shù) 求兩個整數(shù)的最大公約數(shù)和最小公倍數(shù),,143,第5章作業(yè):,作業(yè)上傳系統(tǒng)中N5.doc中的習題。 完成教材中第5章習題5.1 、5.9,上傳源文件。,,144,第六章數(shù)組,例:求一個班級50個學生的平均成績。 如果還要找出高于平均成績的學生名單,如何實現(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ù)組應用舉例 字符數(shù)組與字符串處理,147,數(shù)組概念的引入,數(shù)組是個多值變量,一個數(shù)組變量由一組同名但不同下標的元素構(gòu)成 用數(shù)組來存儲邏輯相關(guān)的數(shù)據(jù)實體,程序可方便地按下標組織循環(huán),148,數(shù)組概念的引入,數(shù)組包含的所有元素都具有相同名字和相同的數(shù)據(jù)類型 用數(shù)組名和元素在數(shù)組中的序號可唯一地確定某個數(shù)組元素 多維數(shù)組,149,數(shù)組的說明,形式: 例: int a5,b45; float x4;,150,數(shù)組的說明,數(shù)組說明的作用是為數(shù)組預留空間 數(shù)據(jù)類型為數(shù)組的“基類型”,整數(shù)表達式定義了數(shù)組中所含元素的個數(shù),運算符的個數(shù)決定了數(shù)組的維數(shù)。,151,數(shù)組的說明,
27、注意: 在C語言中,數(shù)組元素的下標起始值為0而不是1 下標運算符中的整數(shù)表達式代表數(shù)組每一維的長度 下標運算符中不允許使用變量定義數(shù)組長度,允許包含常量和sizeof表達式,152,數(shù)組的說明,#define N 50 int a3+2; char cN; float dsizeof(double); double fsizeof(a);,153,數(shù)組的引用,形式: 其中:“下標1”、“下標2”等為整型表達式,代表了該元素在內(nèi)存中的排列位置。,154,數(shù)組的引用,說明: 引用下標變量時,所給出的下標個數(shù)必須與所定義的數(shù)組維數(shù)相一致,而且每一個下標表達式的值不得超界 凡是數(shù)組基類型變量能使用的運
28、算,數(shù)組元素也能使用,155,一維數(shù)組遍歷,for(i=0;i 29、少于數(shù)組元素的個數(shù),這表示僅對數(shù)組中排列靠前的元素賦初值,后面元素的值自動賦0;若初值表中給定的初值多于下標變量的個數(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ù)組應用舉例,閱讀程序?qū)懗鼋Y(jié)果: 冒泡排序(選擇排序) 打印楊輝三角形,數(shù)組應用,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語言中,沒有標準的字符串定義類型,字符串被當作字 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é)束標記,為了便于識別一個字符串的結(jié)尾,C語言約定,字符串的末尾以轉(zhuǎn)義字符0作為結(jié)束標記。,172,字 32、符串的輸入與輸出,使用scanf和printf函數(shù)輸入與輸出 main() char str80; scnaf(“%s”,str); printf(“%s”,str);,173,字符串的輸入與輸出,注意: 用%s格式輸入輸出字符串時,輸出項應該為字符數(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、符串數(shù)組,180,字符串遍歷,使用字符數(shù)組: for(i=0;si;i++) si ,已知字符串長度為n: for(i=0;i 35、(字符串結(jié)束標志不計入內(nèi)),184,常用的字符串處理函數(shù),strcmp函數(shù) 形式:strcmp(,); 功能:比較str1和str2兩個字符串的大小 注意:只比較結(jié)束標記前內(nèi)容,185,常用的字符串處理函數(shù),strcpy函數(shù) 形式:strcpy(,); 功能:將字符串str2的內(nèi)容連同結(jié)束符0一起復制到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ù)組應用舉例,字符串的加密解密 編寫程序,實現(xiàn)通訊錄查詢功能,,189,第6章作業(yè):,作業(yè)上傳系統(tǒng)中N6.doc中的習題。 完成教材中第6章習題6.4 、6.5,上傳源文件。,,190,第七章函數(shù),函數(shù)的概念 函數(shù)的定義 函數(shù)的調(diào)用 函數(shù)的嵌套 37、與遞歸 變量的作用域 變量的存儲類別,,191,函數(shù)的概念,將具有特定功能,或者被重復多次使用的語句序列單獨設(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ù)可以分為兩大類:標準函數(shù)、自定義函數(shù),195,函數(shù) 38、的定義,形式: () 函數(shù)體 ,實例1:求n的階乘,196,函數(shù)的定義,形式: () ,197,函數(shù)的定義,參數(shù): 函數(shù)類型:代表該函數(shù)所返回的值的類型,可以是int,float,char等標準的預定義類型,也可以是用戶自己定義的類型,也可以是無值型void,若省略,將自動賦予函數(shù)的類型為int,198,函數(shù)的定義,參數(shù): 函數(shù)名:用戶標識符,命名規(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ù)相同、類型一致、位置對應,205,函數(shù)的調(diào)用,函數(shù)調(diào)用方式 函數(shù)的調(diào)用出現(xiàn)在表達式 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ù),排序,練習,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ū)域中 局部變量默認的存儲類別為動態(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ù)或復合語句內(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、器變量當作普通的動態(tài)變量處理,227,外部存儲,如果一個全局變量要被同一個程序中的位于其前的函數(shù)引用或被另一個源程序文件引用,就必須在引用之前對該全局變量作外部存儲聲明。,228,外部存儲,外部存儲類別的聲明形式: extern 數(shù)據(jù)類型 變量名列表;,229,外部存儲,說明: 外部存儲類別主要是為多文件共享而設(shè)置的,230,第7章作業(yè):,作業(yè)上傳系統(tǒng)中N7.doc中的習題。 完成教材中第6章習題7.2 、7.3、7.7,上傳源文件。,,231,第八章 編譯預處理,所謂“編譯預處理”是指對源程序編譯之前先調(diào)用C的預處理程序?qū)σ浴?”開頭的命令行進行解釋、替換,產(chǎn)生一個新的源程序,然后才對源程序 46、進行通常意義下的編譯。,,232,第八章 編譯預處理,宏定義 文件包含處理 條件編譯 應用舉例,233,宏定義,無參數(shù)宏定義 有參數(shù)宏定義 宏調(diào)用 宏調(diào)用與函數(shù)調(diào)用的區(qū)別,234,無參數(shù)宏定義,形式: #define 例: #define N 50 #define PI 3.1415926,235,無參數(shù)宏定義,所謂無參數(shù)宏定義是指用一個指定的標識符來代表一個字符串,該標識符也稱為“宏名”。預處理時,“宏名”被替換成字符串,這一過程稱為“宏展開”。,236,無參數(shù)宏定義,說明: 宏名一般用大寫字母表示 在宏展開時,系統(tǒng)不作任何正確性檢查,僅作原形替換 #undef命令可用來終止宏定義的作用范圍 47、 宏定義可以嵌套,237,無參數(shù)宏定義,說明: 宏定義中的字符串不加引號,結(jié)束處不加分號,若加了,系統(tǒng)將認為引號、分號也是置換內(nèi)容 #define命令一般出現(xiàn)在源文件的開頭處,238,有參數(shù)宏定義,形式: #define () 例: #define S(a,b) ab?a:b,239,有參數(shù)宏定義,有參數(shù)宏定義是指用一個帶參數(shù)表的宏名代表一個字符串,預處理時不僅作字符串替換,還要進行參數(shù)替換。,240,有參數(shù)宏定義,說明: 宏名與其右邊的圓括號之間不能有空格 當參數(shù)為表達式時,對參數(shù)表達式加括號可防止二義性,有參數(shù)宏,241,有參數(shù)宏定義,說明: 應盡量避免用自增變量作為宏替換的實參,242, 48、宏調(diào)用,,求園面積,243,宏調(diào)用與函數(shù)調(diào)用的區(qū)別,在程序控制上,調(diào)用帶參數(shù)宏時,宏實參只是簡單地對宏形參進行原形替換;調(diào)用函數(shù)時,則是先求出實參表達式的值,再代入形參變量中,楊輝三角形,有參數(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)用是在編譯預處理時進行的,而且不分配內(nèi)存單元,不進行值傳送,也無返回值,246,宏調(diào)用與函數(shù)調(diào)用的區(qū)別,使用函數(shù)調(diào)用不增加運行程序的長度,而每使用一次宏調(diào)用,都會使運行程序篇幅有所增長, 49、使編譯、鏈接后的執(zhí)行程序也增長。,247,宏調(diào)用與函數(shù)調(diào)用的區(qū)別,宏定義主要用于需要少量參數(shù)的簡單表達式中,而且調(diào)用時不作數(shù)據(jù)類型檢查 使用函數(shù)不會給程序帶來意想不到的副作用,而宏則可能給程序帶來意想不到的副作用,248,文件包含處理,文件包含處理是指將另一個源文件嵌入到當前文件中。,249,文件包含處理,形式: #include “文件名” 或 #include ,250,文件包含處理,說明 一個#include只能包含一個文件,除了預定義的標準頭文件外,還可包含用戶自己設(shè)計的文件 文件包含命令中的一對尖括號和一對雙引號是有區(qū)別的,編譯系統(tǒng)會使用不同的方法搜索包含文件,251,文件包含處理, 50、說明 C語言提供了若干標準函數(shù)庫,每個標準函數(shù)庫都與某個預定義的頭文件相對應 允許使用嵌套包含,252,文件包含處理,說明 當用戶文件由多個源程序文件組成時,為了避免重復的說明和定義,提高工作效率,提高程序的可靠性和可維護性,可以把各個源文件共同使用的函數(shù)類型說明以及符號常量的宏定義等組建為單獨的用戶包含文件,253,條件編譯,條件編譯預處理可以使源程序有選擇性地編譯。 使用條件編譯有利于程序的調(diào)試,能增強程序的通用性,可以將程序方便地定制成不同的版本。,254,條件編譯,形式1: #if #else #endif 功能: 當表達式的值為非0時,編譯語句1,否則編譯語句段2,255,條件編譯, 51、形式2: #ifdef #else #endif 功能: 當指定的宏名已經(jīng)在#define預處理行中被定義時,編譯語句段1,否則編譯語句段2,256,條件編譯,形式3: ##ifndef #else #endif 功能: 當指定的宏名未在#define預處理行中被定義時,編譯語句段1,否則編譯語句段2,257,條件編譯,注意: #if命令行中的表達式只能是常量表達式 #else命令行是任選的,若缺省,條件不成立時直接跳出#endif命令行 要使用嵌套條件編譯,需要使用#elif命令,,258,第八章 指針,指針的概念 指針與數(shù)組 指針與函數(shù) 指針與字符串 多級指針 命令行參數(shù),,259,指針的 52、概念,指針變量 當變量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ù),當函數(shù)的參數(shù)為指針變量時,函數(shù)就能方便地通過形式參數(shù)將函數(shù)值帶出函數(shù)體反傳給主調(diào)函數(shù)。,指針作為參數(shù),279,指針與函數(shù)(二),函數(shù)名雖然不是變量,但它與數(shù)組名一樣在內(nèi)存中有確切的物理地址,是個地址常量,函數(shù)名存儲了函數(shù)目標碼的入口地址。,280,指針與函數(shù)(二),可以定義一個指向函數(shù)的指針,借助于該指針能使函數(shù)如同普通變量一樣被復制、存儲,使函數(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ù)指針應用舉例: 求下列分段函數(shù)的函數(shù)值:,287,指針與函數(shù)(三),函數(shù)的返回值類型為指針類型 鏈表,函數(shù)指針,288,指針與字符串,單個字符串的表示 多字 55、符串的表示,289,指針與字符串,單個字符串的表示:,單字符串,字符串操作1,字符串操作2,字符串操作3,290,指針與字符串,多字符串的表示:,字符串排序,多字符串,291,多級指針,多級指針就是“指向指針的指針”,292,二級指針的定義,形式: ** 例:int **p; 或:char x=%,*p=,293,二級指針與指針數(shù)組的聯(lián)系,,字符串數(shù)組,294,命令行參數(shù),在C語言中,main函數(shù)與其他函數(shù)一樣可以帶形式參數(shù)。,295,命令行參數(shù),形式: main(int ,char *) 或者: main(int ,char **),296,命令行參數(shù),說明: 兩個形式參數(shù)的名字可以隨意?。?/p>
56、一般都習慣記作argc和argv),但是它們的類型與順序必須與參數(shù)表中規(guī)定的相一致,297,命令行參數(shù),說明: 當執(zhí)行main函數(shù)時,參數(shù)1將自動被賦予由系統(tǒng)計算出的命令行上的單詞個數(shù),298,命令行參數(shù),說明: 當參數(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)類型的認識 結(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)類型的認識,使用結(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)變量的引用,說明: 當結(jié)構(gòu)變量的成員是另一個結(jié)構(gòu)變量時,必須使用多級成員運算符逐級引用其最底層的成員 只有當兩個結(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)了利用下標法快速存取數(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)變量應用,312,應用 59、舉例,定義一個名字為worker的結(jié)構(gòu)類型,用于存儲職工信息,數(shù)據(jù)項包括:num(工號)、name(姓名)、sex(性別)、title(職稱)、pay(工資) 定義一個結(jié)構(gòu)數(shù)組person(5個元素),并對其初始化 編寫程序,對person數(shù)組排序,結(jié)構(gòu)數(shù)組應用,313,結(jié)構(gòu)指針,定義一個指針,使其指向結(jié)構(gòu)變量,這樣的指針稱為“結(jié)構(gòu)指針”。結(jié)構(gòu)指針除了可以作為函數(shù)的參數(shù),將整個結(jié)構(gòu)作為一個參數(shù)傳遞給另一個函數(shù),其更重要的應用領(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)指針練習,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,應用舉例,定義一個名字為worker的結(jié)構(gòu)類型,用于存儲職工信息,數(shù)據(jù)項包括:num(工號)、name(姓名)、sex(性別)、title(職稱)、pay(工資) 編寫函數(shù),對有n個元素的worker結(jié)構(gòu)類型數(shù)組進行排序,結(jié)構(gòu)指針應用,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é)點的類型定義,例:定義學生記錄結(jié)點類型。 struct stude 63、nt long num; char *name; char sex; int score; char *place; struct student *next; ;,學生記錄結(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ù)功能:釋放當前正被指針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)生出來,并按預定的鏈接關(guān)系插入到鏈表中去的過程。,333,創(chuàng)建鏈表,結(jié)點插入通常有兩種預定關(guān)系: 新結(jié)點總是從表首插入,這種方式稱為“棧”式結(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; 重復第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; 重復第3步到第5步若干次 終止鏈表的延伸:last-next=NULL;,創(chuàng)建隊式鏈表,隊式鏈表實例,336,鏈表數(shù)據(jù)的輸出,輸出整個鏈表數(shù)據(jù)的算法步驟: p=頭指針; 輸出p指向結(jié)點的數(shù)據(jù); p指向下一個結(jié)點; 重復后二個步驟,直至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)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 市教育局冬季運動會安全工作預案
- 2024年秋季《思想道德與法治》大作業(yè)及答案3套試卷
- 2024年教師年度考核表個人工作總結(jié)(可編輯)
- 2024年xx村兩委涉案資金退還保證書
- 2024年憲法宣傳周活動總結(jié)+在機關(guān)“弘揚憲法精神推動發(fā)改工作高質(zhì)量發(fā)展”專題宣講報告會上的講話
- 2024年XX村合作社年報總結(jié)
- 2024-2025年秋季第一學期初中歷史上冊教研組工作總結(jié)
- 2024年小學高級教師年終工作總結(jié)匯報
- 2024-2025年秋季第一學期初中物理上冊教研組工作總結(jié)
- 2024年xx鎮(zhèn)交通年度總結(jié)
- 2024-2025年秋季第一學期小學語文教師工作總結(jié)
- 2024年XX村陳規(guī)陋習整治報告
- 2025年學校元旦迎新盛典活動策劃方案
- 2024年學校周邊安全隱患自查報告
- 2024年XX鎮(zhèn)農(nóng)村規(guī)劃管控述職報告