▏C語言結(jié)構(gòu)體[優(yōu)質(zhì)內(nèi)容]_第1頁
▏C語言結(jié)構(gòu)體[優(yōu)質(zhì)內(nèi)容]_第2頁
▏C語言結(jié)構(gòu)體[優(yōu)質(zhì)內(nèi)容]_第3頁
▏C語言結(jié)構(gòu)體[優(yōu)質(zhì)內(nèi)容]_第4頁
▏C語言結(jié)構(gòu)體[優(yōu)質(zhì)內(nèi)容]_第5頁
已閱讀5頁,還剩28頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、Chap 9 結(jié)構(gòu),9.1 輸出平均分最高的學(xué)生信息 9.2 學(xué)生成績排序 9.3 修改學(xué)生成績,1,高級培訓(xùn),本章要點(diǎn),什么是結(jié)構(gòu)?結(jié)構(gòu)與數(shù)組有什么差別? 有幾種結(jié)構(gòu)的定義形式,它們之間有什么不同? 什么是結(jié)構(gòu)的嵌套? 什么是結(jié)構(gòu)變量和結(jié)構(gòu)成員變量?如何引用結(jié)構(gòu)成員變量? 結(jié)構(gòu)變量如何作為函數(shù)參數(shù)使用? 什么是結(jié)構(gòu)數(shù)組?如何定義和使用結(jié)構(gòu)數(shù)組? 什么是結(jié)構(gòu)指針?它如何實(shí)現(xiàn)對結(jié)構(gòu)分量的操作? 結(jié)構(gòu)指針是如何作為函數(shù)的參數(shù)的?,2,高級培訓(xùn),9.1輸出平均分最高的學(xué)生信息,9.1.1 程序解析 9.1.2 結(jié)構(gòu)的概念與定義 9.1.3 結(jié)構(gòu)的嵌套定義 9.1.4 結(jié)構(gòu)變量的定義和初始化 9.1.

2、5 結(jié)構(gòu)變量的使用,3,高級培訓(xùn),9.1.1 程序解析,例9-1 輸出平均分最高的學(xué)生信息 假設(shè)學(xué)生的基本信息包括學(xué)號、姓名、三門課程成績以及個人平均成績。輸入 個學(xué)生的成績信息, 計(jì)算并輸出平均分最高的學(xué)生信息。,4,高級培訓(xùn),9.1.1 程序解析,#include struct student /* 學(xué)生信息結(jié)構(gòu)定義 */ int num; /* 學(xué)號 */ char name10; /* 姓名 */ int computer, english, math; /* 三門課程成績 */ double average; /* 個人平均成績 */ ;,5,高級培訓(xùn),int main(void)

3、int i, n; struct student s1,max; /* 定義結(jié)構(gòu)變量 */ printf(Input n: ); scanf(%d, ,6,高級培訓(xùn),9.1.2 結(jié)構(gòu)的概念與定義,使用結(jié)構(gòu)來表示學(xué)生信息: struct student int num; /* 學(xué)號 */ char name10; /* 姓名 */ int computer, english, math; /* 三門課程成績 */ double average; /* 個人平均成績 */ ; 結(jié)構(gòu)是C語言中一種新的構(gòu)造數(shù)據(jù)類型,它能夠把有內(nèi)在聯(lián)系的不同類型的數(shù)據(jù)統(tǒng)一成一個整體,使它們相互關(guān)聯(lián) 結(jié)構(gòu)又是變量的集合,

4、可以按照對基本數(shù)據(jù)類型的操作方法單獨(dú)使用其變量成員。,結(jié)構(gòu)與數(shù)組比較: 都是構(gòu)造類型,是多個變量的集合 數(shù)組成員類型相同,結(jié)構(gòu)成員類型不同,7,高級培訓(xùn),9.1.2 結(jié)構(gòu)的概念與定義,結(jié)構(gòu)類型定義的一般形式為: struct 結(jié)構(gòu)名 類型名 結(jié)構(gòu)成員名1; 類型名 結(jié)構(gòu)成員名2; 類型名 結(jié)構(gòu)成員名n; ;,結(jié)構(gòu)的定義以分號結(jié)束,C語言中把結(jié)構(gòu)的定義看作是一條語句,關(guān)鍵字struct和它后面的結(jié)構(gòu)名一起組成一個新的數(shù)據(jù)類型名,8,高級培訓(xùn),9.1.2 結(jié)構(gòu)的概念與定義,例如,平面坐標(biāo)結(jié)構(gòu): struct point float x; float y; ;,雖然x、y的類型相同,也可以用數(shù)組的方

5、式表示,但采用結(jié)構(gòu)進(jìn)行描述,更貼近事物本質(zhì),從而增加了程序的可讀性,使程序更易理解,結(jié)構(gòu)適合用于描述具有多個屬性的實(shí)體或?qū)ο?9,高級培訓(xùn),9.1.3 結(jié)構(gòu)的嵌套定義,在我們的實(shí)際生活中,一個較大的實(shí)體可能由多個成員構(gòu)成,而這些成員中有些又有可能是由一些更小的成員構(gòu)成。 在學(xué)生信息中可以再增加一項(xiàng):“通信地址”,它又可以再劃分為:城市、街道、門牌號、郵政編碼。,10,高級培訓(xùn),9.1.3 結(jié)構(gòu)的嵌套定義,由此,我們可以對其結(jié)構(gòu)類型進(jìn)行如下重新定義: struct address char city10; char street20; int code; int zip; ;,struct ne

6、st_student int num; char name10; struct address addr; int computer, english, math; double average; ;,在定義嵌套的結(jié)構(gòu)類型時,必須先定義成員的結(jié)構(gòu)類型,再定義主結(jié)構(gòu)類型。,11,高級培訓(xùn),9.1.4 結(jié)構(gòu)變量的定義和初始化,在語言中定義結(jié)構(gòu)變量的方式有三種: 1.單獨(dú)定義:先定義一個結(jié)構(gòu)類型,再定義一個具有這種結(jié)構(gòu)類型的變量 struct student int num; /* 學(xué)號 */ char name10; /* 姓名 */ int computer, english, math; /*

7、 三門課程成績 */ double average; /* 個人平均成績 */ ; struct student s1,s2;,12,高級培訓(xùn),9.1.4結(jié)構(gòu)變量的定義和初始化,2. 混合定義:在定義結(jié)構(gòu)類型的同時定義結(jié)構(gòu)變量 struct student int num; /* 學(xué)號 */ char name10; /* 姓名 */ int computer, english, math; /* 三門課程成績 */ double average; /* 個人平均成績 */ s1, s2; 3. 無類型名定義:在定義結(jié)構(gòu)變量時省略結(jié)構(gòu)名 struct int num; /* 學(xué)號 */ cha

8、r name10; /* 姓名 */ int computer, english, math; /* 三門課程成績 */ double average; /* 個人平均成績 */ s1, s2;,13,高級培訓(xùn),9.1.4結(jié)構(gòu)變量的定義和初始化,結(jié)構(gòu)變量的初始化 struct student s1 = 101, Zhang, 78, 87, 85;,14,高級培訓(xùn),9.1.5 結(jié)構(gòu)變量的使用,1. 結(jié)構(gòu)變量成員的引用 在C語言中,使用結(jié)構(gòu)成員操作符“.”來引用結(jié)構(gòu)成員,格式為: 結(jié)構(gòu)變量名 . 結(jié)構(gòu)成員名 s1.num = 101; strcpy(, Zhang); nest_s

9、1.addr.zip = 310015;,15,高級培訓(xùn),9.1.5 結(jié)構(gòu)變量的使用,2. 結(jié)構(gòu)變量的整體賦值 具有相同類型的結(jié)構(gòu)變量可以直接賦值。賦值時,將賦值符號右邊結(jié)構(gòu)變量的每一個成員的值都賦給了左邊結(jié)構(gòu)變量中相應(yīng)的成員。 struct student s1 = 101, Zhang, 78, 87, 85, s2; s2 = s1;,16,高級培訓(xùn),9.1.5 結(jié)構(gòu)變量的使用,3. 結(jié)構(gòu)變量作為函數(shù)參數(shù) 如果一個C程序的規(guī)模較大,功能較多,必然需要以函數(shù)的形式進(jìn)行功能模塊的劃分和實(shí)現(xiàn) 如果程序中含有結(jié)構(gòu)數(shù)據(jù),則就可能需要用結(jié)構(gòu)變量作為函數(shù)的參數(shù)或返回值,以在函數(shù)間傳遞數(shù)據(jù)。 例: do

10、uble count_average( struct student s ) main:s1.average = count_average ( s1 );,特點(diǎn):可以傳遞多個數(shù)據(jù)且參數(shù)形式較簡單 缺點(diǎn):對于成員較多的大型結(jié)構(gòu),參數(shù)傳遞時所進(jìn)行的結(jié)構(gòu)數(shù)據(jù)復(fù)制使得效率較低,17,高級培訓(xùn),9.2 學(xué)生成績排序,9.2.1 程序解析 9.2.2 結(jié)構(gòu)數(shù)組操作,18,高級培訓(xùn),9.2.1 程序解析,例9-2 輸入n(n50)個學(xué)生的成績信息,按照學(xué)生的個人平均成績從高到低輸出他們的信息。 struct student students50, temp; /* 定義結(jié)構(gòu)數(shù)組 */ /* 輸入 */ ,

11、19,高級培訓(xùn),9.2.1 程序解析,/* 結(jié)構(gòu)數(shù)組排序,選擇排序法 */ for( i = 0; i studentsindex.average) /* 比較平均成績*/ index = j; temp = studentsindex;/* 交換數(shù)組元素 */ studentsindex = studentsi; studentsi = temp; /* 輸出排序后的信息 */ printf(numt namet averagen); for (i = 0; i n; i+ ) printf(%dt%st %.2lfn, studentsi.num, , stud

12、entsi.average);,20,高級培訓(xùn),一個結(jié)構(gòu)變量只能表示一個實(shí)體的信息,如果有許多相同類型的實(shí)體,就需要使用結(jié)構(gòu)數(shù)組。 結(jié)構(gòu)數(shù)組是結(jié)構(gòu)與數(shù)組的結(jié)合,與普通數(shù)組的不同之處在于每個數(shù)組元素都是一個結(jié)構(gòu)類型的變量。,9.2.2 結(jié)構(gòu)數(shù)組操作,21,高級培訓(xùn),結(jié)構(gòu)數(shù)組的定義方法與結(jié)構(gòu)變量類似 struct student students50;,結(jié)構(gòu)數(shù)組students,它有50個數(shù)組元素,從students0到students49,每個數(shù)組元素都是一個結(jié)構(gòu)類型struct student的變量,9.2.2 結(jié)構(gòu)數(shù)組操作,22,高級培訓(xùn),9.2.2 結(jié)構(gòu)數(shù)組操作,結(jié)構(gòu)數(shù)組的初始化 stru

13、ct student students50 = 101,zhang, 76, 85, 78 , 102, wang, 83, 92, 86 ;,23,高級培訓(xùn),結(jié)構(gòu)數(shù)組元素的成員引用 ,其格式為: 結(jié)構(gòu)數(shù)組名下標(biāo) . 結(jié)構(gòu)成員名 使用方法與同類型的變量完全相同: studentsi.num = 101; strcpy(, zhang); studentsi = studentsk,9.2.2 結(jié)構(gòu)數(shù)組操作,24,高級培訓(xùn),9.3 修改學(xué)生成績,9.3.1 程序解析 9.3.2 結(jié)構(gòu)指針的概念 9.3.3 結(jié)構(gòu)指針作為函數(shù)參數(shù),25,高級培訓(xùn),9.3.1程序解析,例9

14、-3 輸入n(n50)個學(xué)生的成績信息,再輸入一個學(xué)生的學(xué)號、課程以及成績,在自定義函數(shù)中修改該學(xué)生指定課程的成績。,int main(void) int course, i, n, num, pos, score; struct student students50; /* 定義結(jié)構(gòu)數(shù)組 */ /* 輸入n個學(xué)生信息 */ /* 輸入待修改學(xué)生信息 */ /*調(diào)用函數(shù),修改學(xué)生成績*/ pos = update_score(students, n, num, course, score); /*輸出修改后的學(xué)生信息*/ . ,26,高級培訓(xùn),9.3.1程序解析,/* 自定義函數(shù),修改學(xué)生成績

15、 */ int update_score(struct student *p, int n, int num, int course, int score) int i,pos; for(i = 0; i num = num) break; if(i math = score; break; case 2: p-english = score; break; case 3: p-computer = score; break; pos = i; /* 被修改學(xué)生在數(shù)組中的下標(biāo) */ else /* 無此學(xué)號 */ pos = -1; return pos; ,27,高級培訓(xùn),9.3.2結(jié)構(gòu)指針

16、的概念,指針可以指向任何一種變量,而結(jié)構(gòu)變量也是C語言中的一種合法變量,因此,指針也可以指向結(jié)構(gòu)變量,這就是結(jié)構(gòu)指針。 結(jié)構(gòu)指針就是指向結(jié)構(gòu)類型變量的指針,28,高級培訓(xùn),9.3.2結(jié)構(gòu)指針的概念,struct student s1 = 101, zhang, 78, 87, 85, *p; p = ,P,29,高級培訓(xùn),9.3.2結(jié)構(gòu)指針的概念,結(jié)構(gòu)指針的使用 (1) 用*p訪問結(jié)構(gòu)成員。如: (*p).num = 101; (2) 用指向運(yùn)算符“-”訪問指針指向的結(jié)構(gòu)成員。如: p-num = 101;,當(dāng)p指向結(jié)構(gòu)變量s1時,下面三條語句的效果是一樣的: s1.num = 101; (*

17、p).num = 101; p-num = 101;,30,高級培訓(xùn),9.3.3結(jié)構(gòu)指針作為函數(shù)參數(shù),結(jié)構(gòu)指針的操作是非常靈活的,如果將結(jié)構(gòu)指針作為函數(shù)的參數(shù),可以完成比基本類型指針更為復(fù)雜的操作。 例9-3 main: pos = update_score(students, n, num, course, score); 自定義函數(shù): int update_score(struct student *p, int n, int num, int course, int score),函數(shù)update_score運(yùn)行完畢返回主函數(shù)后,主函數(shù)中的結(jié)構(gòu)數(shù)組students中的值已被修改,31,高級培訓(xùn),9.3.3結(jié)構(gòu)指針作為函數(shù)參數(shù),與結(jié)構(gòu)變量作為函數(shù)參數(shù)相比,用結(jié)構(gòu)指針作為函數(shù)參數(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論