版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、1 第十四講第十四講 結(jié)構(gòu)體結(jié)構(gòu)體 相關(guān)數(shù)據(jù)的集合。相關(guān)數(shù)據(jù)的集合。 數(shù)據(jù)的類型可以不相同。數(shù)據(jù)的類型可以不相同。 用來定義保存在文件中的記錄。用來定義保存在文件中的記錄。 與指針一起創(chuàng)建動(dòng)態(tài)的數(shù)據(jù)結(jié)構(gòu):與指針一起創(chuàng)建動(dòng)態(tài)的數(shù)據(jù)結(jié)構(gòu): 鏈表鏈表 隊(duì)列隊(duì)列 棧棧 樹樹 2 第十四講第十四講 結(jié)構(gòu)體結(jié)構(gòu)體 結(jié)構(gòu)體的概念結(jié)構(gòu)體的概念 結(jié)構(gòu)體類型的定義結(jié)構(gòu)體類型的定義 結(jié)構(gòu)體變量結(jié)構(gòu)體變量 定義和聲明定義和聲明 初始化初始化 使用使用 結(jié)構(gòu)體數(shù)組結(jié)構(gòu)體數(shù)組 C C語言程序設(shè)計(jì)語言程序設(shè)計(jì) 本講是教材第11章,但我們由 于課時(shí)和全國(guó)C的大綱關(guān)系,第 四至10節(jié)不講,有興趣者,自己 學(xué)習(xí).本課件后面還有一
2、些有 趣的例子,如冼牌,選舉計(jì)票程 序, 有興趣者也可以自學(xué). 結(jié)構(gòu)體是派生的數(shù)據(jù)類型結(jié)構(gòu)體是派生的數(shù)據(jù)類型 使用其他類型的對(duì)象來構(gòu)造使用其他類型的對(duì)象來構(gòu)造 結(jié)構(gòu)體。結(jié)構(gòu)體。 3 結(jié)構(gòu)體結(jié)構(gòu)體 結(jié)構(gòu)體結(jié)構(gòu)體 數(shù)組是由相同類型的數(shù)據(jù)構(gòu)成,而現(xiàn)實(shí)生活中由一些不相數(shù)組是由相同類型的數(shù)據(jù)構(gòu)成,而現(xiàn)實(shí)生活中由一些不相 同類型的數(shù)據(jù)構(gòu)成的一組數(shù)據(jù)是相當(dāng)多的,例如學(xué)號(hào)、姓名和同類型的數(shù)據(jù)構(gòu)成的一組數(shù)據(jù)是相當(dāng)多的,例如學(xué)號(hào)、姓名和 學(xué)生成績(jī)。學(xué)生成績(jī)。C C語言提供了這種數(shù)據(jù)結(jié)構(gòu)稱為語言提供了這種數(shù)據(jù)結(jié)構(gòu)稱為結(jié)構(gòu)體,它是一種結(jié)構(gòu)體,它是一種 較為復(fù)雜而又非常靈活的構(gòu)造型的數(shù)據(jù)類型。較為復(fù)雜而又非常靈活的構(gòu)造
3、型的數(shù)據(jù)類型。 一個(gè)結(jié)構(gòu)體類型可以由若干個(gè)成員(或域)的成分組成,一個(gè)結(jié)構(gòu)體類型可以由若干個(gè)成員(或域)的成分組成, 不同的結(jié)構(gòu)體類型其成員不同。不同的結(jié)構(gòu)體類型其成員不同。 對(duì)于一個(gè)具體的結(jié)構(gòu)體而言其成員的數(shù)量是固定的(同數(shù)對(duì)于一個(gè)具體的結(jié)構(gòu)體而言其成員的數(shù)量是固定的(同數(shù) 組),各成員的數(shù)據(jù)類型可以不同,這是結(jié)構(gòu)體與數(shù)組的重要組),各成員的數(shù)據(jù)類型可以不同,這是結(jié)構(gòu)體與數(shù)組的重要 相同和不同點(diǎn)。相同和不同點(diǎn)。 4 結(jié)構(gòu)體類型定義的一般形式為:結(jié)構(gòu)體類型定義的一般形式為: struct struct 結(jié)構(gòu)體名結(jié)構(gòu)體名 類型名類型名1 1 成員名成員名1 1; 類型名類型名2 2 成員名成員名
4、2 2; 類型名類型名n n 成員名成員名n n; ; 結(jié)構(gòu)體結(jié)構(gòu)體 其中,其中,structstruct是關(guān)鍵字,是結(jié)構(gòu)體類型的標(biāo)志。結(jié)構(gòu)體名是是關(guān)鍵字,是結(jié)構(gòu)體類型的標(biāo)志。結(jié)構(gòu)體名是 由用戶定義的標(biāo)識(shí)符,它規(guī)定了所定義的結(jié)構(gòu)體類型的名稱。由用戶定義的標(biāo)識(shí)符,它規(guī)定了所定義的結(jié)構(gòu)體類型的名稱。 結(jié)構(gòu)體類型的組成成分稱為成員,成員名的命名規(guī)則與變量名結(jié)構(gòu)體類型的組成成分稱為成員,成員名的命名規(guī)則與變量名 相同。相同。 如果成員的類型相同,則可以同變量一樣在一個(gè)類型名后寫如果成員的類型相同,則可以同變量一樣在一個(gè)類型名后寫 出幾個(gè)成員名,他們之間用逗號(hào)分隔。出幾個(gè)成員名,他們之間用逗號(hào)分隔。 s
5、truct struct student long int xuhao long int xuhao; char name8char name8; int eng ,coup,sum;int eng ,coup,sum; float ave; float ave; ; 5 struct date int year; int month; int day; ; 也可以寫成:也可以寫成: struct date int year,month,day; struct student int num; char name8,sex; float score4; ; struct:引入結(jié)構(gòu)體定義。:引入
6、結(jié)構(gòu)體定義。 date:結(jié)構(gòu)體的名稱,必須與:結(jié)構(gòu)體的名稱,必須與 struct 一起使用。一起使用。 struct date 結(jié)構(gòu)體包含結(jié)構(gòu)體包含3個(gè)個(gè) int * 類型的類型的成員成員: year Month day 例如例如A: 這里struct student結(jié)構(gòu)體包含有: Int 型num(學(xué)號(hào)) char name8(姓名),sex(性別) Float score4(成績(jī)數(shù)組) 例如例如B: 6 結(jié)構(gòu)體類型的定義結(jié)構(gòu)體類型的定義 結(jié)構(gòu)體定義說明結(jié)構(gòu)體定義說明 同一個(gè)結(jié)構(gòu)體內(nèi)不可以有同名的成員。同一個(gè)結(jié)構(gòu)體內(nèi)不可以有同名的成員。 不同結(jié)構(gòu)體的成員名可以相同,不互相沖突。不同結(jié)構(gòu)體的成
7、員名可以相同,不互相沖突。 結(jié)構(gòu)體結(jié)構(gòu)體 struct date int year,month,day; ; struct Book char title50,writer20,publisher50; int year,month; ; int year,month,day; 7 結(jié)構(gòu)體類型的定義結(jié)構(gòu)體類型的定義 結(jié)構(gòu)體定義說明結(jié)構(gòu)體定義說明 結(jié)構(gòu)體的成員可以是基本類型和構(gòu)造類型(數(shù)組和其他結(jié)構(gòu)體)。結(jié)構(gòu)體的成員可以是基本類型和構(gòu)造類型(數(shù)組和其他結(jié)構(gòu)體)。 結(jié)構(gòu)體結(jié)構(gòu)體 struct date int year,month,day; birthday; struct StuRec int
8、num;char name20;/這里包含了數(shù)組這里包含了數(shù)組 struct date birthday;/這里包含了上面的結(jié)構(gòu)體這里包含了上面的結(jié)構(gòu)體,稱稱結(jié)構(gòu)體的嵌套結(jié)構(gòu)體的嵌套 ; 結(jié)構(gòu)體的成員不可以包含自身結(jié)構(gòu)體的成員不可以包含自身 但可以包含自身的指針但可以包含自身的指針 struct student char name20; char gender; float scores4; struct student next; /*error*/ struct student *nextPtr; /*correct*/ ; 8 結(jié)構(gòu)體變量結(jié)構(gòu)體變量 結(jié)構(gòu)體定義說明結(jié)構(gòu)體定義說明 只是創(chuàng)建
9、了新的數(shù)據(jù)類型,并不能保留內(nèi)存空間。只是創(chuàng)建了新的數(shù)據(jù)類型,并不能保留內(nèi)存空間。 必須定義結(jié)構(gòu)體變量來獲得內(nèi)存空間。必須定義結(jié)構(gòu)體變量來獲得內(nèi)存空間。 定義定義(聲明聲明)結(jié)構(gòu)體變量結(jié)構(gòu)體變量 有三種方法有三種方法: 1.定義結(jié)構(gòu)體類型后,像聲明普通變量一樣聲明結(jié)構(gòu)體變量。定義結(jié)構(gòu)體類型后,像聲明普通變量一樣聲明結(jié)構(gòu)體變量。 結(jié)構(gòu)體結(jié)構(gòu)體 struct date int year,month,day; ; struct date birth; year month day FF00 FF04 FF08 birth birth 的存儲(chǔ)形式的存儲(chǔ)形式 TC中與中與VC中的不同中的不同 9 結(jié)構(gòu)體變
10、量結(jié)構(gòu)體變量 定義聲明結(jié)構(gòu)體變量定義聲明結(jié)構(gòu)體變量 2.在定義結(jié)構(gòu)體類型的同時(shí),聲明結(jié)構(gòu)體變量在定義結(jié)構(gòu)體類型的同時(shí),聲明結(jié)構(gòu)體變量 結(jié)構(gòu)體結(jié)構(gòu)體 struct date int year,month,day; birth, days4, *bPtr; struct int year,month,day; birth, days4, *bPtr; 沒有結(jié)構(gòu)體名,沒有結(jié)構(gòu)體名, 無法再次使用。無法再次使用。 3.直接(只)聲明結(jié)構(gòu)體變量直接(只)聲明結(jié)構(gòu)體變量省略類型名。省略類型名。 類型與變量是不同的概念,注意區(qū)分。系統(tǒng)能對(duì)變量賦值、存取、運(yùn)算,類型與變量是不同的概念,注意區(qū)分。系統(tǒng)能對(duì)變量賦
11、值、存取、運(yùn)算, 而類型則不能,編譯時(shí),系統(tǒng)只對(duì)變量分配存儲(chǔ)空間,而類型則不分配。而類型則不能,編譯時(shí),系統(tǒng)只對(duì)變量分配存儲(chǔ)空間,而類型則不分配。 結(jié)構(gòu)體中的成員也可以是一個(gè)結(jié)構(gòu)體變量,即結(jié)構(gòu)體的嵌套。結(jié)構(gòu)體中的成員也可以是一個(gè)結(jié)構(gòu)體變量,即結(jié)構(gòu)體的嵌套。 10 struct student /* student是結(jié)構(gòu)體名,結(jié)構(gòu)體成員有是結(jié)構(gòu)體名,結(jié)構(gòu)體成員有num,name,sex,date,scre4 */ int num; char name8,sex; struct date /*date是結(jié)構(gòu)體名,其結(jié)構(gòu)體變量表是是結(jié)構(gòu)體名,其結(jié)構(gòu)體變量表是birthday,成員包括年月日,成員包括
12、年月日*/ int year,month,day; birthday; float score4; /*score4是數(shù)組,數(shù)組成員類型浮點(diǎn)型是數(shù)組,數(shù)組成員類型浮點(diǎn)型 */ xuesh; 結(jié)構(gòu)體中的成員名可以和程序中的變量同名;不同結(jié)構(gòu)體結(jié)構(gòu)體中的成員名可以和程序中的變量同名;不同結(jié)構(gòu)體 中的成員名也可以同名。中的成員名也可以同名。 11 結(jié)構(gòu)體的操作結(jié)構(gòu)體的操作 結(jié)構(gòu)體變量可以執(zhí)行的操作結(jié)構(gòu)體變量可以執(zhí)行的操作 將結(jié)構(gòu)體變量賦給相同類型的結(jié)構(gòu)體變量。將結(jié)構(gòu)體變量賦給相同類型的結(jié)構(gòu)體變量。 得到結(jié)構(gòu)體變量的地址。得到結(jié)構(gòu)體變量的地址。 訪問結(jié)構(gòu)體變量的成員。訪問結(jié)構(gòu)體變量的成員。 使用使用
13、sizeof 確確(測(cè)測(cè))定結(jié)構(gòu)體變量的大小。定結(jié)構(gòu)體變量的大小。 結(jié)構(gòu)體結(jié)構(gòu)體 12 結(jié)構(gòu)體變量的初始化結(jié)構(gòu)體變量的初始化 給全部成員賦初值給全部成員賦初值 結(jié)構(gòu)體結(jié)構(gòu)體 struct student int num; char name8,sex; struct date int year,month ,day ; birthday; float sco 4; xuesh=101,“王小寧”,F,1975,5,21,83.6,88,75.5,90; 將結(jié)構(gòu)體變量各成員的初值順序地放在一對(duì)大括號(hào)中,并用逗號(hào)分隔。對(duì)將結(jié)構(gòu)體變量各成員的初值順序地放在一對(duì)大括號(hào)中,并用逗號(hào)分隔。對(duì) 結(jié)構(gòu)體類型變
14、量賦初值時(shí),按每個(gè)成員在結(jié)構(gòu)體中的順序一一對(duì)應(yīng)賦值。結(jié)構(gòu)體類型變量賦初值時(shí),按每個(gè)成員在結(jié)構(gòu)體中的順序一一對(duì)應(yīng)賦值。 同變量一樣結(jié)構(gòu)體變量在定義時(shí)也可以進(jìn)行初始化。同變量一樣結(jié)構(gòu)體變量在定義時(shí)也可以進(jìn)行初始化。 13 結(jié)構(gòu)體變量的初始化結(jié)構(gòu)體變量的初始化 初始化結(jié)構(gòu)體變量初始化結(jié)構(gòu)體變量 給部分成員賦初值。給部分成員賦初值。 結(jié)構(gòu)體結(jié)構(gòu)體 struct StuRec int num; char name20; struct date int year,month,day; birthday; float score; student=101, “王小寧”; num (2B) name (20B
15、) birthday(6B)score (4B) yearmonthday 101 王小寧 0000.0 14 結(jié)構(gòu)體變量的成員結(jié)構(gòu)體變量的成員 訪問結(jié)構(gòu)體成員的兩種方式訪問結(jié)構(gòu)體成員的兩種方式 結(jié)構(gòu)體成員運(yùn)算符:結(jié)構(gòu)體成員運(yùn)算符:. 用于結(jié)構(gòu)體變量用于結(jié)構(gòu)體變量 結(jié)構(gòu)體指針運(yùn)算符:結(jié)構(gòu)體指針運(yùn)算符:- 用于指向結(jié)構(gòu)體的指針用于指向結(jié)構(gòu)體的指針 等價(jià)于等價(jià)于 (*cardPtr).face 結(jié)構(gòu)體結(jié)構(gòu)體 struct card myCard; printf(“%s”, myCard.face); struct card *cardPtr; printf(“%s”, cardPtr-face);
16、 struct card char *face; char *suit; myCard.face; 15 案例分析:結(jié)構(gòu)體變量的成員案例分析:結(jié)構(gòu)體變量的成員 問題:訪問結(jié)構(gòu)體變量的成員。問題:訪問結(jié)構(gòu)體變量的成員。(cw1301.c) 結(jié)構(gòu)體結(jié)構(gòu)體 #include struct card char *face; char *suit; a; Int main() struct card a, *aPtr; a.face = Ace; a.suit = Spades; aPtr = printf(%s%s%sn%s%s%sn%s%s%sn, a.face, of , a.suit, aPtr
17、-face, of , aPtr-suit, (*aPtr).face, of , (*aPtr).suit); 與數(shù)組的不同:與數(shù)組的不同: 結(jié)構(gòu)變量名不是指針結(jié)構(gòu)變量名不是指針 Ace of Spades Ace of Spades Ace of Spades 注意:注意: 結(jié)構(gòu)不能作為整體輸入輸出。結(jié)構(gòu)不能作為整體輸入輸出。 必須逐個(gè)成員輸入輸出。必須逐個(gè)成員輸入輸出。 16 案例分析:結(jié)構(gòu)體作為函數(shù)的參數(shù)案例分析:結(jié)構(gòu)體作為函數(shù)的參數(shù) 問題:編寫函數(shù)實(shí)現(xiàn)結(jié)構(gòu)體的復(fù)制。問題:編寫函數(shù)實(shí)現(xiàn)結(jié)構(gòu)體的復(fù)制。 結(jié)構(gòu)體結(jié)構(gòu)體 #include#include structstruct date d
18、ate int year, month, day; ; int year, month, day; ; voidvoid show(char show(char * *, struct date);, struct date); voidvoid copy(struct date, struct date); copy(struct date, struct date); voidvoid clone(struct date, struct date clone(struct date, struct date * *);); intint main() main() structstruct
19、 date d1, d2, d3, d4; date d1, d2, d3, d4; d1.year = 2004; d1.year = 2004; d1.month = 5; d1.month = 5; d1.day = 1; d1.day = 1; show(“d1”, d1); show(“d1”, d1); /結(jié)構(gòu)體變量作實(shí)參,值傳遞結(jié)構(gòu)體變量作實(shí)參,值傳遞 d2 = d1;d2 = d1; show(d2, d2); show(d2, d2); 實(shí)現(xiàn)實(shí)現(xiàn)(cw1302.c) 17 案例分析:結(jié)構(gòu)體作為函數(shù)的參數(shù)案例分析:結(jié)構(gòu)體作為函數(shù)的參數(shù) 結(jié)構(gòu)體結(jié)構(gòu)體 copy(d1, d3);
20、copy(d1, d3); show(d3, d3); show(d3, d3); clone(d1, clone(d1, show(d4, d4); show(d4, d4); voidvoid show(char show(char * *name, struct date d)name, struct date d) printf(%s: %d-%d-%dn, name, d.year, d.month, d.day); printf(%s: %d-%d-%dn, name, d.year, d.month, d.day); voidvoid copy(struct date s, co
21、py(struct date s, struct date dstruct date d) ) d = s; d = s; voidvoid clone(struct date s, clone(struct date s, struct date struct date * *dPtrdPtr) ) * *dPtr = s; dPtr = s; d1: 2004-5-1 d2: 2004-5-1 d3: 0-0-24 (TC)在在VC中運(yùn)行的結(jié)果不一樣中運(yùn)行的結(jié)果不一樣-858993460-858993460-858993460 d4: 2004-5-1 用指針作形參 用地址作實(shí)參傳遞 /結(jié)
22、構(gòu)體變量作實(shí)參,值傳遞,d3未賦值作實(shí)參值不確定 空返回,無值返回 (cw1302.c)續(xù))續(xù) 18 結(jié)構(gòu)體數(shù)組結(jié)構(gòu)體數(shù)組 一、結(jié)構(gòu)體數(shù)組的定義一、結(jié)構(gòu)體數(shù)組的定義 定義結(jié)構(gòu)體數(shù)組的方法和定義結(jié)構(gòu)體變量的方法一樣,只定義結(jié)構(gòu)體數(shù)組的方法和定義結(jié)構(gòu)體變量的方法一樣,只 是必須說明其為數(shù)組。是必須說明其為數(shù)組。 定義結(jié)構(gòu)體變量的三種方法都可以用來定義結(jié)構(gòu)體數(shù)組。定義結(jié)構(gòu)體變量的三種方法都可以用來定義結(jié)構(gòu)體數(shù)組。 二、結(jié)構(gòu)體數(shù)組的初始化二、結(jié)構(gòu)體數(shù)組的初始化 和一般數(shù)組一樣,結(jié)構(gòu)體數(shù)組也可以進(jìn)行初始化。和一般數(shù)組一樣,結(jié)構(gòu)體數(shù)組也可以進(jìn)行初始化。 數(shù)組每個(gè)元素的初值都放在一對(duì)大括號(hào)中,括號(hào)中依次排數(shù)
23、組每個(gè)元素的初值都放在一對(duì)大括號(hào)中,括號(hào)中依次排 列元素各成員的初始值列元素各成員的初始值 三、結(jié)構(gòu)體數(shù)組的引用三、結(jié)構(gòu)體數(shù)組的引用 對(duì)結(jié)構(gòu)體數(shù)組的引用一般是對(duì)數(shù)組元素的成員進(jìn)行引用。對(duì)結(jié)構(gòu)體數(shù)組的引用一般是對(duì)數(shù)組元素的成員進(jìn)行引用。 引用只要遵循對(duì)數(shù)組元素的引用規(guī)則和對(duì)結(jié)構(gòu)體變量成員的引用只要遵循對(duì)數(shù)組元素的引用規(guī)則和對(duì)結(jié)構(gòu)體變量成員的 引用規(guī)則即可。引用規(guī)則即可。 19 結(jié)構(gòu)體數(shù)組結(jié)構(gòu)體數(shù)組 結(jié)構(gòu)體數(shù)組結(jié)構(gòu)體數(shù)組 數(shù)組的元素是結(jié)構(gòu)體變量。數(shù)組的元素是結(jié)構(gòu)體變量。 常用結(jié)構(gòu)體來表示記錄,那么結(jié)構(gòu)體數(shù)組就可以表示一組記常用結(jié)構(gòu)體來表示記錄,那么結(jié)構(gòu)體數(shù)組就可以表示一組記 錄。錄。 案例分析案例
24、分析 全班全班 N 個(gè)學(xué)生,每個(gè)學(xué)生有學(xué)號(hào)、姓名、四門課的成績(jī)。個(gè)學(xué)生,每個(gè)學(xué)生有學(xué)號(hào)、姓名、四門課的成績(jī)。 結(jié)構(gòu)體結(jié)構(gòu)體 學(xué)號(hào)學(xué)號(hào)姓名姓名成績(jī)成績(jī)1成績(jī)成績(jī)2成績(jī)成績(jī)3成績(jī)成績(jī)4 101WangHai80787681 102ZhaoFei68667175 130LiRui82768184 20 結(jié)構(gòu)體數(shù)組結(jié)構(gòu)體數(shù)組 結(jié)構(gòu)體數(shù)組結(jié)構(gòu)體數(shù)組 案例分析案例分析 那么,可以定義結(jié)構(gòu)體數(shù)組來保存那么,可以定義結(jié)構(gòu)體數(shù)組來保存 N 個(gè)學(xué)生的數(shù)據(jù)。個(gè)學(xué)生的數(shù)據(jù)。 這樣,每個(gè)學(xué)生的數(shù)據(jù)就對(duì)應(yīng)一個(gè)結(jié)構(gòu)體變量(一條記錄),便于這樣,每個(gè)學(xué)生的數(shù)據(jù)就對(duì)應(yīng)一個(gè)結(jié)構(gòu)體變量(一條記錄),便于 編程處理。編程處理。 結(jié)構(gòu)
25、體結(jié)構(gòu)體 struct student int num; char name20; float scores4; ; struct student students30; 21 程序舉例程序舉例 設(shè)某班有設(shè)某班有N名學(xué)生,每個(gè)學(xué)生數(shù)據(jù)包括學(xué)號(hào),姓名,性別,年齡,平均成績(jī)。名學(xué)生,每個(gè)學(xué)生數(shù)據(jù)包括學(xué)號(hào),姓名,性別,年齡,平均成績(jī)。 要求輸入任意一個(gè)學(xué)號(hào),輸出該學(xué)生的所有數(shù)據(jù)。要求輸入任意一個(gè)學(xué)號(hào),輸出該學(xué)生的所有數(shù)據(jù)。 分析:從一組數(shù)據(jù)中查找所需要的具有某特征的內(nèi)容,最簡(jiǎn)單的是順序查找。分析:從一組數(shù)據(jù)中查找所需要的具有某特征的內(nèi)容,最簡(jiǎn)單的是順序查找。 直到找到或找完為止。直到找到或找完為止。
26、 /*Cw1303.c 教材教材P171L11-1*/ #include #define N 2 struct student /定義結(jié)構(gòu)體定義結(jié)構(gòu)體 long int num;/學(xué)號(hào)學(xué)號(hào) char name7;/姓名姓名 char sex3;/性別性別 int age,score;/成績(jī)成績(jī) stuN;/定義結(jié)構(gòu)體數(shù)組定義結(jié)構(gòu)體數(shù)組 main() int i,t=-1;/t=-1為未查找到時(shí)的標(biāo)志為未查找到時(shí)的標(biāo)志 long int xuehao;/查找學(xué)號(hào)變量查找學(xué)號(hào)變量 struct student stuN; /定義結(jié)構(gòu)體類型數(shù)組定義結(jié)構(gòu)體類型數(shù)組 (cw1303.c)案例分析:結(jié)構(gòu)體
27、數(shù)組案例分析:結(jié)構(gòu)體數(shù)組 22 printf(請(qǐng)按下列順序輸入請(qǐng)按下列順序輸入%d個(gè)學(xué)生的信息個(gè)學(xué)生的信息:n,N); /為結(jié)構(gòu)體變量賦值為結(jié)構(gòu)體變量賦值 printf(t學(xué)號(hào)學(xué)號(hào) 姓名姓名 性別性別 年齡年齡 平均平均n); for (i=0;iN;i+) printf(NO%d:t,i+1); scanf(%ld%s%s%d%d, printf(請(qǐng)輸入需查找學(xué)生的學(xué)號(hào):請(qǐng)輸入需查找學(xué)生的學(xué)號(hào):); scanf(%ld, for(i=0;iN;i+) if(xuehao=stui.num) t=i;break; if (t!=-1) /*以下輸出檢索結(jié)果以下輸出檢索結(jié)果*/ printf(%
28、ld%8s%4s%4d%4dn,stut.num,,stut.sex,stut.age, stut.score); else printf(查無此人查無此人!n); (cw1303.c)續(xù))續(xù) 23 案例分析:結(jié)構(gòu)體數(shù)組案例分析:結(jié)構(gòu)體數(shù)組 檢索檢索 問題:?jiǎn)栴}: 某班有某班有 n 個(gè)學(xué)生,每個(gè)學(xué)生的數(shù)據(jù)包括學(xué)號(hào)、姓名、年齡和性別。個(gè)學(xué)生,每個(gè)學(xué)生的數(shù)據(jù)包括學(xué)號(hào)、姓名、年齡和性別。 要求給定任意一個(gè)學(xué)號(hào),程序能輸出檢索的結(jié)果,并顯示對(duì)應(yīng)的學(xué)要求給定任意一個(gè)學(xué)號(hào),程序能輸出檢索的結(jié)果,并顯示對(duì)應(yīng)的學(xué) 生的數(shù)據(jù)。生的數(shù)據(jù)。 分析分析 定義結(jié)構(gòu)體表示學(xué)生定義結(jié)構(gòu)體表示學(xué)生 用結(jié)構(gòu)體
29、數(shù)組保存學(xué)生數(shù)據(jù)用結(jié)構(gòu)體數(shù)組保存學(xué)生數(shù)據(jù) 采用順序查找法采用順序查找法 結(jié)構(gòu)體結(jié)構(gòu)體 輸入學(xué)生信息輸入學(xué)生信息 輸入查詢條件輸入查詢條件 查找學(xué)生信息,報(bào)告結(jié)果查找學(xué)生信息,報(bào)告結(jié)果 24 案例分析:結(jié)構(gòu)體數(shù)組案例分析:結(jié)構(gòu)體數(shù)組 檢索檢索 實(shí)現(xiàn)實(shí)現(xiàn)(cw1304.c) 結(jié)構(gòu)體結(jié)構(gòu)體 #include #define MAX 20 int main() struct StuRec int num; char name20; char gender; int age; studentMAX; int i, N, num; 25 案例分析:結(jié)構(gòu)體數(shù)組案例分析:結(jié)構(gòu)體數(shù)組 檢索檢索 實(shí)現(xiàn)實(shí)現(xiàn) 結(jié)構(gòu)體
30、結(jié)構(gòu)體 printf(tInput a integer as the number of students:); scanf(%d, printf(tInput %d students information:n,N); printf(ntNo.tNametGendertAgen); for (i=0;iN;i+) printf(student %d:nt, i+1); scanf(%d %s %c %d, (cw1304.c)續(xù))續(xù) 26 案例分析:結(jié)構(gòu)體數(shù)組案例分析:結(jié)構(gòu)體數(shù)組 檢索檢索 實(shí)現(xiàn)實(shí)現(xiàn) 結(jié)構(gòu)體結(jié)構(gòu)體 printf(ntInput a number:); scanf(%d, pr
31、intf(ntPlease wait. Searching.n); for (i=0;iN;i+) if (num=studenti.num) break; if (iN) printf(ntNo.:%dntName:%sntGender:%cntAge:%dn, studenti.num, , studenti.gender, studenti.age); else printf(ntNot found!n); 輸入查找條件輸入查找條件 查找查找 (cw1304.c)續(xù))續(xù) 27 案例分析:結(jié)構(gòu)體數(shù)組案例分析:結(jié)構(gòu)體數(shù)組 檢索檢索 問題:?jiǎn)栴}: 可以多次查找。可以多
32、次查找。 結(jié)構(gòu)體結(jié)構(gòu)體 輸入學(xué)生信息輸入學(xué)生信息 輸入查詢條件輸入查詢條件 查找學(xué)生信息,報(bào)告結(jié)果查找學(xué)生信息,報(bào)告結(jié)果 是否繼續(xù)查詢是否繼續(xù)查詢 Y N 人機(jī)交互人機(jī)交互 28 案例分析:結(jié)構(gòu)體數(shù)組案例分析:結(jié)構(gòu)體數(shù)組 檢索檢索 實(shí)現(xiàn)實(shí)現(xiàn)(cw1304m.c) 部分代碼部分代碼 結(jié)構(gòu)體結(jié)構(gòu)體 do scanf(%d, for (i=0;iN;i+) if (num=studenti.num) break; if (iN) /* Found! */ else printf(ntNot found!n); printf(ntContinue?(y/n); c=getchar(); while (
33、c=y|c=Y); 1001y (cw1304.c)續(xù))續(xù) 29 小結(jié):知識(shí)要點(diǎn)小結(jié):知識(shí)要點(diǎn) 結(jié)構(gòu)體是由若干個(gè)不同類型數(shù)據(jù)項(xiàng)構(gòu)成的集合。結(jié)構(gòu)體是由若干個(gè)不同類型數(shù)據(jù)項(xiàng)構(gòu)成的集合。 結(jié)構(gòu)體類型的定義:結(jié)構(gòu)體類型的定義: 1. 結(jié)構(gòu)體類型定義的一般形式結(jié)構(gòu)體類型定義的一般形式 2. 結(jié)構(gòu)體類型定義中的注意事項(xiàng)結(jié)構(gòu)體類型定義中的注意事項(xiàng) 結(jié)構(gòu)體類型變量:結(jié)構(gòu)體類型變量: 結(jié)構(gòu)體數(shù)組:結(jié)構(gòu)體數(shù)組: 1. 結(jié)構(gòu)體數(shù)組定義的三種方法結(jié)構(gòu)體數(shù)組定義的三種方法 2. 結(jié)構(gòu)體數(shù)組的初始化結(jié)構(gòu)體數(shù)組的初始化 3. 對(duì)結(jié)構(gòu)體數(shù)組元素的成員進(jìn)行引用對(duì)結(jié)構(gòu)體數(shù)組元素的成員進(jìn)行引用 1. 結(jié)構(gòu)體類型變量定義的三種方法結(jié)
34、構(gòu)體類型變量定義的三種方法 2. 結(jié)構(gòu)體類型變量的初始化結(jié)構(gòu)體類型變量的初始化 3. 對(duì)結(jié)構(gòu)體變量中成員的引用對(duì)結(jié)構(gòu)體變量中成員的引用 4. 對(duì)整個(gè)結(jié)構(gòu)體變量的引用對(duì)整個(gè)結(jié)構(gòu)體變量的引用 30 #include /預(yù)處理調(diào)用輸入輸出頭文件預(yù)處理調(diào)用輸入輸出頭文件 #include / #define N 10/定義符號(hào)常量定義符號(hào)常量 struct stu/定義結(jié)構(gòu)體定義結(jié)構(gòu)體 long int sno;/學(xué)號(hào)長(zhǎng)整型學(xué)號(hào)長(zhǎng)整型 int score4;/成績(jī)浮點(diǎn)數(shù)一維數(shù)組三元素成績(jī)浮點(diǎn)數(shù)一維數(shù)組三元素 studN;/定義結(jié)構(gòu)體數(shù)組定義結(jié)構(gòu)體數(shù)組 void sort(struct stu arr)
35、/定義結(jié)構(gòu)體數(shù)組成績(jī)排序定義結(jié)構(gòu)體數(shù)組成績(jī)排序 int i,j; /定義循環(huán)變量定義循環(huán)變量 struct stu temp; /定義結(jié)構(gòu)體臨時(shí)變量定義結(jié)構(gòu)體臨時(shí)變量 for(i=0;iN;i+) /外循環(huán)外循環(huán) for(j=i+1;jN;j+) /內(nèi)循環(huán)內(nèi)循環(huán) if(arri.score3arrj.score3) /比較前后兩行比較前后兩行 temp=arri;arri=arrj;arrj=temp;/排序交換排序交換 輸入一個(gè)班輸入一個(gè)班10個(gè)學(xué)生的學(xué)號(hào)和每個(gè)學(xué)生考試三門功課(數(shù)學(xué)、英語、計(jì)算機(jī)基礎(chǔ))個(gè)學(xué)生的學(xué)號(hào)和每個(gè)學(xué)生考試三門功課(數(shù)學(xué)、英語、計(jì)算機(jī)基礎(chǔ)) 的成績(jī)。編程計(jì)算出每個(gè)學(xué)生的
36、總分和平均分,并按學(xué)生成績(jī)優(yōu)劣排序,最后打的成績(jī)。編程計(jì)算出每個(gè)學(xué)生的總分和平均分,并按學(xué)生成績(jī)優(yōu)劣排序,最后打 印一張按高分到低分名次排序的成績(jī)單。要求:印一張按高分到低分名次排序的成績(jī)單。要求: 1)排序用一個(gè)函數(shù)實(shí)現(xiàn)。排序用一個(gè)函數(shù)實(shí)現(xiàn)。 2)打印的成績(jī)單表項(xiàng)包括:序號(hào),學(xué)號(hào)、數(shù)學(xué)、英語、計(jì)算機(jī)、總分、平均分。打印的成績(jī)單表項(xiàng)包括:序號(hào),學(xué)號(hào)、數(shù)學(xué)、英語、計(jì)算機(jī)、總分、平均分。 31 int main()/主函數(shù)主函數(shù) int i; printf(請(qǐng)輸入學(xué)號(hào)和數(shù)學(xué)、英語、計(jì)算機(jī)的成績(jī)請(qǐng)輸入學(xué)號(hào)和數(shù)學(xué)、英語、計(jì)算機(jī)的成績(jī)n); for(i=0;iN;i+)/輸入數(shù)據(jù)輸入數(shù)據(jù) printf(
37、“NO:%d”,i+1); scanf(%ld%d%d%d, studi.score3=studi.score0+studi.score1+studi.score2; sort(stud);/調(diào)用排序函數(shù)調(diào)用排序函數(shù) printf(“名次名次t學(xué)號(hào)學(xué)號(hào)t數(shù)學(xué)數(shù)學(xué)t英語英語t計(jì)算機(jī)計(jì)算機(jī)t總分總分t平均分平均分n); /輸出題頭輸出題頭 for(i=0;iN;i+)/順序輸出整行順序輸出整行 printf(%dt%ld%t%dt%dt%dt%dt%.1fn,i+1,studi.sno,studi.scor e0,studi.score1,studi.score2,studi.score3,(fl
38、oat)studi.score 3/3); 這是用結(jié)構(gòu)體做實(shí)驗(yàn)報(bào)告這是用結(jié)構(gòu)體做實(shí)驗(yàn)報(bào)告,思路方法同數(shù)組是一致的思路方法同數(shù)組是一致的. 32 本章到此結(jié)束,謝謝您的光臨!本章到此結(jié)束,謝謝您的光臨! THANK YOU VERY THANK YOU VERY MUCH MUCH ! 33 案例分析:結(jié)構(gòu)體數(shù)組案例分析:結(jié)構(gòu)體數(shù)組 高性能的洗牌和發(fā)牌程序高性能的洗牌和發(fā)牌程序 數(shù)據(jù)結(jié)構(gòu)數(shù)據(jù)結(jié)構(gòu) 用一個(gè)紙牌結(jié)構(gòu)體數(shù)組保存一副牌。用一個(gè)紙牌結(jié)構(gòu)體數(shù)組保存一副牌。 紙牌的花色和號(hào)碼名依然保存在字符串?dāng)?shù)組中。紙牌的花色和號(hào)碼名依然保存在字符串?dāng)?shù)組中。 這樣,數(shù)組中的紙牌儼然已有一個(gè)順序了,則可以改進(jìn)算
39、這樣,數(shù)組中的紙牌儼然已有一個(gè)順序了,則可以改進(jìn)算 法。法。 洗牌:隨機(jī)打亂紙牌在數(shù)組中的位置。洗牌:隨機(jī)打亂紙牌在數(shù)組中的位置。 不存在無限延期。不存在無限延期。 發(fā)牌:按紙牌在數(shù)組中的順序顯示輸出。發(fā)牌:按紙牌在數(shù)組中的順序顯示輸出。 數(shù)組遍歷一次。數(shù)組遍歷一次。 結(jié)構(gòu)體結(jié)構(gòu)體 34 案例分析:結(jié)構(gòu)體數(shù)組案例分析:結(jié)構(gòu)體數(shù)組 高性能的洗牌和發(fā)牌程序高性能的洗牌和發(fā)牌程序 實(shí)現(xiàn)實(shí)現(xiàn)(cw1304a.c) 結(jié)構(gòu)體結(jié)構(gòu)體 #include #include #include struct card char *face; char *suit; ; typedef struct card Car
40、d; void fillDeck(Card*, char*, char*); void shuffle(Card*); void deal(Card*); 35 案例分析:結(jié)構(gòu)體數(shù)組案例分析:結(jié)構(gòu)體數(shù)組 高性能的洗牌和發(fā)牌程序高性能的洗牌和發(fā)牌程序 實(shí)現(xiàn)實(shí)現(xiàn) 結(jié)構(gòu)體結(jié)構(gòu)體 int main() Card deck52; char *face = Ace,Deuce,Three, Four,Five, Six,Seven,Eight, Nine,Ten, Jack,Queen,King; char *suit = Hearts,Diamonds,Clubs,Spades; srand(time(
41、NULL); fillDeck(deck, face, suit); shuffle(deck); deal(deck); 36 案例分析:結(jié)構(gòu)體數(shù)組案例分析:結(jié)構(gòu)體數(shù)組 高性能的洗牌和發(fā)牌程序高性能的洗牌和發(fā)牌程序 實(shí)現(xiàn)實(shí)現(xiàn) 結(jié)構(gòu)體結(jié)構(gòu)體 void fillDeck(Card *wDeck, char *wFace, char *wSuit) int i; for (i=0; i=51; i+) wDecki.face = wFacei%13; wDecki.suit = wSuiti/13; 37 案例分析:結(jié)構(gòu)體數(shù)組案例分析:結(jié)構(gòu)體數(shù)組 高性能的洗牌和發(fā)牌程序高性能的洗牌和發(fā)牌程序 實(shí)現(xiàn)
42、實(shí)現(xiàn) 結(jié)構(gòu)體結(jié)構(gòu)體 void shuffle(Card *wDeck) int i, j; Card temp; for (i=0; i=51; i+) j = rand()%52; temp = wDecki; wDecki = wDeckj; wDeckj = temp; 38 案例分析:結(jié)構(gòu)體數(shù)組案例分析:結(jié)構(gòu)體數(shù)組 高性能的洗牌和發(fā)牌程序高性能的洗牌和發(fā)牌程序 實(shí)現(xiàn)實(shí)現(xiàn) 結(jié)構(gòu)體結(jié)構(gòu)體 void deal(Card *wDeck) int i; for (i=0; i=51; i+) printf(%5s of %-8s%c, wDecki.face, wDecki.suit, (i+1
43、)%2 ? t : n); 39 案例分析:結(jié)構(gòu)體數(shù)組案例分析:結(jié)構(gòu)體數(shù)組 點(diǎn)票程序點(diǎn)票程序 問題問題 有三個(gè)候選人,有三個(gè)候選人,N個(gè)選舉人,每次輸入一個(gè)得票的候選人的名字,個(gè)選舉人,每次輸入一個(gè)得票的候選人的名字, 要求最后輸出各人的得票結(jié)果。要求最后輸出各人的得票結(jié)果。 定義數(shù)據(jù)結(jié)構(gòu)定義數(shù)據(jù)結(jié)構(gòu) 結(jié)構(gòu)體結(jié)構(gòu)體 struct candidate char name20; /*姓名姓名*/ int count; /*得票數(shù)得票數(shù)*/ cand3; 40 案例分析:結(jié)構(gòu)體數(shù)組案例分析:結(jié)構(gòu)體數(shù)組 點(diǎn)票程序點(diǎn)票程序 算法算法 結(jié)構(gòu)體結(jié)構(gòu)體 輸入候選人信息輸入候選人信息 輸入選票輸入選票 查找得票
44、人信息查找得票人信息 找到否?找到否? 得票人的票數(shù)增一得票人的票數(shù)增一 輸出點(diǎn)票結(jié)果輸出點(diǎn)票結(jié)果 點(diǎn)完否?點(diǎn)完否? Y N N Y 41 案例分析:結(jié)構(gòu)體數(shù)組案例分析:結(jié)構(gòu)體數(shù)組 點(diǎn)票程序點(diǎn)票程序 實(shí)現(xiàn)實(shí)現(xiàn)(cw1305.c) 結(jié)構(gòu)體結(jié)構(gòu)體 do printf(Vote:t); gets(name); for (i=0;iM;i+) if (strcmp(name, )=0) candi.count+; vote+; break; printf(tContinue?(y/n); c=getchar(); i=getchar(); while (c=y|c=Y); 42 案
45、例分析:結(jié)構(gòu)體數(shù)組案例分析:結(jié)構(gòu)體數(shù)組 改進(jìn)點(diǎn)票程序改進(jìn)點(diǎn)票程序 問題:?jiǎn)栴}: 假設(shè)選舉人都是候選人假設(shè)選舉人都是候選人 分析點(diǎn)票過程中數(shù)組的變化分析點(diǎn)票過程中數(shù)組的變化 結(jié)構(gòu)體結(jié)構(gòu)體 litao litao wanghai litao zhaofei litaowanghai litaowanghaizhaofei 43 案例分析:結(jié)構(gòu)體數(shù)組案例分析:結(jié)構(gòu)體數(shù)組 改進(jìn)點(diǎn)票程序改進(jìn)點(diǎn)票程序 數(shù)據(jù)結(jié)構(gòu)和算法數(shù)據(jù)結(jié)構(gòu)和算法 結(jié)構(gòu)體結(jié)構(gòu)體 struct candidate char name20; int count; candM; 輸入選票輸入選票 查找得票人信息查找得票人信息 找到否?找到否?
46、得票人的票數(shù)增一得票人的票數(shù)增一 輸出點(diǎn)票結(jié)果輸出點(diǎn)票結(jié)果 點(diǎn)完否?點(diǎn)完否? Y N N Y 加入新的候選人;加入新的候選人; 其得票數(shù)為其得票數(shù)為1。 44 案例分析:結(jié)構(gòu)體數(shù)組案例分析:結(jié)構(gòu)體數(shù)組 改進(jìn)點(diǎn)票程序改進(jìn)點(diǎn)票程序 實(shí)現(xiàn)實(shí)現(xiàn)(cw1306.c) 結(jié)構(gòu)體結(jié)構(gòu)體 。 printf(Vote:t); gets(name); found=0; for (i=0;ilen;i+) if (strcmp(name, )=0) candi.count+; found=1; break; if (!found) strcpy(,name); candi.co
47、unt=1; len+; 。 出現(xiàn)新的候選人出現(xiàn)新的候選人 45 案例分析:結(jié)構(gòu)體數(shù)組案例分析:結(jié)構(gòu)體數(shù)組 增強(qiáng)點(diǎn)票程序增強(qiáng)點(diǎn)票程序 問題問題 要求按候選人得票數(shù)要求按候選人得票數(shù) 從高到低順序輸出結(jié)果。從高到低順序輸出結(jié)果。 修改算法修改算法 結(jié)構(gòu)體結(jié)構(gòu)體 輸入選票輸入選票 查找得票人信息查找得票人信息 找到否?找到否? 得票人的票數(shù)增一得票人的票數(shù)增一 輸出點(diǎn)票結(jié)果輸出點(diǎn)票結(jié)果 點(diǎn)完否?點(diǎn)完否? Y N N Y 加入新的候選人;加入新的候選人; 其得票數(shù)賦值其得票數(shù)賦值“1”。 按得票數(shù)進(jìn)行排序按得票數(shù)進(jìn)行排序 46 案例分析:結(jié)構(gòu)體數(shù)組案例分析:結(jié)構(gòu)體數(shù)組 增強(qiáng)點(diǎn)票程序增強(qiáng)點(diǎn)票程序 實(shí)現(xiàn)
48、實(shí)現(xiàn)(cw1307.c) 排序部分排序部分 結(jié)構(gòu)體結(jié)構(gòu)體 for (i=0;ilen-1;i+) for (j=0;jlen-1-i;j+) if (candj.countcandj+1.count) tmp=candj; candj=candj+1; candj+1=tmp; 47 案例分析:結(jié)構(gòu)體數(shù)組案例分析:結(jié)構(gòu)體數(shù)組 優(yōu)化點(diǎn)票程序優(yōu)化點(diǎn)票程序 問題問題 如果候選人的信息較多,為了提高排序過程中數(shù)據(jù)交換的性能,增如果候選人的信息較多,為了提高排序過程中數(shù)據(jù)交換的性能,增 設(shè)一數(shù)組設(shè)一數(shù)組order,用來保存排序結(jié)果。,用來保存排序結(jié)果。 分析分析 結(jié)構(gòu)體結(jié)構(gòu)體 012345 305142
49、 20Wanghai M 43 P 12Zhaofei F 41 P 6Lilan F 38 N 35Huangjin M 52 P 9Wuma M 29 N 15Hecheng M 36 P order的初態(tài)的初態(tài) order的末態(tài)的末態(tài) 從高到低從高到低 0 1 2 3 4 5 48 案例分析:結(jié)構(gòu)體數(shù)組案例分析:結(jié)構(gòu)體數(shù)組 優(yōu)化點(diǎn)票程序優(yōu)化點(diǎn)票程序 實(shí)現(xiàn)實(shí)現(xiàn)(cw1308.c) 結(jié)構(gòu)體結(jié)構(gòu)體 for (i=0;ilen;i+) orderi=i; for (i=0;ilen-1;i+) for (j=0;jlen-1-i;j+) if (candorderj.countcandorder
50、j+1.count) tmp=orderj; orderj=orderj+1; orderj+1=tmp; for (i=0;ilen;i+) printf(t%st%dn, , candorderi.count); 交換序號(hào)交換序號(hào) 排序數(shù)組賦初值排序數(shù)組賦初值 按照按照order保存的順序輸出候選人信息。保存的順序輸出候選人信息。 49 結(jié)構(gòu)體作為函數(shù)的參數(shù)結(jié)構(gòu)體作為函數(shù)的參數(shù) 把結(jié)構(gòu)體的單個(gè)成員傳遞給函數(shù)把結(jié)構(gòu)體的單個(gè)成員傳遞給函數(shù) 值傳遞。值傳遞。 被調(diào)用函數(shù)不能修改調(diào)用函數(shù)中的結(jié)構(gòu)體成員。被調(diào)用函數(shù)不能修改調(diào)用函數(shù)中的結(jié)構(gòu)體成員。 把整個(gè)結(jié)構(gòu)體傳遞給函數(shù)
51、把整個(gè)結(jié)構(gòu)體傳遞給函數(shù) 值傳遞。值傳遞。 被調(diào)用函數(shù)不能修改調(diào)用函數(shù)中的結(jié)構(gòu)體。被調(diào)用函數(shù)不能修改調(diào)用函數(shù)中的結(jié)構(gòu)體。 把結(jié)構(gòu)體指針傳遞給函數(shù)把結(jié)構(gòu)體指針傳遞給函數(shù) 模擬引用傳遞。模擬引用傳遞。 被調(diào)用函數(shù)能修改調(diào)用函數(shù)中的結(jié)構(gòu)體。被調(diào)用函數(shù)能修改調(diào)用函數(shù)中的結(jié)構(gòu)體。 結(jié)構(gòu)體結(jié)構(gòu)體 50 在函數(shù)中使用結(jié)構(gòu)體在函數(shù)中使用結(jié)構(gòu)體 把整個(gè)結(jié)構(gòu)體作為單個(gè)數(shù)據(jù)返回把整個(gè)結(jié)構(gòu)體作為單個(gè)數(shù)據(jù)返回 因?yàn)榻Y(jié)構(gòu)體變量之間可以賦值。因?yàn)榻Y(jié)構(gòu)體變量之間可以賦值。 按值傳遞把數(shù)組傳遞給函數(shù)按值傳遞把數(shù)組傳遞給函數(shù) 把數(shù)組作為結(jié)構(gòu)體的成員,然后把結(jié)構(gòu)體傳遞給函數(shù)。把數(shù)組作為結(jié)構(gòu)體的成員,然后把結(jié)構(gòu)體傳遞給函數(shù)。 被調(diào)用函
52、數(shù)不能修改調(diào)用函數(shù)中的數(shù)組。被調(diào)用函數(shù)不能修改調(diào)用函數(shù)中的數(shù)組。 結(jié)構(gòu)體結(jié)構(gòu)體 51 共用體共用體或稱為或稱為聯(lián)合聯(lián)合(Union) 使幾個(gè)不同的變量共占同一段內(nèi)存的結(jié)構(gòu)稱為使幾個(gè)不同的變量共占同一段內(nèi)存的結(jié)構(gòu)稱為 “ “共用體共用體” 或者或者“聯(lián)合聯(lián)合”類型的結(jié)構(gòu)。類型的結(jié)構(gòu)。 1、共用體的概念 union number short x; char ch; float y; ; 基本上和基本上和struct一樣一樣 x、ch和和y處于處于同樣的地址同樣的地址 sizeof(union xxx)取決于占空間最多的那個(gè)成員變量。取決于占空間最多的那個(gè)成員變量。 11.8 52 共用體共用體 u
53、nion data int i; char ch; float f; a,b,c; 同一內(nèi)存單元在每一瞬時(shí)只能存放其中一種類型的成員;同一內(nèi)存單元在每一瞬時(shí)只能存放其中一種類型的成員; 并非同時(shí)都起作用,起作用的成員是最后一次存放的成員并非同時(shí)都起作用,起作用的成員是最后一次存放的成員 不能作為函數(shù)參數(shù)不能作為函數(shù)參數(shù) union data int i; char ch; float f; ; union data a,b,c; 或: 共用體和結(jié)構(gòu)體的比較:共用體和結(jié)構(gòu)體的比較: 結(jié)構(gòu)體變量所占內(nèi)存長(zhǎng)度是各成員占的內(nèi)存長(zhǎng)度之和。每個(gè)成員結(jié)構(gòu)體變量所占內(nèi)存長(zhǎng)度是各成員占的內(nèi)存長(zhǎng)度之和。每個(gè)成員
54、分別占有其自己的內(nèi)存單元。分別占有其自己的內(nèi)存單元。 共用體變量所占的內(nèi)存長(zhǎng)度等于最長(zhǎng)的成員的長(zhǎng)度。共用體變量所占的內(nèi)存長(zhǎng)度等于最長(zhǎng)的成員的長(zhǎng)度。 上面定義的上面定義的“共用共用 體體”變量、變量、 各占個(gè)字節(jié)各占個(gè)字節(jié) (因?yàn)橐粋€(gè)實(shí)型變(因?yàn)橐粋€(gè)實(shí)型變 量占個(gè)字節(jié)),量占個(gè)字節(jié)), 而不是各占而不是各占 個(gè)字節(jié)。個(gè)字節(jié)。 例如: 53 共用體共用體 只有先定義了共用體變量才能引用它,而且不能引用共用只有先定義了共用體變量才能引用它,而且不能引用共用 體變量,而只能引用共用體變量中的成員。體變量,而只能引用共用體變量中的成員。 例如:前面定義了a、b、c為共用體變量 a.i a.i (引用共用
55、體變量中的整型變量)引用共用體變量中的整型變量) a.cha.ch(引用共用體變量中的字符變量)引用共用體變量中的字符變量) a.f a.f (引用共用體變量中的實(shí)型變量)引用共用體變量中的實(shí)型變量) 2 共用體變量的引用方式 54 共用體共用體 (1)(1)同一個(gè)內(nèi)存段可以用來存放幾種不同類型的成員,但在每一同一個(gè)內(nèi)存段可以用來存放幾種不同類型的成員,但在每一 瞬時(shí)只能存放其中一種,而不是同時(shí)存放幾種。瞬時(shí)只能存放其中一種,而不是同時(shí)存放幾種。 (2) (2) 共用體變量中起作用的成員是最后一次存放的成員,在存共用體變量中起作用的成員是最后一次存放的成員,在存 入一個(gè)新的成員后原有的成員就失
56、去作用。入一個(gè)新的成員后原有的成員就失去作用。 (3) (3) 共用體變量的地址和它的各成員的地址都是同一地址。共用體變量的地址和它的各成員的地址都是同一地址。 (4) (4) 不能對(duì)共用體變量名賦值,也不能企圖引用變量名來得到不能對(duì)共用體變量名賦值,也不能企圖引用變量名來得到 一個(gè)值,又不能在定義共用體變量時(shí)對(duì)它初始化。一個(gè)值,又不能在定義共用體變量時(shí)對(duì)它初始化。 (5) (5) 不能把共用體變量作為函數(shù)參數(shù),也不能使函數(shù)帶回共用不能把共用體變量作為函數(shù)參數(shù),也不能使函數(shù)帶回共用 體變量,但可以使用指向共用體變量的指針體變量,但可以使用指向共用體變量的指針 (6) (6) 共用體類型可以出現(xiàn)
57、在結(jié)構(gòu)體類型定義中,也可以定義共共用體類型可以出現(xiàn)在結(jié)構(gòu)體類型定義中,也可以定義共 用體數(shù)組。反之,結(jié)構(gòu)體也可以出現(xiàn)在共用體類型定義中,用體數(shù)組。反之,結(jié)構(gòu)體也可以出現(xiàn)在共用體類型定義中, 數(shù)組也可以作為共用體的成員。數(shù)組也可以作為共用體的成員。 3 共用體類型數(shù)據(jù)的特點(diǎn) 55 共用體共用體 設(shè)有若干個(gè)人員的數(shù)據(jù),其中有學(xué)生和教師。學(xué)生的數(shù)據(jù)中包設(shè)有若干個(gè)人員的數(shù)據(jù),其中有學(xué)生和教師。學(xué)生的數(shù)據(jù)中包 括:姓名、號(hào)碼、性別、職業(yè)、括:姓名、號(hào)碼、性別、職業(yè)、班級(jí)班級(jí)。教師的數(shù)據(jù)包括:姓名、。教師的數(shù)據(jù)包括:姓名、 號(hào)碼、性別、職業(yè)、號(hào)碼、性別、職業(yè)、職務(wù)職務(wù)??梢钥闯?,學(xué)生和教師所包含的數(shù)??梢?/p>
58、看出,學(xué)生和教師所包含的數(shù) 據(jù)是不同的?,F(xiàn)要求把它們放在同一表格中。據(jù)是不同的?,F(xiàn)要求把它們放在同一表格中。 圖圖11-2511-25 例 56 用指針處理鏈表用指針處理鏈表 圖圖11-2611-26 算法:算法: 57 共用體共用體 #include #include structstruct int num; int num; char name10; char name10; char sex; char sex; char job; char job; union union int banji; int banji; char position10;char position10;
59、category; category; person2;person2;/ /* *先設(shè)人數(shù)為先設(shè)人數(shù)為2 2* */ / int main() int i; for(i=0;i2;i+) scanf(%d %s %c %c, Cw1308.c 58 共用體共用體 if(personi.job = S)if(personi.job = S) scanf(%d, scanf(%d, else if(personi.job = T)else if(personi.job = T) scanf(%s, personi.category.position);scanf(%s, personi.cate
60、gory.position); else printf(“Input error!”); printf(n);else printf(“Input error!”); printf(n); printf(No. name sex job class/positionn);printf(No. name sex job class/positionn); for(i=0;i2;i+)for(i=0;i2;i+) if (personi.job = S)if (personi.job = S) printf(“%-6d%-10s%-3c%-3c%-6dn”,personi.num, printf(
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 第11課 蘇聯(lián)的社會(huì)主義建設(shè)(分層作業(yè))(解析版)
- 安徽省“江南十套”2024屆高三數(shù)學(xué)試題(新課標(biāo))第二輪復(fù)習(xí)測(cè)試卷
- 雙簧扁咀鉗行業(yè)深度研究報(bào)告
- 2025煤炭運(yùn)輸合同示范文本
- 2024年度天津市公共營(yíng)養(yǎng)師之三級(jí)營(yíng)養(yǎng)師基礎(chǔ)試題庫和答案要點(diǎn)
- 2025施工合同標(biāo)識(shí)限線登記
- 2024年度四川省公共營(yíng)養(yǎng)師之二級(jí)營(yíng)養(yǎng)師基礎(chǔ)試題庫和答案要點(diǎn)
- 2025年計(jì)算機(jī)電話集成項(xiàng)目可行性研究報(bào)告
- 環(huán)保型合成洗滌劑項(xiàng)目可行性研究報(bào)告(立項(xiàng)備案下載可編輯)
- 陶瓷片項(xiàng)目可行性研究報(bào)告
- 第二章 粉體制備
- 預(yù)應(yīng)力空心板計(jì)算
- 2024版珠寶鑒定技師勞動(dòng)合同范本3篇
- GA/T 1740.2-2024旅游景區(qū)安全防范要求第2部分:湖泊型
- 2023年開封糧食產(chǎn)業(yè)集團(tuán)有限公司招聘筆試真題
- 2024年全國(guó)“紀(jì)檢監(jiān)察”業(yè)務(wù)相關(guān)知識(shí)考試題庫(附含答案)
- 2025年社區(qū)工作者考試試題庫及答案
- 期末檢測(cè)卷(三)2024-2025學(xué)年人教PEP版英語四年級(jí)上冊(cè)(含答案無聽力原文無聽力音頻)
- 2024-2030年中國(guó)兒童內(nèi)衣行業(yè)運(yùn)營(yíng)狀況及投資前景預(yù)測(cè)報(bào)告
- 吉首大學(xué)《高等數(shù)學(xué)》2023-2024學(xué)年第一學(xué)期期末試卷
- 打印和復(fù)印服務(wù)協(xié)議
評(píng)論
0/150
提交評(píng)論