版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、第8章 結(jié)構(gòu)體與共用體本章內(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)體實(shí)現(xiàn)動態(tài)數(shù)據(jù)結(jié)構(gòu)鏈表的概念及操作原理 從基本數(shù)據(jù)類型到抽象數(shù)據(jù)類型二進(jìn)制數(shù)在早期的機(jī)器指令及匯編語言中,數(shù)據(jù)對象均用二進(jìn)制數(shù)表示,沒有類型的概念基本數(shù)據(jù)類型在高級語言中引入了基本數(shù)據(jù)類型:整型、實(shí)型、字符型等基本數(shù)據(jù)類型不能方便的解決所有問題,有些語言(如PL/1)中試圖規(guī)定較多的類型,如數(shù)組、樹、棧等,但實(shí)踐證明不是個好辦法用戶自己構(gòu)造數(shù)據(jù)類型-復(fù)合數(shù)據(jù)類型表示復(fù)雜的數(shù)據(jù)對象,典型的代表就是“結(jié)構(gòu)體”,數(shù)組、指針也可算作此類
2、抽象數(shù)據(jù)類型(Abstract Data Type,簡稱ADT)在復(fù)合數(shù)據(jù)類型基礎(chǔ)上增加了對數(shù)據(jù)的操作類跨時代的進(jìn)步例如汽車就是一種ADT思考一個問題在程序里表示一個人(姓名、年齡、性別、),怎么表示?想表示多個人呢?如何用計算機(jī)程序?qū)崿F(xiàn)下述表格的管理? 表8-1 某學(xué)校學(xué)生成績管理表學(xué)號姓名性別入學(xué)時間計算機(jī)原理英 語數(shù) 學(xué)音 樂1令狐沖男1999908372822林平之男1999789288783岳靈珊女1999897298664任瑩瑩女1999789587905 6 數(shù)組的解決方法int studentId30; /* 最多可以管理30個學(xué)生, 每個學(xué)生的學(xué)號用數(shù)組的下標(biāo)表示*/char
3、studentName3010;charstudentSex302;int timeOfEnter30; /*入學(xué)時間用int表示*/int scoreComputer30;/*計算機(jī)原理課的成績*/int scoreEnglish30; /*英語課的成績*/int scoreMath30; /*數(shù)學(xué)課的成績*/int scoreMusic30; /*音樂課的成績*/數(shù)組的解決方法int studentId30 = 1,2,3,4,5,6;charstudentName3010 = 令狐沖,林平之, 岳靈珊,任瑩瑩;charstudentSex302 = 男,男,女,女;int timeOfE
4、nter30 = 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; 數(shù)組的解決方法數(shù)據(jù)的內(nèi)存管理方式 907889788392729572889887827866901234令狐沖林平之岳靈珊任瑩瑩男男女女1999199919991999數(shù)組的解決方法分配內(nèi)存不集中,尋址效率不高 對數(shù)組進(jìn)行賦初值時,容易發(fā)生錯位 結(jié)構(gòu)顯得比較零散,不容易管理 希望的
5、內(nèi)存分配圖 1令狐沖男1999908372822林平之男1999789288783岳靈珊女1999897298664任瑩瑩女199978958790結(jié)構(gòu)體的解決方法struct STUDENT int studentID; /*每個學(xué)生的序號*/ char studentName10;/*每個學(xué)生的姓名*/ char studentSex4; /*每個學(xué)生的性別*/ inttimeOfEnter; /*每個學(xué)生的入學(xué)時間*/ intscoreComputer; /*每個學(xué)生的計算機(jī)原理成績*/ intscoreEnglish; /*每個學(xué)生的英語成績*/ intscoreMath; /*每個學(xué)
6、生的數(shù)學(xué)成績*/ intscoreMusic; /*每個學(xué)生的音樂成績*/ ;struct STUDENT是一個類型struct STUDENT students4;students0.studentNamestudents0.Sex它們都是變量,一般稱為結(jié)構(gòu)的成員變量用戶自定義的數(shù)據(jù)類型結(jié)構(gòu)體:把關(guān)系緊密且邏輯相關(guān)的多種不同類型的變量組織到統(tǒng)一的名字之下,也稱復(fù)合數(shù)據(jù)類型這種類型的變量占用相鄰的一段內(nèi)存單元共用體:把情形互斥但又邏輯相關(guān)的多種不同類型的變量組織在一起這種類型的變量占用同一段內(nèi)存單元,因此每一時刻只有一個數(shù)據(jù)起作用10010LiFunM1887.5Beijingnumnames
7、exagescoreaddrstruct 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é)構(gòu)體的成員(member),也稱元素(element)或域(filed)結(jié)構(gòu)體的定義只定義了數(shù)據(jù)的形式,即聲明了一種復(fù)雜的數(shù)據(jù)類型,并未生成任何變量。結(jié)構(gòu)體的定義先定義結(jié)構(gòu)體類型再定義變量名在定義類型的同
8、時定義變量直接定義結(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;struct int num; char name20; char sex; int age; float score; char addr30; student1,student2;結(jié)構(gòu)體變量的定義結(jié)構(gòu)體變量的定義用typedef為已存在的類型定義新名字struct student i
9、nt num; char name20; char sex; int age; float score; char addr30; ;typedef struct student STUD;STUD student1,student2;用STUD代替 struct student類型;結(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
10、; student1,student2;numnamesexagebirthdayaddrmonthdayyearstruct student 占用內(nèi)存字節(jié)數(shù)=?double 占用內(nèi)存字節(jié)數(shù) = 8結(jié)構(gòu)體變量的定義結(jié)構(gòu)(Structure)的內(nèi)存占用一個結(jié)構(gòu)變量的成員變量在內(nèi)存中是相鄰的整個結(jié)構(gòu)變量的將占用多少內(nèi)存呢?是所有成員變量的內(nèi)存總和嗎?事實(shí)上,所有數(shù)據(jù)類型在內(nèi)存中都是從偶數(shù)地址開始存放的,且結(jié)構(gòu)所占的實(shí)際空間一般是按照機(jī)器字長對齊的不同的編譯器、不同的平臺,對齊方式會有變化,不過一般的編譯器都可以設(shè)定按照多大對齊我們可以用sizeof來獲得結(jié)構(gòu)的大小m1m2charm3intchar
11、m1m2charm3intchar結(jié)構(gòu)體指針struct pointint x;int y; struct point pt; /*定義結(jié)構(gòu)體變量*/ struct point *ppt; /*定義結(jié)構(gòu)體指針*/ ppt = &pt;怎樣通過pt訪問pt的成員?pt.x = 0; /*成員運(yùn)算符*/ 怎樣通過ppt訪問pt的成員?(*ppt).x = 0;ppt-x = 0; /*指向運(yùn)算符*/第二種更常用xypptpt定義:struct STUDENTintstudentID;charstudentName10;char studentSex4;struct date timeOfEnter
12、;int scoreComputer;int scoreEnglish;int scoreMath;int scoreMusic; struct STUDENT stu30; 結(jié)構(gòu)體數(shù)組學(xué)號姓名性別入學(xué)時間計算機(jī)原理年月日英語數(shù)學(xué)音樂struct STUDENTintstudentID;charstudentName10;char studentSex4;struct date timeOfEnter;int scoreComputer;int scoreEnglish;int scoreMath;int scoreMusic; struct STUDENT stu30 = 1,令狐沖,男,1
13、999,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,90 ;初始化結(jié)構(gòu)體數(shù)組結(jié)構(gòu)體數(shù)組的指針struct STUDENT *pt;pt = stu;2341stu0stu1stu2ptpt+stu3for (pt=stu; ptscoreComputer; sum1 = sum1 + pt-scoreEnglish; sum2 = sum2 + pt-scoreMath; sum3 = sum3 + pt-scoreM
14、usic; for (i=0; i4; i+) averagei = sumi/4; printf(%20s : %4.2fn, namei, *(average+i); 例8.2:利用指向結(jié)構(gòu)體數(shù)組的指針計算學(xué)生各科的平均成績 學(xué)號姓名性別入學(xué)時間計算機(jī)原理年月日英語數(shù)學(xué)音樂例8.2main()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)
15、體數(shù)組的第一個元素*/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(%20s : %4.2fn, namei, *(average+i); 例8.1 :洗牌和發(fā)牌模擬 一付撲克有52張牌,分為4種花色(Suit):黑桃(Spades)、紅桃(Hearts)、草花(Clubs)、方塊(Diamonds)每種花色有13張牌面
16、(Face):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; 例8.1 :洗牌和發(fā)牌模擬發(fā)牌過程將52張牌按照隨機(jī)的順序存放算法步驟
17、:產(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張以上相同的牌 例8.1 :洗牌和發(fā)牌模擬解決方法增加一步,判斷新產(chǎn)生的隨機(jī)數(shù)以前是否出現(xiàn)過如果出現(xiàn)過,則放棄;如果以前未出現(xiàn)過,則保留算法步驟:產(chǎn)生051的隨機(jī)數(shù)m,將其放于resulti內(nèi)。判斷resulti在以前(result0resulti-1)是否出現(xiàn)過。如果出現(xiàn)過,則回到第2步;如果沒出現(xiàn)過,則i=i+1如果i=51,則重復(fù)第23步,否則,結(jié)束循環(huán)輸出結(jié)果例8.1 :洗牌和發(fā)
18、牌模擬算法缺陷:隨著隨機(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)行交換 例8.1 :洗牌和發(fā)牌模擬(P313)用結(jié)構(gòu)體數(shù)組做函數(shù)參數(shù)/*函數(shù)功能:將52張牌按黑桃、紅桃、草花、方塊花色順序,面值按AK的順序排列函數(shù)參數(shù):結(jié)構(gòu)體數(shù)組wCard,表示不同花色和面值的52張牌 指針變量wFace,表示指向面值字符串?dāng)?shù)組face的指針 指針變量wSuit,表示指向花色字符串
19、數(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%13);用結(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 =
20、rand()%52; /*j = random(52);TC的庫函數(shù)*/temp = wCardi; wCardi = wCardj;wCardj = temp; /* 洗牌過程 */例8.1 :洗牌和發(fā)牌模擬(P313)用結(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)#incl
21、ude #include struct CARD char suit10; char face10; ; char *suit = Spades,Hearts,Clubs,Diamonds; char *face = A,2,3,4,5,6,7,8,9, 10,jack,Queen,King; void FillCard(struct CARD wCard,char *wFace,char *wSuit)inti;for (i=0; i52; i+)strcpy(wCardi.suit, wSuiti/13);strcpy(wCardi.face, wFacei%13);void Shuffl
22、e(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; /* 洗牌過程 */void Deal(struct CARD *wCard)int i;for (i=0; isecond+; if (t-second=60) t-second=0; t-minute+; if (t-minute=60) t-minute =0; t-hour+; if (t-hour=24) t-hour=0;void display(CLOCK *t) printf(%2d:%2d:%2dr, t-hour, t-minute, t-second);實(shí)驗(yàn)九 結(jié)構(gòu)體編程練習(xí)在屏幕上模擬顯示一個數(shù)字式時鐘 枚舉類型如果一個變量只有幾種可能的值,則可以定義為枚舉類型所謂“枚舉”就是指把可能的值一一列舉出來,變量的值只限于列舉出來的
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年農(nóng)業(yè)主題公園運(yùn)營策略方法
- 2026年HRBP業(yè)務(wù)伙伴角色賦能課
- 2026年鄉(xiāng)村治理積分制應(yīng)用策略
- 2026湖北武漢武昌區(qū)中南電力設(shè)計院有限公司數(shù)智科技公司招聘4人備考題庫及答案詳解1套
- 趣味天文知識
- 職業(yè)噪聲暴露限值標(biāo)準(zhǔn)的制定依據(jù)
- 職業(yè)健康風(fēng)險評估方法學(xué)在化工行業(yè)中的創(chuàng)新應(yīng)用
- 2023年船企裝備行業(yè)分析報告及未來五至十年行業(yè)發(fā)展報告
- 職業(yè)健康風(fēng)險評估與員工職業(yè)發(fā)展精準(zhǔn)匹配策略-1
- 職業(yè)安全教育培訓(xùn)收獲課件
- 2026重慶高新開發(fā)建設(shè)投資集團(tuán)招聘3人備考考試試題及答案解析
- 2026年度宣城市宣州區(qū)森興林業(yè)開發(fā)有限公司第一批次員工公開招聘筆試參考題庫及答案解析
- 老年人管理人員培訓(xùn)制度
- 2025年湖南常德市鼎城區(qū)面向全市選調(diào)8名公務(wù)員備考題庫及答案詳解(新)
- 2026北京海淀初三上學(xué)期期末語文試卷和答案
- 2025學(xué)年度人教PEP五年級英語上冊期末模擬考試試卷(含答案含聽力原文)
- GB/T 3098.6-2023緊固件機(jī)械性能不銹鋼螺栓、螺釘和螺柱
- 公司食材配送方案
- GA/T 952-2011法庭科學(xué)機(jī)動車發(fā)動機(jī)號碼和車架號碼檢驗(yàn)規(guī)程
- 教科版科學(xué)五年級下冊《生物與環(huán)境》單元教材解讀及教學(xué)建議
- 5Why分析法(經(jīng)典完整版)課件
評論
0/150
提交評論