版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(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ù)的類(lèi)型可以不相同。數(shù)據(jù)的類(lèi)型可以不相同。用來(lái)定義保存在文件中的記錄。用來(lái)定義保存在文件中的記錄。與指針一起創(chuàng)建動(dòng)態(tài)的數(shù)據(jù)結(jié)構(gòu):與指針一起創(chuàng)建動(dòng)態(tài)的數(shù)據(jù)結(jié)構(gòu):鏈表鏈表隊(duì)列隊(duì)列棧棧樹(shù)樹(shù)2第十四講第十四講 結(jié)構(gòu)體結(jié)構(gòu)體結(jié)構(gòu)體的概念結(jié)構(gòu)體的概念結(jié)構(gòu)體類(lèi)型的定義結(jié)構(gòu)體類(lèi)型的定義結(jié)構(gòu)體變量結(jié)構(gòu)體變量定義和聲明定義和聲明初始化初始化使用使用結(jié)構(gòu)體數(shù)組結(jié)構(gòu)體數(shù)組C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)本講是教材第11章,但我們由于課時(shí)和全國(guó)C的大綱關(guān)系,第四至10節(jié)不講,有興趣者,自己學(xué)習(xí).本課件后面還有一些有趣的例子,如冼牌,選舉計(jì)票程序, 有興趣者
2、也可以自學(xué).結(jié)構(gòu)體是派生的數(shù)據(jù)類(lèi)型結(jié)構(gòu)體是派生的數(shù)據(jù)類(lèi)型使用其他類(lèi)型的對(duì)象來(lái)構(gòu)造使用其他類(lèi)型的對(duì)象來(lái)構(gòu)造結(jié)構(gòu)體。結(jié)構(gòu)體。3結(jié)構(gòu)體結(jié)構(gòu)體結(jié)構(gòu)體結(jié)構(gòu)體數(shù)組是由相同類(lèi)型的數(shù)據(jù)構(gòu)成,而現(xiàn)實(shí)生活中由一些不相數(shù)組是由相同類(lèi)型的數(shù)據(jù)構(gòu)成,而現(xiàn)實(shí)生活中由一些不相同類(lèi)型的數(shù)據(jù)構(gòu)成的一組數(shù)據(jù)是相當(dāng)多的,例如學(xué)號(hào)、姓名和同類(lèi)型的數(shù)據(jù)構(gòu)成的一組數(shù)據(jù)是相當(dāng)多的,例如學(xué)號(hào)、姓名和學(xué)生成績(jī)。學(xué)生成績(jī)。C C語(yǔ)言提供了這種數(shù)據(jù)結(jié)構(gòu)稱(chēng)為語(yǔ)言提供了這種數(shù)據(jù)結(jié)構(gòu)稱(chēng)為結(jié)構(gòu)體,它是一種結(jié)構(gòu)體,它是一種較為復(fù)雜而又非常靈活的構(gòu)造型的數(shù)據(jù)類(lèi)型。較為復(fù)雜而又非常靈活的構(gòu)造型的數(shù)據(jù)類(lèi)型。一個(gè)結(jié)構(gòu)體類(lèi)型可以由若干個(gè)成員(或域)的成分組成,一個(gè)結(jié)
3、構(gòu)體類(lèi)型可以由若干個(gè)成員(或域)的成分組成,不同的結(jié)構(gòu)體類(lèi)型其成員不同。不同的結(jié)構(gòu)體類(lèi)型其成員不同。對(duì)于一個(gè)具體的結(jié)構(gòu)體而言其成員的數(shù)量是固定的(同數(shù)對(duì)于一個(gè)具體的結(jié)構(gòu)體而言其成員的數(shù)量是固定的(同數(shù)組),各成員的數(shù)據(jù)類(lèi)型可以不同,這是結(jié)構(gòu)體與數(shù)組的重要組),各成員的數(shù)據(jù)類(lèi)型可以不同,這是結(jié)構(gòu)體與數(shù)組的重要相同和不同點(diǎn)。相同和不同點(diǎn)。4結(jié)構(gòu)體類(lèi)型定義的一般形式為:結(jié)構(gòu)體類(lèi)型定義的一般形式為:struct struct 結(jié)構(gòu)體名結(jié)構(gòu)體名 類(lèi)型名類(lèi)型名1 1 成員名成員名1 1; 類(lèi)型名類(lèi)型名2 2 成員名成員名2 2; 類(lèi)型名類(lèi)型名n n 成員名成員名n n; ;結(jié)構(gòu)體結(jié)構(gòu)體其中,其中,stru
4、ctstruct是關(guān)鍵字,是結(jié)構(gòu)體類(lèi)型的標(biāo)志。結(jié)構(gòu)體名是是關(guān)鍵字,是結(jié)構(gòu)體類(lèi)型的標(biāo)志。結(jié)構(gòu)體名是由用戶(hù)定義的標(biāo)識(shí)符,它規(guī)定了所定義的結(jié)構(gòu)體類(lèi)型的名稱(chēng)。由用戶(hù)定義的標(biāo)識(shí)符,它規(guī)定了所定義的結(jié)構(gòu)體類(lèi)型的名稱(chēng)。結(jié)構(gòu)體類(lèi)型的組成成分稱(chēng)為成員,成員名的命名規(guī)則與變量名結(jié)構(gòu)體類(lèi)型的組成成分稱(chēng)為成員,成員名的命名規(guī)則與變量名相同。相同。如果成員的類(lèi)型相同,則可以同變量一樣在一個(gè)類(lèi)型名后寫(xiě)如果成員的類(lèi)型相同,則可以同變量一樣在一個(gè)類(lèi)型名后寫(xiě)出幾個(gè)成員名,他們之間用逗號(hào)分隔。出幾個(gè)成員名,他們之間用逗號(hào)分隔。 struct struct student long int xuhao long int xuhao
5、; char name8char name8; int eng ,coup,sum;int eng ,coup,sum; float ave; float ave; ;5struct dateint year; int month; int day;也可以寫(xiě)成:也可以寫(xiě)成:struct dateint year,month,day;struct student int num; char name8,sex; float score4; ;struct:引入結(jié)構(gòu)體定義。:引入結(jié)構(gòu)體定義。date:結(jié)構(gòu)體的名稱(chēng),必須與:結(jié)構(gòu)體的名稱(chēng),必須與 struct 一起使用。一起使用。struct dat
6、e 結(jié)構(gòu)體包含結(jié)構(gòu)體包含3個(gè)個(gè) int * 類(lèi)型的類(lèi)型的成員成員:yearMonthday例如例如A:這里struct student結(jié)構(gòu)體包含有:Int 型num(學(xué)號(hào))char name8(姓名),sex(性別)Float score4(成績(jī)數(shù)組)例如例如B:6結(jié)構(gòu)體類(lèi)型的定義結(jié)構(gòu)體類(lèi)型的定義結(jié)構(gòu)體定義說(shuō)明結(jié)構(gòu)體定義說(shuō)明同一個(gè)結(jié)構(gòu)體內(nèi)不可以有同名的成員。同一個(gè)結(jié)構(gòu)體內(nèi)不可以有同名的成員。不同結(jié)構(gòu)體的成員名可以相同,不互相沖突。不同結(jié)構(gòu)體的成員名可以相同,不互相沖突。結(jié)構(gòu)體結(jié)構(gòu)體struct date int year,month,day; ;struct Book char title50
7、,writer20,publisher50; int year,month;int year,month,day;7結(jié)構(gòu)體類(lèi)型的定義結(jié)構(gòu)體類(lèi)型的定義結(jié)構(gòu)體定義說(shuō)明結(jié)構(gòu)體定義說(shuō)明結(jié)構(gòu)體的成員可以是基本類(lèi)型和構(gòu)造類(lèi)型(數(shù)組和其他結(jié)構(gòu)體)。結(jié)構(gòu)體的成員可以是基本類(lèi)型和構(gòu)造類(lèi)型(數(shù)組和其他結(jié)構(gòu)體)。結(jié)構(gòu)體結(jié)構(gòu)體struct dateint year,month,day; birthday;struct StuRec int num;char name20;/這里包含了數(shù)組這里包含了數(shù)組 struct date birthday;/這里包含了上面的結(jié)構(gòu)體這里包含了上面的結(jié)構(gòu)體,稱(chēng)稱(chēng)結(jié)構(gòu)體的嵌套結(jié)構(gòu)體的嵌
8、套;結(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)體定義說(shuō)明結(jié)構(gòu)體定義說(shuō)明只是創(chuàng)建了新的數(shù)據(jù)類(lèi)型,并不能保留內(nèi)存空間。只是創(chuàng)建了新的數(shù)據(jù)類(lèi)型,并不能保留內(nèi)存空間。必須定義結(jié)構(gòu)體變量來(lái)獲得內(nèi)存空間。必須定義結(jié)構(gòu)體變量來(lái)獲得內(nèi)存空間。定義定義(聲明聲明)結(jié)構(gòu)體變量結(jié)構(gòu)體變量 有三種
9、方法有三種方法:1.定義結(jié)構(gòu)體類(lèi)型后,像聲明普通變量一樣聲明結(jié)構(gòu)體變量。定義結(jié)構(gòu)體類(lèi)型后,像聲明普通變量一樣聲明結(jié)構(gòu)體變量。結(jié)構(gòu)體結(jié)構(gòu)體struct date int year,month,day;struct date birth;yearmonthdayFF00FF04FF08birthbirth 的存儲(chǔ)形式的存儲(chǔ)形式TC中與中與VC中的不同中的不同9結(jié)構(gòu)體變量結(jié)構(gòu)體變量定義聲明結(jié)構(gòu)體變量定義聲明結(jié)構(gòu)體變量2.在定義結(jié)構(gòu)體類(lèi)型的同時(shí),聲明結(jié)構(gòu)體變量在定義結(jié)構(gòu)體類(lèi)型的同時(shí),聲明結(jié)構(gòu)體變量結(jié)構(gòu)體結(jié)構(gòu)體struct date int year,month,day; birth, days4, *
10、bPtr;struct int year,month,day; birth, days4, *bPtr;沒(méi)有結(jié)構(gòu)體名,沒(méi)有結(jié)構(gòu)體名,無(wú)法再次使用。無(wú)法再次使用。3.直接(只)聲明結(jié)構(gòu)體變量直接(只)聲明結(jié)構(gòu)體變量省略類(lèi)型名。省略類(lèi)型名。類(lèi)型與變量是不同的概念,注意區(qū)分。系統(tǒng)能對(duì)變量賦值、存取、運(yùn)算,類(lèi)型與變量是不同的概念,注意區(qū)分。系統(tǒng)能對(duì)變量賦值、存取、運(yùn)算,而類(lèi)型則不能,編譯時(shí),系統(tǒng)只對(duì)變量分配存儲(chǔ)空間,而類(lèi)型則不分配。而類(lèi)型則不能,編譯時(shí),系統(tǒng)只對(duì)變量分配存儲(chǔ)空間,而類(lèi)型則不分配。結(jié)構(gòu)體中的成員也可以是一個(gè)結(jié)構(gòu)體變量,即結(jié)構(gòu)體的嵌套。結(jié)構(gòu)體中的成員也可以是一個(gè)結(jié)構(gòu)體變量,即結(jié)構(gòu)體的嵌套。
11、10struct 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,成員包括年月日,成員包括年月日*/ int year,month,day; birthday; float score4; /*score4是數(shù)組,數(shù)組成員類(lèi)型浮點(diǎn)型是數(shù)組,數(shù)組成員類(lèi)型浮點(diǎn)型 */ xuesh;結(jié)構(gòu)體中的成員名可以和程序中的變量同名;不同結(jié)構(gòu)體結(jié)構(gòu)體中的成員名可以和
12、程序中的變量同名;不同結(jié)構(gòu)體中的成員名也可以同名。中的成員名也可以同名。11結(jié)構(gòu)體的操作結(jié)構(gòu)體的操作結(jié)構(gòu)體變量可以執(zhí)行的操作結(jié)構(gòu)體變量可以執(zhí)行的操作將結(jié)構(gòu)體變量賦給相同類(lèi)型的結(jié)構(gòu)體變量。將結(jié)構(gòu)體變量賦給相同類(lèi)型的結(jié)構(gòu)體變量。得到結(jié)構(gòu)體變量的地址。得到結(jié)構(gòu)體變量的地址。訪問(wèn)結(jié)構(gòu)體變量的成員。訪問(wèn)結(jié)構(gòu)體變量的成員。使用使用 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 ye
13、ar,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)體類(lèi)型變量賦初值時(shí),按每個(gè)成員在結(jié)構(gòu)體中的順序一一對(duì)應(yīng)賦值。結(jié)構(gòu)體類(lèi)型變量賦初值時(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)體變量給部分成員賦初值
14、。給部分成員賦初值。結(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)birthday(6B)score(4B)yearmonthday101王小寧0000.014結(jié)構(gòu)體變量的成員結(jié)構(gòu)體變量的成員訪問(wèn)結(jié)構(gòu)體成員的兩種方式訪問(wèn)結(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)體的指
15、針等價(jià)于等價(jià)于 (*cardPtr).face結(jié)構(gòu)體結(jié)構(gòu)體struct card myCard;printf(“%s”, myCard.face);struct card *cardPtr;printf(“%s”, cardPtr-face);struct card char *face; char *suit; myCard.face;15案例分析:結(jié)構(gòu)體變量的成員案例分析:結(jié)構(gòu)體變量的成員問(wèn)題:訪問(wèn)結(jié)構(gòu)體變量的成員。問(wèn)題:訪問(wèn)結(jié)構(gòu)體變量的成員。(cw1301.c)結(jié)構(gòu)體結(jié)構(gòu)體#include struct card char *face; char *suit;a;Int main() s
16、truct card a, *aPtr; a.face = Ace; a.suit = Spades; aPtr = &a;printf(%s%s%sn%s%s%sn%s%s%sn, a.face, of , a.suit, aPtr-face, of , aPtr-suit, (*aPtr).face, of , (*aPtr).suit);與數(shù)組的不同:與數(shù)組的不同:結(jié)構(gòu)變量名不是指針結(jié)構(gòu)變量名不是指針Ace of SpadesAce of SpadesAce of Spades注意:注意:結(jié)構(gòu)不能作為整體輸入輸出。結(jié)構(gòu)不能作為整體輸入輸出。必須逐個(gè)成員輸入輸出。必須逐個(gè)成員輸入輸
17、出。16案例分析:結(jié)構(gòu)體作為函數(shù)的參數(shù)案例分析:結(jié)構(gòu)體作為函數(shù)的參數(shù)問(wèn)題:編寫(xiě)函數(shù)實(shí)現(xiàn)結(jié)構(gòu)體的復(fù)制。問(wèn)題:編寫(xiě)函數(shù)實(shí)現(xiàn)結(jié)構(gòu)體的復(fù)制。結(jié)構(gòu)體結(jié)構(gòu)體#include#include structstruct date date 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);voidvoi
18、d clone(struct date, struct date clone(struct date, struct date * *););intint main() main() structstruct 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
19、= 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); copy(d1, d3); show(d3, d3); show(d3, d3); clone(d1, &d4); clone(d1, &d4); show(d4, d4); show(d4, d4); voidvoid show(char show(char * *name, struct date d)name, struct date d) printf(%s: %d-%d
20、-%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, copy(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:
21、2004-5-1d2: 2004-5-1d3: 0-0-24 (TC)在在VC中運(yùn)行的結(jié)果不一樣中運(yùn)行的結(jié)果不一樣-858993460-858993460-858993460d4: 2004-5-1用指針作形參用地址作實(shí)參傳遞/結(jié)構(gòu)體變量作實(shí)參,值傳遞,d3未賦值作實(shí)參值不確定空返回,無(wú)值返回(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)體變量的方法一樣,只是必須說(shuō)明其為數(shù)組。是必須說(shuō)明其為數(shù)組。定義結(jié)構(gòu)體變量的三種方法都可以用來(lái)定義結(jié)構(gòu)體數(shù)組。定義結(jié)構(gòu)體變量的三種方法都
22、可以用來(lái)定義結(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ù)組每個(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ù)
23、組結(jié)構(gòu)體數(shù)組數(shù)組的元素是結(jié)構(gòu)體變量。數(shù)組的元素是結(jié)構(gòu)體變量。常用結(jié)構(gòu)體來(lái)表示記錄,那么結(jié)構(gòu)體數(shù)組就可以表示一組記常用結(jié)構(gòu)體來(lái)表示記錄,那么結(jié)構(gòu)體數(shù)組就可以表示一組記錄。錄。案例分析案例分析全班全班 N 個(gè)學(xué)生,每個(gè)學(xué)生有學(xué)號(hào)、姓名、四門(mén)課的成績(jī)。個(gè)學(xué)生,每個(gè)學(xué)生有學(xué)號(hào)、姓名、四門(mén)課的成績(jī)。結(jié)構(gòu)體結(jié)構(gòu)體學(xué)號(hào)學(xué)號(hào)姓名姓名成績(jī)成績(jī)1成績(jī)成績(jī)2成績(jī)成績(jī)3成績(jī)成績(jī)4101WangHai80787681102ZhaoFei68667175130LiRui8276818420結(jié)構(gòu)體數(shù)組結(jié)構(gòu)體數(shù)組結(jié)構(gòu)體數(shù)組結(jié)構(gòu)體數(shù)組案例分析案例分析那么,可以定義結(jié)構(gòu)體數(shù)組來(lái)保存那么,可以定義結(jié)構(gòu)體數(shù)組來(lái)保存 N 個(gè)學(xué)生的數(shù)據(jù)
24、。個(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)體結(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ù)中查找所需要的具有某特征
25、的內(nèi)容,最簡(jiǎn)單的是順序查找。分析:從一組數(shù)據(jù)中查找所需要的具有某特征的內(nèi)容,最簡(jiǎn)單的是順序查找。直到找到或找完為止。直到找到或找完為止。/*Cw1303.c 教材教材P171L11-1*/#include #define N 2struct 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é)
26、號(hào)變量 struct student stuN; /定義結(jié)構(gòu)體類(lèi)型數(shù)組定義結(jié)構(gòu)體類(lèi)型數(shù)組(cw1303.c)案例分析:結(jié)構(gòu)體數(shù)組案例分析:結(jié)構(gòu)體數(shù)組22printf(請(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,&stui.num,&,&stui.sex,&stui.age,&stui.score);p
27、rintf(請(qǐng)輸入需查找學(xué)生的學(xué)號(hào):請(qǐng)輸入需查找學(xué)生的學(xué)號(hào):);scanf(%ld,&xuehao);for(i=0;iN;i+) if(xuehao=stui.num) t=i;break; if (t!=-1) /*以下輸出檢索結(jié)果以下輸出檢索結(jié)果*/printf(%ld%8s%4s%4d%4dn,stut.num,,stut.sex,stut.age,stut.score);else printf(查無(wú)此人查無(wú)此人!n);(cw1303.c)續(xù))續(xù)23案例分析:結(jié)構(gòu)體數(shù)組案例分析:結(jié)構(gòu)體數(shù)組檢索檢索問(wèn)題:?jiǎn)栴}:某班有某班有 n 個(gè)學(xué)生,每個(gè)學(xué)生的數(shù)據(jù)包括學(xué)號(hào)、姓
28、名、年齡和性別。個(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)體數(shù)組保存學(xué)生數(shù)據(jù)用結(jié)構(gòu)體數(shù)組保存學(xué)生數(shù)據(jù)采用順序查找法采用順序查找法結(jié)構(gòu)體結(jié)構(gòu)體輸入學(xué)生信息輸入學(xué)生信息輸入查詢(xún)條件輸入查詢(xún)條件查找學(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 20int main() struct
29、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)體結(jié)構(gòu)體printf(tInput a integer as the number of students:);scanf(%d, &N);printf(tInput %d students information:n,N);printf(ntNo.tNametGendertAgen);for (i=0;iN;i+) printf(student %d:nt, i+1);
30、 scanf(%d %s %c %d, &studenti.num, , &studenti.gender, &studenti.age);(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, &num); printf(ntPlease wait. Searching.n); for (i=0;iN;i+) if (num=studenti.num) break; if (iN) printf(ntNo.:%dntN
31、ame:%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ù)組檢索檢索問(wèn)題:?jiǎn)栴}:可以多次查找。可以多次查找。結(jié)構(gòu)體結(jié)構(gòu)體輸入學(xué)生信息輸入學(xué)生信息輸入查詢(xún)條件輸入查詢(xún)條件查找學(xué)生信息,報(bào)告結(jié)果查找學(xué)生信息,報(bào)告結(jié)果是否繼續(xù)查詢(xún)是否繼續(xù)查詢(xún)YN人機(jī)交互人機(jī)交互28案例分析:結(jié)構(gòu)體數(shù)組案例分析:結(jié)構(gòu)體數(shù)組檢索檢索實(shí)現(xiàn)實(shí)現(xiàn)(cw13
32、04m.c)部分代碼部分代碼結(jié)構(gòu)體結(jié)構(gòu)體 do scanf(%d, &num); 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 (c=y|c=Y);1001y(cw1304.c)續(xù))續(xù)29小結(jié):知識(shí)要點(diǎn)小結(jié):知識(shí)要點(diǎn) 結(jié)構(gòu)體是由若干個(gè)不同類(lèi)型數(shù)據(jù)項(xiàng)構(gòu)成的集合。結(jié)構(gòu)體是由若干個(gè)不同類(lèi)型數(shù)據(jù)項(xiàng)構(gòu)成的集合。結(jié)構(gòu)體類(lèi)型的定義:結(jié)構(gòu)體類(lèi)型的定義:1. 結(jié)構(gòu)體類(lèi)型定義的一般
33、形式結(jié)構(gòu)體類(lèi)型定義的一般形式2. 結(jié)構(gòu)體類(lèi)型定義中的注意事項(xiàng)結(jié)構(gòu)體類(lèi)型定義中的注意事項(xiàng)結(jié)構(gòu)體類(lèi)型變量:結(jié)構(gòu)體類(lèi)型變量:結(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)體類(lèi)型變量定義的三種方法結(jié)構(gòu)體類(lèi)型變量定義的三種方法2. 結(jié)構(gòu)體類(lèi)型變量的初始化結(jié)構(gòu)體類(lèi)型變量的初始化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)用輸入輸出頭文件#i
34、nclude /#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)/定義結(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.scor
35、e3arrj.score3) /比較前后兩行比較前后兩行 temp=arri;arri=arrj;arrj=temp;/排序交換排序交換輸入一個(gè)班輸入一個(gè)班10個(gè)學(xué)生的學(xué)號(hào)和每個(gè)學(xué)生考試三門(mén)功課(數(shù)學(xué)、英語(yǔ)、計(jì)算機(jī)基礎(chǔ))個(gè)學(xué)生的學(xué)號(hào)和每個(gè)學(xué)生考試三門(mén)功課(數(shù)學(xué)、英語(yǔ)、計(jì)算機(jī)基礎(chǔ))的成績(jī)。編程計(jì)算出每個(gè)學(xué)生的總分和平均分,并按學(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é)、英語(yǔ)、計(jì)
36、算機(jī)、總分、平均分。打印的成績(jī)單表項(xiàng)包括:序號(hào),學(xué)號(hào)、數(shù)學(xué)、英語(yǔ)、計(jì)算機(jī)、總分、平均分。 31int main()/主函數(shù)主函數(shù)int i;printf(請(qǐng)輸入學(xué)號(hào)和數(shù)學(xué)、英語(yǔ)、計(jì)算機(jī)的成績(jī)請(qǐng)輸入學(xué)號(hào)和數(shù)學(xué)、英語(yǔ)、計(jì)算機(jī)的成績(jī)n); for(i=0;iN;i+)/輸入數(shù)據(jù)輸入數(shù)據(jù)printf(“NO:%d”,i+1);scanf(%ld%d%d%d, &studi.sno,&studi.score0,&studi.score1,&studi.score2); studi.score3=studi.score0+studi.score1+studi.score2;
37、 sort(stud);/調(diào)用排序函數(shù)調(diào)用排序函數(shù)printf(“名次名次t學(xué)號(hào)學(xué)號(hào)t數(shù)學(xué)數(shù)學(xué)t英語(yǔ)英語(yǔ)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.score0,studi.score1,studi.score2,studi.score3,(float)studi.score3/3); 這是用結(jié)構(gòu)體做實(shí)驗(yàn)報(bào)告這是用結(jié)構(gòu)體做實(shí)驗(yàn)報(bào)告,思路方法同數(shù)組是一致的思路方法同數(shù)組是一致的.32本章到此結(jié)束,謝謝您的光臨!本章到此
38、結(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)算這樣,數(shù)組中的紙牌儼然已有一個(gè)順序了,則可以改進(jìn)算法。法。洗牌:隨機(jī)打亂紙牌在數(shù)組中的位置。洗牌:隨機(jī)打亂紙牌在數(shù)組中的位置。 不存在無(wú)限延期。不存在無(wú)限延期。發(fā)牌:按紙牌在數(shù)組中的順序顯示輸出。
39、發(fā)牌:按紙牌在數(shù)組中的順序顯示輸出。 數(shù)組遍歷一次。數(shù)組遍歷一次。結(jié)構(gòu)體結(jié)構(gòu)體34案例分析:結(jié)構(gòu)體數(shù)組案例分析:結(jié)構(gòu)體數(shù)組高性能的洗牌和發(fā)牌程序高性能的洗牌和發(fā)牌程序?qū)崿F(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 Card;void fillDeck(Card*, char*, char*);void shuffle(Card*);void deal(Card*);35案例分析:結(jié)構(gòu)體數(shù)組案例分析:結(jié)構(gòu)體數(shù)組高性能的洗牌和發(fā)牌程序高性能的
40、洗牌和發(fā)牌程序?qū)崿F(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(NULL); fillDeck(deck, face, suit); shuffle(deck); deal(deck);36案例分析:結(jié)構(gòu)體數(shù)組案例分析:結(jié)構(gòu)體數(shù)組高性能的洗牌和發(fā)牌程序高性能的洗牌和發(fā)牌程序?qū)崿F(xiàn)實(shí)現(xiàn)結(jié)構(gòu)體結(jié)構(gòu)體void
41、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ā)牌程序?qū)崿F(xiàn)實(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
42、= temp; 38案例分析:結(jié)構(gòu)體數(shù)組案例分析:結(jié)構(gòu)體數(shù)組高性能的洗牌和發(fā)牌程序高性能的洗牌和發(fā)牌程序?qū)崿F(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)%2 ? t : n); 39案例分析:結(jié)構(gòu)體數(shù)組案例分析:結(jié)構(gòu)體數(shù)組點(diǎn)票程序點(diǎn)票程序問(wèn)題問(wèn)題有三個(gè)候選人,有三個(gè)候選人,N個(gè)選舉人,每次輸入一個(gè)得票的候選人的名字,個(gè)選舉人,每次輸入一個(gè)得票的候選人的名字,要求最后輸出各人的得票結(jié)果。要求最后輸出各人的得票結(jié)果。定義數(shù)據(jù)
43、結(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)體輸入候選人信息輸入候選人信息輸入選票輸入選票查找得票人信息查找得票人信息找到否?找到否?得票人的票數(shù)增一得票人的票數(shù)增一輸出點(diǎn)票結(jié)果輸出點(diǎn)票結(jié)果點(diǎn)完否?點(diǎn)完否?YNNY41案例分析:結(jié)構(gòu)體數(shù)組案例分析:結(jié)構(gòu)體數(shù)組點(diǎn)票程序點(diǎn)票程序?qū)崿F(xiàn)實(shí)現(xiàn)(cw1305.c)結(jié)構(gòu)體結(jié)構(gòu)體 do printf(Vote:t); gets(name); for (i=0;iM;i
44、+) if (strcmp(name, )=0) candi.count+; vote+; break; printf(tContinue?(y/n); c=getchar(); i=getchar(); while (c=y|c=Y);42案例分析:結(jié)構(gòu)體數(shù)組案例分析:結(jié)構(gòu)體數(shù)組改進(jìn)點(diǎn)票程序改進(jìn)點(diǎn)票程序問(wèn)題:?jiǎn)栴}:假設(shè)選舉人都是候選人假設(shè)選舉人都是候選人分析點(diǎn)票過(guò)程中數(shù)組的變化分析點(diǎn)票過(guò)程中數(shù)組的變化結(jié)構(gòu)體結(jié)構(gòu)體litaolitao wanghai litao zhaofei litaowanghailitaowanghaizhaofei43案例分析:結(jié)構(gòu)體數(shù)組案例分析:
45、結(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;輸入選票輸入選票查找得票人信息查找得票人信息找到否?找到否?得票人的票數(shù)增一得票人的票數(shù)增一輸出點(diǎn)票結(jié)果輸出點(diǎn)票結(jié)果點(diǎn)完否?點(diǎn)完否?YNNY加入新的候選人;加入新的候選人;其得票數(shù)為其得票數(shù)為1。44案例分析:結(jié)構(gòu)體數(shù)組案例分析:結(jié)構(gòu)體數(shù)組改進(jìn)點(diǎn)票程序改進(jìn)點(diǎn)票程序?qū)崿F(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 (str
46、cmp(name, )=0) candi.count+; found=1; break; if (!found) strcpy(,name); candi.count=1; len+; 。出現(xiàn)新的候選人出現(xiàn)新的候選人45案例分析:結(jié)構(gòu)體數(shù)組案例分析:結(jié)構(gòu)體數(shù)組增強(qiáng)點(diǎn)票程序增強(qiáng)點(diǎn)票程序問(wèn)題問(wèn)題要求按候選人得票數(shù)要求按候選人得票數(shù)從高到低順序輸出結(jié)果。從高到低順序輸出結(jié)果。修改算法修改算法結(jié)構(gòu)體結(jié)構(gòu)體輸入選票輸入選票查找得票人信息查找得票人信息找到否?找到否?得票人的票數(shù)增一得票人的票數(shù)增一輸出點(diǎn)票結(jié)果輸出點(diǎn)票結(jié)果點(diǎn)完否?點(diǎn)完否?YNNY加入新的候選人;加入
47、新的候選人;其得票數(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)票程序?qū)崿F(xiàn)實(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)票程序問(wèn)題問(wèn)題如果候選人的信息較多,為了提高排序過(guò)程中數(shù)據(jù)交換的性能,增如果候選人的信息較多,為了提高排序過(guò)程中數(shù)據(jù)交
48、換的性能,增設(shè)一數(shù)組設(shè)一數(shù)組order,用來(lái)保存排序結(jié)果。,用來(lái)保存排序結(jié)果。分析分析結(jié)構(gòu)體結(jié)構(gòu)體01234530514220Wanghai 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)從高到低從高到低01234548案例分析:結(jié)構(gòu)體數(shù)組案例分析:結(jié)構(gòu)體數(shù)組優(yōu)化點(diǎn)票程序優(yōu)化點(diǎn)票程序?qū)崿F(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
49、(j=0;jlen-1-i;j+) if (candorderj.countcandorderj+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ù)中的
50、結(jié)構(gòu)體成員。被調(diào)用函數(shù)不能修改調(diào)用函數(shù)中的結(jié)構(gòu)體成員。把整個(gè)結(jié)構(gòu)體傳遞給函數(shù)把整個(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ù)組
51、作為結(jié)構(gòu)體的成員,然后把結(jié)構(gòu)體傳遞給函數(shù)。被調(diào)用函數(shù)不能修改調(diào)用函數(shù)中的數(shù)組。被調(diào)用函數(shù)不能修改調(diào)用函數(shù)中的數(shù)組。結(jié)構(gòu)體結(jié)構(gòu)體51共用體共用體或稱(chēng)為或稱(chēng)為聯(lián)合聯(lián)合(Union)使幾個(gè)不同的變量共占同一段內(nèi)存的結(jié)構(gòu)稱(chēng)為使幾個(gè)不同的變量共占同一段內(nèi)存的結(jié)構(gòu)稱(chēng)為 “ “共用體共用體”或者或者“聯(lián)合聯(lián)合”類(lèi)型的結(jié)構(gòu)。類(lèi)型的結(jié)構(gòu)。1、共用體的概念 union number short x; char ch; float y;基本上和基本上和struct一樣一樣x、ch和和y處于處于同樣的地址同樣的地址sizeof(union xxx)取決于占空間最多的那個(gè)成員變量。取決于占空間最多的那個(gè)成員變量。11.
52、852共用體共用體 union data int i; char ch; float f;a,b,c; 同一內(nèi)存單元在每一瞬時(shí)只能存放其中一種類(lèi)型的成員;同一內(nèi)存單元在每一瞬時(shí)只能存放其中一種類(lèi)型的成員;并非同時(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è)
53、成員分別占有其自己的內(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 (引用共用體變量中的整型變量)引
54、用共用體變量中的整型變量) a.cha.ch(引用共用體變量中的字符變量)引用共用體變量中的字符變量) a.f a.f (引用共用體變量中的實(shí)型變量)引用共用體變量中的實(shí)型變量)2 共用體變量的引用方式 54共用體共用體 (1)(1)同一個(gè)內(nèi)存段可以用來(lái)存放幾種不同類(lèi)型的成員,但在每一同一個(gè)內(nèi)存段可以用來(lái)存放幾種不同類(lèi)型的成員,但在每一瞬時(shí)只能存放其中一種,而不是同時(shí)存放幾種。瞬時(shí)只能存放其中一種,而不是同時(shí)存放幾種。(2) (2) 共用體變量中起作用的成員是最后一次存放的成員,在存共用體變量中起作用的成員是最后一次存放的成員,在存入一個(gè)新的成員后原有的成員就失去作用。入一個(gè)新的成員后原有的成
55、員就失去作用。 (3) (3) 共用體變量的地址和它的各成員的地址都是同一地址。共用體變量的地址和它的各成員的地址都是同一地址。(4) (4) 不能對(duì)共用體變量名賦值,也不能企圖引用變量名來(lái)得到不能對(duì)共用體變量名賦值,也不能企圖引用變量名來(lái)得到一個(gè)值,又不能在定義共用體變量時(shí)對(duì)它初始化。一個(gè)值,又不能在定義共用體變量時(shí)對(duì)它初始化。(5) (5) 不能把共用體變量作為函數(shù)參數(shù),也不能使函數(shù)帶回共用不能把共用體變量作為函數(shù)參數(shù),也不能使函數(shù)帶回共用體變量,但可以使用指向共用體變量的指針體變量,但可以使用指向共用體變量的指針 (6) (6) 共用體類(lèi)型可以出現(xiàn)在結(jié)構(gòu)體類(lèi)型定義中,也可以定義共共用體類(lèi)
56、型可以出現(xiàn)在結(jié)構(gòu)體類(lèi)型定義中,也可以定義共用體數(shù)組。反之,結(jié)構(gòu)體也可以出現(xiàn)在共用體類(lèi)型定義中,用體數(shù)組。反之,結(jié)構(gòu)體也可以出現(xiàn)在共用體類(lèi)型定義中,數(shù)組也可以作為共用體的成員。數(shù)組也可以作為共用體的成員。 3 共用體類(lèi)型數(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ù)??梢钥闯觯瑢W(xué)生和教師所包含的數(shù)。可以看出,學(xué)生和教師所包含的數(shù)據(jù)是不同的?,F(xiàn)要求把它們放在
57、同一表格中。據(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; category; category;person2;person2;
58、/ /* *先設(shè)人數(shù)為先設(shè)人數(shù)為2 2* */ /int main() int i; for(i=0;i2;i+) scanf(%d %s %c %c, &personi.num, &, &personi.sex, &personi.job);Cw1308.c58共用體共用體 if(personi.job = S)if(personi.job = S)scanf(%d, &personi.category.banji);scanf(%d, &personi.category.banji);else if(personi.j
59、ob = T)else if(personi.job = T)scanf(%s, personi.category.position);scanf(%s, personi.category.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 (per
60、soni.job = S)if (personi.job = S)printf(“%-6d%-10s%-3c%-3c%-6dn”,personi.num, printf(“%-6d%-10s%-3c%-3c%-6dn”,personi.num, , personi.sex, personi.job, , personi.sex, personi.job, personi.category.banji); personi.category.banji);else printf(“%-6d%-10s%-3c%-3c%-6sn”,personi.num, else printf(“%-6d%-10s%-3c%-3c%-6sn”,personi.num, ,personi.sex, personi.job, per
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030年中國(guó)隱形眼鏡行業(yè)市場(chǎng)發(fā)展?jié)摿εc投資策略建議報(bào)告
- 2025-2030年中國(guó)銅鋁復(fù)合散熱器行業(yè)市場(chǎng)規(guī)模分析及發(fā)展建議研究報(bào)告
- 2025-2030年中國(guó)酸奶發(fā)酵劑行業(yè)市場(chǎng)前景趨勢(shì)與投資潛力分析報(bào)告
- 2025-2030年中國(guó)超白玻璃市場(chǎng)前景趨勢(shì)及投資潛力分析報(bào)告
- 個(gè)人向的事業(yè)單位借款合同范本(2024版)3篇
- 中等教育的教師教育與培養(yǎng)創(chuàng)新考核試卷
- 制鞋業(yè)國(guó)際市場(chǎng)準(zhǔn)入與規(guī)范考核試卷
- 互聯(lián)網(wǎng)+社區(qū)服務(wù)與治理考核試卷
- 復(fù)混肥料在現(xiàn)代農(nóng)業(yè)中的作用考核試卷
- 地質(zhì)勘探中的野外地質(zhì)考核試卷
- 烹飪工藝美術(shù)教案
- 小學(xué)一年級(jí)英語(yǔ)1a期末學(xué)業(yè)評(píng)價(jià)方案
- 中央廣播電視大學(xué)畢業(yè)生登記表-6
- 搶救制度試卷附有答案
- 勞務(wù)派遣勞務(wù)外包服務(wù)方案(技術(shù)方案)
- 2023年藥品注冊(cè)專(zhuān)員年度總結(jié)及來(lái)年計(jì)劃
- 易普拉格科研管理系統(tǒng)
- 最終版 古城文化修復(fù)監(jiān)理大綱
- 拔罐技術(shù)操作考核評(píng)分標(biāo)準(zhǔn)
- 軟件無(wú)線電原理與應(yīng)用第3版 課件 第4-6章 軟件無(wú)線電硬件平臺(tái)設(shè)計(jì)、軟件無(wú)線電信號(hào)處理算法、信道編譯碼技術(shù)
- RB-T 099-2022 進(jìn)口食品供應(yīng)商評(píng)價(jià)技術(shù)規(guī)范
評(píng)論
0/150
提交評(píng)論