Ch8-結(jié)構(gòu)體與共用體.ppt_第1頁
Ch8-結(jié)構(gòu)體與共用體.ppt_第2頁
Ch8-結(jié)構(gòu)體與共用體.ppt_第3頁
Ch8-結(jié)構(gòu)體與共用體.ppt_第4頁
Ch8-結(jié)構(gòu)體與共用體.ppt_第5頁
已閱讀5頁,還剩35頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、Ch8 結(jié)構(gòu)體與共用體,C語言快速培訓(xùn)教案,2020/9/20,NEUQ計算機(jī)興趣小組專用教案,2,本章內(nèi)容,結(jié)構(gòu)體(結(jié)構(gòu)structure) 、共用體(聯(lián)合union)類型的定義 結(jié)構(gòu)體變量、結(jié)構(gòu)體數(shù)組 結(jié)構(gòu)體變量、結(jié)構(gòu)體數(shù)組與指針、函數(shù)的關(guān)系 用結(jié)構(gòu)體實現(xiàn)動態(tài)數(shù)據(jù)結(jié)構(gòu) 鏈表的概念及操作原理,2020/9/20,NEUQ計算機(jī)興趣小組專用教案,3,從基本數(shù)據(jù)類型到抽象數(shù)據(jù)類型,二進(jìn)制數(shù) 在早期的機(jī)器指令及匯編語言中,數(shù)據(jù)對象均用二進(jìn)制數(shù)表示,沒有類型的概念,基本數(shù)據(jù)類型 在高級語言中引入了基本數(shù)據(jù)類型:整型、實型、字符型等 基本數(shù)據(jù)類型不能方便的解決所有問題,有些語言(如PL/1)中試圖規(guī)定

2、較多的類型,如數(shù)組、樹、棧等,但實踐證明不是個好辦法,用戶自己構(gòu)造數(shù)據(jù)類型-復(fù)合數(shù)據(jù)類型 表示復(fù)雜的數(shù)據(jù)對象,典型的代表就是“結(jié)構(gòu)體”,數(shù)組、指針也可算作此類,抽象數(shù)據(jù)類型(Abstract Data Type,簡稱ADT) 在復(fù)合數(shù)據(jù)類型基礎(chǔ)上增加了對數(shù)據(jù)的操作 類跨時代的進(jìn)步 例如汽車就是一種ADT,2020/9/20,NEUQ計算機(jī)興趣小組專用教案,4,思考一個問題,在程序里表示一個人(姓名、年齡、性別、),怎么表示? 想表示多個人呢? 如何用計算機(jī)程序?qū)崿F(xiàn)下述表格的管理?,表8-1 某學(xué)校學(xué)生成績管理表,2020/9/20,NEUQ計算機(jī)興趣小組專用教案,5,數(shù)組的解決方法,int s

3、tudentId30; /* 最多可以管理30個學(xué)生, 每個學(xué)生的學(xué)號用數(shù)組的下標(biāo)表示*/ charstudentName1030; charstudentSex230; int timeOfEnter30; /*入學(xué)時間用int表示*/ int scoreComputer30;/*計算機(jī)原理課的成績*/ int scoreEnglish30; /*英語課的成績*/ int scoreMath30; /*數(shù)學(xué)課的成績*/ int scoreMusic30; /*音樂課的成績*/,2020/9/20,NEUQ計算機(jī)興趣小組專用教案,6,數(shù)組的解決方法,int studentId30 = 1,2,

4、3,4,5,6; charstudentName1030 = 令狐沖,林平之, 岳靈珊,任瑩瑩; charstudentSex230 = 男,男,女,女; int timeOfEnter30 = 1999,1999,1999,1999; int scoreComputer30 = 90,78,89,78; int scoreEnglish30 = 83,92,72,95; int scoreMath30 = 72,88,98,87; int scoreMusic30 = 82,78,66,90;,2020/9/20,NEUQ計算機(jī)興趣小組專用教案,7,數(shù)組的解決方法,數(shù)據(jù)的內(nèi)存管理方式,202

5、0/9/20,NEUQ計算機(jī)興趣小組專用教案,8,數(shù)組的解決方法,分配內(nèi)存不集中,尋址效率不高 對數(shù)組進(jìn)行賦初值時,容易發(fā)生錯位 結(jié)構(gòu)顯得比較零散,不容易管理,2020/9/20,NEUQ計算機(jī)興趣小組專用教案,9,希望的內(nèi)存分配圖,2020/9/20,NEUQ計算機(jī)興趣小組專用教案,10,結(jié)構(gòu)體的解決方法,struct STUDENT int studentID; /*每個學(xué)生的序號*/ char studentName10;/*每個學(xué)生的姓名*/ char studentSex4; /*每個學(xué)生的性別*/ inttimeOfEnter; /*每個學(xué)生的入學(xué)時間*/ intscoreComp

6、uter; /*每個學(xué)生的計算機(jī)原理成績*/ intscoreEnglish; /*每個學(xué)生的英語成績*/ intscoreMath; /*每個學(xué)生的數(shù)學(xué)成績*/ intscoreMusic; /*每個學(xué)生的音樂成績*/ ; struct STUDENT是一個類型 struct STUDENT students4; students0.studentNamestudents0.Sex 它們都是變量,一般稱為結(jié)構(gòu)的成員變量,2020/9/20,NEUQ計算機(jī)興趣小組專用教案,11,用戶自定義的數(shù)據(jù)類型,結(jié)構(gòu)體: 把關(guān)系緊密且邏輯相關(guān)的多種不同類型的變量組織到統(tǒng)一的名字之下,也稱復(fù)合數(shù)據(jù)類型 這種

7、類型的變量占用相鄰的一段內(nèi)存單元 共用體: 把情形互斥但又邏輯相關(guān)的多種不同類型的變量組織在一起 這種類型的變量占用同一段內(nèi)存單元,因此每一時刻只有一個數(shù)據(jù)起作用,2020/9/20,NEUQ計算機(jī)興趣小組專用教案,12,struct student int num; char name20; char sex; int age; float score; char addr30; ;,structure definition形成一個樣板,用于生成結(jié)構(gòu)體變量。,一般形式:,struct 結(jié)構(gòu)體名 類型關(guān)鍵字 成員名1; 類型關(guān)鍵字 成員名2 . 類型關(guān)鍵字 成員名n ;,構(gòu)成結(jié)構(gòu)體的變量稱為結(jié)

8、構(gòu)體的成員(member), 也稱元素(element)或域(filed),結(jié)構(gòu)體的定義只定義了數(shù)據(jù)的形式,即聲明了一種復(fù)雜的數(shù)據(jù)類型,并未生成任何變量。,結(jié)構(gòu)體的定義,2020/9/20,NEUQ計算機(jī)興趣小組專用教案,13,先定義結(jié)構(gòu)體類型再定義變量名,在定義類型的同時定義變量,直接定義結(jié)構(gòu)體變量(不出現(xiàn)結(jié)構(gòu)體名),struct student student1,student2;,struct student int num; char name20; char sex; int age; float score; char addr30; student1,student2;,stru

9、ct int num; char name20; char sex; int age; float score; char addr30; student1,student2;,結(jié)構(gòu)體變量的定義,2020/9/20,NEUQ計算機(jī)興趣小組專用教案,14,結(jié)構(gòu)體變量的定義,用typedef為已存在的類型定義新名字 struct student int num; char name20; char sex; int age; float score; char addr30; ; typedef struct student STUD; STUD student1,student2; 用STUD代

10、替 struct student類型;,2020/9/20,NEUQ計算機(jī)興趣小組專用教案,15,結(jié)構(gòu)體定義可以嵌套,struct date int month; int day; int year; ; typedef struct date DATE;,struct student int num; char name20; char sex; int age; DATE birthday; char addr30; student1,student2;,struct student 占用內(nèi)存字節(jié)數(shù)=?,double 占用內(nèi)存字節(jié)數(shù) = 8,結(jié)構(gòu)體變量的定義,2020/9/20,NEUQ計

11、算機(jī)興趣小組專用教案,16,結(jié)構(gòu)(Structure)的內(nèi)存占用,一個結(jié)構(gòu)變量的成員變量在內(nèi)存中是相鄰的 整個結(jié)構(gòu)變量的將占用多少內(nèi)存呢? 是所有成員變量的內(nèi)存總和嗎? 事實上,所有數(shù)據(jù)類型在內(nèi)存中都是從偶數(shù)地址開始存放的,且結(jié)構(gòu)所占的實際空間一般是按照機(jī)器字長對齊的 不同的編譯器、不同的平臺,對齊方式會有變化,不過一般的編譯器都可以設(shè)定按照多大對齊 我們可以用sizeof來獲得結(jié)構(gòu)的大小,2020/9/20,NEUQ計算機(jī)興趣小組專用教案,17,結(jié)構(gòu)體指針,struct pointint x;int y; struct point pt; /*定義結(jié)構(gòu)體變量*/ struct point *

12、ppt; /*定義結(jié)構(gòu)體指針*/ ppt = /*指向運算符*/ 第二種更常用,2020/9/20,NEUQ計算機(jī)興趣小組專用教案,18,定義:,struct STUDENT intstudentID; charstudentName10; char studentSex4; struct date timeOfEnter; int scoreComputer; int scoreEnglish; int scoreMath; int scoreMusic; ; struct STUDENT stu30;,結(jié)構(gòu)體數(shù)組,2020/9/20,NEUQ計算機(jī)興趣小組專用教案,19,struct ST

13、UDENT intstudentID; charstudentName10; char studentSex4; struct date timeOfEnter; int scoreComputer; int scoreEnglish; int scoreMath; int scoreMusic; ; struct STUDENT stu30 = 1,令狐沖,男,1999,12,20,90,83,72,82, 2,林平之,男,1999,07,06,78,92,88,78, 3,岳靈珊,女,1999,07,06,89,72,98,66, 4,任瑩瑩,女,1999,07,06,78,95,87,9

14、0 ;,初始化,結(jié)構(gòu)體數(shù)組,2020/9/20,NEUQ計算機(jī)興趣小組專用教案,20,結(jié)構(gòu)體數(shù)組的指針,struct STUDENT *pt; pt = stu;,stu0,stu1,stu2,pt,pt+,stu3,2020/9/20,NEUQ計算機(jī)興趣小組專用教案,21,for (pt=stu; ptscoreComputer; sum1 = sum1 + pt-scoreEnglish; sum2 = sum2 + pt-scoreMath; sum3 = sum3 + pt-scoreMusic; for (i=0; i4; i+) averagei = sumi/4; printf(

15、%20s : %4.2fn, namei, *(average+i); ,例8.2:利用指向結(jié)構(gòu)體數(shù)組的指針計算學(xué)生各科的平均成績,2020/9/20,NEUQ計算機(jī)興趣小組專用教案,22,例8.2,main() struct STUDENT *pt; float sum4 = 0.0,average4 = 0.0; int i; char *name=score of Computer,score of English, score of Math,score of Music; pt = stu; /*pt指向結(jié)構(gòu)體數(shù)組的第一個元素*/ for (pt=stu; ptscoreComput

16、er; sum1 = sum1 + pt-scoreEnglish; sum2 = sum2 + pt-scoreMath; sum3 = sum3 + pt-scoreMusic; for (i=0; i4; i+) averagei = sumi/4; printf(%20s : %4.2fn, namei, *(average+i); ,2020/9/20,NEUQ計算機(jī)興趣小組專用教案,23,例8.1 :洗牌和發(fā)牌模擬,一付撲克有52張牌,分為4種花色(Suit): 黑桃(Spades)、紅桃(Hearts)、草花(Clubs)、方塊(Diamonds) 每種花色有13張牌面(Face

17、): A,2,3,4,5,6,7,8,9,10,Jack,Queen,King 設(shè)計一個結(jié)構(gòu)體表示一張牌,由兩個成分組成:花色、牌面: struct CARD char suit10; char face10; ; struct CARD card52; /*順序存放撲克牌*/ int result52; /*存放洗牌發(fā)牌結(jié)果*/ char *suit = Spades,Hearts,Clubs,Diamonds; char *face = A,2,3,4,5,6,7,8,9, 10,jack,Queen,King;,2020/9/20,NEUQ計算機(jī)興趣小組專用教案,24,例8.1 :洗牌和

18、發(fā)牌模擬,發(fā)牌過程 將52張牌按照隨機(jī)的順序存放 算法步驟: 產(chǎn)生051的隨機(jī)數(shù),將其放于resulti內(nèi)。 i=i+1 如果i=51,則重復(fù)第2步,否則,結(jié)束循環(huán) 輸出結(jié)果 存在一個致命的問題: 在重復(fù)第2步時,產(chǎn)生的隨機(jī)數(shù)可能與以前產(chǎn)生的隨機(jī)數(shù)相同,相同意味著52張牌中出現(xiàn)2張以上相同的牌,2020/9/20,NEUQ計算機(jī)興趣小組專用教案,25,例8.1 :洗牌和發(fā)牌模擬,解決方法 增加一步,判斷新產(chǎn)生的隨機(jī)數(shù)以前是否出現(xiàn)過 如果出現(xiàn)過,則放棄;如果以前未出現(xiàn)過,則保留 算法步驟: 產(chǎn)生051的隨機(jī)數(shù)m,將其放于resulti內(nèi)。 判斷resulti在以前(result0resulti-

19、1)是否出現(xiàn)過。如果出現(xiàn)過,則回到第2步;如果沒出現(xiàn)過,則i=i+1 如果i=51,則重復(fù)第23步,否則,結(jié)束循環(huán) 輸出結(jié)果,2020/9/20,NEUQ計算機(jī)興趣小組專用教案,26,例8.1 :洗牌和發(fā)牌模擬,算法缺陷: 隨著隨機(jī)數(shù)數(shù)量的增加,新的隨機(jī)數(shù)與已經(jīng)產(chǎn)生的隨機(jī)數(shù)相同的可能性越來越大,有可能出現(xiàn)算法延遲問題 高效算法 將按照花色與牌面的順序存放的牌(cardi)隨機(jī)打亂 每次循環(huán),程序選擇一個051的隨機(jī)數(shù)j,然后將數(shù)組中當(dāng)前的CARD結(jié)構(gòu)cardi與隨機(jī)選出的j所在的數(shù)組元素cardj結(jié)構(gòu)進(jìn)行交換,2020/9/20,NEUQ計算機(jī)興趣小組專用教案,27,例8.1 :洗牌和發(fā)牌模擬

20、(P313),用結(jié)構(gòu)體數(shù)組做函數(shù)參數(shù) /*函數(shù)功能:將52張牌按黑桃、紅桃、草花、方塊花色順序,面值按AK的順序排列 函數(shù)參數(shù):結(jié)構(gòu)體數(shù)組wCard,表示不同花色和面值的52張牌 指針變量wFace,表示指向面值字符串?dāng)?shù)組face的指針 指針變量wSuit,表示指向花色字符串?dāng)?shù)組suit的指針 函數(shù)返回值:無 */ void FillCard(struct CARD wCard,char *wFace,char *wSuit) inti; for (i=0; i52; i+) strcpy(wCardi.suit, wSuiti/13); strcpy(wCardi.face, wFacei%

21、13); ,2020/9/20,NEUQ計算機(jī)興趣小組專用教案,28,用結(jié)構(gòu)體指針做函數(shù)參數(shù) /*函數(shù)功能:將52張牌的順序打亂, 函數(shù)參數(shù):結(jié)構(gòu)體數(shù)組變量wCard,表示52張牌 函數(shù)返回值:無 */ void Shuffle(struct CARD *wCard) int i,j; struct card temp; for (i=0; i52; i+) j = rand()%52; /*j = random(52);TC的庫函數(shù)*/ temp = wCardi; wCardi = wCardj; wCardj = temp; /* 洗牌過程 */ ,例8.1 :洗牌和發(fā)牌模擬(P313)

22、,2020/9/20,NEUQ計算機(jī)興趣小組專用教案,29,用結(jié)構(gòu)體指針做函數(shù)參數(shù) /*函數(shù)功能:輸出發(fā)牌結(jié)果 函數(shù)參數(shù):結(jié)構(gòu)體數(shù)組變量wCard,表示有52張牌 函數(shù)返回值:無 */ void Deal(struct CARD *wCard) int i; for (i=0; i52; i+)/*輸出發(fā)牌結(jié)果*/ printf(%10s%10sn, wCardi.suit, wCardi.face); ,例8.1 :洗牌和發(fā)牌模擬(P313),2020/9/20,NEUQ計算機(jī)興趣小組專用教案,30,結(jié)構(gòu)體與函數(shù),向函數(shù)傳遞結(jié)構(gòu)體的單個成員 單向值傳遞,函數(shù)內(nèi)對結(jié)構(gòu)內(nèi)容的修改不影響原結(jié)構(gòu) 向

23、函數(shù)傳遞結(jié)構(gòu)體的完整結(jié)構(gòu) 單向值傳遞,函數(shù)內(nèi)對結(jié)構(gòu)內(nèi)容的修改不影響原結(jié)構(gòu),開銷大 向函數(shù)傳遞結(jié)構(gòu)體的首地址 用結(jié)構(gòu)體數(shù)組或者結(jié)構(gòu)體指針做函數(shù)參數(shù) 除提高效率外,還可以修改結(jié)構(gòu)體指針?biāo)赶虻慕Y(jié)構(gòu)體的內(nèi)容,2020/9/20,NEUQ計算機(jī)興趣小組專用教案,31,思考,下面的結(jié)構(gòu)什么意思? struct temp int data; struct temp pt; TC下的錯誤提示: Undefined structure temp Structure size too large VC下的錯誤提示: pt uses undefined struct temp 下面的的呢? struct temp

24、 int data; struct temp *pt;,2020/9/20,NEUQ計算機(jī)興趣小組專用教案,32,動態(tài)數(shù)據(jù)結(jié)構(gòu),結(jié)構(gòu)體聲明時不能包含自我,但可以包含指向本結(jié)構(gòu)體類型的指針變量 鏈表(Linked table) struct Link int data; struct Link *next; ,2020/9/20,NEUQ計算機(jī)興趣小組專用教案,33,位字段,想表達(dá)人的姓名、出生年、月、日,都定義什么類型的成員變量? struct personchar name12;int year;char month;char day; ; 這樣有很多的空間浪費,比如month只可能取值1-

25、12,4bits足夠,2020/9/20,NEUQ計算機(jī)興趣小組專用教案,34,位字段,struct personchar name12;unsigned int year : 12; unsigned int month : 4;unsigned int day : 5; ; 調(diào)整成員順序可以讓結(jié)構(gòu)更緊湊 每個位段都可以當(dāng)作一個無符號整型數(shù)使用 表達(dá)范圍當(dāng)然受限,而且當(dāng)然不能取地址,2020/9/20,NEUQ計算機(jī)興趣小組專用教案,35,共用體,或稱為聯(lián)合(Union),union numbershort x;char ch; float y; 基本上和struct一樣 x、ch和y處于同樣的地址 size

溫馨提示

  • 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

提交評論