




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、1你懂得你懂得C,所以,所以C不在話下!不在話下!2考試時(shí)間及地點(diǎn)考試時(shí)間及地點(diǎn)n時(shí)間時(shí)間q2010年年1月月6日日q下午:下午:14:3016:30n地點(diǎn)地點(diǎn)qSY2103高級(jí)語(yǔ)言程序設(shè)計(jì)高級(jí)語(yǔ)言程序設(shè)計(jì)主講教師:賈彩燕主講教師:賈彩燕計(jì)算機(jī)與信息技術(shù)學(xué)院計(jì)算機(jī)與信息技術(shù)學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)系計(jì)算機(jī)科學(xué)與技術(shù)系4課程內(nèi)容課程內(nèi)容第一章第一章 程序設(shè)計(jì)和程序設(shè)計(jì)和C C語(yǔ)言語(yǔ)言第二章第二章 數(shù)據(jù)對(duì)象與計(jì)算數(shù)據(jù)對(duì)象與計(jì)算第三章第三章 變量、函數(shù)和控制結(jié)構(gòu)變量、函數(shù)和控制結(jié)構(gòu)第四章第四章 基本程序設(shè)計(jì)技術(shù)基本程序設(shè)計(jì)技術(shù)第五章第五章 C C程序結(jié)構(gòu)(函數(shù))程序結(jié)構(gòu)(函數(shù))第六章第六章 數(shù)組數(shù)組第七
2、章第七章 指針指針第八章第八章 文件和輸入輸出文件和輸入輸出第九章第九章 結(jié)構(gòu)和其它數(shù)據(jù)機(jī)制結(jié)構(gòu)和其它數(shù)據(jù)機(jī)制第十章第十章 程序開(kāi)發(fā)技術(shù)程序開(kāi)發(fā)技術(shù)第十一章第十一章 標(biāo)準(zhǔn)庫(kù)標(biāo)準(zhǔn)庫(kù)5基本類(lèi)型基本類(lèi)型構(gòu)造類(lèi)型構(gòu)造類(lèi)型指針類(lèi)型指針類(lèi)型空類(lèi)型空類(lèi)型void定義類(lèi)型定義類(lèi)型typedef數(shù)值類(lèi)型數(shù)值類(lèi)型字符類(lèi)型字符類(lèi)型char8位位枚舉類(lèi)型枚舉類(lèi)型enum整整 型型浮點(diǎn)型浮點(diǎn)型單精度型單精度型float32位位雙精度型雙精度型double64位位短整型短整型short16位位長(zhǎng)整型長(zhǎng)整型long32位位整型整型int32位位數(shù)組數(shù)組結(jié)構(gòu)類(lèi)型結(jié)構(gòu)類(lèi)型struct共用類(lèi)型共用類(lèi)型unionC C 數(shù)據(jù)類(lèi)型數(shù)
3、據(jù)類(lèi)型6第九章:結(jié)構(gòu)和其它數(shù)據(jù)機(jī)制第九章:結(jié)構(gòu)和其它數(shù)據(jù)機(jī)制7n結(jié)構(gòu)(結(jié)構(gòu)(struct)/結(jié)構(gòu)體結(jié)構(gòu)體n結(jié)構(gòu)與函數(shù)結(jié)構(gòu)與函數(shù)n聯(lián)合(聯(lián)合(union)/共用體共用體n枚舉(枚舉(enum)n編程實(shí)例編程實(shí)例n鏈接結(jié)構(gòu)(自引用結(jié)構(gòu))鏈接結(jié)構(gòu)(自引用結(jié)構(gòu))n字段字段主要內(nèi)容主要內(nèi)容8結(jié)構(gòu)結(jié)構(gòu)&結(jié)構(gòu)是一種結(jié)構(gòu)是一種構(gòu)造構(gòu)造數(shù)據(jù)類(lèi)型數(shù)據(jù)類(lèi)型&用途:把用途:把不同類(lèi)型不同類(lèi)型的數(shù)據(jù)組合成一個(gè)整體的數(shù)據(jù)組合成一個(gè)整體-自定義自定義數(shù)據(jù)類(lèi)型數(shù)據(jù)類(lèi)型q結(jié)構(gòu)類(lèi)型定義結(jié)構(gòu)類(lèi)型定義struct 結(jié)構(gòu)類(lèi)型名結(jié)構(gòu)類(lèi)型名 類(lèi)型標(biāo)識(shí)符類(lèi)型標(biāo)識(shí)符 成員名;成員名; 類(lèi)型標(biāo)識(shí)符類(lèi)型標(biāo)識(shí)符 成員名;成員名; .;成員類(lèi)型可以是
4、成員類(lèi)型可以是基本型或構(gòu)造型基本型或構(gòu)造型struct是是關(guān)鍵字關(guān)鍵字, ,不能省略不能省略合法標(biāo)識(shí)符合法標(biāo)識(shí)符可省可省:無(wú)名結(jié)構(gòu)無(wú)名結(jié)構(gòu)9例例 struct student int num; char name20; char sex; int age; double score; char addr30; ; namenumsexagescoreaddr4字節(jié)4字節(jié)20字節(jié)1字節(jié)8字節(jié)30字節(jié).結(jié)構(gòu)類(lèi)型定義描述結(jié)構(gòu)的組織形式,不分配內(nèi)存例子圖解例子圖解10n先定義結(jié)構(gòu)類(lèi)型,再定義結(jié)構(gòu)變量先定義結(jié)構(gòu)類(lèi)型,再定義結(jié)構(gòu)變量q一般形式:一般形式: struct 結(jié)構(gòu)類(lèi)型名結(jié)構(gòu)類(lèi)型名 類(lèi)型標(biāo)識(shí)符類(lèi)型
5、標(biāo)識(shí)符 成員名;成員名; 類(lèi)型標(biāo)識(shí)符類(lèi)型標(biāo)識(shí)符 成員名;成員名; .;struct 結(jié)構(gòu)類(lèi)型名結(jié)構(gòu)類(lèi)型名 變量名表列變量名表列;結(jié)構(gòu)變量的定義結(jié)構(gòu)變量的定義例例 struct student int num; char name20; char sex; int age; double score; char addr30; ; struct student stu1, stu2; 11一般形式:一般形式:struct 結(jié)構(gòu)類(lèi)型名結(jié)構(gòu)類(lèi)型名 類(lèi)型標(biāo)識(shí)符類(lèi)型標(biāo)識(shí)符 成員名;成員名; 類(lèi)型標(biāo)識(shí)符類(lèi)型標(biāo)識(shí)符 成員名;成員名; .變量名表列變量名表列;例例 struct student int num
6、; char name20; char sex; int age; double score; char addr30; stu1, stu2; 定義結(jié)構(gòu)類(lèi)型的同時(shí)定義結(jié)構(gòu)變量定義結(jié)構(gòu)類(lèi)型的同時(shí)定義結(jié)構(gòu)變量12一般形式:一般形式:struct 類(lèi)型標(biāo)識(shí)符類(lèi)型標(biāo)識(shí)符 成員名;成員名; 類(lèi)型標(biāo)識(shí)符類(lèi)型標(biāo)識(shí)符 成員名;成員名; .變量名表列變量名表列;例例 struct int num; char name20; char sex; int age; double score; char addr30; stu1,stu2; 用用無(wú)名結(jié)構(gòu)無(wú)名結(jié)構(gòu)直接定義直接定義變量變量只能一次只能一次直接定義結(jié)構(gòu)變
7、量直接定義結(jié)構(gòu)變量13結(jié)構(gòu)類(lèi)型與結(jié)構(gòu)變量概念不同結(jié)構(gòu)類(lèi)型與結(jié)構(gòu)變量概念不同類(lèi)型類(lèi)型:不分配內(nèi)存不分配內(nèi)存; 變量變量:分配內(nèi)存分配內(nèi)存類(lèi)型類(lèi)型:不能賦值、存取、運(yùn)算不能賦值、存取、運(yùn)算; 變量變量:可以可以結(jié)構(gòu)可嵌套結(jié)構(gòu)可嵌套結(jié)構(gòu)成員名與程序中變量名可相同,不會(huì)混淆結(jié)構(gòu)成員名與程序中變量名可相同,不會(huì)混淆結(jié)構(gòu)類(lèi)型及變量的作用域與生存期同其它類(lèi)型變量結(jié)構(gòu)類(lèi)型及變量的作用域與生存期同其它類(lèi)型變量說(shuō)明:說(shuō)明:14q形式一:形式一:struct 結(jié)構(gòu)類(lèi)型名結(jié)構(gòu)類(lèi)型名 類(lèi)型標(biāo)識(shí)符類(lèi)型標(biāo)識(shí)符 成員名;成員名; 類(lèi)型標(biāo)識(shí)符類(lèi)型標(biāo)識(shí)符 成員名;成員名; .;struct 結(jié)構(gòu)類(lèi)型名結(jié)構(gòu)類(lèi)型名 結(jié)構(gòu)變量結(jié)構(gòu)變量
8、=初始數(shù)據(jù)初始數(shù)據(jù);例例 struct student int num; char name20; char sex; int age; char addr30; ; struct student stu1=112,“Wang Lin”,M,19, “200 Beijing Road”;結(jié)構(gòu)變量的初始化結(jié)構(gòu)變量的初始化15struct 結(jié)構(gòu)類(lèi)型名結(jié)構(gòu)類(lèi)型名 類(lèi)型標(biāo)識(shí)符類(lèi)型標(biāo)識(shí)符 成員名;成員名; 類(lèi)型標(biāo)識(shí)符類(lèi)型標(biāo)識(shí)符 成員名;成員名; .結(jié)構(gòu)變量結(jié)構(gòu)變量=初始數(shù)據(jù)初始數(shù)據(jù);例例 struct student int num; char name20; char sex; int age; ch
9、ar addr30; stu1=112,“Wang Lin”,M,19, “200 Beijing Road”; 結(jié)構(gòu)變量的初始化結(jié)構(gòu)變量的初始化形式二:形式二:16struct 類(lèi)型標(biāo)識(shí)符類(lèi)型標(biāo)識(shí)符 成員名;成員名; 類(lèi)型標(biāo)識(shí)符類(lèi)型標(biāo)識(shí)符 成員名;成員名; .結(jié)構(gòu)變量結(jié)構(gòu)變量=初始數(shù)據(jù)初始數(shù)據(jù);例例 struct int num; char name20; char sex; int age; char addr30; stu1=112,“Wang Lin”,M,19, “200 Beijing Road”; 結(jié)構(gòu)變量的初始化結(jié)構(gòu)變量的初始化形式三:形式三:17定義結(jié)構(gòu)類(lèi)型定義結(jié)構(gòu)類(lèi)型n程序
10、里反復(fù)使用的結(jié)構(gòu)最好定義為程序里反復(fù)使用的結(jié)構(gòu)最好定義為類(lèi)型類(lèi)型typedef struct double x, y; POINT;typedef struct POINT center; double radius; CIRCLE;typedef struct POINT lu; POINT rd; RECTANGLE;n定義結(jié)構(gòu)成員時(shí)利用結(jié)構(gòu)標(biāo)志定義結(jié)構(gòu)成員時(shí)利用結(jié)構(gòu)標(biāo)志 struct point double x, y; ;struct circle struct point center; double radius; ;struct rectangle struct point lu
11、; struct point rd; ;18例例n定義為結(jié)構(gòu)類(lèi)型,可以使程序更簡(jiǎn)短清晰。例:居民身份證信息的定義為結(jié)構(gòu)類(lèi)型,可以使程序更簡(jiǎn)短清晰。例:居民身份證信息的結(jié)構(gòu)類(lèi)型定義:結(jié)構(gòu)類(lèi)型定義:typedef struct char name20; /* 名字字符串用多長(zhǎng)?名字字符串用多長(zhǎng)? */ int sex; char nationality10; int born_in3; char address50; int date_of_issue3; int valid_years; char issued_by30; char id_number18; char photo10064; I
12、DCARD;19無(wú)效結(jié)構(gòu)定義無(wú)效結(jié)構(gòu)定義n結(jié)構(gòu)成員不能是被描述的結(jié)構(gòu)本身。結(jié)構(gòu)成員不能是被描述的結(jié)構(gòu)本身。n非法結(jié)構(gòu)描述的例子:非法結(jié)構(gòu)描述的例子:struct invalid int n; struct invalid iv;20POINT 結(jié)構(gòu)CIRCLE 結(jié)構(gòu)yxradius結(jié)構(gòu)的實(shí)現(xiàn)結(jié)構(gòu)的實(shí)現(xiàn)n結(jié)構(gòu)的實(shí)現(xiàn)結(jié)構(gòu)的實(shí)現(xiàn)n一個(gè)結(jié)構(gòu)占一塊連續(xù)存儲(chǔ),各成員順序存放。一個(gè)結(jié)構(gòu)占一塊連續(xù)存儲(chǔ),各成員順序存放。nCIRCLE對(duì)象的存儲(chǔ)方式。對(duì)象的存儲(chǔ)方式。typedef struct POINT center; double radius; CIRCLE;21對(duì)齊問(wèn)題對(duì)齊問(wèn)題n結(jié)構(gòu)成員類(lèi)型可不同,可能
13、出現(xiàn)對(duì)齊問(wèn)題:結(jié)構(gòu)成員類(lèi)型可不同,可能出現(xiàn)對(duì)齊問(wèn)題:struct exam char aa; int nn; double xx;n為了效率,硬件通常規(guī)定各種基本類(lèi)型數(shù)據(jù)的擺放方式。例如,通常要為了效率,硬件通常規(guī)定各種基本類(lèi)型數(shù)據(jù)的擺放方式。例如,通常要求兩字節(jié)表示的整數(shù)從偶數(shù)地址的單元開(kāi)始存放;需要求兩字節(jié)表示的整數(shù)從偶數(shù)地址的單元開(kāi)始存放;需要8個(gè)字節(jié)表示的個(gè)字節(jié)表示的雙精度數(shù),可能要求從雙精度數(shù),可能要求從8(或(或4)的倍數(shù)地址的單元開(kāi)始存放)的倍數(shù)地址的單元開(kāi)始存放 n系統(tǒng)對(duì)整個(gè)結(jié)構(gòu)對(duì)象的存放也可能有起始位置要求系統(tǒng)對(duì)整個(gè)結(jié)構(gòu)對(duì)象的存放也可能有起始位置要求22n結(jié)構(gòu)成員可能不連續(xù),
14、存放位置之間可能出現(xiàn)空位(結(jié)結(jié)構(gòu)成員可能不連續(xù),存放位置之間可能出現(xiàn)空位(結(jié)構(gòu)中的空洞)構(gòu)中的空洞)n結(jié)構(gòu)大小未必等于成員大小之和。結(jié)構(gòu)大小未必等于成員大小之和。應(yīng)該用應(yīng)該用sizeof計(jì)算計(jì)算結(jié)結(jié)構(gòu)大?。ɡ鐒?dòng)態(tài)存儲(chǔ)分配時(shí))構(gòu)大小(例如動(dòng)態(tài)存儲(chǔ)分配時(shí)) aa nn xx 4 個(gè)字節(jié) struct exam 的可能布局:的可能布局:23結(jié)構(gòu)變量的使用結(jié)構(gòu)變量的使用n設(shè)有設(shè)有POINT pt1, pt2; CIRCLE circ1, circl2;n整體賦值整體賦值q同類(lèi)型結(jié)構(gòu)變量可整體賦值,效果是各成員分別賦值:同類(lèi)型結(jié)構(gòu)變量可整體賦值,效果是各成員分別賦值:npt2 = pt1; n結(jié)構(gòu)不能
15、做相等結(jié)構(gòu)不能做相等/不等比較不等比較n成員訪問(wèn)成員訪問(wèn)q訪問(wèn)結(jié)構(gòu)成員用圓點(diǎn)運(yùn)算符(訪問(wèn)結(jié)構(gòu)成員用圓點(diǎn)運(yùn)算符(.),具有最高優(yōu)先級(jí),自左向右結(jié)),具有最高優(yōu)先級(jí),自左向右結(jié)合。例子:合。例子:qpt2.y = pt1.y + 2.4;qcirc1.center.x = 2.07;qcirc1.center.y = pt1.y;24將結(jié)構(gòu)將結(jié)構(gòu)circ2所表示的圓做平移,可以寫(xiě):所表示的圓做平移,可以寫(xiě):circ2.center.x += 2.8;circ2.center.y += 0.24;結(jié)構(gòu)成員相當(dāng)于相應(yīng)類(lèi)型的變量,操作由類(lèi)型決定。結(jié)構(gòu)成員相當(dāng)于相應(yīng)類(lèi)型的變量,操作由類(lèi)型決定。/* 簡(jiǎn)單示
16、例簡(jiǎn)單示例 */int main () POINT pt1 = 2.34, 3.28, pt2; CIRCLE circ1 = 3.5, 2.07, 1.25; double x, y; pt2.x = 8.0; pt2.y = circ1.center.y + 3.44; x = pt2.x - pt1.x; y = pt2.y - pt1.y; printf(distance: %fn, sqrt(x*x + y*y); return 0;25 結(jié)構(gòu)、數(shù)組與指針結(jié)構(gòu)、數(shù)組與指針n結(jié)構(gòu)可以有數(shù)組成員結(jié)構(gòu)可以有數(shù)組成員,也可以定義一組以結(jié)構(gòu)為元素的數(shù)組(結(jié)構(gòu)數(shù)組)也可以定義一組以結(jié)構(gòu)為元素的數(shù)
17、組(結(jié)構(gòu)數(shù)組)n例:用結(jié)構(gòu)數(shù)組重構(gòu)例:用結(jié)構(gòu)數(shù)組重構(gòu)C程序關(guān)鍵字統(tǒng)計(jì)程序。程序關(guān)鍵字統(tǒng)計(jì)程序。n兩種實(shí)現(xiàn):兩種實(shí)現(xiàn):q1)兩維字符數(shù)組和計(jì)數(shù)器數(shù)組;)兩維字符數(shù)組和計(jì)數(shù)器數(shù)組;q2)用字符指針數(shù)組和計(jì)數(shù)器數(shù)組。)用字符指針數(shù)組和計(jì)數(shù)器數(shù)組。n更合理方式是用一個(gè)結(jié)構(gòu)表示與一個(gè)關(guān)鍵字有關(guān)的所有信息。為此可定更合理方式是用一個(gè)結(jié)構(gòu)表示與一個(gè)關(guān)鍵字有關(guān)的所有信息。為此可定義結(jié)構(gòu)類(lèi)型。義結(jié)構(gòu)類(lèi)型。typedef struct char * key; int count; KEYC; /* “關(guān)鍵字計(jì)數(shù)器關(guān)鍵字計(jì)數(shù)器”類(lèi)型類(lèi)型 */26n程序數(shù)據(jù)結(jié)構(gòu)就是一個(gè)程序數(shù)據(jù)結(jié)構(gòu)就是一個(gè)KEYC數(shù)組,定義時(shí)初始化:
18、數(shù)組,定義時(shí)初始化:KEYC keytable32 = auto, 0, break, 0, . . volatile,0, while, 0; /*初始化中也可寫(xiě)嵌套的括號(hào)初始化中也可寫(xiě)嵌套的括號(hào)*/n程序的主循環(huán)可寫(xiě)為:程序的主循環(huán)可寫(xiě)為:int i; .while (getident(., s) != -1) for (i = 0; i 0) for (p = keytable; p :np-key 等價(jià)于等價(jià)于 (*p).key28-具有最高優(yōu)先級(jí)(與圓點(diǎn),函數(shù)調(diào)用具有最高優(yōu)先級(jí)(與圓點(diǎn),函數(shù)調(diào)用()及數(shù)組元素訪問(wèn)及數(shù)組元素訪問(wèn)一樣),一樣),從左向右結(jié)合。從左向右結(jié)合。while (
19、getident(s, .) 0) for (p = keytable; p key) = 0) p-count+; break; n已經(jīng)討論了已經(jīng)討論了C語(yǔ)言的所有運(yùn)算符,附錄語(yǔ)言的所有運(yùn)算符,附錄A列出這些運(yùn)算符:列出這些運(yùn)算符:意義意義/優(yōu)先級(jí)優(yōu)先級(jí)/結(jié)合方式。請(qǐng)自己查閱。結(jié)合方式。請(qǐng)自己查閱。29n結(jié)構(gòu)(結(jié)構(gòu)(struct)/結(jié)構(gòu)體結(jié)構(gòu)體n結(jié)構(gòu)與函數(shù)結(jié)構(gòu)與函數(shù)n聯(lián)合(聯(lián)合(union)/共用體共用體n枚舉(枚舉(enum)n編程實(shí)例編程實(shí)例n鏈接結(jié)構(gòu)(自引用結(jié)構(gòu))鏈接結(jié)構(gòu)(自引用結(jié)構(gòu))n字段字段主要內(nèi)容主要內(nèi)容30結(jié)構(gòu)與函數(shù)結(jié)構(gòu)與函數(shù)n結(jié)構(gòu)可作為函數(shù)參數(shù)和函數(shù)返回值。將結(jié)構(gòu)數(shù)據(jù)傳給函數(shù)
20、結(jié)構(gòu)可作為函數(shù)參數(shù)和函數(shù)返回值。將結(jié)構(gòu)數(shù)據(jù)傳給函數(shù)有三種方式(返回值情況類(lèi)似):有三種方式(返回值情況類(lèi)似):q傳結(jié)構(gòu)成員的值,只要該成員能賦值。傳結(jié)構(gòu)成員的值,只要該成員能賦值。q傳遞整個(gè)結(jié)構(gòu)的值。結(jié)構(gòu)參數(shù)。傳遞整個(gè)結(jié)構(gòu)的值。結(jié)構(gòu)參數(shù)。q傳結(jié)構(gòu)的地址(指針)。結(jié)構(gòu)指針參數(shù)。傳結(jié)構(gòu)的地址(指針)。結(jié)構(gòu)指針參數(shù)。n結(jié)構(gòu)參數(shù):結(jié)構(gòu)參數(shù):q實(shí)參結(jié)構(gòu)變量的值整個(gè)賦給形參,函數(shù)內(nèi)對(duì)形參的操作不會(huì)實(shí)參結(jié)構(gòu)變量的值整個(gè)賦給形參,函數(shù)內(nèi)對(duì)形參的操作不會(huì)影響實(shí)參影響實(shí)參n結(jié)構(gòu)指針參數(shù):結(jié)構(gòu)指針參數(shù):q傳結(jié)構(gòu)指針允許函數(shù)對(duì)實(shí)參結(jié)構(gòu)做任何操作,包括修改??蓚鹘Y(jié)構(gòu)指針允許函數(shù)對(duì)實(shí)參結(jié)構(gòu)做任何操作,包括修改??梢员苊饨Y(jié)
21、構(gòu)復(fù)制,若結(jié)構(gòu)很大,復(fù)制費(fèi)時(shí)間,也可考慮用指以避免結(jié)構(gòu)復(fù)制,若結(jié)構(gòu)很大,復(fù)制費(fèi)時(shí)間,也可考慮用指針?lè)绞絺鬟f針?lè)绞絺鬟f31處理結(jié)構(gòu)的函數(shù)處理結(jié)構(gòu)的函數(shù)n例:由參數(shù)值構(gòu)造例:由參數(shù)值構(gòu)造POINT類(lèi)型的結(jié)構(gòu)值,函數(shù)定義:類(lèi)型的結(jié)構(gòu)值,函數(shù)定義:POINT mkpoint1(double x, double y) POINT temp; temp.x = x; temp.y = y; return temp;n返回值可賦給同類(lèi)型變量。這種函數(shù)從成員值構(gòu)造結(jié)構(gòu)值,可返回值可賦給同類(lèi)型變量。這種函數(shù)從成員值構(gòu)造結(jié)構(gòu)值,可稱(chēng)為結(jié)構(gòu)稱(chēng)為結(jié)構(gòu)值構(gòu)造函數(shù)值構(gòu)造函數(shù)。使用:。使用:qpt1 = mkpoint1(
22、3.825, 20.7);qpt2 = mkpoint1(pt1.x, 0.0);ntemp隨函數(shù)結(jié)束而撤消,值返回,與局部變量的撤消無(wú)關(guān)。返回大的隨函數(shù)結(jié)束而撤消,值返回,與局部變量的撤消無(wú)關(guān)。返回大的結(jié)構(gòu)值時(shí)需要復(fù)制大批數(shù)據(jù)結(jié)構(gòu)值時(shí)需要復(fù)制大批數(shù)據(jù)32例例n由參數(shù)值構(gòu)造由參數(shù)值構(gòu)造CIRCLE類(lèi)型的結(jié)構(gòu)值,函數(shù)定義:類(lèi)型的結(jié)構(gòu)值,函數(shù)定義:CIRCLE mkcircle(POINT c, double r) CIRCLE temp; temp.center = c; temp.radius = r; return temp;n函數(shù)有一個(gè)結(jié)構(gòu)參數(shù)。用例:函數(shù)有一個(gè)結(jié)構(gòu)參數(shù)。用例:qcirc1
23、 = mkcircle(pt1, 5.254);qcirc2 = mkcircle(circ1.center, 11.7);qcirc3 = mkcircle(mkpoint1(2.05, 3.7), 3.245);n第三個(gè)例子:第三個(gè)例子:mkpoint返回返回POINT值,傳給值,傳給mkcircle的的POINT類(lèi)型參數(shù)類(lèi)型參數(shù)33值復(fù)制不一定合理值復(fù)制不一定合理n定義計(jì)算兩個(gè)點(diǎn)之間距離的函數(shù),采用結(jié)構(gòu)參數(shù):定義計(jì)算兩個(gè)點(diǎn)之間距離的函數(shù),采用結(jié)構(gòu)參數(shù): double distance(POINT p1, POINT p2) double x = p1.x-p2.x, y = p1.y-p
24、2.y; return sqrt(x*x + y*y);復(fù)制整個(gè)結(jié)構(gòu),語(yǔ)義清楚。缺點(diǎn)是整體復(fù)制開(kāi)銷(xiāo)較大復(fù)制整個(gè)結(jié)構(gòu),語(yǔ)義清楚。缺點(diǎn)是整體復(fù)制開(kāi)銷(xiāo)較大n例:打印身份證中身份證號(hào)和姓名的函數(shù):例:打印身份證中身份證號(hào)和姓名的函數(shù):void prtIDCard0(IDCARD ic) printf(%sn, ic.id_number); printf(%snn, );復(fù)制整個(gè)結(jié)構(gòu),大部分復(fù)制工作沒(méi)有價(jià)值復(fù)制整個(gè)結(jié)構(gòu),大部分復(fù)制工作沒(méi)有價(jià)值34傳遞結(jié)構(gòu)指針傳遞結(jié)構(gòu)指針n可考慮傳遞結(jié)構(gòu)指針,下面函數(shù)完成同樣工作:可考慮傳遞結(jié)構(gòu)指針,下面函數(shù)完成同樣工作:void prtIDCard(IDC
25、ARD *icp) printf(%sn%snn, icp-id_number, icp-name);n只復(fù)制一個(gè)指針,更合理。只復(fù)制一個(gè)指針,更合理。q設(shè)設(shè)idc是是IDCARD變量:變量:prtIDCard(&idc);q例,打印一個(gè)身份證結(jié)構(gòu)數(shù)組中的各身份證的信息:例,打印一個(gè)身份證結(jié)構(gòu)數(shù)組中的各身份證的信息:IDCARD idcs10000, *p;. /* 假設(shè)假設(shè)idcs的元素都有了值的元素都有了值 */for(p = idcs; p x = x; p-y = y; return p;q調(diào)用時(shí)用指向調(diào)用時(shí)用指向POINT的指針接收函數(shù)返回值。的指針接收函數(shù)返回值。POINT *q;
26、q = mkpoint2(2.22, 1.784);36實(shí)例實(shí)例n使用實(shí)例:使用實(shí)例:POINT *pp1, *pp2;. .pp1 = mkpoint2(2.57, 3.86);pp2 = mkpoint2(pp1-y + 2.6, pp1-x 0.7);. . /* 使用建立的結(jié)構(gòu)使用建立的結(jié)構(gòu) */free(pp1); free(pp2); /*最后釋放存儲(chǔ)最后釋放存儲(chǔ)*/n采用動(dòng)態(tài)管理優(yōu)點(diǎn):采用動(dòng)態(tài)管理優(yōu)點(diǎn):q所建立結(jié)構(gòu)的存在期不受建立位置約束,傳遞指針不必復(fù)制整個(gè)所建立結(jié)構(gòu)的存在期不受建立位置約束,傳遞指針不必復(fù)制整個(gè)結(jié)構(gòu)。這種方式在復(fù)雜軟件里用的很多。結(jié)構(gòu)。這種方式在復(fù)雜軟件里用的
27、很多。n在在“數(shù)據(jù)結(jié)構(gòu)數(shù)據(jù)結(jié)構(gòu)”課程中大量使用這種方式課程中大量使用這種方式37結(jié)構(gòu)指針要點(diǎn)結(jié)構(gòu)指針要點(diǎn): :1 1、必須將指針指向一個(gè)確定的結(jié)構(gòu)變量,如:、必須將指針指向一個(gè)確定的結(jié)構(gòu)變量,如:p=&a;p=&a;或動(dòng)態(tài)內(nèi)存或動(dòng)態(tài)內(nèi)存 分配實(shí)現(xiàn)分配實(shí)現(xiàn)2 2、通過(guò)結(jié)構(gòu)變量的指針訪問(wèn)結(jié)構(gòu)的方法為、通過(guò)結(jié)構(gòu)變量的指針訪問(wèn)結(jié)構(gòu)的方法為: : a.num a.num、( (* *p).nump).num、p-nump-num3 3、區(qū)分下面的兩種用法:、區(qū)分下面的兩種用法: p-n+ p-n+ 和和 +p-n+p-n等價(jià)于等價(jià)于(p-n)+(p-n)+和和+(p-n)+(p-n)4、p+或或+p:是
28、指針是指針p指向數(shù)組的下個(gè)元素指向數(shù)組的下個(gè)元素,而這個(gè)元素是由結(jié)而這個(gè)元素是由結(jié) 構(gòu)體類(lèi)型數(shù)據(jù)組成的構(gòu)體類(lèi)型數(shù)據(jù)組成的,它不是一個(gè)簡(jiǎn)單的變量它不是一個(gè)簡(jiǎn)單的變量.5、(+p)-num:先使指針先使指針p指向結(jié)構(gòu)體數(shù)組當(dāng)前位置的下一個(gè)元指向結(jié)構(gòu)體數(shù)組當(dāng)前位置的下一個(gè)元素素,再訪問(wèn)其元素成員再訪問(wèn)其元素成員num; 請(qǐng)區(qū)別與請(qǐng)區(qū)別與(p+)-num的不同。的不同。38例例 指向結(jié)構(gòu)體數(shù)組的指針指向結(jié)構(gòu)體數(shù)組的指針#include struct studentlong num;char name20;char sex;int age;double score; char addr30;a3=996
29、41,Li Ping,M,20,56, Tianjin Street, 99341,Zhang Fan,F,21,78, Beijing Road, 99441,Ren Zhong,M,19,84, Shenyang Road;int main() struct student *p; for(p=a;pnum,p-name,p-sex,p-age,p-score,p-addr); return 0;39n結(jié)構(gòu)(結(jié)構(gòu)(struct)/結(jié)構(gòu)體結(jié)構(gòu)體n結(jié)構(gòu)與函數(shù)結(jié)構(gòu)與函數(shù)n聯(lián)合(聯(lián)合(union)/共用體共用體n枚舉(枚舉(enum)n編程實(shí)例編程實(shí)例n鏈接結(jié)構(gòu)(自引用結(jié)構(gòu))鏈接結(jié)構(gòu)(自引用結(jié)構(gòu))
30、n字段字段主要內(nèi)容主要內(nèi)容40字段(位段)字段(位段)n位段的含義位段的含義 位段是以位為單位定義長(zhǎng)度的結(jié)構(gòu)類(lèi)型中的成員位段是以位為單位定義長(zhǎng)度的結(jié)構(gòu)類(lèi)型中的成員. .n位段的構(gòu)成位段的構(gòu)成例如例如:struct:struct pack pack unsigned a:2;unsigned a:2; unsigned b:6; unsigned b:6; unsigned c:8; unsigned c:8; int int x; x; data; data;這個(gè)結(jié)構(gòu)體類(lèi)型的變量在內(nèi)存中的情況為這個(gè)結(jié)構(gòu)體類(lèi)型的變量在內(nèi)存中的情況為: :abcx2 26 68 8161641也可以使各個(gè)字段不恰
31、好占滿一個(gè)字節(jié)也可以使各個(gè)字段不恰好占滿一個(gè)字節(jié)structstruct pack pack unsigned a:2; unsigned a:2; unsigned b:6; unsigned b:6; unsigned c:4; unsigned c:4; int int x; x; data; data;則內(nèi)存中的分配形式為則內(nèi)存中的分配形式為: :abcx2 26 64 41616空閑4 4此處:此處:a,b,c共占共占2個(gè)字節(jié)中的個(gè)字節(jié)中的12位,空閑位,空閑4位位, int型的型的x從一個(gè)新的字節(jié)開(kāi)始從一個(gè)新的字節(jié)開(kāi)始.42對(duì)位段中數(shù)據(jù)的引用方法對(duì)位段中數(shù)據(jù)的引用方法n方法:通過(guò)結(jié)
32、構(gòu)成員來(lái)應(yīng)用:方法:通過(guò)結(jié)構(gòu)成員來(lái)應(yīng)用:如:如:data.a=2;data.a=2;data.b=6;data.b=6;n要點(diǎn):要點(diǎn): 注意每個(gè)字段的最大取值范圍注意每個(gè)字段的最大取值范圍. . 如如:data.a:data.a的取值只能是的取值只能是:03,:03, 因?yàn)閮晌欢M(jìn)制最大表示的數(shù)為因?yàn)閮晌欢M(jìn)制最大表示的數(shù)為3.3.431.1.若某個(gè)位段要從新的存儲(chǔ)單元開(kāi)始若某個(gè)位段要從新的存儲(chǔ)單元開(kāi)始, ,可以這樣定義可以這樣定義: :structstruct pack packunsigned a:2;unsigned a:2;unsigned :0;unsigned :0;unsigne
33、d b:4;unsigned b:4;unsigned c:4;unsigned c:4;intint x; x;data;data;注意:長(zhǎng)度為注意:長(zhǎng)度為0 0的位段的作用是使下一個(gè)位段的內(nèi)的位段的作用是使下一個(gè)位段的內(nèi)容從新的存儲(chǔ)單元開(kāi)始存放。容從新的存儲(chǔ)單元開(kāi)始存放。位段的使用要點(diǎn)位段的使用要點(diǎn)44位段的使用要點(diǎn)位段的使用要點(diǎn)2.2.一個(gè)位段存儲(chǔ)在同一個(gè)機(jī)器字中一個(gè)位段存儲(chǔ)在同一個(gè)機(jī)器字中, ,不能跨字存儲(chǔ)不能跨字存儲(chǔ). .如下面如下面的定義是錯(cuò)誤的的定義是錯(cuò)誤的( (假設(shè)機(jī)器的字長(zhǎng)為假設(shè)機(jī)器的字長(zhǎng)為1616位位) )structstruct pack pack unsigned a:
34、2; unsigned a:2; unsigned b:5; unsigned b:5; unsigned c:10;unsigned c:10; unsigned d:4; unsigned d:4; int int x; x; data; data;453.3.可以定義無(wú)名字段可以定義無(wú)名字段structstruct unsigned a:2; unsigned a:2; unsigned :5;/unsigned :5;/* *空閑不用空閑不用* */ / unsigned b:2; unsigned b:2; unsigned c:4; unsigned c:4; int int x;
35、 x; data; data;位段的使用要點(diǎn)位段的使用要點(diǎn)464.4.位段可以用十進(jìn)制的整型形式輸出位段可以用十進(jìn)制的整型形式輸出, ,也可以用其他的整型格式輸出也可以用其他的整型格式輸出( (如八進(jìn)制如八進(jìn)制, ,十十六進(jìn)制和無(wú)符號(hào)六進(jìn)制和無(wú)符號(hào)),),位段以整型的形式參加算術(shù)運(yùn)算位段以整型的形式參加算術(shù)運(yùn)算. . 分析下面的程序:分析下面的程序:#include struct pack unsigned a:2; unsigned b:3; unsigned c:1; unsigned d:4; unsigned e:3; abc;int main()abc.d=3;printf(%dn,
36、abc.d);return 0;位段的使用要點(diǎn)位段的使用要點(diǎn)47n結(jié)構(gòu)(結(jié)構(gòu)(struct)/結(jié)構(gòu)體結(jié)構(gòu)體n結(jié)構(gòu)與函數(shù)結(jié)構(gòu)與函數(shù)n聯(lián)合(聯(lián)合(union)/共用體共用體n枚舉(枚舉(enum)n編程實(shí)例編程實(shí)例n鏈接結(jié)構(gòu)(自引用結(jié)構(gòu))鏈接結(jié)構(gòu)(自引用結(jié)構(gòu))n字段字段主要內(nèi)容主要內(nèi)容48聯(lián)合聯(lián)合 unionn使邏輯上不同的成員共用使用同一段內(nèi)存的結(jié)構(gòu)稱(chēng)為聯(lián)合或共用體。使邏輯上不同的成員共用使用同一段內(nèi)存的結(jié)構(gòu)稱(chēng)為聯(lián)合或共用體。n聯(lián)合也是成員的組合,各成員有名字,所有成員共享同一存儲(chǔ)位置。聯(lián)合聯(lián)合也是成員的組合,各成員有名字,所有成員共享同一存儲(chǔ)位置。聯(lián)合變量每時(shí)只能保存一個(gè)成員的值變量每時(shí)只能保
37、存一個(gè)成員的值n定義聯(lián)合類(lèi)型及變量定義聯(lián)合類(lèi)型及變量union int n; double x; char c; u1, u2;n可引進(jìn)聯(lián)合標(biāo)志:可引進(jìn)聯(lián)合標(biāo)志:union data int n; double x; char c;union data u1, u2;49 成 員c的 存 儲(chǔ) 位 置 和 范 圍 成 員n的 存 儲(chǔ) 位 置 和 范 圍 圖9 . 2 聯(lián) 合u n i o n d a t a的 表 示 成 員x的 存 儲(chǔ) 位 置 和 范 圍 聯(lián)合變量的存儲(chǔ)實(shí)現(xiàn)聯(lián)合變量的存儲(chǔ)實(shí)現(xiàn)n成員共用同一存儲(chǔ)位置,存儲(chǔ)區(qū)大小由大成員決定。對(duì)成員共用同一存儲(chǔ)位置,存儲(chǔ)區(qū)大小由大成員決定。對(duì)uni
38、on data,n是整數(shù),是整數(shù),d是雙精度數(shù),是雙精度數(shù),c是字符。需要足以存放雙精度數(shù)的存儲(chǔ)區(qū)是字符。需要足以存放雙精度數(shù)的存儲(chǔ)區(qū),各各成員首地址相同。成員安排如下圖:成員首地址相同。成員安排如下圖:50聯(lián)合變量的初始化和使用聯(lián)合變量的初始化和使用n聯(lián)合變量可以在定義時(shí)直接初始化,但這個(gè)初始化只能對(duì)聯(lián)合變量可以在定義時(shí)直接初始化,但這個(gè)初始化只能對(duì)第一個(gè)成員做。例:第一個(gè)成員做。例:nunion data u1 = 3, u2 = 5;n聯(lián)合變量使用形式與結(jié)構(gòu)變量相同,可整體賦值、成員訪聯(lián)合變量使用形式與結(jié)構(gòu)變量相同,可整體賦值、成員訪問(wèn)、取地址。幾個(gè)例子:?jiǎn)?、取地址。幾個(gè)例子:qn =
39、u1.n;qu1.c = n;qm = u2.n + 167;n可定義指向聯(lián)合的指針,可從這種指針出發(fā),通過(guò)可定義指向聯(lián)合的指針,可從這種指針出發(fā),通過(guò)-運(yùn)算運(yùn)算符訪問(wèn)被指聯(lián)合變量的成員。符訪問(wèn)被指聯(lián)合變量的成員。51示例示例n使用聯(lián)合的簡(jiǎn)單示例:使用聯(lián)合的簡(jiǎn)單示例:qunion data fun10(int m, union data u);qunion data u1, u2, u3, u4, *up;qup = (union data *)malloc(sizeof(union data); 寫(xiě)復(fù)雜程序時(shí),人們也定義聯(lián)合類(lèi)型。寫(xiě)復(fù)雜程序時(shí),人們也定義聯(lián)合類(lèi)型。52聯(lián)合變量基本使用規(guī)則聯(lián)合
40、變量基本使用規(guī)則n聯(lián)合變量可看成能改變面目的變量,不同時(shí)刻可能以聯(lián)合變量可看成能改變面目的變量,不同時(shí)刻可能以不同性質(zhì)出現(xiàn),表示不同東西。不同性質(zhì)出現(xiàn),表示不同東西。n使用原則:使用原則:q應(yīng)該按所保存成員的方式使用:最近對(duì)本變量用什么方式賦應(yīng)該按所保存成員的方式使用:最近對(duì)本變量用什么方式賦值(當(dāng)作哪個(gè)成員),就用同樣方式(通過(guò)同樣成員)取值。值(當(dāng)作哪個(gè)成員),就用同樣方式(通過(guò)同樣成員)取值。遵受本規(guī)則的使用有效,取值與賦值的一致性由編程者保證,遵受本規(guī)則的使用有效,取值與賦值的一致性由編程者保證,C系統(tǒng)不檢查。系統(tǒng)不檢查。53n結(jié)構(gòu)(結(jié)構(gòu)(struct)/結(jié)構(gòu)體結(jié)構(gòu)體n結(jié)構(gòu)與函數(shù)結(jié)構(gòu)與
41、函數(shù)n聯(lián)合(聯(lián)合(union)/共用體共用體n枚舉(枚舉(enum)n編程實(shí)例編程實(shí)例n鏈接結(jié)構(gòu)(自引用結(jié)構(gòu))鏈接結(jié)構(gòu)(自引用結(jié)構(gòu))n字段字段主要內(nèi)容主要內(nèi)容54枚舉(枚舉(enum)n枚舉用于定義一組命名常量,枚舉常量。描述形式:枚舉用于定義一組命名常量,枚舉常量。描述形式:qenum 枚舉標(biāo)志枚舉標(biāo)志 枚舉常量名枚舉常量名, .;n枚舉說(shuō)明:枚舉說(shuō)明:q引進(jìn)一組常量名,為每個(gè)常量確定一個(gè)整數(shù)值;默認(rèn)情況下第一引進(jìn)一組常量名,為每個(gè)常量確定一個(gè)整數(shù)值;默認(rèn)情況下第一個(gè)給值個(gè)給值0,順序遞增,順序遞增q枚舉常量不能重名,如果同時(shí)存在多個(gè)枚舉說(shuō)明,其中常量名也枚舉常量不能重名,如果同時(shí)存在多個(gè)枚
42、舉說(shuō)明,其中常量名也必須互不相同必須互不相同n枚舉標(biāo)志可用于寫(xiě)變量定義。例:枚舉標(biāo)志可用于寫(xiě)變量定義。例:qenum color RED, GREEN, BLUE;qenum color cr1, cr2;55定義和使用定義和使用n定義枚舉類(lèi)型(用定義枚舉類(lèi)型(用typedef):):qtypedef enum WHITE, BLACK COLOR1;qCOLOR1 cr1, cr2; n程序里使用枚舉變量的例子:程序里使用枚舉變量的例子:cr1 = RED; . .if (cr2 = GREEN) .; . .switch (cr1) case RED: . .; break; case G
43、REEN: . .; break; case BLUE: . .; break;56說(shuō)明說(shuō)明nC 語(yǔ)言實(shí)際上把枚舉類(lèi)型看作語(yǔ)言實(shí)際上把枚舉類(lèi)型看作int類(lèi)型的變量。使類(lèi)型的變量。使用枚舉主要是提高程序的可讀性用枚舉主要是提高程序的可讀性n枚舉常量由編譯處理,一次可定義一組常量,很枚舉常量由編譯處理,一次可定義一組常量,很方便方便n定義時(shí)可以給枚舉常量指定取值,隨后的枚舉常定義時(shí)可以給枚舉常量指定取值,隨后的枚舉常量遞增取值。例:量遞增取值。例:qenum color RED = 1, GREEN, BLUE, WHITE = 8, GREY = 12, BLACK, PINK = 15;57例
44、:編寫(xiě)程序,功能是輸入當(dāng)天是星期幾,就可以計(jì)算并輸出例:編寫(xiě)程序,功能是輸入當(dāng)天是星期幾,就可以計(jì)算并輸出n n天天后是星期幾。例如,今天是星期六,若求后是星期幾。例如,今天是星期六,若求3 3天后是星期幾,則天后是星期幾,則輸入輸入6 6,3 3,即輸出,即輸出“3 3天后是星期天后是星期2”2”。enumenum week weeksunsun,monmon,tuetue,wedwed,thuthu,frifri,satsat;enumenum week nd(enum week nd(enum week w week w,intint n) n); return(enumreturn(e
45、num week)(int)w week)(int)wn)n)7)7); intint main() main() enumenum week w0 week w0,wnwn; / / * * w0 w0表示當(dāng)天的星期值,表示當(dāng)天的星期值,wnwn表示表示n n天后的星期值天后的星期值 * * / / int int n n; scanfscanf(d d,dd,w0w0,n)n); wnwnnd(w0nd(w0,n)n); if(wnif(wn0) printf0) printf(d d天后是星期日天后是星期日nn,n)n); else printfelse printf(“(“d d天后是
46、星期天后是星期dn”dn”,wnwn) );return 0; return 0; 58n結(jié)構(gòu)(結(jié)構(gòu)(struct)/結(jié)構(gòu)體結(jié)構(gòu)體n結(jié)構(gòu)與函數(shù)結(jié)構(gòu)與函數(shù)n聯(lián)合(聯(lián)合(union)/共用體共用體n枚舉(枚舉(enum)n編程實(shí)例編程實(shí)例n鏈接結(jié)構(gòu)(自引用結(jié)構(gòu))鏈接結(jié)構(gòu)(自引用結(jié)構(gòu))n字段字段主要內(nèi)容主要內(nèi)容59編程實(shí)例編程實(shí)例n數(shù)據(jù)組排序:數(shù)據(jù)組排序:q用結(jié)構(gòu)重新實(shí)現(xiàn)學(xué)生成績(jī)實(shí)例。用結(jié)構(gòu)重新實(shí)現(xiàn)學(xué)生成績(jī)實(shí)例。q標(biāo)準(zhǔn)庫(kù)排序函數(shù)標(biāo)準(zhǔn)庫(kù)排序函數(shù)qsort的使用。的使用。 n假設(shè)成績(jī)記錄文件里包含學(xué)生的姓名和成績(jī)假設(shè)成績(jī)記錄文件里包含學(xué)生的姓名和成績(jī)n下面程序假設(shè)文件記錄形式為:下面程序假設(shè)文件記錄形式
47、為:q02001014 zhangshan 86q02001016 lisi 7760定義定義n為在程序里處理這樣的學(xué)生成績(jī),定義結(jié)構(gòu)類(lèi)型:為在程序里處理這樣的學(xué)生成績(jī),定義結(jié)構(gòu)類(lèi)型: enum MAXNUM = 400; /* 還可以根據(jù)需要增加其他常量定義還可以根據(jù)需要增加其他常量定義 */typedef struct unsigned long num;char name20; double score; StuRec;n定義一個(gè)外部(學(xué)生記錄)數(shù)組(也可動(dòng)態(tài)分配)定義一個(gè)外部(學(xué)生記錄)數(shù)組(也可動(dòng)態(tài)分配) nStuRec studentsMAXNUM; 61排序函數(shù)排序函數(shù)qsort
48、n排序函數(shù)排序函數(shù)qsort在在里定義。里定義。 nvoid qsort(void *base, size_t n, size_t size, int (*cmp)(const void *, const void *);qvoid指針參數(shù)是被排序數(shù)據(jù)組起始位置(指針參數(shù)是被排序數(shù)據(jù)組起始位置(qsort不知道數(shù)組元素類(lèi)型)不知道數(shù)組元素類(lèi)型)qsize_t是個(gè)無(wú)符號(hào)整數(shù)類(lèi)型是個(gè)無(wú)符號(hào)整數(shù)類(lèi)型qn表示被排序的數(shù)據(jù)項(xiàng)數(shù)表示被排序的數(shù)據(jù)項(xiàng)數(shù)qsize表示被排序的數(shù)組元素的大小表示被排序的數(shù)組元素的大小n用用qsort時(shí)必須通知所需的排列方式(比較元素大小的準(zhǔn)則),時(shí)必須通知所需的排列方式(比較元素
49、大小的準(zhǔn)則),它把它把“較小較小”元素排在前面元素排在前面ncmp是比較準(zhǔn)則,實(shí)際參數(shù)必須符合是比較準(zhǔn)則,實(shí)際參數(shù)必須符合qsort對(duì)比較函數(shù)的類(lèi)型對(duì)比較函數(shù)的類(lèi)型要求和功能要求要求和功能要求62函數(shù)調(diào)用函數(shù)調(diào)用n要對(duì)數(shù)組要對(duì)數(shù)組students里的里的snum個(gè)學(xué)生記錄排序,調(diào)用形式個(gè)學(xué)生記錄排序,調(diào)用形式(scrcmp是自定義的比較函數(shù),下面討論):是自定義的比較函數(shù),下面討論):qqsort(students, snum, sizeof(StuRec), scrcmp);n將比較學(xué)生分?jǐn)?shù)函數(shù)取名將比較學(xué)生分?jǐn)?shù)函數(shù)取名scrcmp,其原型應(yīng)是:,其原型應(yīng)是:qint scrcmp(cons
50、t void *vp1, const void *vp2); q比較函數(shù)在第一個(gè)元素比較函數(shù)在第一個(gè)元素“大于大于”第二個(gè)元素時(shí)返回正值,兩元素第二個(gè)元素時(shí)返回正值,兩元素相等時(shí)返回相等時(shí)返回0,第一個(gè)元素較小時(shí)返回負(fù)值。,第一個(gè)元素較小時(shí)返回負(fù)值?!按笮〈笮 标P(guān)系應(yīng)根據(jù)關(guān)系應(yīng)根據(jù)排序需要確定排序需要確定63qsort通用性的實(shí)現(xiàn)通用性的實(shí)現(xiàn)n下面定義先轉(zhuǎn)換到下面定義先轉(zhuǎn)換到StuRec指針并取出指針并取出score成員值后再比較成員值后再比較大?。捍笮。篿nt scrcmp(const void *vp1, const void *vp2) double s1 = (StuRec*)vp1)
51、-score, s2 = (StuRec*)vp2)-score; return s1 s2 ? 1 : s1 = s2 ? 0 : -1; 64qsort的通用性的通用性nqsort“通用通用”,按排序準(zhǔn)則工作。對(duì)另一準(zhǔn)則,按排序準(zhǔn)則工作。對(duì)另一準(zhǔn)則,qsort就就能對(duì)同一組數(shù)據(jù)做另一種排序。例如希望將學(xué)生記錄按能對(duì)同一組數(shù)據(jù)做另一種排序。例如希望將學(xué)生記錄按5分一段分段排列,那么可以采用下面比較函數(shù):分一段分段排列,那么可以采用下面比較函數(shù):int scr5cmp(const void *vp1, const void *vp2) int n1 = (StuRec*)vp1)-score,
52、 n2 = (StuRec*)vp2)-score; return n1/5 - n2/5; 65按姓名排序按姓名排序n要按姓名排序,可用標(biāo)準(zhǔn)要按姓名排序,可用標(biāo)準(zhǔn)strcmp函數(shù)。函數(shù)。qsort提供的是指提供的是指向?qū)W生記錄的向?qū)W生記錄的void指針。這里要比較是其中的名字字符串,指針。這里要比較是其中的名字字符串,用用char* 指針。可定義下面轉(zhuǎn)接函數(shù):指針??啥x下面轉(zhuǎn)接函數(shù): int scmp(const void *vp1, const void *vp2) return strcmp(StuRec*)vp1)-name, (StuRec*)vp1)-name);66關(guān)于數(shù)組數(shù)據(jù)
53、的管理關(guān)于數(shù)組數(shù)據(jù)的管理struct ArrayList int narrMAXLEN; /數(shù)組數(shù)組 int nNumber; /有效元素個(gè)數(shù)有效元素個(gè)數(shù);struct ArraryList int *pnBuffer; /整形緩沖區(qū),動(dòng)態(tài)分配整形緩沖區(qū),動(dòng)態(tài)分配 int nLen; /緩沖區(qū)長(zhǎng)度緩沖區(qū)長(zhǎng)度 int nNumber; /有效元素個(gè)數(shù)有效元素個(gè)數(shù);67n結(jié)構(gòu)(結(jié)構(gòu)(struct)/結(jié)構(gòu)體結(jié)構(gòu)體n結(jié)構(gòu)與函數(shù)結(jié)構(gòu)與函數(shù)n聯(lián)合(聯(lián)合(union)/共用體共用體n枚舉(枚舉(enum)n編程實(shí)例編程實(shí)例n鏈接結(jié)構(gòu)(自引用結(jié)構(gòu))鏈接結(jié)構(gòu)(自引用結(jié)構(gòu))n字段字段主要內(nèi)容主要內(nèi)容68鏈接結(jié)構(gòu)鏈
54、接結(jié)構(gòu)n詞頻統(tǒng)計(jì)詞頻統(tǒng)計(jì)q統(tǒng)計(jì)正文文件里各個(gè)字或單詞出現(xiàn)的次數(shù)。統(tǒng)計(jì)正文文件里各個(gè)字或單詞出現(xiàn)的次數(shù)。n統(tǒng)計(jì)前不知道有多少不同的詞,無(wú)法在編程時(shí)準(zhǔn)備好統(tǒng)計(jì)統(tǒng)計(jì)前不知道有多少不同的詞,無(wú)法在編程時(shí)準(zhǔn)備好統(tǒng)計(jì)中使用的完整數(shù)據(jù)結(jié)構(gòu)。中使用的完整數(shù)據(jù)結(jié)構(gòu)。n可能方案可能方案q動(dòng)態(tài)分配計(jì)數(shù)器數(shù)組,必要時(shí)調(diào)整大?。ㄓ脛?dòng)態(tài)分配計(jì)數(shù)器數(shù)組,必要時(shí)調(diào)整大?。ㄓ胷ealloc)。)。n問(wèn)題問(wèn)題q新詞逐個(gè)遇到,反復(fù)調(diào)整分配效率比較低,而且需要使用很大的新詞逐個(gè)遇到,反復(fù)調(diào)整分配效率比較低,而且需要使用很大的塊,不夠靈活。塊,不夠靈活。q如果詞很多,能否找到足夠大的存儲(chǔ)塊也是問(wèn)題。如果詞很多,能否找到足夠大的存儲(chǔ)塊也
55、是問(wèn)題。69動(dòng)態(tài)數(shù)據(jù)管理的解決方案動(dòng)態(tài)數(shù)據(jù)管理的解決方案n采用能實(shí)現(xiàn)動(dòng)態(tài)增長(zhǎng)的數(shù)據(jù)組織結(jié)構(gòu)采用能實(shí)現(xiàn)動(dòng)態(tài)增長(zhǎng)的數(shù)據(jù)組織結(jié)構(gòu)n鏈接結(jié)構(gòu)鏈接結(jié)構(gòu)q一環(huán)扣一扣,通過(guò)一個(gè)元素保存的其它元素的地址找到其它元素。一環(huán)扣一扣,通過(guò)一個(gè)元素保存的其它元素的地址找到其它元素。n通過(guò)鏈接結(jié)構(gòu)實(shí)現(xiàn)動(dòng)態(tài)數(shù)據(jù)通過(guò)鏈接結(jié)構(gòu)實(shí)現(xiàn)動(dòng)態(tài)數(shù)據(jù)q增加元素:在鐵鏈的某個(gè)位置加一鐵環(huán)增加元素:在鐵鏈的某個(gè)位置加一鐵環(huán)q刪除元素:去掉鐵鏈的某一鐵環(huán)刪除元素:去掉鐵鏈的某一鐵環(huán)n問(wèn)題問(wèn)題q鐵鏈中的每一鐵環(huán)是一樣的嗎?鐵鏈中的每一鐵環(huán)是一樣的嗎?q普通的鐵鏈?zhǔn)菃蜗虻倪€是雙向的?普通的鐵鏈?zhǔn)菃蜗虻倪€是雙向的?q有沒(méi)有一些特殊的鐵鏈,比如有多個(gè)
56、分叉的?有沒(méi)有一些特殊的鐵鏈,比如有多個(gè)分叉的?q鐵鏈可以跟銅鏈拴一起嗎?鐵鏈可以跟銅鏈拴一起嗎?q鐵鏈的頭部可以拴在柱子上嗎?鐵鏈的頭部可以拴在柱子上嗎?70鏈接結(jié)構(gòu)實(shí)現(xiàn)原理鏈接結(jié)構(gòu)實(shí)現(xiàn)原理n鏈接結(jié)構(gòu)中的元素需要保存的信息鏈接結(jié)構(gòu)中的元素需要保存的信息q與結(jié)點(diǎn)本身有關(guān)的信息與結(jié)點(diǎn)本身有關(guān)的信息q找到其它元素所需要的信息找到其它元素所需要的信息n這些信息可以組織成結(jié)構(gòu)這些信息可以組織成結(jié)構(gòu)n問(wèn)題:如何找到其它元素?問(wèn)題:如何找到其它元素?q保存其它元素在內(nèi)存中的地址保存其它元素在內(nèi)存中的地址q在結(jié)構(gòu)中設(shè)置指針?lè)至?,用?lái)保存其它元素的地址的分量指針?lè)至吭诮Y(jié)構(gòu)中設(shè)置指針?lè)至?,用?lái)保存其它元素的地址
57、的分量指針?lè)至縩問(wèn)題:指針的類(lèi)型?問(wèn)題:指針的類(lèi)型?q需要指向元素的結(jié)構(gòu)類(lèi)型的指針類(lèi)型需要指向元素的結(jié)構(gòu)類(lèi)型的指針類(lèi)型q如果需要指向的元素與本元素的類(lèi)型相同的話,則需要定義自引用如果需要指向的元素與本元素的類(lèi)型相同的話,則需要定義自引用的結(jié)構(gòu)類(lèi)型。的結(jié)構(gòu)類(lèi)型。71鏈接結(jié)構(gòu)鏈接結(jié)構(gòu)n一個(gè)結(jié)構(gòu)元素可以通過(guò)指針引用同類(lèi)結(jié)構(gòu)元素,一個(gè)結(jié)構(gòu)元素可以通過(guò)指針引用同類(lèi)結(jié)構(gòu)元素,多個(gè)結(jié)構(gòu)元素通過(guò)指針建立聯(lián)系。多個(gè)結(jié)構(gòu)元素通過(guò)指針建立聯(lián)系。n指向結(jié)構(gòu)的指針?lè)Q為鏈接,形成的復(fù)雜數(shù)據(jù)結(jié)構(gòu)指向結(jié)構(gòu)的指針?lè)Q為鏈接,形成的復(fù)雜數(shù)據(jù)結(jié)構(gòu)稱(chēng)為鏈接結(jié)構(gòu)稱(chēng)為鏈接結(jié)構(gòu)n最簡(jiǎn)單的鏈接結(jié)構(gòu)最簡(jiǎn)單的鏈接結(jié)構(gòu)q線性鏈接形成的表,線性鏈接形
58、成的表,鏈接表鏈接表。q每個(gè)自引用結(jié)構(gòu)有一個(gè)鏈接指針?lè)至?。每個(gè)自引用結(jié)構(gòu)有一個(gè)鏈接指針?lè)至俊?2單向鏈表單向鏈表n鏈接表就像鏈條,自引用結(jié)構(gòu)是鏈節(jié),鏈接表就像鏈條,自引用結(jié)構(gòu)是鏈節(jié),表結(jié)點(diǎn)表結(jié)點(diǎn),結(jié)點(diǎn)間由指,結(jié)點(diǎn)間由指針連接形成整個(gè)結(jié)構(gòu)。針連接形成整個(gè)結(jié)構(gòu)。n所有結(jié)點(diǎn)(結(jié)構(gòu))由動(dòng)態(tài)分配創(chuàng)建。所有結(jié)點(diǎn)(結(jié)構(gòu))由動(dòng)態(tài)分配創(chuàng)建。n從指向表首結(jié)點(diǎn)的指針出發(fā),沿鏈接可順序訪問(wèn)表中各結(jié)點(diǎn)。從指向表首結(jié)點(diǎn)的指針出發(fā),沿鏈接可順序訪問(wèn)表中各結(jié)點(diǎn)。該指針代表整個(gè)表。通常把最后結(jié)點(diǎn)的指針置空表示結(jié)束。該指針代表整個(gè)表。通常把最后結(jié)點(diǎn)的指針置空表示結(jié)束。07300000000更復(fù)雜的引用鏈接結(jié)構(gòu)更復(fù)雜的引用鏈接結(jié)構(gòu)
59、74單向鏈表操作舉例單向鏈表操作舉例n設(shè)有某系統(tǒng)用戶信息結(jié)構(gòu),其中設(shè)有某系統(tǒng)用戶信息結(jié)構(gòu),其中q用戶用戶ID長(zhǎng)度為長(zhǎng)度為10q用戶姓名長(zhǎng)度不超過(guò)用戶姓名長(zhǎng)度不超過(guò)10n需要處理的用戶數(shù)據(jù)不定,需要處理的用戶數(shù)據(jù)不定,n假設(shè)某程序需要以鏈表方式處理用戶的數(shù)據(jù)假設(shè)某程序需要以鏈表方式處理用戶的數(shù)據(jù)75普通單向鏈表示意普通單向鏈表示意DataDataDataDataNULLHeadTail76鏈表結(jié)點(diǎn)結(jié)構(gòu)聲明鏈表結(jié)點(diǎn)結(jié)構(gòu)聲明方法方法1:struct UserInfoNodechar szID11;/IDchar szName11;/姓名姓名 struct UserInfoNode *pNextUse
60、r; /下個(gè)用戶指針下個(gè)用戶指針;方法方法2:typedef struct UserInfoNode *USERPOINTER;struct UserInfoNodechar szID11;/IDchar szName11; /姓名姓名 USERPOINTER pNextUser;/下個(gè)用戶指針下個(gè)用戶指針;77更好的方法:基本信息單獨(dú)說(shuō)明更好的方法:基本信息單獨(dú)說(shuō)明/用戶基本信息結(jié)構(gòu)聲明struct UserInfochar szID11;/ID,11個(gè)字符個(gè)字符char szName11; /姓名,姓名,11個(gè)字符個(gè)字符;或typedef structchar szID11;/ID,11個(gè)
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025云南省建筑安全員知識(shí)題庫(kù)
- 鄭州工業(yè)安全職業(yè)學(xué)院《大數(shù)據(jù)快速運(yùn)算》2023-2024學(xué)年第二學(xué)期期末試卷
- 遼寧裝備制造職業(yè)技術(shù)學(xué)院《醫(yī)學(xué)微生物學(xué)實(shí)驗(yàn)轉(zhuǎn)專(zhuān)業(yè)》2023-2024學(xué)年第二學(xué)期期末試卷
- 山東管理學(xué)院《診斷胸肺檢查》2023-2024學(xué)年第二學(xué)期期末試卷
- 廣州城建職業(yè)學(xué)院《電子商務(wù)技術(shù)基礎(chǔ)》2023-2024學(xué)年第二學(xué)期期末試卷
- 太原科技大學(xué)《城市規(guī)劃與管理》2023-2024學(xué)年第二學(xué)期期末試卷
- 玉溪職業(yè)技術(shù)學(xué)院《軋制工藝學(xué)管材生產(chǎn)》2023-2024學(xué)年第二學(xué)期期末試卷
- 商丘職業(yè)技術(shù)學(xué)院《表面活性劑化學(xué)與應(yīng)用》2023-2024學(xué)年第二學(xué)期期末試卷
- 五年級(jí)教師2025年第一季度工作計(jì)劃
- 做賬實(shí)操-商貿(mào)企業(yè)成本核算方法
- 狼道的讀后感課件
- 2022版高中生物必修二第一章測(cè)試題及答案解析
- 【初中語(yǔ)文】《說(shuō)和做》課件+統(tǒng)編版語(yǔ)文七年級(jí)下冊(cè)
- 機(jī)修知識(shí)培訓(xùn)教材課件
- 跨云平臺(tái)的DevOps集成
- 紡織染整行業(yè)安全培訓(xùn)
- 小學(xué)綜合實(shí)踐活動(dòng)《察探究活動(dòng)跟著節(jié)氣去探究》課教案
- 水工建筑物維護(hù)技術(shù)
- 載重汽車(chē)的安全操作規(guī)程范本
- 平臺(tái)對(duì)接技術(shù)方案
- 化妝品包裝相容性評(píng)估方法
評(píng)論
0/150
提交評(píng)論