第五章 復(fù)雜構(gòu)造數(shù)據(jù)類型_第1頁(yè)
第五章 復(fù)雜構(gòu)造數(shù)據(jù)類型_第2頁(yè)
第五章 復(fù)雜構(gòu)造數(shù)據(jù)類型_第3頁(yè)
第五章 復(fù)雜構(gòu)造數(shù)據(jù)類型_第4頁(yè)
第五章 復(fù)雜構(gòu)造數(shù)據(jù)類型_第5頁(yè)
已閱讀5頁(yè),還剩23頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、第五章第五章 復(fù)雜構(gòu)造數(shù)據(jù)類型復(fù)雜構(gòu)造數(shù)據(jù)類型 2/28第五章第五章 復(fù)雜構(gòu)造數(shù)據(jù)類型復(fù)雜構(gòu)造數(shù)據(jù)類型n5.1 結(jié)構(gòu)體結(jié)構(gòu)體n5.2 共用體共用體n5.3 枚舉類型枚舉類型3/285.1.1 結(jié)構(gòu)體的引出及使用結(jié)構(gòu)體的引出及使用n每條記錄中數(shù)據(jù)的數(shù)據(jù)類型不相同每條記錄中數(shù)據(jù)的數(shù)據(jù)類型不相同學(xué)號(hào)學(xué)號(hào)姓名姓名性別性別年齡年齡入學(xué)成績(jī)?nèi)雽W(xué)成績(jī)所屬學(xué)院所屬學(xué)院0501李明李明男男19610信息信息0502張莉張莉女女19595信息信息0503王濤王濤男男20580控制控制學(xué)號(hào)學(xué)號(hào)姓名姓名性別性別年齡年齡入學(xué)成績(jī)?nèi)雽W(xué)成績(jī)所屬學(xué)院所屬學(xué)院int num char name10 char sexint ag

2、eint scorechar institute20n如何表示如下的數(shù)據(jù)信息?如何表示如下的數(shù)據(jù)信息?n結(jié)構(gòu)體是由一些邏輯相關(guān),但數(shù)據(jù)類型不同的分結(jié)構(gòu)體是由一些邏輯相關(guān),但數(shù)據(jù)類型不同的分量組成的一組數(shù)據(jù)。量組成的一組數(shù)據(jù)。4/28n結(jié)構(gòu)體的定義結(jié)構(gòu)體的定義注意不要忘了分號(hào)注意不要忘了分號(hào)成員表列成員表列struct 結(jié)構(gòu)體類型名結(jié)構(gòu)體類型名 數(shù)據(jù)類型數(shù)據(jù)類型 成員名成員名1;1; 數(shù)據(jù)類型數(shù)據(jù)類型 成員名成員名2;2; : : : : 數(shù)據(jù)類型數(shù)據(jù)類型 成員名成員名n;n; ;用戶定義用戶定義的標(biāo)識(shí)符的標(biāo)識(shí)符n說明:說明:定義了結(jié)構(gòu)體類型,僅僅是定義了數(shù)據(jù)的定義了結(jié)構(gòu)體類型,僅僅是定義了數(shù)據(jù)

3、的組織形式,創(chuàng)立了組織形式,創(chuàng)立了一種數(shù)據(jù)類型一種數(shù)據(jù)類型,但并不會(huì)為這,但并不會(huì)為這種結(jié)構(gòu)體類型分配內(nèi)存空間,只有定義了結(jié)構(gòu)體種結(jié)構(gòu)體類型分配內(nèi)存空間,只有定義了結(jié)構(gòu)體變量,才會(huì)為變量分配空間。變量,才會(huì)為變量分配空間。例:例:struct student int num ; char name10 ; char sex; int age; int score ; char institute20;5/28n定義結(jié)構(gòu)體變量的方法定義結(jié)構(gòu)體變量的方法q(1) 先定義結(jié)構(gòu)體類型,再定義變量先定義結(jié)構(gòu)體類型,再定義變量 struct student char name10 ; int age ;

4、int s1 , s2 ; ; struct student st1, st2 ;結(jié)構(gòu)體結(jié)構(gòu)體 類型定義類型定義結(jié)構(gòu)體結(jié)構(gòu)體 變量定義變量定義n內(nèi)存中結(jié)構(gòu)體變量占有一片連續(xù)的存儲(chǔ)單元,其占用的字內(nèi)存中結(jié)構(gòu)體變量占有一片連續(xù)的存儲(chǔ)單元,其占用的字節(jié)數(shù)可用節(jié)數(shù)可用sizeof 運(yùn)算符算出:運(yùn)算符算出: printf(“%dn” , sizeof(struct student) ) ; printf(“%dn” , sizeof(st1) ) ; n結(jié)構(gòu)體變量結(jié)構(gòu)體變量st1和和st2各自都需要各自都需要16個(gè)字節(jié)的存儲(chǔ)空間個(gè)字節(jié)的存儲(chǔ)空間st1st2nameages1s26/28n定義結(jié)構(gòu)體變量的

5、方法定義結(jié)構(gòu)體變量的方法q(2) 定義結(jié)構(gòu)體類型同時(shí)定義變量定義結(jié)構(gòu)體類型同時(shí)定義變量 struct student char name10 ; int age ; int s1 , s2 ; st1, st2 ;q(3) 直接定義結(jié)構(gòu)體變量直接定義結(jié)構(gòu)體變量 struct char name10 ; int age ; int s1 , s2 ; st1, st2;定義結(jié)構(gòu)體變量定義結(jié)構(gòu)體變量注意:這里沒有結(jié)構(gòu)體類型名,注意:這里沒有結(jié)構(gòu)體類型名,這種方式有時(shí)使用并不方便,這種方式有時(shí)使用并不方便,因此不建議大家采用因此不建議大家采用7/28n結(jié)構(gòu)體類型可以嵌套定義結(jié)構(gòu)體類型可以嵌套定義 例

6、例: : struct date int year ; int month ; int day ; ; struct stud char name10 ; struct date birthday ; int s1 , s2 ; ;或或: : struct stud char name10 ; struct date int year ; int month ; int day ; birthday ; int s1 , s2 ; ;8/28n結(jié)構(gòu)體變量的引用結(jié)構(gòu)體變量的引用q格式:格式:結(jié)構(gòu)體變量名結(jié)構(gòu)體變量名. 成員名成員名struct student char name10 ; int

7、age ; int s1 , s2 ; ;struct student st1 ;strcpy(st1. name, “Mary” ); st1. age = 21 ;st1. s1 = 78 ; st1. s2 = 86 ; 成員運(yùn)算符成員運(yùn)算符9/28n說明說明q結(jié)構(gòu)體變量通常不能整體使用,不能整體輸入、輸出,結(jié)構(gòu)體變量通常不能整體使用,不能整體輸入、輸出,只能對(duì)單個(gè)成員分別引用。但當(dāng)結(jié)構(gòu)體變量作為函數(shù)參只能對(duì)單個(gè)成員分別引用。但當(dāng)結(jié)構(gòu)體變量作為函數(shù)參數(shù)或賦初值時(shí),可以整體輸入;或者兩個(gè)相同類型的結(jié)數(shù)或賦初值時(shí),可以整體輸入;或者兩個(gè)相同類型的結(jié)構(gòu)體變量,如果一個(gè)已經(jīng)賦值,可以對(duì)另外一個(gè)整

8、體賦構(gòu)體變量,如果一個(gè)已經(jīng)賦值,可以對(duì)另外一個(gè)整體賦值。值。 例:如果例:如果s1已被賦值,則可以:已被賦值,則可以:s2 = s1;q如果成員本身又屬于一個(gè)結(jié)構(gòu)體類型,則這個(gè)成員也不如果成員本身又屬于一個(gè)結(jié)構(gòu)體類型,則這個(gè)成員也不能整體賦值,要用若干個(gè)成員運(yùn)算符引用,如前面的能整體賦值,要用若干個(gè)成員運(yùn)算符引用,如前面的birthday成員本身又是成員本身又是date類型的變量,則需:類型的變量,則需: stu1.birthday.month=4; stu1.birthday.day=5;q可以引用結(jié)構(gòu)體變量成員的地址,也可以引用結(jié)構(gòu)體變可以引用結(jié)構(gòu)體變量成員的地址,也可以引用結(jié)構(gòu)體變量的地

9、址,要區(qū)分清楚。如:量的地址,要區(qū)分清楚。如: printf(“%x”, &stu1.num); printf(“%x”, &stu1);10/28n結(jié)構(gòu)體變量的初始化結(jié)構(gòu)體變量的初始化struct student char name10 ; int age ; int s1 , s2 ;st1=“Mary”, 21, 78, 86;struct stud char name10 ; struct date birthday ; int s1 , s2 ; ;struct stud st2= “John” , 1980 , 11 , 23 , 89 , 95 ;struct student c

10、har name10 ; int age ; int s1 , s2 ; ;struct student st1; st1=“Mary”, 21, 78, 86 ;初始化,正確初始化,正確這是賦值,這是賦值,錯(cuò)誤錯(cuò)誤C不允許這么做不允許這么做初始化,正確初始化,正確11/28n結(jié)構(gòu)體變量的輸入和輸出結(jié)構(gòu)體變量的輸入和輸出qC語(yǔ)言不允許結(jié)構(gòu)體變量整體進(jìn)行輸入和輸出,只語(yǔ)言不允許結(jié)構(gòu)體變量整體進(jìn)行輸入和輸出,只能對(duì)結(jié)構(gòu)體變量的成員進(jìn)行輸入和輸出能對(duì)結(jié)構(gòu)體變量的成員進(jìn)行輸入和輸出例:例:gets( st1. name ) ;scanf( “%d%d%d”, &st1. birthday. year

11、, &st1. birthday. month , &st1. birthday. day ) ;scanf ( “%d%d%d”, &st1. age , &st1. s1 , &st1. s2 ) ; puts( st1. name ) ;printf( “%4d”, st1. age );printf( “%d .%d .%d”, st1. birthday. year , st1. birthday. month , st1. birthday. day ) ;printf(“%4d %4dn”, st1. s1 , st1. s2 ) ; 12/285.1.2 結(jié)構(gòu)體數(shù)組的引出及使用

12、結(jié)構(gòu)體數(shù)組的引出及使用n一個(gè)結(jié)構(gòu)體變量只能存放一個(gè)學(xué)生的信息,對(duì)一個(gè)結(jié)構(gòu)體變量只能存放一個(gè)學(xué)生的信息,對(duì)于多個(gè)學(xué)生的信息,可以使用一個(gè)結(jié)構(gòu)體數(shù)組于多個(gè)學(xué)生的信息,可以使用一個(gè)結(jié)構(gòu)體數(shù)組來存放,結(jié)構(gòu)體數(shù)組的每個(gè)元素是一個(gè)結(jié)構(gòu)體來存放,結(jié)構(gòu)體數(shù)組的每個(gè)元素是一個(gè)結(jié)構(gòu)體類型的變量類型的變量n定義結(jié)構(gòu)體數(shù)組的方法與定義普通數(shù)組的方法定義結(jié)構(gòu)體數(shù)組的方法與定義普通數(shù)組的方法類似:類似:結(jié)構(gòu)體類型結(jié)構(gòu)體類型 數(shù)組名數(shù)組名數(shù)組的長(zhǎng)度數(shù)組的長(zhǎng)度;13/28n結(jié)構(gòu)體數(shù)組的定義及使用結(jié)構(gòu)體數(shù)組的定義及使用1 1、定義結(jié)構(gòu)體數(shù)組、定義結(jié)構(gòu)體數(shù)組(1) (1) 先定義結(jié)構(gòu)體類型先定義結(jié)構(gòu)體類型 再定義結(jié)構(gòu)體數(shù)組:再定

13、義結(jié)構(gòu)體數(shù)組: struct student char name10 ; int age ; int s1 , s2 ; ;struct student st6;(2) (2) 定義結(jié)構(gòu)體類型的同定義結(jié)構(gòu)體類型的同時(shí)定義結(jié)構(gòu)體數(shù)組:時(shí)定義結(jié)構(gòu)體數(shù)組: struct student char name10 ; int age ; int s1 , s2 ; st6 ;(3) (3) 直接定義結(jié)構(gòu)體數(shù)組直接定義結(jié)構(gòu)體數(shù)組 struct char name10 ; int age ; int s1 , s2 ; st6;不提倡使不提倡使用該方法用該方法14/28n結(jié)構(gòu)體數(shù)組的初始化結(jié)構(gòu)體數(shù)組的初始化

14、 將每個(gè)數(shù)組元素的數(shù)據(jù)用花括號(hào)將每個(gè)數(shù)組元素的數(shù)據(jù)用花括號(hào) 括起來。括起來。struct student char name10 ; int age ; int s1 , s2 ; ;struct student st3= “Mary”, 21, 78, 86, “Alex”, 20, 90, 80, “Mike”,19, 75, 68 ;Mary217886Alex209080Mike197568st0st1st215/28n結(jié)構(gòu)體數(shù)組的引用結(jié)構(gòu)體數(shù)組的引用q引用某個(gè)數(shù)組元素的成員引用某個(gè)數(shù)組元素的成員 例:例:puts(); printf(“%d,%d”, st1.age,

15、 st1.s1);q數(shù)組元素之間可以整體賦值,也可以將一個(gè)元素賦數(shù)組元素之間可以整體賦值,也可以將一個(gè)元素賦給一個(gè)相同類型的結(jié)構(gòu)體變量給一個(gè)相同類型的結(jié)構(gòu)體變量例:例:struct student st3=“Mary”,21,78,86, “Alex”, . ; struct student x ; st2 = st0 ; x = st1 ; q輸入和輸出操作只能對(duì)數(shù)組元素的成員進(jìn)行輸入和輸出操作只能對(duì)數(shù)組元素的成員進(jìn)行都是結(jié)構(gòu)體變量的整體賦值形式都是結(jié)構(gòu)體變量的整體賦值形式16/28n例例5-1:按成績(jī)對(duì)學(xué)生信息進(jìn)行從高到底的排序:按成績(jī)對(duì)學(xué)生信息進(jìn)行從高到底的排序#include #def

16、ine N 30struct stud int n; char name10; int s;void input(struct stud a ) int i ; for ( i=0 ; iN ; i+) scanf(“% %d% %s% %d”, &ai.n, , &ai.s) ; void output(struct stud a ) int i ; for ( i=0 ; iN ; i+) printf(“% %4d % %10s % %4dn”, ai.n, , ai.s) ; 注意注意前不加前不加&,因,因name是數(shù)組名,因用是數(shù)組名,因用%

17、s,輸入時(shí)名字不能加空格輸入時(shí)名字不能加空格17/28void sort(struct stud a ) int i , j ; struct stud temp; for ( i=0 ; iN- -1 ; i+) for ( j=i+1 ; jN ; j+) if ( ai.s s1 = 87 ;p - s2 = 90 ;n成員的引用格式成員的引用格式q結(jié)構(gòu)體變量名結(jié)構(gòu)體變量名.成員名成員名 stu.Nameq(*指針變量名指針變量名).成員成員名名 (*p).ageq指針變量名指針變量名-成員名成員名 p-s119/28n指向結(jié)構(gòu)體數(shù)組的指針指向結(jié)構(gòu)體數(shù)組的指針q定義:定義: struct

18、 student a3 , *p ;q使用:使用: for(p=a; pname); scanf(“%d%d%d”,&p-age,&p-s1,&p-s2); n結(jié)構(gòu)體變量作為函數(shù)參數(shù)結(jié)構(gòu)體變量作為函數(shù)參數(shù)q函數(shù)實(shí)參和形參都用結(jié)構(gòu)體變量,參數(shù)之間為值傳遞,函數(shù)實(shí)參和形參都用結(jié)構(gòu)體變量,參數(shù)之間為值傳遞,實(shí)參結(jié)構(gòu)體變量各成員的值依次傳給形參結(jié)構(gòu)體變量。實(shí)參結(jié)構(gòu)體變量各成員的值依次傳給形參結(jié)構(gòu)體變量。q返回結(jié)構(gòu)體類型值的函數(shù)返回結(jié)構(gòu)體類型值的函數(shù)定義格式:定義格式:結(jié)構(gòu)體類型名結(jié)構(gòu)體類型名 函數(shù)名函數(shù)名( 形參表形參表) 函數(shù)體函數(shù)體 ; 例:例: struct student func( int

19、x, float y) 函數(shù)體函數(shù)體 ; 20/285.2 共用體共用體n概念概念q所謂所謂“共用體共用體”類型,是指使幾個(gè)不同類型的變量類型,是指使幾個(gè)不同類型的變量共同占用同一段內(nèi)存單元。共同占用同一段內(nèi)存單元。n定義定義union 共用體類型名共用體類型名 數(shù)據(jù)類型數(shù)據(jù)類型 成員名成員名1;1; 數(shù)據(jù)類型數(shù)據(jù)類型 成員名成員名2;2; : : 數(shù)據(jù)類型數(shù)據(jù)類型 成員名成員名n;n;例:例:union data int i; char ch; float f;21/28n定義共用體類型的變量:形式也有定義共用體類型的變量:形式也有3種,同結(jié)構(gòu)種,同結(jié)構(gòu)體類型體類型1、先定義類型,再定義變量

20、、先定義類型,再定義變量union student char name10 ; int age ; float s;union student st1, st2 ;2、定義類型同時(shí)定義變量、定義類型同時(shí)定義變量union student char name10 ; int age ; float s; st1, st2 ;3、直接定義共用體變量直接定義共用體變量 union char name10 ; int age ; float s ; st1, st2 ;22/28n共用體變量所占的內(nèi)存空間共用體變量所占的內(nèi)存空間q共用體變量所占內(nèi)存的長(zhǎng)度等于最長(zhǎng)的成員的長(zhǎng)度,共用體變量所占內(nèi)存的長(zhǎng)度等

21、于最長(zhǎng)的成員的長(zhǎng)度,而不是各成員的長(zhǎng)度之和,這一點(diǎn)不同于結(jié)構(gòu)體。而不是各成員的長(zhǎng)度之和,這一點(diǎn)不同于結(jié)構(gòu)體。q例:上例所占字節(jié)數(shù)為例:上例所占字節(jié)數(shù)為10n共用體變量的引用共用體變量的引用q格式:格式:共用體變量共用體變量. 成員名成員名q例:例: = “zhang”; st1.age = 20; st1.s = 78.5;23/28n共用體類型數(shù)據(jù)的特點(diǎn)共用體類型數(shù)據(jù)的特點(diǎn)q每一瞬時(shí)只能存放其中的一個(gè)成員,而不是同時(shí)存放幾種,每一瞬時(shí)只能存放其中的一個(gè)成員,而不是同時(shí)存放幾種,即其它成員不起作用,只有最后一個(gè)存放的成員的值有效,即其它成員不起作用,只有最后一個(gè)存放的成員的值有

22、效,其他成員將失去原值。如上例中的變量其他成員將失去原值。如上例中的變量st1只有最后一個(gè)成只有最后一個(gè)成員值員值st1.s=78.5是有效的。是有效的。q共用體變量的地址和它的成員地址都是同一地址,即共用體變量的地址和它的成員地址都是同一地址,即&st1和和、&st1.age、&st1.s的起始地址都是一樣的。的起始地址都是一樣的。q共用體變量共用體變量不能初始化不能初始化,也,也不能不能對(duì)變量名對(duì)變量名整體賦值整體賦值,不能引,不能引用變量名來輸出一個(gè)值,只能引用它的某個(gè)成員。用變量名來輸出一個(gè)值,只能引用它的某個(gè)成員。q共用體變量共用體變量不能作為函數(shù)的參數(shù)不能作為函數(shù)的

23、參數(shù),也,也不能作為函數(shù)返回值不能作為函數(shù)返回值。但可以使用指向共用體變量的指針。但可以使用指向共用體變量的指針。q共用體類型可以出現(xiàn)在結(jié)構(gòu)體中,共用體成員也可以是結(jié)構(gòu)共用體類型可以出現(xiàn)在結(jié)構(gòu)體中,共用體成員也可以是結(jié)構(gòu)體類型。體類型。q可以定義共用體數(shù)組。可以定義共用體數(shù)組。24/28數(shù)據(jù)類型定義:數(shù)據(jù)類型定義:整體是一個(gè)結(jié)構(gòu)體整體是一個(gè)結(jié)構(gòu)體類型;其中第類型;其中第5 5項(xiàng)項(xiàng)可以用共用體來處可以用共用體來處理。理。例:例:struct member int num; char name20; float score1; double score2; union int class; cha

24、r position10; catagory; mem20;25/285.3 枚舉類型枚舉類型n概念概念q枚舉是指將變量的所有取值一一列舉出來,變量的取值枚舉是指將變量的所有取值一一列舉出來,變量的取值只限于列舉出來的值的范圍。該變量稱之為枚舉型變量,只限于列舉出來的值的范圍。該變量稱之為枚舉型變量,所列舉的值叫做枚舉元素(枚舉常量)所列舉的值叫做枚舉元素(枚舉常量)。n定義定義 enum 枚舉類型名枚舉類型名 枚舉元素,枚舉元素,枚舉元素枚舉元素,枚舉元素,枚舉元素n ; 例:例: enum weekdaysun, mon, tue, wed, thu, fri, sat ; 26/28n變量的定

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論