C程序設(shè)計結(jié)構(gòu)體、聯(lián)合體與枚舉類型_第1頁
C程序設(shè)計結(jié)構(gòu)體、聯(lián)合體與枚舉類型_第2頁
C程序設(shè)計結(jié)構(gòu)體、聯(lián)合體與枚舉類型_第3頁
C程序設(shè)計結(jié)構(gòu)體、聯(lián)合體與枚舉類型_第4頁
C程序設(shè)計結(jié)構(gòu)體、聯(lián)合體與枚舉類型_第5頁
已閱讀5頁,還剩56頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、第11章結(jié)構(gòu)體、聯(lián)合體與枚舉類型 結(jié)構(gòu)體類型是C語言允許用戶定義的又一重要的構(gòu)造數(shù)據(jù)類型。 11.1 結(jié)構(gòu)體的概念11.2 結(jié)構(gòu)體數(shù)組11.3 結(jié)構(gòu)體指針11.4 鏈 表11.5 聯(lián)合體數(shù)據(jù)類型11.6 枚舉數(shù)據(jù)類型11.7 自定義類型 11.1 結(jié)構(gòu)體的概念 結(jié)構(gòu)體類型是一種構(gòu)造數(shù)據(jù)類型,是數(shù)目固定,類型不同的若干有序數(shù)據(jù)項(xiàng)的集合。每個數(shù)據(jù)項(xiàng)稱為一個成員。每一個成員可以是一個基本數(shù)據(jù)類型或者是一個構(gòu)造類型。結(jié)構(gòu)體數(shù)據(jù)類型具有很強(qiáng)的數(shù)據(jù)描述能力,但C語言中并不提供現(xiàn)成的結(jié)構(gòu)體類型。因此,用戶在使用一個結(jié)構(gòu)體類型之前,必須先定義它,也就是要在程序中構(gòu)造所需要的數(shù)據(jù)類型。11.1.1 結(jié)構(gòu)體類型的

2、定義結(jié)構(gòu)體類型定義的一般形式為:struct 結(jié)構(gòu)體類型名 類型標(biāo)識符 成員名1; 類型標(biāo)識符 成員名2; 類型標(biāo)識符 成員名n;;例如,定義一個“學(xué)生信息”的結(jié)構(gòu)體類型如下:struct student int num; char name10; char sex; int age; char addr50; int score;11.1.2 結(jié)構(gòu)體變量的定義、引用、初始化1結(jié)構(gòu)體變量的定義(1)先定義結(jié)構(gòu)體類型,再定義結(jié)構(gòu)體類型變量。這種定義的一般形式為:struct 結(jié)構(gòu)體類型名 結(jié)構(gòu)體變量名表;如上面定義了“學(xué)生信息”的結(jié)構(gòu)體類型struct student后,就可以用它來定義結(jié)構(gòu)體變

3、量。例如:struct student stul,stu2;定義了stul和stu2為struct student類型的變量,編譯系統(tǒng)為變量 stul與stu2分配存儲空間時,其存儲格式與結(jié)構(gòu)體類型struct student所描述的保持一致,結(jié)構(gòu)體中的各個成員按要求順序存放。每一個struct student類型的變量占用的存儲單元為67個字節(jié)。(2)在定義結(jié)構(gòu)體類型的同時定義結(jié)構(gòu)體變量。這種定義的一般形式為:struct 結(jié)構(gòu)體類型名 類型標(biāo)識符 成員名1; 類型標(biāo)識符 成員名2; 類型標(biāo)識符 成員名n; 結(jié)構(gòu)體變量名表; 例如:struct student int num; char n

4、ame10; char sex; int age; char addr50; int score; stu1,stu2;這種定義與前面的定義功能相同,都是既定義了結(jié)構(gòu)體類型struct student,又定義了兩個結(jié)構(gòu)體變量stu1與stu2。(3)直接定義結(jié)構(gòu)體類型的變量。其一般形式為:struct 類型標(biāo)識符 成員名1; 類型標(biāo)識符 成員名2; 類型標(biāo)識符 成員名n; 結(jié)構(gòu)體變量名表;例如:struct int num; char name10; char sex; int age; char addr50; int score; stu1,stu2;2結(jié)構(gòu)體變量的引用結(jié)構(gòu)體成員引用的一般

5、形式如下: 其中“.”為結(jié)構(gòu)體成員運(yùn)算符,所有C語言運(yùn)算符中它的優(yōu)先級最高,因此可以把上述引用形式作為一個整體來看待。 例如, 、分別表示結(jié)構(gòu)體變量stu1的成員name與結(jié)構(gòu)體變量stu2的成員score。 例 定義有關(guān)職工工資信息的結(jié)構(gòu)體類型變量(包括編號、姓名、基本工資、附加工資、水電費(fèi)、實(shí)發(fā)工資),為結(jié)構(gòu)體變量中的成員賦值并輸出其值。struct person int num; /* 職工編號*/ char *name; /* 姓名 */ float base; /* 基本工資*/ float addition; /* 附加工資*/ float cost; /* 水電

6、費(fèi)*/ float salary; /* 實(shí)發(fā)工資*/ ; main() struct person employeea,employeeb; employeea.num=2086; =Zhao xiwang; printf(input base,addition,cost:n); scanf(f,f,f, &employeea.base, &employeea.addition, &employeea.cost); employeea.salary=employeea.base+employeea.addition-employeea.cost; employee

7、b=employeea; printf(Number=dnName=sn, employeeb.num, );. printf(Base=.2fnAddition=.2f n,employeeb.base, employeeb.addition); printf(Cost=.2fnSalary=.2fn, employeeb.cost, employeeb.salary);程序運(yùn)行結(jié)果為:input base,addition,cost:805.85,376.57,123.52Number=2086Name= Zhao xiwang3結(jié)構(gòu)體變量的初始化 結(jié)構(gòu)體變量的

8、初始化和對數(shù)組的初始化相類似。將各個成員的初值用一對花括弧括起來,括弧內(nèi)各數(shù)據(jù)項(xiàng)的數(shù)據(jù)類型、順序要和結(jié)構(gòu)體類型說明中的成員類型相匹配,數(shù)據(jù)項(xiàng)間用逗號分隔。如果初值的個數(shù)少于結(jié)構(gòu)中成員的個數(shù),則余下的成員將自動初始化為0或NULL。例如:struct student int num; char name10; char sex; int age; char addr50; int score;main( ) struct student stu=1422,Lin Hui,M,18,Shang Hai,85; printf(Number=dnName=snSex=cn,stu.num,stu.na

9、me,stu.sex); printf(Age=dnAddress=snScore=dn,stu.age,stu.addr,stu.score);程序運(yùn)行結(jié)果為:Number=1422Name=Lin HuiSex=MAge=18Address=Shang HaiScore=8511.1.3 結(jié)構(gòu)體的嵌套 結(jié)構(gòu)體類型定義時,其成員的類型也可以是結(jié)構(gòu)體類型,即結(jié)構(gòu)體類型定義是可以嵌套的。結(jié)構(gòu)體定義的嵌套可以是多重的。 例如,定義一個“職工信息”的結(jié)構(gòu)體類型。每個職工包含編號(num)、姓名(name)、性別(sex)、出生日期(birthday)、家庭住址(addr)等信息。其中出生日期包括年(

10、year)、月(month)、日(day)3個數(shù)據(jù)項(xiàng),家庭住址包括城市(city)、街道(street)、門牌號碼(streetnum)等信息。職工信息的邏輯結(jié)構(gòu)如圖11.3所示。圖11.3 職工信息邏輯結(jié)構(gòu) 顯然“職工信息”中的“出生日期”和“家庭住址”應(yīng)該用結(jié)構(gòu)體類型描述,首先定義結(jié)構(gòu)體類型“日期”struct date和“住址”struct address如下。struct date int year; /*年 */ int month; /*月 */ int day; /*日 */;struct address char city50; /*城市*/ char street50; /*

11、街道*/ int streetnum; /*門牌號碼*/;然后定義結(jié)構(gòu)體類型“職工”struct employee如下。struct employee int num; char name10; char sex; struct date birthday; struct address addr; 在結(jié)構(gòu)體類型struct employee中,成員birthday是struct date結(jié)構(gòu)體類型,它又有自己的成員year、month、day,成員addr是 struct address結(jié)構(gòu)體類型,它又有自己的成員city、street、streetnum,這就是結(jié)構(gòu)體類型的嵌套定義。 對于

12、嵌套的結(jié)構(gòu)體,引用時應(yīng)按照從左到右,從外到內(nèi)的方式,用“”一級一級地運(yùn)算,直到找到最低一級的成員。例如:struct employee emp;emp.num=1001;strcpy(,Liu Xiaomei);emp.sex=F;emp.birthday.year=1986;emp.birthday.month=5;emp.birthday.day=18;strcpy(emp.addr.city,Bei Jing);strcpy(emp.addr.street,Changan street);emp.addr.streetnum=168; 定義了struct employee

13、類型的變量emp,對其各個成員賦值。賦值后結(jié)構(gòu)體變量emp在內(nèi)存中的存儲形式如圖11.4所示。圖11.4 結(jié)構(gòu)體變量emp11.2 結(jié)構(gòu)體數(shù)組11.2.1 結(jié)構(gòu)體數(shù)組的定義 結(jié)構(gòu)體數(shù)組的定義方法與其他整型數(shù)組、實(shí)型數(shù)組和字符型數(shù)組的定義方法類似。例如:struct student int num; char name10; char sex; int age; char addr50; int score; ;struct student stu40; 與結(jié)構(gòu)體變量的定義類似,結(jié)構(gòu)體數(shù)組的定義也可以采用以下的方式:struct student int num; char name10; cha

14、r sex; int age; char addr50; int score; stu40;或struct int num; char name10; char sex; int age; char addr50; int score; stu40;11.2.2 結(jié)構(gòu)體數(shù)組的引用例 輸入全班的學(xué)生的信息(包括學(xué)號、姓名、性別、年齡、成績和家庭住址),并按成績由高到低的次序排序,輸出排序后的全班學(xué)生信息登記表。struct student int num; char name10; char sex; int age; char addr50; int score; ;main() struct

15、 student stu40,temp; int i,j,k; for(i=0;i40;i+) printf(n學(xué)號:); scanf ( d, &stui.num); printf(n姓名:); scanf (s, ); printf(n性別:); scanf ( c, &stui.sex); printf(n年齡:); scanf ( d, &stui.age); printf(n家庭住址:); scanf (s, stui.addr); printf(n成績:); scanf ( d, &stui.score); for(i=0;i39;i+) k=i; for(j=i

16、+1;j40;j+) if(stuk.scorestuj.score) k=j; temp=stui; stui=stuk; stuk=temp; printf(n學(xué)號t姓名t性別t年齡t家庭住址t成績n); for(i=0;i”來訪問結(jié)構(gòu)體成員,一般形式為: 結(jié)構(gòu)體指針變量-成員名例如:pstu-num=6001;例 編一程序,利用結(jié)構(gòu)體指針處理結(jié)構(gòu)體中的成員。struct student int num; char name10; char sex; int age; char addr50; int score; ;main() struct student stu= 6001,Zhao

17、 zhen ,F,18,Beijing,85,*pstu; pstu=& stu; printf(Number=d, Name =s, Sex=cn ,stu.num, , stu.sex); printf(Age=d, Address =s, Score =dn,stu.age,stu.addr,stu.score); printf(Number=d, Name =s, Sex=cn ,(*pstu).num, (*pstu).name, (*pstu).sex); printf(Age=d, Address =s, Score =dn,(*pstu).age, (*pstu

18、).addr, (*pstu).score); printf(Number=d, Name =s, Sex=cn ,pstu-num, pstu-name, pstu-sex); printf(Age=d, Address =s, Score =dn, pstu-age, pstu-addr, pstu-score);程序運(yùn)行結(jié)果為:Number=6001, Name =Zhao zhen, Sex=FAge=18, Address =Beijing, Score =85Number=6001, Name =Zhao zhen, Sex=FAge=18, Address =Beijing, S

19、core =85Number=6001, Name =Zhao zhen, Sex=FAge=18, Address =Beijing, Score =8511.3.2 指向結(jié)構(gòu)體數(shù)組的指針 同前面討論的指向數(shù)組的指針一樣,結(jié)構(gòu)體指針也可用于指向結(jié)構(gòu)體數(shù)組。 結(jié)構(gòu)體指針變量指向一個結(jié)構(gòu)體數(shù)組,這時結(jié)構(gòu)指針變量的值是整個結(jié)構(gòu)體數(shù)組的首地址。結(jié)構(gòu)體指針變量也可指向結(jié)構(gòu)體數(shù)組中的一個元素,這時結(jié)構(gòu)體指針變量的值是該結(jié)構(gòu)體數(shù)組元素的地址。例 利用結(jié)構(gòu)體指針變量輸出結(jié)構(gòu)體數(shù)組。圖11.8 結(jié)構(gòu)數(shù)組的指針11.3.3 結(jié)構(gòu)體指針作函數(shù)參數(shù) 結(jié)構(gòu)體變量作函數(shù)參數(shù)采取的是“單向值傳遞”方式,系統(tǒng)將實(shí)參結(jié)構(gòu)體的

20、全部成員拷貝給被調(diào)用函數(shù)的形參。 例 編寫程序,用結(jié)構(gòu)體指針變量作函數(shù)參數(shù),計算一組學(xué)生的平均成績和不及格人數(shù)。struct student int num; char name10; int score; stu5= 6001,Zhao zhen ,85,6002, Lin ping ,57,6003,He fang,62, 6004,Zhou ming,87, 6005,Wang tao,48;main() struct student *ps; void aver(struct student *ps); ps=stu; aver(ps);void aver(struct student

21、 *ps) int c=0,i; float ave,sum=0; for(i=0;iscore; if(ps-score成員名例如:union udata u,*pu;pu=&u;則指針pu指向聯(lián)合體變量u,通過指針pu可以訪問u中的各個成員。例如:(*pu).i=23; 表示將23賦給pu指向的聯(lián)合體變量的成員i,或者pu-i=23 以上兩種方法的效果是一樣的,但在使用指針訪問聯(lián)合體成員時,通常使用指向運(yùn)算符“”訪問聯(lián)合體成員。 假設(shè)pu指向聯(lián)合體變量,則下面3個語句的效果是一樣的。u.i=23;等價于(*pu).i=23;等價于pu-i=23 聯(lián)合體的特征決定了它的應(yīng)用遠(yuǎn)不如結(jié)構(gòu)體應(yīng)用那

22、樣廣泛。但是實(shí)際應(yīng)用中,常常會出現(xiàn)一些量相互排斥的情況,這時用聯(lián)合體就非常方便。11.6 枚舉數(shù)據(jù)類型11.6.1 枚舉類型的定義 枚舉類型通過枚舉一系列有序的標(biāo)識符來定義。枚舉類型定義的一般格式為:enmu 枚舉名枚舉分量名1,枚舉分量名2,枚舉分量名n; 其中,enmu是定義枚舉類型的關(guān)鍵字。枚舉名遵循標(biāo)識符命名規(guī)則,用于標(biāo)識所定義的枚舉類型。枚舉分量也是一個合法的標(biāo)識符,由用戶根據(jù)需要自己確定,它們列出一個枚舉變量可以具有的值,又稱為枚舉常量。枚舉常量各自代表一個數(shù)值,因此它們之間有先后順序,可以進(jìn)行比較。例如:enum week sun ,mon,tue,wed,thu,fri,sut;定義了一個枚舉類型enmu week,它由枚舉常量sun 、mon、tue、wed、thu、fri和sut組成,即一個enmu week類型的枚舉變量可以具有的值為sun 、mon、tue、wed、thu、fri和sut。 在C語言中,枚舉類型中的枚舉常量各自隱含一個int型值。在默認(rèn)情況下,枚舉常量的值從0開始,后一個總是比前一個大1。如在枚舉類型week中,第

溫馨提示

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

最新文檔

評論

0/150

提交評論