c語言程序設(shè)計9結(jié)構(gòu)體與共同體_第1頁
c語言程序設(shè)計9結(jié)構(gòu)體與共同體_第2頁
c語言程序設(shè)計9結(jié)構(gòu)體與共同體_第3頁
c語言程序設(shè)計9結(jié)構(gòu)體與共同體_第4頁
c語言程序設(shè)計9結(jié)構(gòu)體與共同體_第5頁
已閱讀5頁,還剩81頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、12021-11-1022021-11-103 一個學(xué)生的信息有一個學(xué)生的信息有學(xué)號學(xué)號、姓名姓名、性別性別、年齡年齡、住住址址、成績成績等。等。 一本圖書的信息有一本圖書的信息有分類編號分類編號、書名書名、作者作者、出版出版社社、出版日期出版日期、價格價格、庫存量庫存量等。等。 如何描述這些類型不同的相關(guān)數(shù)據(jù)?如何描述這些類型不同的相關(guān)數(shù)據(jù)?一種構(gòu)造類型數(shù)據(jù)一種構(gòu)造類型數(shù)據(jù) 結(jié)構(gòu)體結(jié)構(gòu)體由若干不同類型的數(shù)據(jù)項組成,由若干不同類型的數(shù)據(jù)項組成, 構(gòu)成結(jié)構(gòu)體的各個數(shù)據(jù)項稱為構(gòu)成結(jié)構(gòu)體的各個數(shù)據(jù)項稱為結(jié)構(gòu)體成員結(jié)構(gòu)體成員。 2021-11-104 數(shù)據(jù)類型數(shù)據(jù)類型1 成員名成員名1; 數(shù)據(jù)類型數(shù)據(jù)

2、類型2 成員名成員名2; 數(shù)據(jù)類型數(shù)據(jù)類型n 成員名成員名n; ;lstructstruct為關(guān)鍵字;為關(guān)鍵字;l結(jié)構(gòu)體名結(jié)構(gòu)體名是用戶定義是用戶定義的的類型標識類型標識。l 中是組成該結(jié)構(gòu)體中是組成該結(jié)構(gòu)體的的成員成員。成員的。成員的數(shù)據(jù)數(shù)據(jù)類型類型可以是可以是C語言所允語言所允許的任何數(shù)據(jù)類型許的任何數(shù)據(jù)類型。2021-11-105例如圖書類型的定義:例如圖書類型的定義: struct bookcard char num10; /*圖書圖書分類編號是字符數(shù)組類型分類編號是字符數(shù)組類型*/ char name30; /*書名是字符數(shù)組類型書名是字符數(shù)組類型*/ char author30;

3、/*作者是字符數(shù)組類型作者是字符數(shù)組類型*/ char publisher60; /*出版社是字符數(shù)組類型出版社是字符數(shù)組類型*/ float price; /*價格是單精度實型價格是單精度實型*/ int n; /*庫存量是整型庫存量是整型*/ ;例如學(xué)生類型的定義:例如學(xué)生類型的定義:struct student char num8; /* 學(xué)號是學(xué)號是字符數(shù)組字符數(shù)組類型類型 */ char name30; /* 姓名是姓名是字符數(shù)組字符數(shù)組類型類型 */ char sex; /* 性別是性別是字符型字符型 */ int age; /* 年齡是年齡是整型整型 */ char addr60

4、; /* 住址是住址是字符數(shù)組字符數(shù)組類型類型 */ int score6; /* 成績是成績是整型數(shù)組整型數(shù)組類型類型 */ ;2021-11-106 按照結(jié)構(gòu)體類型的組成,系統(tǒng)為定義的結(jié)構(gòu)體按照結(jié)構(gòu)體類型的組成,系統(tǒng)為定義的結(jié)構(gòu)體變量分配內(nèi)存單元。結(jié)構(gòu)體變量的各個成員在內(nèi)存變量分配內(nèi)存單元。結(jié)構(gòu)體變量的各個成員在內(nèi)存中占用連續(xù)存儲區(qū)域,中占用連續(xù)存儲區(qū)域,結(jié)構(gòu)體變量結(jié)構(gòu)體變量所占內(nèi)存所占內(nèi)存結(jié)構(gòu)體中結(jié)構(gòu)體中每個成員每個成員所占用內(nèi)存的所占用內(nèi)存的長度之和長度之和。2021-11-107應(yīng)先定義一個應(yīng)先定義一個,而后再定義,而后再定義。系統(tǒng)對系統(tǒng)對不分配空間,僅對不分配空間,僅對分配空間。分

5、配空間。只能對只能對賦值、存取或運算,而不能對一個賦值、存取或運算,而不能對一個賦值、存取或運算。賦值、存取或運算。不不同結(jié)構(gòu)體類型的成員名相同,同結(jié)構(gòu)體類型的成員名相同, struct date int year,month,day; struct student char num8; char name30; char sex; birthday; /* 成員為結(jié)構(gòu)體類型成員為結(jié)構(gòu)體類型 */ char addr60; int score6; ;2021-11-108例如:例如:2021-11-109例如:例如:2021-11-1010 如果初值個數(shù)少于結(jié)構(gòu)體成員個數(shù),如果初值個數(shù)少于結(jié)構(gòu)

6、體成員個數(shù),則將無初值對應(yīng)的成員賦以則將無初值對應(yīng)的成員賦以0值。值。 如果初值個數(shù)多于結(jié)構(gòu)體成員個數(shù),如果初值個數(shù)多于結(jié)構(gòu)體成員個數(shù),則編譯出錯。則編譯出錯。2021-11-1011 元素的個數(shù)可以省略,根據(jù)賦初值時元素的個數(shù)可以省略,根據(jù)賦初值時結(jié)構(gòu)體常量的個數(shù)確定數(shù)組元素的個數(shù)結(jié)構(gòu)體常量的個數(shù)確定數(shù)組元素的個數(shù) 2021-11-10122021-11-10132021-11-10142021-11-1015 結(jié)構(gòu)體變量結(jié)構(gòu)體變量a的各成員可分別表示為的各成員可分別表示為a.num、、a.sex、a.birthday、a.score a.birthday.yeara.birth

7、day.montha.birthday.day 2021-11-1016【例例9.6】編寫一個統(tǒng)計選票的程序?!烤帉懸粋€統(tǒng)計選票的程序。 struct candidate char name20; /* name為候選人姓名為候選人姓名 */ int count; /* count為候選人得票數(shù)為候選人得票數(shù) */ list =invalid,0,Zhao,0,Qian,0, Sun,0,Li,0,Zhou,0;2021-11-1017main( ) int i,n; printf(Enter voten); scanf(%d,&n); /* 輸入所投候選人編號,編號從輸入所投候選人編

8、號,編號從1 1開始開始 */ while (n!=-1) /* 當輸入編號為當輸入編號為-1-1時,表示投票結(jié)束時,表示投票結(jié)束 */ if (n=1 & n=5) listn.count+; /* 有效票,則相應(yīng)候選人計票成員加有效票,則相應(yīng)候選人計票成員加1 1 */ else printf(invalidn); list0.count+; /* 無效票無效票,list0的計票成員加的計票成員加1 */ scanf(%d,&n); /* 輸入所投候選人編號輸入所投候選人編號 */ 2021-11-1018for (i=1; i-”是指向結(jié)構(gòu)體成員是指向結(jié)構(gòu)體成員運算符,優(yōu)

9、先級為一級運算符,優(yōu)先級為一級 p=&d.year2021-11-1021輸入今天的日期,然后輸出該日期。輸入今天的日期,然后輸出該日期。main( ) struct date / /* * 在函數(shù)中定義結(jié)構(gòu)體類型在函數(shù)中定義結(jié)構(gòu)體類型 * */ / int year, month, day; today,*p=&today; / /* * 定義結(jié)構(gòu)體變量及其指針定義結(jié)構(gòu)體變量及其指針 * */ / printf (Enter today date(YYYY/MM/DD):); scanf(%d/%d/%d,&today.year,&today.month, &

10、amp;today.day); printf(Today:%d/%d/%dn,p-year,p-month, p-day); 2021-11-10222021-11-1023ppppp1 H 1.0082 He 4.00263 Li 6.9414 Be 9.012182021-11-10242021-11-1025p101301101B200D3003012021-11-10262021-11-10272021-11-10282021-11-1029 形參是結(jié)構(gòu)體變量。調(diào)用此函數(shù)時,形參是結(jié)構(gòu)體變量。調(diào)用此函數(shù)時,系統(tǒng)將分別為形參系統(tǒng)將分別為形參cx和和cy各分配一個各分配一個sizeof(s

11、truct complex) 大小的內(nèi)存空間,大小的內(nèi)存空間,每個成員都要一一傳遞。每個成員都要一一傳遞。 2021-11-10302021-11-1031 形參定義為指針型參數(shù)。函數(shù)調(diào)用時,實參傳遞的形參定義為指針型參數(shù)。函數(shù)調(diào)用時,實參傳遞的是結(jié)構(gòu)體指針(地址),因此形參是結(jié)構(gòu)體指針(地址),因此形參px、py可讀取主調(diào)函可讀取主調(diào)函數(shù)中變量的內(nèi)容,乘積結(jié)果也可通過形參數(shù)中變量的內(nèi)容,乘積結(jié)果也可通過形參pz指針存到主指針存到主調(diào)函數(shù)中的目標變量。調(diào)函數(shù)中的目標變量。這樣實參與形參之間的數(shù)據(jù)傳遞由多值(每個成員的值)這樣實參與形參之間的數(shù)據(jù)傳遞由多值(每個成員的值)變成了單值(結(jié)構(gòu)體變量的

12、首地址)。變成了單值(結(jié)構(gòu)體變量的首地址)。 2021-11-10322021-11-1033 鏈表是一種動態(tài)數(shù)據(jù)結(jié)構(gòu),可根據(jù)需要鏈表是一種動態(tài)數(shù)據(jù)結(jié)構(gòu),可根據(jù)需要動態(tài)地分配存儲單元。在數(shù)組中,插入或刪動態(tài)地分配存儲單元。在數(shù)組中,插入或刪除一個元素都比較繁瑣,而用鏈表則相對容除一個元素都比較繁瑣,而用鏈表則相對容易。但是數(shù)組元素的引用比較簡單,對于鏈易。但是數(shù)組元素的引用比較簡單,對于鏈表中結(jié)點數(shù)據(jù)的存取操作則相對復(fù)雜。表中結(jié)點數(shù)據(jù)的存取操作則相對復(fù)雜。 head 1000 1032 3284 1296 1382 2008圖圖9.2 動態(tài)單向鏈表示意圖動態(tài)單向鏈表示意圖C3284H1296A

13、1382I2008NNULLNULL10001032struct nodechar c; struct node *next; ;2021-11-1034 C語言提供了相關(guān)的存儲管理庫函數(shù)。這里語言提供了相關(guān)的存儲管理庫函數(shù)。這里僅介紹其中三個,它們的原型說明在僅介紹其中三個,它們的原型說明在“stdlib.h”頭文件和頭文件和“alloc.h”頭文件中,使用頭文件中,使用這三個函數(shù)時,應(yīng)選擇其中一個頭文件包含到這三個函數(shù)時,應(yīng)選擇其中一個頭文件包含到源程序中。源程序中。2021-11-1035將函數(shù)返回值轉(zhuǎn)換將函數(shù)返回值轉(zhuǎn)換成結(jié)構(gòu)體指針成結(jié)構(gòu)體指針 2021-11-10362021-11-1

14、037動態(tài)分配了動態(tài)分配了10個存放整個存放整型數(shù)據(jù)的存儲單元型數(shù)據(jù)的存儲單元 2021-11-1038 實參必須是一個指向動態(tài)分配存儲區(qū)實參必須是一個指向動態(tài)分配存儲區(qū)的指針,它可以是任何類型的指針變量。的指針,它可以是任何類型的指針變量。2021-11-1039q 建立鏈表就是根據(jù)需要一個一個地開建立鏈表就是根據(jù)需要一個一個地開辟新結(jié)點,在結(jié)點中存放數(shù)據(jù)并建立結(jié)點辟新結(jié)點,在結(jié)點中存放數(shù)據(jù)并建立結(jié)點之間的鏈接關(guān)系。之間的鏈接關(guān)系。 頭指針頭指針h設(shè)為設(shè)為NULL讀入一個學(xué)生姓名讀入一個學(xué)生姓名 當姓名長度不為當姓名長度不為0 開辟新結(jié)點開辟新結(jié)點 p=NEW strcpy(p-name,n

15、ame) gets(p-tel) p-next=NULL h=NULL T F h指向第一個指向第一個 連接新結(jié)點連接新結(jié)點 結(jié)點結(jié)點 h=p q-next=p q指向新的尾結(jié)點指向新的尾結(jié)點 q=p 讀入一個學(xué)生姓名讀入一個學(xué)生姓名圖圖9.3 建立單向鏈表建立單向鏈表NULLhppq 2021-11-10402021-11-1041hp p指向第一個結(jié)點指向第一個結(jié)點 p=head 當當p不為不為NULL 輸出結(jié)點數(shù)據(jù)輸出結(jié)點數(shù)據(jù) p指向下一個結(jié)點指向下一個結(jié)點 p=p- -next圖圖9.5 輸出鏈表的輸出鏈表的N-S圖圖pppNULLNULL2021-11-10422021-11-104

16、3hNULLNULL第第i-1個結(jié)點個結(jié)點 第第i個結(jié)點個結(jié)點 第第i+1個結(jié)點個結(jié)點 2021-11-1044 p=head while(strcmp(x,p-name)!=0 & p-next!=NULLNULL) q指針跟隨指針跟隨p指針后移查找指針后移查找 (q=p;p=p-next;) strcmp(x,p-name)=0 T F p=head T F head=p-next q-next=p-next 沒找到?jīng)]找到 free(p)圖圖9.9 刪除鏈表中指定結(jié)點的刪除鏈表中指定結(jié)點的N-S圖圖刪除刪除第一個第一個結(jié)點結(jié)點 刪除中間刪除中間結(jié)點或尾結(jié)點或尾結(jié)點結(jié)點 刪除結(jié)點工刪

17、除結(jié)點工作分兩步:作分兩步:查找結(jié)點查找結(jié)點刪除結(jié)點刪除結(jié)點學(xué)生姓名學(xué)生姓名當姓名不同并且當姓名不同并且不是尾結(jié)點循環(huán)不是尾結(jié)點循環(huán)2021-11-1045hp2021-11-1046hpp q2021-11-1047hppp qq 2021-11-1048查找結(jié)點查找結(jié)點 2021-11-1049hNULLNULL第第i個結(jié)點個結(jié)點ppqqp0p新的第新的第i個結(jié)點個結(jié)點2021-11-1050 head=NULL T F p=head head=p0 while(strcmp(x,p-name)!=0 & p-next!=NULLNULL) p0-next q指針跟隨指針跟隨p指針

18、后移查找指針后移查找 (q=p;p=p-next;) =NULL NULL strcmp(x,p-name)=0 T F p=head T F p-next=p0 head=p0 q-next=p0 p0-next=NULLNULL p0-next=p圖圖9.11 在鏈表指定位置前插入結(jié)點的在鏈表指定位置前插入結(jié)點的N-S圖圖當姓名不同并且當姓名不同并且不是尾結(jié)點循環(huán)不是尾結(jié)點循環(huán)空表時空表時插入插入結(jié)點結(jié)點在表尾在表尾追加結(jié)點追加結(jié)點 插入結(jié)點工插入結(jié)點工作分兩步:作分兩步:查找插查找插入位置入位置連接連接新結(jié)點新結(jié)點在表頭在表頭插入結(jié)點插入結(jié)點 在表中間在表中間插入結(jié)點插入結(jié)點 2021-

19、11-1051hpp02021-11-1052hpqp02021-11-1053hppp qq p02021-11-1054查找插入點查找插入點 2021-11-10552021-11-10562021-11-1057可以先選擇可以先選擇1 1建建立一個鏈表,然立一個鏈表,然后根據(jù)需要選擇后根據(jù)需要選擇功能功能2 2、功能、功能3 3、功能功能4 4、直到選、直到選擇擇0 0退出程序的退出程序的運行運行 2021-11-10582021-11-1059 結(jié)構(gòu)體類型解決了如何描述一個邏輯上相關(guān),但結(jié)構(gòu)體類型解決了如何描述一個邏輯上相關(guān),但數(shù)據(jù)類型不同的一組分量的集合。數(shù)據(jù)類型不同的一組分量的集合

20、。 在需要節(jié)省內(nèi)存儲空間時,在需要節(jié)省內(nèi)存儲空間時,c c語言還提供了一種語言還提供了一種由若干個不同類型的數(shù)據(jù)項組成,但由若干個不同類型的數(shù)據(jù)項組成,但共享同一存儲空共享同一存儲空間間的構(gòu)造類型。的構(gòu)造類型。一種構(gòu)造類型數(shù)據(jù)一種構(gòu)造類型數(shù)據(jù) 共用體共用體由若干不同類型的數(shù)據(jù)項組成,由若干不同類型的數(shù)據(jù)項組成, 構(gòu)成共用體的各個數(shù)據(jù)項稱為構(gòu)成共用體的各個數(shù)據(jù)項稱為共用體成員共用體成員。2021-11-1060 數(shù)據(jù)類型數(shù)據(jù)類型1 成員名成員名1; 數(shù)據(jù)類型數(shù)據(jù)類型2 成員名成員名2; 數(shù)據(jù)類型數(shù)據(jù)類型n 成員名成員名n; ;lunionunion為關(guān)鍵字;為關(guān)鍵字;l共用體名共用體名是用戶定義

21、是用戶定義的的類型標識類型標識。l 中是組成該共用體中是組成該共用體的的成員成員。成員的。成員的數(shù)據(jù)數(shù)據(jù)類型類型可以是可以是C語言所允語言所允許的任何數(shù)據(jù)類型許的任何數(shù)據(jù)類型。2021-11-1061例如:例如: union utype int i; char ch; long l; char c4; ; 定義了一個定義了一個union union utypeutype共用體共用體類型,共用體類型定義不分配內(nèi)存類型,共用體類型定義不分配內(nèi)存空間,只是說明此類型數(shù)據(jù)的組成空間,只是說明此類型數(shù)據(jù)的組成情況。情況。 2021-11-1062 按照共用體類型的組成,系統(tǒng)為定義的共用體按照共用體類型的

22、組成,系統(tǒng)為定義的共用體變量分配內(nèi)存單元。變量分配內(nèi)存單元。共用體變量共用體變量所占內(nèi)存所占內(nèi)存共用體中占用內(nèi)存的共用體中占用內(nèi)存的長度最長的成員長度最長的成員。2021-11-1063例如:例如:union utype int i; char ch; long l; char c4; a, b, c;2021-11-1064例如:例如:union int i; char ch; long l; char c4; 2021-11-1065 union utype int i; char ch; long l; char c4; a, b, c;2021-11-1066 union utype

23、int i; char ch; long l; char c4; a, *p=&a;2021-11-1067例如:例如:2021-11-1068 共用體類型變量在定義時只能對第一共用體類型變量在定義時只能對第一個成員進行賦初值。個成員進行賦初值。 由于第一個成員是字符型,用一個字由于第一個成員是字符型,用一個字節(jié),所以對于初值節(jié),所以對于初值0 0 x9741x9741僅能接受僅能接受0 0 x41x41,初值的高字節(jié)被截去。初值的高字節(jié)被截去。 1. A 41A 412. a 61a 61對對u2u2成員的引成員的引用是無意義的用是無意義的2021-11-10691234567856

24、787830541984122081A低地址低地址高地址高地址高地址高地址低地址低地址2021-11-1070 枚舉枚舉是一個具有有限個是一個具有有限個整型符號常量的整型符號常量的集合集合,這些整型符號常量稱為枚舉常量。,這些整型符號常量稱為枚舉常量。 每個枚舉類型都必須進行類型的定義,每個枚舉類型都必須進行類型的定義,定義時必須將其所有的枚舉常量一一列舉,定義時必須將其所有的枚舉常量一一列舉,以便限定此枚舉類型變量的取值范圍。以便限定此枚舉類型變量的取值范圍。 2021-11-1071 在枚舉類型中,每個在枚舉類型中,每個枚舉常量枚舉常量都代表一都代表一個整型值。在定義枚舉類型的同時可隱式或

25、個整型值。在定義枚舉類型的同時可隱式或顯式地顯式地定義枚舉常量所代表的值定義枚舉常量所代表的值。 01234562021-11-107223452021-11-1073 enumenum 枚舉名枚舉名 枚舉變量名表枚舉變量名表; ; enumenum 枚舉名枚舉名 枚舉常量取值表枚舉常量取值表 枚舉變量表枚舉變量表; ; enumenum 枚舉常量取值表枚舉常量取值表 枚舉變量表枚舉變量表; ;2021-11-1074 賦值運算賦值運算 =true;=red;=yellow;=lightblue; =white; 用用sizeofsizeof運算符計算枚舉變量所占內(nèi)存空間運算符計算枚舉變量所占

26、內(nèi)存空間是是enum color2類型的枚舉值類型的枚舉值2021-11-1075 取址運算取址運算 關(guān)系運算關(guān)系運算truefalse SunSat (1) (0) 2021-11-1076 枚舉變量的輸出枚舉變量的輸出 枚舉變量的輸入枚舉變量的輸入 枚舉變量作為整型變量進行輸入。例如:枚舉變量作為整型變量進行輸入。例如: scanf(%d,&fg);1含義不直觀含義不直觀 2021-11-1077switch(fg) case false: printf(false); break; case true: printf(true); 枚舉變量的輸出枚舉變量的輸出方法二:利用多分支選

27、擇語句輸出枚舉常量對應(yīng)方法二:利用多分支選擇語句輸出枚舉常量對應(yīng)的字符串。的字符串。 2021-11-1078enum flag false,true fg;char *name =false,true; fg=true;printf(%s,namefg); 枚舉變量的輸出枚舉變量的輸出方法三:依據(jù)枚舉值,運用指針方法輸出對應(yīng)的方法三:依據(jù)枚舉值,運用指針方法輸出對應(yīng)的字符串。字符串。2021-11-1079fg=true;printf(%s,fg); 枚舉變量的輸出枚舉變量的輸出 枚舉常量是標識符,不是字符串,以輸出字符枚舉常量是標識符,不是字符串,以輸出字符串方式輸出枚舉常量是錯誤的。串方

28、式輸出枚舉常量是錯誤的。 2021-11-1080【例【例9.20】編制一個程序。當輸入今天的星期序號后,】編制一個程序。當輸入今天的星期序號后,輸出明天是星期幾。輸出明天是星期幾。 enum weekday Mon=1,Tue,Wed,Thu,Fri,Sat,Sun ; char *name8=error,Mon,Tue,Wed, Thu,Fri,Sat,Sun;2021-11-1081main( ) enum weekday d; printf(Input todays numeral(1-7):); scanf(%d,&d); if (d0&d7) d+; /* 今天是星期一到星期六的時候今天是星期一到星期六的時候 */ else if (d=7) d=1; /* 今天是星期日今天是星期日 */ else d=0; if (d) printf(Tomorrow is %s.n,named); else printf(%

溫馨提示

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

評論

0/150

提交評論