c語言學(xué)習(xí),c語言課件第9章_第1頁
c語言學(xué)習(xí),c語言課件第9章_第2頁
c語言學(xué)習(xí),c語言課件第9章_第3頁
c語言學(xué)習(xí),c語言課件第9章_第4頁
c語言學(xué)習(xí),c語言課件第9章_第5頁
已閱讀5頁,還剩51頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、第9章 結(jié)構(gòu)體與共用體本章學(xué)習(xí)目標(biāo)本章學(xué)習(xí)目標(biāo)q 掌握結(jié)構(gòu)體類型的定義。掌握結(jié)構(gòu)體類型的定義。q 熟練掌握結(jié)構(gòu)體變量的引用和初始化。熟練掌握結(jié)構(gòu)體變量的引用和初始化。q 掌握結(jié)構(gòu)體數(shù)組的使用。掌握結(jié)構(gòu)體數(shù)組的使用。q 熟練掌握指向結(jié)構(gòu)體類型的指針的使用。熟練掌握指向結(jié)構(gòu)體類型的指針的使用。q 掌握共用體數(shù)據(jù)類型的定義和引用。掌握共用體數(shù)據(jù)類型的定義和引用。q 了解枚舉類型和用了解枚舉類型和用TYPEDEF定義類型。定義類型。 Return9.1 結(jié)構(gòu)體類型與結(jié)構(gòu)體變量的定義 9.2 結(jié)構(gòu)體變量的引用與初始化 9.3 結(jié)構(gòu)體數(shù)組 9.4 指向結(jié)構(gòu)體類型數(shù)據(jù)的指針 9.5 共用體 9.6 枚舉類型

2、 9.7 用typedef定義類型 9.8 結(jié)構(gòu)體應(yīng)用舉例 9.1 結(jié)構(gòu)體類型與結(jié)構(gòu)體變量的定義 9.1.1 結(jié)構(gòu)體類型的定義結(jié)構(gòu)體類型的定義 在生活中我們通常會(huì)在住宿表上登記姓名、性別、身份證號(hào)碼等項(xiàng)目;在通訊地址表中記錄姓名、郵編、郵箱地址、電話號(hào)碼、E-mail等項(xiàng)目。這些表中集合了各種類型的數(shù)據(jù),無法用前面學(xué)過的任一種簡(jiǎn)單數(shù)據(jù)類型完全描述,因此C引入一種能集中不同數(shù)據(jù)類型于一體的數(shù)據(jù)類型結(jié)構(gòu)體類型。 姓名(字符串)性別(字符)職業(yè)(字符串)年齡(整型)身份證號(hào)碼(長(zhǎng)整型或字符串)住宿表可由下面的項(xiàng)目構(gòu)成: 下面讓我們分析一下住宿表、成績(jī)表、通訊地址等數(shù)據(jù)的特點(diǎn)。 成績(jī)表可由下面的項(xiàng)目構(gòu)

3、成: 班級(jí)(字符串) 學(xué)號(hào)(長(zhǎng)整型) 姓名(字符串) 操作系統(tǒng)(實(shí)型) 數(shù)據(jù)結(jié)構(gòu)(實(shí)型) 計(jì)算機(jī)網(wǎng)絡(luò)(實(shí)型) 姓名(字符串) 工作單位(字符串) 家庭住址(字符串) 郵編(長(zhǎng)整型) 電話號(hào)碼(字符串或長(zhǎng)整型) 通訊地址表可由下面的項(xiàng)目構(gòu)成: E-mail(字符串) 顯然,這些登記表中包含多種不同數(shù)據(jù)類型的數(shù)據(jù)項(xiàng),用簡(jiǎn)單類型的變量無法描述清楚。但可用C語言提供的結(jié)構(gòu)體類型描述如下: /*住宿表結(jié)構(gòu)*/struct accommodchar name20; /*姓名*/ char sex; /*性別*/ char job40; /*職業(yè)*/ int age; /*年齡*/ long number;

4、/*身份證號(hào)碼*/ ; /*成績(jī)表結(jié)構(gòu)*/struct score char grade20; /* 班級(jí)*/ long number; /*學(xué)號(hào)*/ char name20; /*姓名*/ float os; /*操作系統(tǒng)*/ float datastru;/*數(shù)據(jù)結(jié)構(gòu)*/ float compnet;/*計(jì)算機(jī)網(wǎng)絡(luò)*/ ; /*通訊地址表結(jié)構(gòu)*/struct addr char name20; char department30 ;/*部門*/ char address30; /*住址*/ long box; /*郵編*/ long phone; /*電話號(hào)碼*/ char email30

5、; /*Email*/; 像這些對(duì)不同登記表的數(shù)據(jù)結(jié)構(gòu)的描述類型稱為結(jié)構(gòu)體類型 C語言對(duì)結(jié)構(gòu)體類型定義的一般形式如下: struct struct 結(jié)構(gòu)體名結(jié)構(gòu)體名 成員項(xiàng)表列成員項(xiàng)表列 ; /* 此行分號(hào)不能少!*/ 有了結(jié)構(gòu)體類型,我們就可以定義結(jié)構(gòu)體類型變量,對(duì)不同變量的各成員進(jìn)行引用。 9.1.2 結(jié)構(gòu)體類型變量的定義結(jié)構(gòu)體類型變量的定義 結(jié)構(gòu)體類型變量的定義與其它類型的變量的定義是一樣的,但由于結(jié)構(gòu)體類型需要針對(duì)問題事先自行定義,所以結(jié)構(gòu)體類型變量的定義形式就增加了靈活性,共計(jì)有3種形式,分別介紹如下: 1. 1. 先定義結(jié)構(gòu)體類型,再定義結(jié)構(gòu)體類型變量:先定義結(jié)構(gòu)體類型,再定義結(jié)構(gòu)

6、體類型變量: struct stu /*定義學(xué)生結(jié)構(gòu)體類型*/ char name20; /* 學(xué)生姓名*/char sex; /* 性別*/long num; /*學(xué)號(hào)*/float score3; /* 三科考試成績(jī)*/; struct stu student1,student2; /* 定義結(jié)構(gòu)體類型變量*/用此結(jié)構(gòu)體類型,可以定義更多的該結(jié)構(gòu)體類型變量。 2. 2. 定義結(jié)構(gòu)體類型同時(shí)定義結(jié)構(gòu)體類型變量:定義結(jié)構(gòu)體類型同時(shí)定義結(jié)構(gòu)體類型變量: struct data int day;int month;int year; time1,time2 ; 也可以再定義如下變量:struct

7、data time3,time4 ; 用此結(jié)構(gòu)體類型,同樣可以定義更多的該結(jié)構(gòu)體類型變量。 3. 3. 直接定義結(jié)構(gòu)體類型變量:直接定義結(jié)構(gòu)體類型變量:struct char name20; /*學(xué)生姓名*/ char sex; /*性別*/ long num; /*學(xué)號(hào)*/ float score3; /*三科考試成績(jī)*/ person1,person2; /*定義該結(jié)構(gòu)體類型變量*/注意:注意:該定義方法由于無法記錄該結(jié)構(gòu)體類型,所以除直接定義外,不能再定義該結(jié)構(gòu)體類型變量。 關(guān)于結(jié)構(gòu)體類型,有幾點(diǎn)要說明: (1)類型與變量是不同的概念,不要混同。只能對(duì)變量賦值、存取或運(yùn)算,而不能對(duì)一個(gè)類

8、型賦值、存取或運(yùn)算。在編譯時(shí),對(duì)類型是不分配空間的,只對(duì)變量分配空間。(2)數(shù)據(jù)類型相同的數(shù)據(jù)項(xiàng),既可逐個(gè)、逐行分別定義,也可合并成一行定義。例如,上面的日期結(jié)構(gòu)類型,也可改為如下形式: struct date int year, month, day; ; (3)結(jié)構(gòu)體中的成員,既可以是基本數(shù)據(jù)類型,也允許是另一個(gè)已經(jīng)定義的結(jié)構(gòu)類型。如:struct data int day; int month; int year;struct stu /*定義學(xué)生結(jié)構(gòu)體類型*/ char name20; /* 學(xué)生姓名*/ char sex; /* 性別*/ long num; /*學(xué)號(hào)*/ struc

9、t data birthday;/* birthday是struct data類型*/ float score3; /* 三科考試成績(jī)*/student1,student2; 在stu結(jié)構(gòu)中的birthday成員又是一個(gè)結(jié)構(gòu)體(struct data)類型的變量。 (4)成員名可以與程序中的變量名相同,但二者不代表同一對(duì)象。 9.2 結(jié)構(gòu)體變量的引用與初始化 9.2.1 9.2.1 結(jié)構(gòu)體類型變量的引用結(jié)構(gòu)體類型變量的引用 引用結(jié)構(gòu)體類型變量的一般形式為:引用結(jié)構(gòu)體類型變量的一般形式為: 結(jié)構(gòu)體類型變量名結(jié)構(gòu)體類型變量名 . .成員名成員名其中其中“.”.”是是成員成員( (分量分量) )運(yùn)算

10、符運(yùn)算符,它在所有運(yùn)算符中優(yōu)先級(jí)最高。,它在所有運(yùn)算符中優(yōu)先級(jí)最高。 說明:說明:(1)(1)結(jié)構(gòu)體類型變量的各成員與相應(yīng)的簡(jiǎn)單類型變量一樣可以進(jìn)行結(jié)構(gòu)體類型變量的各成員與相應(yīng)的簡(jiǎn)單類型變量一樣可以進(jìn)行各種運(yùn)算,例如:各種運(yùn)算,例如:student2.score1= student1.score1;student2.score1= student1.score1;sum=stud1.score0+stud1.score1+stud1.score2;sum=stud1.score0+stud1.score1+stud1.score2;(2)(2)如果成員本身又屬一個(gè)結(jié)構(gòu)體類型,則要用若干成員運(yùn)算

11、符如果成員本身又屬一個(gè)結(jié)構(gòu)體類型,則要用若干成員運(yùn)算符,一級(jí)一級(jí)地找到最低的一級(jí)成員。,一級(jí)一級(jí)地找到最低的一級(jí)成員。只能對(duì)最低級(jí)的成員進(jìn)行只能對(duì)最低級(jí)的成員進(jìn)行賦值或存取以及運(yùn)算賦值或存取以及運(yùn)算。例如:。例如:student1. birthday.day=01student1. birthday.day=01;student1.birthday.month=10student1.birthday.month=10;student.birthday.year=2004student.birthday.year=2004; (3)可以引用結(jié)構(gòu)體類型變量成員的地址,也可以引用結(jié)構(gòu)體變量的地址。例

12、如: scanf(%f,&student.scorei) 9.2.2 結(jié)構(gòu)體類型變量的初始化結(jié)構(gòu)體類型變量的初始化 和其他類型變量一樣,對(duì)結(jié)構(gòu)體變量可以在定義時(shí)指定初始值,但結(jié)構(gòu)體類型變量匯集了各類不同數(shù)據(jù)類型的成員,所以結(jié)構(gòu)體類型變量的初始化就略顯復(fù)雜。例如:struct stu /*定義學(xué)生結(jié)構(gòu)體類型*/ char name20; /* 學(xué)生姓名*/char sex; /* 性別*/long num; /*學(xué)號(hào)*/float score3; /* 三科考試成績(jī)*/;struct stu student=liping,f,970541,98.5,97.4,95;當(dāng)然我們也可以通過C提

13、供的輸入輸出函數(shù)完成對(duì)結(jié)構(gòu)體類型變量成員的賦值。由于結(jié)構(gòu)體類型變量成員的數(shù)據(jù)類型通常是不一樣的,所以一般是將結(jié)構(gòu)體類型變量成員以字符串的形式輸入,利用C的類型轉(zhuǎn)換函數(shù)將其轉(zhuǎn)換為所需類型。類型轉(zhuǎn)換的函數(shù)有:int atoi( char *str); /* 轉(zhuǎn)換str所指向的字符串為整型。*/double atof(char *str); /* 轉(zhuǎn)換str所指向的字符串為實(shí)型。 */long atol(char *str); /* 轉(zhuǎn)換str所指向的字符串為長(zhǎng)整型。*/使用上述函數(shù),要包含頭文件stdlib.h。 例如,對(duì)上述的結(jié)構(gòu)體類型變量student各成員賦值可以采用以下方法:char te

14、mp20;gets() ; /* 輸入姓名*/student.sex=getchar( ) ; /* 輸入性別*/gets(temp) ; /* 輸入學(xué)號(hào)*/student.num=atol(temp) ; /* 轉(zhuǎn)換為長(zhǎng)整型*/for(i=0;i3;i+) /* 輸入三科成績(jī)*/gets(temp) ; student.scorei=atoi(temp) ; /* 轉(zhuǎn)換為整型*/ 9.3 結(jié)構(gòu)體數(shù)組 結(jié)構(gòu)體數(shù)組與前面介紹過的基本數(shù)據(jù)類型數(shù)組的不同之處是每個(gè)數(shù)組元素都是一個(gè)結(jié)構(gòu)體類型的數(shù)據(jù),都包括多個(gè)成員數(shù)據(jù)項(xiàng)。 9.3.1 9.3.1 結(jié)構(gòu)體數(shù)組的定義結(jié)構(gòu)體數(shù)組的定義

15、 和定義結(jié)構(gòu)體變量的方法相仿,只需說明其為數(shù)組即可。如:struct stu /*定義學(xué)生結(jié)構(gòu)體類型*/ char name20; /*學(xué)生姓名*/char sex; /*性別*/long num; /*學(xué)號(hào)*/float score3; /*三科考試成績(jī)*/;struct stu stud3; /*定義結(jié)構(gòu)體類型數(shù)組stud */ 9.3.2 9.3.2 結(jié)構(gòu)體數(shù)組的初始化結(jié)構(gòu)體數(shù)組的初始化 與其他類型一樣,對(duì)結(jié)構(gòu)體數(shù)組可以初始化。如: struct stu char name20; char sex; long num; float score3; ;struct stu stud3=li

16、ping,m,9901,78.4,68.5,99.4, weifeng,f,9902,67.4,88.5,90.0, xiaoling,m,9903,87.5,97.5,80.0; 結(jié)構(gòu)數(shù)組名結(jié)構(gòu)數(shù)組名nn初值表初值表11, 初值表初值表22,., 初值表初值表nn; 9.3.3 結(jié)構(gòu)體數(shù)組應(yīng)用舉例結(jié)構(gòu)體數(shù)組應(yīng)用舉例 【例【例9-19-1】建立一個(gè)有4個(gè)人的電子通信錄,并輸出通信錄的內(nèi)容。 【思路導(dǎo)航】【思路導(dǎo)航】設(shè)通信錄的每一條記錄都包括姓名、性別、出生年月、通信地址和聯(lián)系電話幾項(xiàng),而在這幾項(xiàng)中,出生年月又包括年份、月份和日期,通信地址又包括郵編和家庭地址兩項(xiàng),我們把這些聯(lián)系較為緊密的內(nèi)容又

17、用單獨(dú)的結(jié)構(gòu)表示。對(duì)于4個(gè)人的記錄可以定義一個(gè)包含4個(gè)元素的結(jié)構(gòu)體數(shù)組。 / /* *exam9_1exam9_1* */ /#include stdio.hstruct addr /*通信地址結(jié)構(gòu)定義*/ char postcode10; /*郵編*/ char addr40; /*家庭住址*/ ; struct birth /*出生年月結(jié)構(gòu)定義*/ int year; int month; int day;struct friend /*電子通信錄結(jié)構(gòu)定義*/ int number; char name20; char sex; struct birth birthday; struct

18、addr address; char telephone13;friends4; int main(void) int i;/*以下是輸入信息*/ for(i=0;i4;i+) friendsi.number=i+1; printf(tenter NO.%d s data:n,i+1); printf(tenter name:); scanf(%s,); getchar(); /*清除鍵盤緩沖區(qū)對(duì)輸入的影響*/ printf(ntenter sex(m/f):); scanf(%c,&friendsi.sex); printf(ntenter birthday

19、:); printf(nttyear:); scanf(%d,&friendsi.birthday.year); printf(nttmonth:); scanf(%d,&friendsi.birthday.month); printf(nttday:); scanf(%d,&friendsi.birthday.day); printf(ntpostcode:); scanf(%s,friendsi.address.postcode); printf(ntaddress:); scanf(%s,friendsi.address.addr); printf(ntphone

20、:); scanf(%s,friendsi.telephone); /* 以下是輸出信息*/ for(i=0;ipostcode=”510070”;p-addr=”guangzhou”;結(jié)構(gòu)體變量在內(nèi)存中的起始地址稱為結(jié)構(gòu)體變量的指針。 下面通過一個(gè)簡(jiǎn)單例子來說明指向結(jié)構(gòu)體變量的指針的應(yīng)用。 【例【例9-29-2】先從鍵盤給一個(gè)結(jié)構(gòu)體類型變量的各成員賦值,然后在屏幕輸出。 / /* *exam9_2exam9_2* */ /#includestdio.h #includestdlib.h /*使用malloc()需要*/struct addr char name10; char departm

21、ent10 ; /* 部門*/ char address20; /*住址*/ char code10; /* 郵編*/ char phone12; /* 電話號(hào)碼*/ char email20; /* Email */; int main(void) /*定義main()函數(shù)*/ struct addr *person; /* 定義結(jié)構(gòu)體類型指針變量*/ person = malloc(sizeof(struct addr); /* 為指針變量分配安全的地址*/ printf(enter name,department,address,postcode, phone, Email:n); ge

22、ts(person-name); gets(person-department) ; gets(person-address); gets(person-code); gets(person-phone); gets(person-email); /*以下打印輸出各成員項(xiàng)的值*/ printf(nname:%sn,person-name); printf(department:%sn,person-department); printf(address:%sn,person-address); printf(postcode:%sn,person-code); printf(phone:%sn

23、,person-phone); printf(Email:%sn,person-email); return 0; 通過指向結(jié)構(gòu)變量的指針來訪問結(jié)構(gòu)變量的成員,與直接使用結(jié)構(gòu)變量的效果是一樣的,只是使用的成員運(yùn)算符不同,前者為“-”,后者為“.”。如果指針變量pointer已指向結(jié)構(gòu)變量var,則以下三種形式是等價(jià)的:(1)var.成員(2)pointer-成員 /*“-”稱為指向運(yùn)算符*/(3)( (*pointer) ).成員 /*括號(hào)不能??!*/ 演示9.4.2 指向結(jié)構(gòu)體數(shù)組的指針指向結(jié)構(gòu)體數(shù)組的指針 定義結(jié)構(gòu)體類型的指針,既可以指向結(jié)構(gòu)體變量,也可以指向結(jié)構(gòu)體數(shù)組。例如,可以在例9-

24、2中定義的結(jié)構(gòu)體類型基礎(chǔ)上再定義結(jié)構(gòu)體數(shù)組及指向結(jié)構(gòu)體類型的指針如下:struct addr char name10; char department10 ; /* 部門*/ char address20; /*住址*/ char code; /* 郵編*/ char phone; /* 電話號(hào)碼*/ char email20; /* Email */;struct addr person4,*p; /* 定義結(jié)構(gòu)體數(shù)組person及指向結(jié)構(gòu)體類型的指針p*/p=person; 語句“p=person;”使指針p指向了結(jié)構(gòu)體數(shù)組person。對(duì)數(shù)組元素的引用可采用三種方法。1) 地址法pers

25、on+i和p+i均表示數(shù)組第i個(gè)元素的地址,數(shù)組元素各成員的引用形式為:(person+i)-name、(person+i)-department和(p+i)-name、(p+i)-department等。person+i和p+i與&personi意義相同。2) 指針法若p指向數(shù)組的某一個(gè)元素,則p+就指向其后續(xù)元素。3) 指針的數(shù)組表示法若p=person,我們說指針p指向數(shù)組person,pi表示數(shù)組的第i個(gè)元素,其效果與personi等同。對(duì)數(shù)組成員的引用描述為: 、pi. department等?!纠纠?-39-3】指向結(jié)構(gòu)體數(shù)組的指針變量的使用。 / /* *

26、exam9_3exam9_3* */ /#include stdio.hstruct addr char name10; char department10 ; /* 部門*/ char address20; /*住址*/ char code10; /* 郵編*/ char phone12; /* 電話號(hào)碼*/ char email20; /* Email */; int main(void) int i; struct addr *p,person4= liying,信息學(xué)院,文明路5號(hào)東3棟302, 524001, 3385201, wangping,文法學(xué)院,文明路5號(hào)東5棟402, 5

27、24001, 3385212, libo ,航海學(xué)院,解放路34號(hào)西4棟205, 524011, 2382424, xuyan,工程學(xué)院,海濱路43號(hào)2號(hào)樓302, 524005, 2382465,;p=person; /*將數(shù)組的首地址賦值給指針p , p 指向了一維數(shù)組person*/for(i=0;iname); printf(部門:%sn,(p+i)-department); printf(地址:%sn,(p+i)-address); printf(郵編:%sn,(p+i)-code); printf(電話:%sn,(p+i)-phone); printf(Email:%sn,(p+i

28、)-email);return 0; 演示9.5 共用體 共用體類型也是用來描述類型不同的數(shù)據(jù),但與結(jié)構(gòu)體類型不同,共用體數(shù)據(jù)成員存儲(chǔ)時(shí)采用覆蓋技術(shù),各數(shù)據(jù)成員共享(或部分共享)同一塊存儲(chǔ)空間。在結(jié)構(gòu)體中增加共用體類型成員,可使結(jié)構(gòu)體中產(chǎn)生動(dòng)態(tài)成員。共用體類型在有的書中亦稱為聯(lián)合體。 9.5.1 9.5.1 共用體類型的定義共用體類型的定義共用體的定義用關(guān)鍵字union標(biāo)識(shí),形式為:union union 共用體名共用體名 成員表列成員表列 ;例如:union data int i; char ch; float f;; 共用體數(shù)據(jù)類型union data包含一個(gè)整型成員、一個(gè)字符成員和一個(gè)單

29、精度浮點(diǎn)數(shù)類型成員。共用體數(shù)據(jù)類型與結(jié)構(gòu)體在形式上非常相似,但其表示的含義及存儲(chǔ)是完全不同的。結(jié)構(gòu)體中的成員有各自的存儲(chǔ)空間,結(jié)構(gòu)體變量所占的內(nèi)存長(zhǎng)度等于各成員的長(zhǎng)度之和,而共用體的各成員是共用一段內(nèi)存空間,因此共用體變量所占的內(nèi)存長(zhǎng)度等于最長(zhǎng)成員的長(zhǎng)度,如圖9-2所示。 4字節(jié)1字節(jié)變量i變量f變量ch結(jié)構(gòu)體 ich共用體f圖9-2共用體類型與結(jié)構(gòu)體類型占用存儲(chǔ)空間的比較2字節(jié)9.5.2 共用體變量的定義共用體變量的定義 共用體變量的定義與結(jié)構(gòu)體變量的定義類似,也有三種方法:1.先定義共用體類型,再定義共用體類型變量。如:union data int i; char ch; float f;

30、;union data un1, un2, un3; 這里先定義了共用體類型data,然后定義了三個(gè)共用體變量un1、un2、un3。 2.定義共用體類型同時(shí)定義共用體類型變量。如:union data int i; char ch; float f; un1, un2, un3;3.直接定義共用體類型變量。如:union int i; char ch; float f; un1, un2, un3;提倡使用第一種方法。 9.5.3 9.5.3 共用體變量的引用共用體變量的引用共用變量體的引用與結(jié)構(gòu)體變量一樣,也只能逐個(gè)引用共用體變量的成員。例如,訪問共用體變量un1各成員的格式為:un1.i

31、、un1.ch、un1.f。說明:說明:(1)共用體變量中,可以包含若干個(gè)成員及若干種類型,但共用體成員不能同時(shí)使用。在每一時(shí)刻,只有一個(gè)成員及一種類型起作用,不能同時(shí)引用多個(gè)成員及多種類型。(2)共用體數(shù)據(jù)成員存儲(chǔ)時(shí)采用覆蓋技術(shù),實(shí)現(xiàn)共用體變量各成員的內(nèi)存共享,所以在某一時(shí)刻,存放的和起作用的是最后一次存入的成員值。例如,執(zhí)行un1.i=1, un1.ch=c, un1.f=3.14后,un1.f才是有效的成員。 (3)由于所有成員共享同一內(nèi)存空間,故共用變量與其各成員的地址相同。例如,un1un1.iun1.chun1.f。(4)不能對(duì)共用變量進(jìn)行初始化(注意:結(jié)構(gòu)變量可以);也不能將共用

32、變量作為函數(shù)參數(shù),以及使函數(shù)返回一個(gè)共用數(shù)據(jù),但可以使用指向共用變量的指針。(5)共用類型可以出現(xiàn)在結(jié)構(gòu)類型定義中,反之亦然。 【例9-5】設(shè)有若干人員的數(shù)據(jù),其中有學(xué)生和教師,教師的數(shù)據(jù)中包括編號(hào)、姓名、職業(yè)、職務(wù),學(xué)生的數(shù)據(jù)中包括編號(hào)、姓名、職業(yè)、班級(jí)?,F(xiàn)要求把這些數(shù)據(jù)放在同表格中,如圖9-3。 【思路導(dǎo)航】【思路導(dǎo)航】這些數(shù)據(jù)中,編號(hào)、姓名、職業(yè)是三個(gè)固定字段,第四個(gè)字段是動(dòng)態(tài)字段,可能是職務(wù)(字符型),也可能是班級(jí)(整型),兩個(gè)中選一個(gè),故用共用體類型描述。假設(shè)考慮三個(gè)人員的數(shù)據(jù),用結(jié)構(gòu)體數(shù)組來描述。 / /* *exam9_5exam9_5* */ /#include stdio.h

33、#include string.hunion cf /*定義共用體cf*/ int classes; /*班級(jí)*/ char position10; /*職務(wù)*/;struct int num; /*編號(hào)*/ char name10; /*姓名*/ char job4; /* 職業(yè)*/ union cf categroy; /*該成員為共用體成員,存放班級(jí)或職務(wù)*/person3; /*定義結(jié)構(gòu)體數(shù)組*/ int main(void) int i;for(i=0;i3;i+) printf(輸入第輸入第%d個(gè)人員的資料:個(gè)人員的資料:n,i+1); scanf(%d%s%s,&pers

34、oni.num,, personi.job); if(!strcmp(personi.job,學(xué)生學(xué)生) scanf(%d,&personi.categroy.classes); else scanf(%s,personi.categroy.position); for(i=0;iSun、Sat最大。(4)枚舉元素的值也是可以人為改變的:在定義時(shí)由程序指定。例如,如果enum weekdays Sun=, Mon ,Tue, Wed, Thu, Fri, Sat;則Sun=,Mon=,從Tue=2開始,依次增。 【例【例9-59-5】從鍵盤輸入一整數(shù),顯示與之對(duì)

35、應(yīng)的星期值。 /*exam9_5*/#include stdio.hint main(void) enum weekdays Mon=1,Tue,Wed,Thu,Fri,Sat, sun workday; int i; printf(請(qǐng)輸入一個(gè)整數(shù):請(qǐng)輸入一個(gè)整數(shù):n); scanf(%d,&i); workday=(enum weekdays )i; /*將將i強(qiáng)制轉(zhuǎn)換為枚舉類型強(qiáng)制轉(zhuǎn)換為枚舉類型*/ switch(workday) case Sun:printf(Sundayn); break; case Mon:printf(Mondayn); break; case Tue:p

36、rintf(Tuesdayn); break; case Wed:printf(Wednesdayn); break; case Thu:printf(Thursdayn); break; case Fri:printf(Fridayn); break; case Sat:printf(Saturdayn); break; default:printf(Input errorn); return 0; 演示9.7 用typedef定義類型 在C語言中除可直接使用提供的標(biāo)準(zhǔn)類型和自定義的類型(結(jié)構(gòu)體、共用體、枚舉等)外,也可使用typedef定義已有類型的別名。該別名與標(biāo)準(zhǔn)類型名一樣,可用來定義

37、相應(yīng)的變量。typedef類型定義的含義是給某個(gè)已有的數(shù)據(jù)類型重新命名,即允許給指定的數(shù)據(jù)類型定義一個(gè)新的名字(原名稱仍然可用),其形式為:typedef typedef 類型名類型名 新名稱新名稱其中,“typedef”類型定義的語句的關(guān)鍵字;“類型名”是系統(tǒng)提供的標(biāo)準(zhǔn)類型名,或者是一個(gè)已定義的類型名;“新名稱”為用戶定義的與類型名等價(jià)的一個(gè)別名。 例如:typedef float REAL; /* 給實(shí)型float定義一個(gè)別名REAL*/REAL a,b; /*定義實(shí)型變量a、b*/ typedef struct date int year, month, day; DATE; /*為結(jié)構(gòu)

38、體定義一個(gè)別名DATE */ DATE birthday;/*定義一個(gè)結(jié)構(gòu)體類型的變量birthday*/ typedef int NUM10; /*定義NUM 為包含10個(gè)元素的數(shù)組類型*/NUM a,b;/*定義了兩個(gè)包含有10個(gè)元素的一維數(shù)組a、b*/ 相當(dāng)于int a10,b10; 說明:(1) 用typedef只是給已有類型增加個(gè)別名,并不能創(chuàng)造個(gè)新的類型。就如同人一樣,除學(xué)名外,可以再取一個(gè)小名(或雅號(hào)),但并不能創(chuàng)造出另一個(gè)人來。(2) typedef與#define有相似之處,但二者是不同的:前者是由編譯器在編譯時(shí)處理的;后者是由編譯預(yù)處理器在編譯預(yù)處理時(shí)處理的,而且只能作簡(jiǎn)單

39、的字符串替換。(3) 定義的別名一般使用大寫字母,以便與系統(tǒng)的標(biāo)準(zhǔn)類型標(biāo)識(shí)符相區(qū)別。(4) 當(dāng)不同源文件中用到同一數(shù)據(jù)類型(尤其是像數(shù)組、指針、結(jié)構(gòu)體、共用體等數(shù)據(jù)類型)時(shí),常用typedef聲明一些數(shù)據(jù)類型,把它們單獨(dú)放在一個(gè)文件中,然后在需要用到它們的文件中用#include命令把它們包含進(jìn)來。(5)使用typedef有利于程序的通用與移植。例如有系統(tǒng)int 型為2個(gè)字節(jié),而有的為4個(gè)字節(jié),若要進(jìn)行程序移植,一定會(huì)出現(xiàn)問題,假如在甲機(jī)器上int 為2 個(gè)字節(jié),在程序中這樣定義:“typedef int INTEGER;”,程序中就可用INTEGER定義變量。此時(shí)若想移植到乙機(jī)器上,而其in

40、t為4個(gè)字節(jié),那么只需將“typedef int INTEGER;”改動(dòng)為:“typedef long INTEGER;”就可以了,其它地方不用修改。9.8 結(jié)構(gòu)體應(yīng)用舉例 【例【例9-79-7】以下是4個(gè)學(xué)生的成績(jī)登記表,除姓名、學(xué)號(hào)外,還有三科成績(jī),編程實(shí)現(xiàn)對(duì)表格的計(jì)算:求出各人的平均分以及各科的平均分,并按各人平均成績(jī)由高分到低分輸出。 Name number English Physics Mathema AverageLiping 001 78 98 76Wangling 002 66 90 86Jiangbo 003 89 70 76Yangming 004 90 100 67題目

41、要求的問題多,采用模塊化編程方式,將問題進(jìn)行分解如下:1) 結(jié)構(gòu)體類型數(shù)組的輸入。2) 求解各學(xué)生的三科平均成績(jī)。3) 按學(xué)生的平均成績(jī)排序。4) 按表格要求輸出。5) 求解各學(xué)生單科平均成績(jī)并輸出。6) 定義main()函數(shù),調(diào)用各子程序。 第一步,根據(jù)具體情況定義結(jié)構(gòu)體類型。struct stuchar name20; /*姓名*/long number; /*學(xué)號(hào)*/float score4; /*數(shù)組依此存放English、Mathema、Physics,及Average*/; 由于有多個(gè)子模塊需要使用該結(jié)構(gòu)體類型,所以將其定義為外部的結(jié)構(gòu)體類型,放在程序的最前面。 第二步,定義結(jié)構(gòu)體

42、類型數(shù)組的輸入模塊。第二步,定義結(jié)構(gòu)體類型數(shù)組的輸入模塊。/ /* *輸入結(jié)構(gòu)體類型數(shù)組輸入結(jié)構(gòu)體類型數(shù)組arrarr的的n n個(gè)元素個(gè)元素* */ /void input(struct stu arr ,int n)void input(struct stu arr ,int n) int i,j; int i,j;char temp30;char temp30;for(i=0;in;i+)for(i=0;in;i+) / /* *打印提示信息打印提示信息* */ / printf(ninputname,number,English,mathema,physicn); printf(ninp

43、utname,number,English,mathema,physicn); gets(); / gets(); /* *輸入姓名輸入姓名* */ / gets(temp); / gets(temp); /* *輸入學(xué)號(hào)輸入學(xué)號(hào)* */ / arri.number=atol(temp); arri.number=atol(temp); for(j=0;j3;j+) for(j=0;j3;j+) gets(temp); / gets(temp); /* *輸入三科成績(jī)輸入三科成績(jī)* */ / arri.scorej=atof(temp); arri.scor

44、ej=atof(temp); 第三步,求解各學(xué)生的三科平均成績(jī)。結(jié)構(gòu)體數(shù)組中第i個(gè)元素arri的成員score的前三個(gè)元素為已知,第四個(gè)Average需計(jì)算得到。void aver(struct stu arr ,int n) int i,j;for(i=0;in;i+) /*n個(gè)學(xué)生*/arri.score3=0;for(j=0;j3;j+)arri.score3=arri.score3+arri.scorej;/*求和*/arri.score3=arri.score3/3; /*平均成績(jī)*/ 第四步,按平均成績(jī)由大到小排序,排序算法采用冒泡法。void order(struct stu arr,int n) struct stu temp;int i,j;for(i=0;in-1;i+) for(j=0;jn-1-i;j+) if(arrj.score3arrj+1.score3) temp=arrj; /*結(jié)構(gòu)體類型變量不允許以整體輸入或輸出,但允許相互賦值*/ arrj=arrj+1;

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(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)論