結(jié)構(gòu)體共用體與枚舉類型-西安交大_第1頁
結(jié)構(gòu)體共用體與枚舉類型-西安交大_第2頁
結(jié)構(gòu)體共用體與枚舉類型-西安交大_第3頁
結(jié)構(gòu)體共用體與枚舉類型-西安交大_第4頁
結(jié)構(gòu)體共用體與枚舉類型-西安交大_第5頁
已閱讀5頁,還剩30頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、結(jié)構(gòu)體共用體與枚舉類型結(jié)構(gòu)體共用體與枚舉類型-西安交西安交大大9.1結(jié)構(gòu)體結(jié)構(gòu)體9.2結(jié)構(gòu)體數(shù)組結(jié)構(gòu)體數(shù)組9.3結(jié)構(gòu)體與指針結(jié)構(gòu)體與指針9.4共用體共用體9.5 枚舉類型枚舉類型9.6用用typedef定義類型定義類型第第9 9章章 結(jié)構(gòu)體、共用體與枚舉類型結(jié)構(gòu)體、共用體與枚舉類型結(jié)構(gòu)體共用體與枚舉類型結(jié)構(gòu)體共用體與枚舉類型-西安交西安交大大9.1 9.1 結(jié)構(gòu)體結(jié)構(gòu)體結(jié)構(gòu)體是將不同類型的數(shù)據(jù)根據(jù)需要組合成一個有結(jié)構(gòu)體是將不同類型的數(shù)據(jù)根據(jù)需要組合成一個有機的整體,以便于引用。機的整體,以便于引用。這個整體是一個構(gòu)造數(shù)據(jù)類型這個整體是一個構(gòu)造數(shù)據(jù)類型結(jié)構(gòu)體類型,其結(jié)構(gòu)體類型,其中的數(shù)據(jù)是相互聯(lián)

2、系的。中的數(shù)據(jù)是相互聯(lián)系的。如要存儲一個學(xué)生的有關(guān)信息(學(xué)號、姓名、性別、如要存儲一個學(xué)生的有關(guān)信息(學(xué)號、姓名、性別、年齡、住址)年齡、住址)n u m n am e sex ag e ad d r 1 0 0 1 0 L i m in M 1 8 D alian 可采用結(jié)構(gòu)體數(shù)據(jù)結(jié)構(gòu)描述上述信息??刹捎媒Y(jié)構(gòu)體數(shù)據(jù)結(jié)構(gòu)描述上述信息。結(jié)構(gòu)體共用體與枚舉類型結(jié)構(gòu)體共用體與枚舉類型-西安交西安交大大struct studentint num; char name20; char sex; int age; char addr30;;定義一個結(jié)構(gòu)體類型的一定義一個結(jié)構(gòu)體類型的一般形式為:般形式為:s

3、truct 結(jié)構(gòu)體名結(jié)構(gòu)體名 成員表列成員表列;是類型,不是變量名是類型,不是變量名num nam e sex age addr 10010 L i m in M 18 D alian 對各成員都要進行類型說明;對各成員都要進行類型說明;成員名命名規(guī)則與變量名成員名命名規(guī)則與變量名結(jié)構(gòu)體共用體與枚舉類型結(jié)構(gòu)體共用體與枚舉類型-西安交西安交大大定義結(jié)構(gòu)體類型變量的方法定義結(jié)構(gòu)體類型變量的方法方法一方法一:先定義結(jié)構(gòu)體類型再定義變量:先定義結(jié)構(gòu)體類型再定義變量struct studentint num; char name20; char sex; int age; char addr30;;st

4、ruct student student1, student2;定義定義studet1和和sudent2為為struct student類型變量類型變量不能只指定一個變量為不能只指定一個變量為“struct型型”而不指定結(jié)構(gòu)體名而不指定結(jié)構(gòu)體名結(jié)構(gòu)體共用體與枚舉類型結(jié)構(gòu)體共用體與枚舉類型-西安交西安交大大可用符號常量代表一個結(jié)構(gòu)體類型可用符號常量代表一個結(jié)構(gòu)體類型#define STUDENT struct studentSTUDENTint num; char name20; char sex; int age; char addr30;這樣,可直接用這樣,可直接用STUDENT定義變量,如

5、:定義變量,如:STUDENT student1, student2;此時,不必再寫關(guān)鍵字此時,不必再寫關(guān)鍵字struct結(jié)構(gòu)體共用體與枚舉類型結(jié)構(gòu)體共用體與枚舉類型-西安交西安交大大方法二方法二:在定義類型的同時定義變量:在定義類型的同時定義變量struct studentint num; char name20; char sex; int age; char addr30;student1, student2;一般形式是:一般形式是:struct 結(jié)構(gòu)體名結(jié)構(gòu)體名 成員表列成員表列 變量名表列;變量名表列;結(jié)構(gòu)體共用體與枚舉類型結(jié)構(gòu)體共用體與枚舉類型-西安交西安交大大方法三方法三:直接定

6、義結(jié)構(gòu)類型變量:直接定義結(jié)構(gòu)類型變量其一般形式是:其一般形式是:structstruct 成員表列成員表列 變量名表列;變量名表列;此時,不出現(xiàn)結(jié)構(gòu)體名此時,不出現(xiàn)結(jié)構(gòu)體名structint num; char name20; char sex; int age; char addr30;student1, student2;結(jié)構(gòu)體共用體與枚舉類型結(jié)構(gòu)體共用體與枚舉類型-西安交西安交大大幾點說明:幾點說明:1.1.類型與變量是不同概念,不要混淆;類型與變量是不同概念,不要混淆;2.2.結(jié)構(gòu)體中的成員,可以單獨使用,其作用與地位相當(dāng)于普通變量;結(jié)構(gòu)體中的成員,可以單獨使用,其作用與地位相當(dāng)于普通

7、變量;3.3.成員名可以與程序中的變量名相同,二者不代表同一對象。互不干擾。成員名可以與程序中的變量名相同,二者不代表同一對象?;ゲ桓蓴_。4.4.在結(jié)構(gòu)中,各成員都占有自己的內(nèi)存空間,它們是同時存在的。一個結(jié)在結(jié)構(gòu)中,各成員都占有自己的內(nèi)存空間,它們是同時存在的。一個結(jié)構(gòu)變量的總長度等于所有成員長度之和。構(gòu)變量的總長度等于所有成員長度之和。Sizeof( )Sizeof( )為一運算符,其為一運算符,其功能是測試某種類型的變量功能是測試某種類型的變量在內(nèi)存中所占用的字節(jié)數(shù)。在內(nèi)存中所占用的字節(jié)數(shù)。有:有:struct int i; char c; float a;test;sizeof(tes

8、t)的值是:的值是:7結(jié)構(gòu)體共用體與枚舉類型結(jié)構(gòu)體共用體與枚舉類型-西安交西安交大大struct date int month; int day; int year; ;Struct studentint num;char name20;int age;struct date birthday;student1,student2;Struct studentint num; char name20; int age; struct int month; int day; int year; birthday;student1,student2;5. 5. 成員也可以是一個結(jié)構(gòu)體變量。例:成員也

9、可以是一個結(jié)構(gòu)體變量。例:結(jié)構(gòu)體共用體與枚舉類型結(jié)構(gòu)體共用體與枚舉類型-西安交西安交大大結(jié)構(gòu)體類型變量的引用結(jié)構(gòu)體類型變量的引用引用一般形式為:結(jié)構(gòu)體變量名引用一般形式為:結(jié)構(gòu)體變量名.成員名成員名規(guī)則:規(guī)則:1. 不能將一個結(jié)構(gòu)體變量作為一個整體進行賦值和輸出;只不能將一個結(jié)構(gòu)體變量作為一個整體進行賦值和輸出;只能對其各個成員分別輸出。能對其各個成員分別輸出。printf(“.”,student1);printf(“ %d”, student1.num); 輸出輸出 10010錯!正確!2 .2 .若成員本身又屬一個結(jié)構(gòu)體類型,只能對最低級的成員進若成員本身又屬一個結(jié)構(gòu)體類型,只能對最低級的

10、成員進行賦值或存取以及運算。行賦值或存取以及運算。 如:如:student1.birthday.yearstudent1.birthday.year結(jié)構(gòu)體共用體與枚舉類型結(jié)構(gòu)體共用體與枚舉類型-西安交西安交大大3. 3. 對成員變量可以象普通變量一樣進行各種運算,如:對成員變量可以象普通變量一樣進行各種運算,如: sumage=student1.age+student2.age;sumage=student1.age+student2.age;4. 4. 可以引用成員的地址,也可以引用結(jié)構(gòu)體變量的地址可以引用成員的地址,也可以引用結(jié)構(gòu)體變量的地址, ,如:如: scanf(scanf(“%d%

11、d”,& student1.num);,& student1.num); printf( printf(“%o%o”,&student1);,&student1); scanf( scanf(“%d,%s,%c,%d,%s%d,%s,%c,%d,%s”,&student1);,&student1);錯!錯!輸入輸入student1.num的值的值輸出輸出student1的首地址的首地址結(jié)構(gòu)體共用體與枚舉類型結(jié)構(gòu)體共用體與枚舉類型-西安交西安交大大Struct student int no; char name20; char sex; struct int year; int month; i

12、nt day; birth;Struct student s;設(shè)變量設(shè)變量s中的中的“生日生日”是是“1984年年11月月11日日”,下列對,下列對“生日生日”的正確賦值方式是:的正確賦值方式是:A)year=1984;month=11;day=11;B)birth.year=1984;birth.month=11;birth.day=11C)s.year=1984;s.month=11;s.day=11D)s.birth.year=1984;s.birth.month=11;s.birth.day=11;練習(xí):已知學(xué)生記錄描述為:練習(xí):已知學(xué)生記錄描述為:結(jié)構(gòu)體共用體與枚舉類型結(jié)構(gòu)體共用體與

13、枚舉類型-西安交西安交大大結(jié)構(gòu)體變量的初始化結(jié)構(gòu)體變量的初始化 在定義結(jié)構(gòu)體類型變量的同時對其每個成員賦初值在定義結(jié)構(gòu)體類型變量的同時對其每個成員賦初值初始化。初始化。 struct studentlong int num; char name20; char sex; char addr20; a=9801,”Wang hong”,W,”2 Linggong Road”;main( )printf(“No.:%ldnname:%snsex:%cnaddress:%sn”,a.num,,a.sex,a.addr);運行結(jié)果為:運行結(jié)果為:No.:9801name:Wang hong

14、sex:Waddress:2 Linggong Road結(jié)構(gòu)體共用體與枚舉類型結(jié)構(gòu)體共用體與枚舉類型-西安交西安交大大9.2 9.2 結(jié)構(gòu)體數(shù)組結(jié)構(gòu)體數(shù)組(每個數(shù)組元素都是一個結(jié)構(gòu)體類型的數(shù)據(jù))(每個數(shù)組元素都是一個結(jié)構(gòu)體類型的數(shù)據(jù))結(jié)構(gòu)體數(shù)組的定義結(jié)構(gòu)體數(shù)組的定義:struct studentint num; char name20; char sex; int age; char addr30; struct studnt stu3;也可直接定義:也可直接定義:struct student int num; stu3;或或struct int num; stu3;結(jié)構(gòu)體共用體與枚舉類型結(jié)構(gòu)

15、體共用體與枚舉類型-西安交西安交大大結(jié)構(gòu)體數(shù)組的引用結(jié)構(gòu)體數(shù)組的引用1 1結(jié)構(gòu)體數(shù)組元素中某一成員的引用結(jié)構(gòu)體數(shù)組元素中某一成員的引用 表示表示stustu的第的第1 1個元素的個元素的namename成員項成員項 stu4.age stu4.age 表示表示stustu的第的第5 5個元素的個元素的ageage成員項成員項2 2結(jié)構(gòu)體數(shù)組元素的賦值結(jié)構(gòu)體數(shù)組元素的賦值 可將一個結(jié)構(gòu)體數(shù)組元素賦給同一結(jié)構(gòu)體數(shù)組中的另一個元可將一個結(jié)構(gòu)體數(shù)組元素賦給同一結(jié)構(gòu)體數(shù)組中的另一個元素,或者賦給同一類型的變量。素,或者賦給同一類型的變量。 stu1 = stu2;

16、stu1 = stu2; Stu4 = stu5; Stu4 = stu5;注意:結(jié)構(gòu)體數(shù)組元素的輸入和輸出只能將單個成員項進行輸注意:結(jié)構(gòu)體數(shù)組元素的輸入和輸出只能將單個成員項進行輸入和輸出,而不能把結(jié)構(gòu)體數(shù)組元素作為一個整體直接進行入和輸出,而不能把結(jié)構(gòu)體數(shù)組元素作為一個整體直接進行輸入和輸出。輸入和輸出。結(jié)構(gòu)體共用體與枚舉類型結(jié)構(gòu)體共用體與枚舉類型-西安交西安交大大結(jié)構(gòu)體數(shù)組的初始化結(jié)構(gòu)體數(shù)組的初始化struct studentint num; char name20; char sex; int age; char addr30; stu3=111,”Li”,M,18,”Dalian”

17、,;也可采用:也可采用:struct student int num; ; struct student stu=,;結(jié)構(gòu)體數(shù)組的初始化的一般形式是在結(jié)構(gòu)體數(shù)組的初始化的一般形式是在定義數(shù)組后面加上:定義數(shù)組后面加上: =初值表列初值表列;結(jié)構(gòu)體共用體與枚舉類型結(jié)構(gòu)體共用體與枚舉類型-西安交西安交大大struct person char name20; int count; leader3=“Li”,0,”zhang”,0,”Liu”,0;main( ) int i, j; char leader_name20; for( i=1;i=10;i+) scanf(“%s”,leader_name

18、); for(j=0;j3;j+) if(strcmp(leader_name,)= =0)leaderj.count+); for(i=0;i3;i+) printf(“%5s:%dn”,,leaderi.count); 判斷是哪一位候選人判斷是哪一位候選人例題:設(shè)有三個候選人,例題:設(shè)有三個候選人,每次輸入一個得票的候選每次輸入一個得票的候選人的名字,要求最后輸出人的名字,要求最后輸出各人得票結(jié)果。各人得票結(jié)果。結(jié)構(gòu)體共用體與枚舉類型結(jié)構(gòu)體共用體與枚舉類型-西安交西安交大大計算學(xué)生的平均成績和不及計算學(xué)生的平均成績和不及格的人數(shù)。格的人數(shù)。

19、struct stuint num;char *name;char sex;float score;boy5=101,Li ping,M,45,102,Zhang ping,M,62.5,103,He fang,F,92.5,104,Cheng ling,F,87,105,Wang ming,M,58,; main()int i,c=0;float ave,s=0;for(i=0;i5;i+)s+=boyi.score;if(boyi.score成員名成員名指向運算符。其優(yōu)先級指向運算符。其優(yōu)先級高于自增、自減運算符高于自增、自減運算符試分析以下運算:試分析以下運算:p-n 得到得到p指向的結(jié)

20、構(gòu)體變量中的成員指向的結(jié)構(gòu)體變量中的成員n的值的值p-n+ 得到得到p指向的結(jié)構(gòu)體變量中的成員指向的結(jié)構(gòu)體變量中的成員n的值,的值, 用完后使它加用完后使它加1;+p-n 得到得到p指向的結(jié)構(gòu)體變量中的成員指向的結(jié)構(gòu)體變量中的成員n的值的值 使其先加使其先加1成員運算符成員運算符結(jié)構(gòu)體共用體與枚舉類型結(jié)構(gòu)體共用體與枚舉類型-西安交西安交大大指向結(jié)構(gòu)體數(shù)組的指針指向結(jié)構(gòu)體數(shù)組的指針類似與多維數(shù)組中指向一維數(shù)組的指針。例:類似與多維數(shù)組中指向一維數(shù)組的指針。例: #includestring.h #includestdio.h struct student int num; char name20

21、; char sex; int age; ;結(jié)構(gòu)體共用體與枚舉類型結(jié)構(gòu)體共用體與枚舉類型-西安交西安交大大 struct student stu3=10101, Li Lin, M, 18, 10102, Zhang Fun, M, 19, 10104, Wang Min, F, 20; void main() struct student *p; printf( No. Name Sex agen); for (p=stu; pnum, p-name, p-sex, p-age); 注意:注意:p定義為定義為struct student類型,它只能指向這種類型的結(jié)構(gòu)類型,它只能指向這種類型的

22、結(jié)構(gòu)體變量,而不能指向該類型的成員(體變量,而不能指向該類型的成員(p=&是錯誤的)其是錯誤的)其它類型的結(jié)構(gòu)體變量。它類型的結(jié)構(gòu)體變量。 結(jié)構(gòu)體共用體與枚舉類型結(jié)構(gòu)體共用體與枚舉類型-西安交西安交大大用結(jié)構(gòu)體變量和指向結(jié)構(gòu)體的指針作為函數(shù)參數(shù)用結(jié)構(gòu)體變量和指向結(jié)構(gòu)體的指針作為函數(shù)參數(shù)將一個結(jié)構(gòu)體變量的值傳遞給另一個函數(shù)有將一個結(jié)構(gòu)體變量的值傳遞給另一個函數(shù)有3 3個方法:個方法:用結(jié)構(gòu)體變量的成員作參數(shù),將實參值傳給形參用結(jié)構(gòu)體變量的成員作參數(shù),將實參值傳給形參 用法和用普通變量作實參是一樣的,屬于用法和用普通變量作實參是一樣的,屬于“值傳遞值傳遞”方式。應(yīng)當(dāng)注意實方式。應(yīng)當(dāng)

23、注意實參和形參的類型保持一致。參和形參的類型保持一致。2.2.用結(jié)構(gòu)體變量作實參用結(jié)構(gòu)體變量作實參 此方法采用的是此方法采用的是“值傳遞值傳遞”的方式,將結(jié)構(gòu)體變量所占的內(nèi)存單元的內(nèi)的方式,將結(jié)構(gòu)體變量所占的內(nèi)存單元的內(nèi)容全部順序傳遞給形參。形參也必須是同類型的結(jié)構(gòu)體變量。在函數(shù)容全部順序傳遞給形參。形參也必須是同類型的結(jié)構(gòu)體變量。在函數(shù)調(diào)用其間形參也要占用內(nèi)存單元。這種傳遞方式在空間和時間上開銷調(diào)用其間形參也要占用內(nèi)存單元。這種傳遞方式在空間和時間上開銷較大。此外,由于采用值傳遞方式,如果在執(zhí)行被調(diào)用函數(shù)其間改變較大。此外,由于采用值傳遞方式,如果在執(zhí)行被調(diào)用函數(shù)其間改變了形參(也是結(jié)構(gòu)體變

24、量)的值,該值不能返回主調(diào)函數(shù),這往往造了形參(也是結(jié)構(gòu)體變量)的值,該值不能返回主調(diào)函數(shù),這往往造成使用上的不便。因此一般較少用這種方法。成使用上的不便。因此一般較少用這種方法。3.3.用指向結(jié)構(gòu)體變量(或數(shù)組)的指針作實參,將結(jié)構(gòu)體變量(或數(shù)組)用指向結(jié)構(gòu)體變量(或數(shù)組)的指針作實參,將結(jié)構(gòu)體變量(或數(shù)組)的地址傳給形參。的地址傳給形參。結(jié)構(gòu)體共用體與枚舉類型結(jié)構(gòu)體共用體與枚舉類型-西安交西安交大大 #includestdio.h #define format %dn%sn%fn%fn%fn struct student int num; char name20; char sex; fl

25、oat score3; ;void main() void print(); struct student stu; stu.num=12345; strcpy(, Li Li); stu.score0=67.5; stu.score1=89; stu.score2=78.6; printf(&stu);void print(p) struct student *p; printf(format, p-num, p-name, p-score0, p-score1, p-score2); printf(n); 結(jié)構(gòu)體共用體與枚舉類型結(jié)構(gòu)體共用體與枚舉類型-西安交西安交大大9.4

26、 9.4 共用體共用體 共用體是使用覆蓋技術(shù)將幾個不同類型的變量置于同一段共用體是使用覆蓋技術(shù)將幾個不同類型的變量置于同一段內(nèi)存,雖然它們各自占的內(nèi)存長度不同,但起始地址相同。內(nèi)存,雖然它們各自占的內(nèi)存長度不同,但起始地址相同。共用體定義的一般形式:共用體定義的一般形式:unionunion 共用體名共用體名 成員表列成員表列 變量表列;變量表列;結(jié)構(gòu)體和共用體機制上的區(qū)別:結(jié)構(gòu)體和共用體機制上的區(qū)別: 結(jié)構(gòu)體所占內(nèi)存長度是各成員占的長度之和。即每個成員結(jié)構(gòu)體所占內(nèi)存長度是各成員占的長度之和。即每個成員分別占有其自己的內(nèi)存單元。共用體變量所占內(nèi)存長度是最長分別占有其自己的內(nèi)存單元。共用體變量所

27、占內(nèi)存長度是最長的成員的長度。的成員的長度。例如:例如:union aint i; char ch; float f;a, b, c;a.ch=Ha.i=23a.f=1234.4567結(jié)構(gòu)體共用體與枚舉類型結(jié)構(gòu)體共用體與枚舉類型-西安交西安交大大已知:已知:union int i; char c; float a;test;則:則:sizeof(test)的值是:的值是:4結(jié)構(gòu)體共用體與枚舉類型結(jié)構(gòu)體共用體與枚舉類型-西安交西安交大大 共用體數(shù)據(jù)的特點 1) 1)同一個內(nèi)存段可以用來存放幾種不同類型的成員變量,但在同一個內(nèi)存段可以用來存放幾種不同類型的成員變量,但在每個瞬間只能存放其中一種,而

28、不是同時存放幾種。起作用的是最每個瞬間只能存放其中一種,而不是同時存放幾種。起作用的是最后依次存放的成員。如經(jīng)過以下三次賦值后,只有后依次存放的成員。如經(jīng)過以下三次賦值后,只有a.f=1.5a.f=1.5有效。有效。 a.i=1; a.ch=a.i=1; a.ch=a a; a.f=1.5; a.f=1.5; 2) 2)共用體變量的地址和它的各成員的地址都是同一個地址共用體變量的地址和它的各成員的地址都是同一個地址 3)3)不能對共用體變量名賦值。也不能企圖引用變量名得到成員不能對共用體變量名賦值。也不能企圖引用變量名得到成員值,不能在定義共用體變量時對它初始化。下面是錯誤的:值,不能在定義共

29、用體變量時對它初始化。下面是錯誤的:(1) union (1) union int i;int i; char ch; char ch; float f; float f;a=a, a=a, a a, 1.5;, 1.5;(2) a=1;(2) a=1;(3) m=a;(3) m=a;結(jié)構(gòu)體共用體與枚舉類型結(jié)構(gòu)體共用體與枚舉類型-西安交西安交大大 4) 4)在函數(shù)間傳遞共用體時,只能使用指針的方法。在函數(shù)間傳遞共用體時,只能使用指針的方法。 5)5)共用體類型可以出現(xiàn)在結(jié)構(gòu)體類型定義中,也可以定義共用體類型可以出現(xiàn)在結(jié)構(gòu)體類型定義中,也可以定義共用體數(shù)組。反之,結(jié)構(gòu)體也可以出現(xiàn)在共用體類型定義

30、中,共用體數(shù)組。反之,結(jié)構(gòu)體也可以出現(xiàn)在共用體類型定義中,數(shù)組也可以作為共用體的成員。數(shù)組也可以作為共用體的成員。要作如下表格的數(shù)據(jù)管理,對教師(要作如下表格的數(shù)據(jù)管理,對教師(“T T”)要注明職務(wù))要注明職務(wù)(“positionposition”),對學(xué)生(),對學(xué)生(“S S”)要注明班級()要注明班級(“classclass”)。)。由于數(shù)據(jù)的不完全一致,對班級和職務(wù)要用到共用體。由于數(shù)據(jù)的不完全一致,對班級和職務(wù)要用到共用體。namenumsexjobClass PositionLi1011 FS501Wang2085 MTprof 結(jié)構(gòu)體共用體與枚舉類型結(jié)構(gòu)體共用體與枚舉類型-西安

31、交西安交大大struct int num; char name10; char sex; char job; union int class; char position10; category; person2; main() int n, i; for (i=0; i2; i+) scanf(%d %s %c %c, &personi.num, , &personi.sex, &personi.job); if (personi.job=s) scanf(%d, &personi.category.class); else if (personi.job=t) sc

32、anf(%s, personi.category.position); else printf(ninput error!); 結(jié)構(gòu)體共用體與枚舉類型結(jié)構(gòu)體共用體與枚舉類型-西安交西安交大大printf(n); printf(No. name sex job class/positionn); for (i=0; i2; i+) if (personi.job=s) printf(%-6d%-10s%-3c%-3c%-6dn, personi.num, , personi.sex, personi.job, personi.category.class); else p

33、rintf(%-6d%-10s%-3c%-3c%-6sn, personi.num, , personi.sex, personi.job, personi.category.position); 結(jié)構(gòu)體共用體與枚舉類型結(jié)構(gòu)體共用體與枚舉類型-西安交西安交大大9.5 9.5 枚舉類型枚舉類型如果變量只有幾種可能的值,可以定義為枚舉類型。它是把變量如果變量只有幾種可能的值,可以定義為枚舉類型。它是把變量的值一一列舉出來。變量只能取列舉出的值。的值一一列舉出來。變量只能取列舉出的值。枚舉類型定義一般方法:枚舉類型定義一般方法:enum weekday sun, mon, t

34、ue, wed, thu, fri, sat;變量聲明方法:變量聲明方法:enum weekday workday, week_end;workday和和week_end被定義為枚舉變量,它們只能取值于被定義為枚舉變量,它們只能取值于sun到到sat之一。如:之一。如:workday=mon;week_end=sum;是正確的。是正確的。 結(jié)構(gòu)體共用體與枚舉類型結(jié)構(gòu)體共用體與枚舉類型-西安交西安交大大1 1在在C C編譯中,對枚舉按常量處理,故稱枚舉常量。不能對它們賦值。例如:編譯中,對枚舉按常量處理,故稱枚舉常量。不能對它們賦值。例如: Mon = 1; Sun = 7; Mon = 1;

35、Sun = 7; 是錯誤的。是錯誤的。2 2枚舉元素作為常量,它們是有值的,如果沒有進行初始化,第一個枚舉元素的枚舉元素作為常量,它們是有值的,如果沒有進行初始化,第一個枚舉元素的值是值是0 0,第二個枚舉元素的值為,第二個枚舉元素的值為1 1,依此類推。例如,對上述枚舉變量,依此類推。例如,對上述枚舉變量wordkaywordkay來說,來說,如下語句:如下語句: workday = Fri;printf(workday = Fri;printf(“%d%d”,workday); ,workday); 輸出結(jié)果是輸出結(jié)果是4 4。也可以改變枚舉元素的值,在定義時由程序指定,例如:也可以改變枚

36、舉元素的值,在定義時由程序指定,例如: enum weekday Mon = 1,Tue,Wed,Thu,Fri,Sat,Sun workday;enum weekday Mon = 1,Tue,Wed,Thu,Fri,Sat,Sun workday;定義定義MonMon為為1 1,以后順序加,以后順序加1 1,SunSun為為7 7。3 3枚舉類型變量只能取枚舉元素表中的某個元素,而不能是其它值。不能把整數(shù)枚舉類型變量只能取枚舉元素表中的某個元素,而不能是其它值。不能把整數(shù)直接賦給枚舉變梁。例如:直接賦給枚舉變梁。例如:workday = 2 ;workday = 2 ;是錯誤的。它們屬于不

37、同的類型。應(yīng)先是錯誤的。它們屬于不同的類型。應(yīng)先進行強制類型轉(zhuǎn)換才能賦值。例如:進行強制類型轉(zhuǎn)換才能賦值。例如:workday = (enum weekday) 2;workday = (enum weekday) 2;甚至可以是表甚至可以是表達式。例如:達式。例如:workday = (enum weekday) (5-3);workday = (enum weekday) (5-3);4 4枚舉值可以用來作判斷比較。例如:枚舉值可以用來作判斷比較。例如:if (workday = Mon) if (workday = Mon) 枚舉值的比較規(guī)則是:按其在定義時的順序號比較。順序號大,枚舉值

38、也大。如枚舉值的比較規(guī)則是:按其在定義時的順序號比較。順序號大,枚舉值也大。如果果workday = Friworkday = Fri,那么,那么workdayworkday就大于就大于TueTue。 枚舉類型的變量在使用時要注意以下幾點:枚舉類型的變量在使用時要注意以下幾點: 結(jié)構(gòu)體共用體與枚舉類型結(jié)構(gòu)體共用體與枚舉類型-西安交西安交大大例:已知今天是星期日,編寫一個程序,求若干天后是星期幾。#include void main() int n; enum sun,mon,tue,wed,thu,fri,sat day; char weekday77 = 星期日星期日,星期一星期一,星期二星期二, 星期三星期三,星期四星期四,星期五星期五,星期六星期六; printf(輸入間隔天數(shù)輸入間隔天數(shù):); scanf(%d,&n); day = sun; printf(今天是今天是%s,%d天后是天后是%s.n,we

溫馨提示

  • 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)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論