C語言程序設(shè)計(jì):第7章 結(jié)構(gòu)體_第1頁
C語言程序設(shè)計(jì):第7章 結(jié)構(gòu)體_第2頁
C語言程序設(shè)計(jì):第7章 結(jié)構(gòu)體_第3頁
C語言程序設(shè)計(jì):第7章 結(jié)構(gòu)體_第4頁
C語言程序設(shè)計(jì):第7章 結(jié)構(gòu)體_第5頁
已閱讀5頁,還剩30頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、思考思考:在程序里表示一個(gè)人(姓名、年齡、性別、在程序里表示一個(gè)人(姓名、年齡、性別、),怎),怎么表示?么表示?想表示多個(gè)人呢?想表示多個(gè)人呢?如何用計(jì)算機(jī)程序?qū)崿F(xiàn)下述表格的管理?如何用計(jì)算機(jī)程序?qū)崿F(xiàn)下述表格的管理? 某學(xué)校學(xué)生成績(jī)管理表某學(xué)校學(xué)生成績(jī)管理表學(xué)號(hào)學(xué)號(hào)姓名姓名性別性別入學(xué)時(shí)間入學(xué)時(shí)間計(jì)算機(jī)計(jì)算機(jī)原理原理英英 語語數(shù)數(shù) 學(xué)學(xué)音音 樂樂1 1令狐沖令狐沖男男1999199990908383727282822 2林平之林平之男男1999199978789292888878783 3岳靈珊岳靈珊女女1999199989897272989866664 4任瑩瑩任瑩瑩女女199919997

2、8789595878790905 5 6 6 數(shù)組的解決方法數(shù)組的解決方法int studentId30; /* 最多可以管理最多可以管理30個(gè)學(xué)生個(gè)學(xué)生, 每個(gè)學(xué)每個(gè)學(xué) 生的學(xué)號(hào)用數(shù)組的下標(biāo)表示生的學(xué)號(hào)用數(shù)組的下標(biāo)表示*/char studentName3010;char studentSex303;int timeOfEnter30; /*入學(xué)時(shí)間用入學(xué)時(shí)間用int表示表示*/int scoreComputer30;/*計(jì)算機(jī)原理課的成績(jī)計(jì)算機(jī)原理課的成績(jī)*/int scoreEnglish30; /*英語課的成績(jī)英語課的成績(jī)*/int scoreMath30; /*數(shù)學(xué)課的成績(jī)數(shù)學(xué)課的成

3、績(jī)*/int scoreMusic30; /*音樂課的成績(jī)音樂課的成績(jī)*/數(shù)組的解決方法數(shù)組的解決方法int studentId30 = 1,2,3,4,5,6;charstudentName3010=令狐沖令狐沖,林平之林平之, 岳靈珊岳靈珊,任瑩瑩任瑩瑩;charstudentSex303=男男,男男,女女,女女;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

4、 scoreMusic30 = 82,78,66,90; 數(shù)組的解決方法數(shù)組的解決方法數(shù)據(jù)的內(nèi)存管理方式數(shù)據(jù)的內(nèi)存管理方式 90907878898978788383929272729595727288889898878782827878666690901 12 23 34 4令狐沖令狐沖林平之林平之岳靈珊岳靈珊任瑩瑩任瑩瑩男男男男女女女女19991999199919991999199919991999數(shù)組的解決方法數(shù)組的解決方法分配內(nèi)存不集中,尋址效率不高分配內(nèi)存不集中,尋址效率不高 對(duì)數(shù)組進(jìn)行賦初值時(shí),容易發(fā)生對(duì)數(shù)組進(jìn)行賦初值時(shí),容易發(fā)生錯(cuò)位錯(cuò)位 結(jié)構(gòu)顯得比較零散,不容易管理結(jié)構(gòu)顯得比較零散

5、,不容易管理 希望希望的內(nèi)存分配圖的內(nèi)存分配圖 1 1令狐沖令狐沖男男1999199990908383727282822 2林平之林平之男男1999199978789292888878783 3岳靈珊岳靈珊女女1999199989897272989866664 4任瑩瑩任瑩瑩女女199919997878959587879090結(jié)構(gòu)體的解決方法結(jié)構(gòu)體的解決方法struct STUDENTstruct STUDENT int studentID; /int studentID; /* *每個(gè)學(xué)生的序號(hào)每個(gè)學(xué)生的序號(hào)* */ / char studentName10;/char studentNam

6、e10;/* *每個(gè)學(xué)生的姓名每個(gè)學(xué)生的姓名* */ / char studentSex3; /char studentSex3; /* *每個(gè)學(xué)生的性別每個(gè)學(xué)生的性別* */ / intinttimeOfEnter; /timeOfEnter; /* *每個(gè)學(xué)生的入學(xué)時(shí)間每個(gè)學(xué)生的入學(xué)時(shí)間* */ / intintscoreComputer; /scoreComputer; /* *每個(gè)學(xué)生的計(jì)算機(jī)原理成績(jī)每個(gè)學(xué)生的計(jì)算機(jī)原理成績(jī)* */ / intintscoreEnglish; /scoreEnglish; /* *每個(gè)學(xué)生的英語成績(jī)每個(gè)學(xué)生的英語成績(jī)* */ / intintscore

7、Math;scoreMath; / /* *每個(gè)學(xué)生的數(shù)學(xué)成績(jī)每個(gè)學(xué)生的數(shù)學(xué)成績(jī)* */ / intintscoreMusic; /scoreMusic; /* *每個(gè)學(xué)生的音樂成績(jī)每個(gè)學(xué)生的音樂成績(jī)* */ / ;struct STUDENTstruct STUDENT是一個(gè)類型是一個(gè)類型結(jié)構(gòu)體:結(jié)構(gòu)體:1. 把把關(guān)系緊密且邏輯相關(guān)關(guān)系緊密且邏輯相關(guān)的多種的多種不同類型不同類型的變量組織到統(tǒng)的變量組織到統(tǒng)一的名字之下,也稱復(fù)合數(shù)據(jù)類型一的名字之下,也稱復(fù)合數(shù)據(jù)類型2. 這種類型的變量占用這種類型的變量占用相鄰相鄰的一段內(nèi)存單元的一段內(nèi)存單元第7章 結(jié)構(gòu)體 結(jié)構(gòu)體類型的定義結(jié)構(gòu)體類型的定義 結(jié)

8、構(gòu)體是一種構(gòu)造數(shù)據(jù)類型,它由若干成員組成。每一個(gè)成員既可以是一個(gè)基本數(shù)據(jù)類型也可以是一個(gè)構(gòu)造數(shù)據(jù)類型 struct 結(jié)構(gòu)體名結(jié)構(gòu)體名類型類型1 成員成員1;類型類型2 成員成員2;.類型類型n 成員成員n;結(jié)構(gòu)體類型的定義結(jié)構(gòu)體類型的定義struct studentchar cNum8;char cName20;int nAge;char cSex;結(jié)構(gòu)體關(guān)鍵字結(jié)構(gòu)體關(guān)鍵字結(jié)構(gòu)體名結(jié)構(gòu)體名分號(hào)是結(jié)束標(biāo)分號(hào)是結(jié)束標(biāo)志,不能省略志,不能省略結(jié)構(gòu)體的結(jié)構(gòu)體的4 4個(gè)個(gè)成員成員結(jié)構(gòu)體嵌套定義struct dateint nYear;int nMonth;int nDay;struct studentc

9、har cNum8;char cName20;struct date dBirthday;struct studentchar cNum8;char cName20;struct dateint nYear, nMonth, nDay; dBirthday;等價(jià)7.1.2 結(jié)構(gòu)體變量結(jié)構(gòu)體變量 (1) 結(jié)構(gòu)體變量的定義 先定義結(jié)構(gòu)體類型,再聲明結(jié)構(gòu)體變量。其一般形式為:struct 結(jié)構(gòu)體名結(jié)構(gòu)體名 結(jié)構(gòu)體變量名結(jié)構(gòu)體變量名; 例:struct studentchar cNum8;char cName20;int nAge;char cSex;struct student sStu;struc

10、t 結(jié)構(gòu)體名結(jié)構(gòu)體名 結(jié)構(gòu)體變量名結(jié)構(gòu)體變量名;定義結(jié)構(gòu)體類型的同時(shí)定義結(jié)構(gòu)體變量。其一般形式為: 例:struct studentchar cNum8;char cName20;int nAge;char cSex; sStu; struct 結(jié)構(gòu)體名結(jié)構(gòu)體名 成員列表成員列表變量列表變量列表;直接定義無結(jié)構(gòu)名的結(jié)構(gòu)體類型變量 例: struct char cNum8; char cName20; int nAge; char cSex; sStu; struct 成員列表成員列表變量列表變量列表;(2) 結(jié)構(gòu)體變量的初始化以上三種方式聲明結(jié)構(gòu)體變量的同時(shí)都可以進(jìn)行初始化。初始化方式為:將所

11、賦初值按順序放在一對(duì)大括號(hào)內(nèi),下面以第一種定義結(jié)構(gòu)體變量的方式為例來說明初始化問題。例:struct studentchar cNum8;char cName20;int nAge;char cSex;struct student sStu =0804101,Zhanghua,20,M; 注意:注意:(1) 如下初始化形式是非法的。如下初始化形式是非法的。 struct student sStu; sStu=0501,Zhao lin,20,M;(2) 所賦初值與各成員數(shù)據(jù)類型要匹配或兼容所賦初值與各成員數(shù)據(jù)類型要匹配或兼容。(3) 結(jié)構(gòu)體變量成員的引用結(jié)構(gòu)體變量成員的引用形式如下: 結(jié)構(gòu)體變

12、量名結(jié)構(gòu)體變量名. .成員名成員名 實(shí)心點(diǎn)“.”稱為成員運(yùn)算符。例:sStu.cNum sStu.cName 例7-1 定 義 并 初 始化學(xué)生結(jié)構(gòu)體變量,然后輸出變量的各成員值。 #includestruct studentchar *pcNum;char *pcName;char cSex;struct dateint nYear,nMonth,nDay;dBirth;float fScore;sStu1=0804101,Mr.Zhang,M,1979,9,1,80,sStu2;void main()sStu2=sStu1;/*同類型結(jié)構(gòu)體變量之間進(jìn)行賦值運(yùn)算*/printf (Numbe

13、r=%sn,sStu2.pcNum);printf (Name=%sn,sStu2.pcName);printf (Born=%d年年,sStu2.dBirth.nYear);printf (%d月月,sStu2.dBirth.nMonth);printf (%d日日n,sStu2.dBirth.nDay);printf (Sex=%cn,sStu2.cSex);printf (Score=%.1fn,sStu2.fScore); .3結(jié)構(gòu)體數(shù)組在實(shí)際應(yīng)用中,經(jīng)常用結(jié)構(gòu)體數(shù)組來表示具有相同數(shù)據(jù)結(jié)構(gòu)的一個(gè)群體。 例:struct studentchar *pcNum;char *

14、pcName;char cSex;struct dateint nYear,nMonth,nDay;dBirth;float fScore;結(jié)構(gòu)體數(shù)組sStu,共有5個(gè)元素:sStu0sStu4。在聲明的時(shí)候還完成了對(duì)數(shù)組的初始化工作。 struct student sStu5= 0804101,Mr.Zhang,M,1979,9,1,80, 0804102,Mr.Wang,W,1980,8,1,70, 0804103,Mr.Li,M,1978,7,1,55, 0804104,Mr.Zhao,W,1977,6,1,65, 0804105,Mr.Zhou,M,1981,5,1,45;struct

15、 student char *pcNum; char *pcName; char cSex; struct date int nYear,nMonth,nDay; dBirth; float fScore;struct student sStu5=0804101,Mr.Zhang,M,1979,9,1,80,0804102,Mr.Wang,W,1980,8,1,70,0804103,Mr.Li,M,1978,7,1,55,0804104,Mr.Zhao,W,1977,6,1,65,0804105,Mr.Zhou,M,1981,5,1,45;void main() int nCount,nE=0

16、; float fAvg,fSum=0; for(nCount=0;nCount5;nCount+) fSum+=sStunCount.fScore; if(sStunCount.fScorex = 0; /*指向運(yùn)算符指向運(yùn)算符*/第二種更常用第二種更常用xypptpt對(duì)比 (3) 指向結(jié)構(gòu)體數(shù)組 struct telephonechar cName20;char cPhone10;struct telephone tTel3,*ptTel;ptTel=tTel;由于指針 ptTel 指向了數(shù)組 tTel 的首地址,則通過 ptTel 可以實(shí)現(xiàn)操作數(shù)組 tTel 元素的目的。 231tTel

17、0tTel1tTel2ptTelptTel+例7-5運(yùn)用結(jié)構(gòu)體指針變量實(shí)現(xiàn)例7-3的功能。 #include #define NUM 3struct telephone char cName20; char cPhone10;void main() struct telephone tTelNUM,*ptTel; for(ptTel=tTel;ptTelcName);printf(input phone:);gets(ptTel-cPhone); printf(namettphonen); for(ptTel=tTel;ptTelcName,ptTel-cPhone); 7.1.5結(jié)構(gòu)體與函數(shù)

18、結(jié)構(gòu)體與函數(shù) 結(jié)構(gòu)體變量既可以做函數(shù)的參數(shù)也可以做函數(shù)的返回值。結(jié)構(gòu)體變量作函數(shù)參數(shù)傳遞的是所有成員,因此,實(shí)參與形參必須是相同類型的結(jié)構(gòu)體變量。結(jié)構(gòu)體變量做函數(shù)的返回值,返回給主調(diào)函數(shù)的是所有成員,因此,接受此返回值的變量類型必須是結(jié)構(gòu)體類型。結(jié)構(gòu)體成員也可以做函數(shù)的參數(shù)和返回值,這與普通變量做函數(shù)的參數(shù)和返回值是一樣的。 例7-6編寫程序求解某一點(diǎn)在平面坐標(biāo)中關(guān)于原點(diǎn)的對(duì)稱點(diǎn)。 流程如圖所示: #include struct dot int nX;int nY;struct dot SymmetricalDot(struct dot sDot)/*求對(duì)稱點(diǎn)函數(shù)*/ struct dot d

19、SDot;/*定義對(duì)稱點(diǎn)結(jié)構(gòu)體變量*/dSDot.nX = -sDot.nX;dSDot.nY = -sDot.nY;return dSDot;/*將對(duì)稱點(diǎn)返回給主調(diào)函數(shù)*/void main() struct dot dPoint;struct dot dSPoint;/*點(diǎn)dPoint的對(duì)稱點(diǎn)*/printf(Please enter two members of a Point:n);scanf(%d,%d,&dPoint.nX,&dPoint.nY);dSPoint = SymmetricalDot(dPoint);/*調(diào)用求對(duì)稱點(diǎn)函數(shù)*/printf(symmetri

20、cal dot:%d,%dn,dSPoint.nX,dSPoint.nY);/*輸出對(duì)稱點(diǎn)*/7.1.6 7.1.6 位段在定義結(jié)構(gòu)體時(shí)以位為單位來聲明成員所占的內(nèi)存長(zhǎng)度,這樣的成員就稱為位段或位域。C語言允許聲明位段為從1 - 8范圍內(nèi)的任意位數(shù)。例: struct bitdata unsigned a:2;unsigned b:5;unsigned c:3;unsigned d:2;bX; 現(xiàn)在大家要特別注意,位段a和b共7位,不滿一個(gè)字節(jié),還剩1位,但緊接其后的位段c卻需要3位,這時(shí)系統(tǒng)會(huì)另外起一個(gè)存儲(chǔ)單元來存放位段c,依據(jù)同樣的規(guī)律第二個(gè)存儲(chǔ)單元也會(huì)出現(xiàn)3位空閑,如下圖所示。 2bit

21、5bit1bit3bit2bit3bit1B1B7.2 7.2 共用體共用體共用體又稱聯(lián)合體,是將不同數(shù)據(jù)類型組合在一起,這些不同類型的成員在內(nèi)存中所占用的起始單元是相同的。 7.2.1共用體類型定義共用體類型定義 union 共用體名共用體名類型類型 成員成員1;類型類型 成員成員2;.類型類型n 成員成員n;例如:union unit int nClass;char cOffice10; ; .2共用體變量定義共用體變量的聲明和結(jié)構(gòu)變量的定義方式一樣,也有三種。共用體變量的賦值和引用union unit int nClass; char cOffice10; ;union

22、unit uDepartment;union unit int nClass; char cOffice10; uDepartment;union int nClass; char cOffice10; uDepartment;共用體變量名共用體變量名.成員名成員名7-7有一張教師與學(xué)生通用的表格,數(shù)據(jù)項(xiàng)有姓名、有一張教師與學(xué)生通用的表格,數(shù)據(jù)項(xiàng)有姓名、年齡、職業(yè)、教研室年齡、職業(yè)、教研室/ /班級(jí)。輸入人員數(shù)據(jù),再以班級(jí)。輸入人員數(shù)據(jù),再以表格輸出。表格輸出。 #include #define NUM 2struct info/*結(jié)構(gòu)體*/char cName10;int nAge;char

23、 cJob;union unit/*共用體*/int nClass;char cOffice10; uDepa;iPersonInfoNUM;void main() int nCount; for(nCount=0;nCountNUM;nCount+) printf(input Name,Age,Job and Class/Officen); scanf(%s%d %c,iPersonInfonCount.cName,&iPersonInfonCount.nAge,&iPersonInfonCount.cJob); if(iPersonInfonCount.cJob=s) sc

24、anf(%d,&iPersonInfonCount.uDepa.nClass); else scanf(%s,iPersonInfonCount.uDepa.cOffice); printf(NametAgetJobtClass/Officen); for(nCount=0;nCountNUM;nCount+) printf(%st,iPersonInfonCount.cName);printf(%dt,iPersonInfonCount.nAge);printf(%ct,iPersonInfonCount.cJob); if(iPersonInfonCount.cJob=s) printf(%dn,iPersonInfonCount.uDepa.nClass); else printf(%sn,iPersonInfonCount.uDepa.cOffice); 7.3 7.3 枚舉枚舉“枚舉”就是一一列舉的意思,枚舉類型就是一一列舉出來所有可能用到的數(shù)據(jù)值,然后據(jù)此定義的變量就只能使用列舉出來的值,相當(dāng)于常量。

溫馨提示

  • 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. 人人文庫網(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)論