




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、1第十四講第十四講 結構體結構體相關數據的集合。相關數據的集合。數據的類型可以不相同。數據的類型可以不相同。用來定義保存在文件中的記錄。用來定義保存在文件中的記錄。與指針一起創(chuàng)建動態(tài)的數據結構:與指針一起創(chuàng)建動態(tài)的數據結構:鏈表鏈表隊列隊列棧棧樹樹2第十四講第十四講 結構體結構體結構體的概念結構體的概念結構體類型的定義結構體類型的定義結構體變量結構體變量定義和聲明定義和聲明初始化初始化使用使用結構體數組結構體數組C C語言程序設計語言程序設計本講是教材第11章,但我們由于課時和全國C的大綱關系,第四至10節(jié)不講,有興趣者,自己學習.本課件后面還有一些有趣的例子,如冼牌,選舉計票程序, 有興趣者
2、也可以自學.結構體是派生的數據類型結構體是派生的數據類型使用其他類型的對象來構造使用其他類型的對象來構造結構體。結構體。3結構體結構體結構體結構體數組是由相同類型的數據構成,而現(xiàn)實生活中由一些不相數組是由相同類型的數據構成,而現(xiàn)實生活中由一些不相同類型的數據構成的一組數據是相當多的,例如學號、姓名和同類型的數據構成的一組數據是相當多的,例如學號、姓名和學生成績。學生成績。C C語言提供了這種數據結構稱為語言提供了這種數據結構稱為結構體,它是一種結構體,它是一種較為復雜而又非常靈活的構造型的數據類型。較為復雜而又非常靈活的構造型的數據類型。一個結構體類型可以由若干個成員(或域)的成分組成,一個結
3、構體類型可以由若干個成員(或域)的成分組成,不同的結構體類型其成員不同。不同的結構體類型其成員不同。對于一個具體的結構體而言其成員的數量是固定的(同數對于一個具體的結構體而言其成員的數量是固定的(同數組),各成員的數據類型可以不同,這是結構體與數組的重要組),各成員的數據類型可以不同,這是結構體與數組的重要相同和不同點。相同和不同點。4結構體類型定義的一般形式為:結構體類型定義的一般形式為:struct struct 結構體名結構體名 類型名類型名1 1 成員名成員名1 1; 類型名類型名2 2 成員名成員名2 2; 類型名類型名n n 成員名成員名n n; ;結構體結構體其中,其中,stru
4、ctstruct是關鍵字,是結構體類型的標志。結構體名是是關鍵字,是結構體類型的標志。結構體名是由用戶定義的標識符,它規(guī)定了所定義的結構體類型的名稱。由用戶定義的標識符,它規(guī)定了所定義的結構體類型的名稱。結構體類型的組成成分稱為成員,成員名的命名規(guī)則與變量名結構體類型的組成成分稱為成員,成員名的命名規(guī)則與變量名相同。相同。如果成員的類型相同,則可以同變量一樣在一個類型名后寫如果成員的類型相同,則可以同變量一樣在一個類型名后寫出幾個成員名,他們之間用逗號分隔。出幾個成員名,他們之間用逗號分隔。 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;也可以寫成:也可以寫成:struct dateint year,month,day;struct student int num; char name8,sex; float score4; ;struct:引入結構體定義。:引入結構體定義。date:結構體的名稱,必須與:結構體的名稱,必須與 struct 一起使用。一起使用。struct dat
6、e 結構體包含結構體包含3個個 int * 類型的類型的成員成員:yearMonthday例如例如A:這里struct student結構體包含有:Int 型num(學號)char name8(姓名),sex(性別)Float score4(成績數組)例如例如B:6結構體類型的定義結構體類型的定義結構體定義說明結構體定義說明同一個結構體內不可以有同名的成員。同一個結構體內不可以有同名的成員。不同結構體的成員名可以相同,不互相沖突。不同結構體的成員名可以相同,不互相沖突。結構體結構體struct date int year,month,day; ;struct Book char title50
7、,writer20,publisher50; int year,month;int year,month,day;7結構體類型的定義結構體類型的定義結構體定義說明結構體定義說明結構體的成員可以是基本類型和構造類型(數組和其他結構體)。結構體的成員可以是基本類型和構造類型(數組和其他結構體)。結構體結構體struct dateint year,month,day; birthday;struct StuRec int num;char name20;/這里包含了數組這里包含了數組 struct date birthday;/這里包含了上面的結構體這里包含了上面的結構體,稱稱結構體的嵌套結構體的嵌
8、套;結構體的成員不可以包含自身結構體的成員不可以包含自身但可以包含自身的指針但可以包含自身的指針struct student char name20; char gender; float scores4; struct student next; /*error*/ struct student *nextPtr; /*correct*/; 8結構體變量結構體變量結構體定義說明結構體定義說明只是創(chuàng)建了新的數據類型,并不能保留內存空間。只是創(chuàng)建了新的數據類型,并不能保留內存空間。必須定義結構體變量來獲得內存空間。必須定義結構體變量來獲得內存空間。定義定義(聲明聲明)結構體變量結構體變量 有三種
9、方法有三種方法:1.定義結構體類型后,像聲明普通變量一樣聲明結構體變量。定義結構體類型后,像聲明普通變量一樣聲明結構體變量。結構體結構體struct date int year,month,day;struct date birth;yearmonthdayFF00FF04FF08birthbirth 的存儲形式的存儲形式TC中與中與VC中的不同中的不同9結構體變量結構體變量定義聲明結構體變量定義聲明結構體變量2.在定義結構體類型的同時,聲明結構體變量在定義結構體類型的同時,聲明結構體變量結構體結構體struct date int year,month,day; birth, days4, *
10、bPtr;struct int year,month,day; birth, days4, *bPtr;沒有結構體名,沒有結構體名,無法再次使用。無法再次使用。3.直接(只)聲明結構體變量直接(只)聲明結構體變量省略類型名。省略類型名。類型與變量是不同的概念,注意區(qū)分。系統(tǒng)能對變量賦值、存取、運算,類型與變量是不同的概念,注意區(qū)分。系統(tǒng)能對變量賦值、存取、運算,而類型則不能,編譯時,系統(tǒng)只對變量分配存儲空間,而類型則不分配。而類型則不能,編譯時,系統(tǒng)只對變量分配存儲空間,而類型則不分配。結構體中的成員也可以是一個結構體變量,即結構體的嵌套。結構體中的成員也可以是一個結構體變量,即結構體的嵌套。
11、10struct student /* student是結構體名,結構體成員有是結構體名,結構體成員有num,name,sex,date,scre4 */ int num; char name8,sex; struct date /*date是結構體名,其結構體變量表是是結構體名,其結構體變量表是birthday,成員包括年月日,成員包括年月日*/ int year,month,day; birthday; float score4; /*score4是數組,數組成員類型浮點型是數組,數組成員類型浮點型 */ xuesh;結構體中的成員名可以和程序中的變量同名;不同結構體結構體中的成員名可以和
12、程序中的變量同名;不同結構體中的成員名也可以同名。中的成員名也可以同名。11結構體的操作結構體的操作結構體變量可以執(zhí)行的操作結構體變量可以執(zhí)行的操作將結構體變量賦給相同類型的結構體變量。將結構體變量賦給相同類型的結構體變量。得到結構體變量的地址。得到結構體變量的地址。訪問結構體變量的成員。訪問結構體變量的成員。使用使用 sizeof 確確(測測)定結構體變量的大小。定結構體變量的大小。結構體結構體12結構體變量的初始化結構體變量的初始化給全部成員賦初值給全部成員賦初值結構體結構體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;將結構體變量各成員的初值順序地放在一對大括號中,并用逗號分隔。對將結構體變量各成員的初值順序地放在一對大括號中,并用逗號分隔。對結構體類型變量賦初值時,按每個成員在結構體中的順序一一對應賦值。結構體類型變量賦初值時,按每個成員在結構體中的順序一一對應賦值。同變量一樣結構體變量在定義時也可以進行初始化。同變量一樣結構體變量在定義時也可以進行初始化。13結構體變量的初始化結構體變量的初始化初始化結構體變量初始化結構體變量給部分成員賦初值
14、。給部分成員賦初值。結構體結構體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結構體變量的成員結構體變量的成員訪問結構體成員的兩種方式訪問結構體成員的兩種方式結構體成員運算符:結構體成員運算符:.用于結構體變量用于結構體變量結構體指針運算符:結構體指針運算符:-用于指向結構體的指針用于指向結構體的指
15、針等價于等價于 (*cardPtr).face結構體結構體struct card myCard;printf(“%s”, myCard.face);struct card *cardPtr;printf(“%s”, cardPtr-face);struct card char *face; char *suit; myCard.face;15案例分析:結構體變量的成員案例分析:結構體變量的成員問題:訪問結構體變量的成員。問題:訪問結構體變量的成員。(cw1301.c)結構體結構體#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);與數組的不同:與數組的不同:結構變量名不是指針結構變量名不是指針Ace of SpadesAce of SpadesAce of Spades注意:注意:結構不能作為整體輸入輸出。結構不能作為整體輸入輸出。必須逐個成員輸入輸出。必須逐個成員輸入輸
17、出。16案例分析:結構體作為函數的參數案例分析:結構體作為函數的參數問題:編寫函數實現(xiàn)結構體的復制。問題:編寫函數實現(xiàn)結構體的復制。結構體結構體#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); /結構體變量作實參,值傳遞結構體變量作實參,值傳遞 d2 = d1;d2
19、= d1; show(d2, d2); show(d2, d2); 實現(xiàn)實現(xiàn)(cw1302.c)17案例分析:結構體作為函數的參數案例分析:結構體作為函數的參數結構體結構體 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中運行的結果不一樣中運行的結果不一樣-858993460-858993460-858993460d4: 2004-5-1用指針作形參用地址作實參傳遞/結構體變量作實參,值傳遞,d3未賦值作實參值不確定空返回,無值返回(cw1302.c)續(xù))續(xù)18結構體數組結構體數組一、結構體數組的定義一、結構體數組的定義定義結構體數組的方法和定義結構體變量的方法一樣,只定義結構體數組的方法和定義結構體變量的方法一樣,只是必須說明其為數組。是必須說明其為數組。定義結構體變量的三種方法都可以用來定義結構體數組。定義結構體變量的三種方法都
22、可以用來定義結構體數組。二、結構體數組的初始化二、結構體數組的初始化和一般數組一樣,結構體數組也可以進行初始化。和一般數組一樣,結構體數組也可以進行初始化。數組每個元素的初值都放在一對大括號中,括號中依次排數組每個元素的初值都放在一對大括號中,括號中依次排列元素各成員的初始值列元素各成員的初始值三、結構體數組的引用三、結構體數組的引用對結構體數組的引用一般是對數組元素的成員進行引用。對結構體數組的引用一般是對數組元素的成員進行引用。引用只要遵循對數組元素的引用規(guī)則和對結構體變量成員的引用只要遵循對數組元素的引用規(guī)則和對結構體變量成員的引用規(guī)則即可。引用規(guī)則即可。19結構體數組結構體數組結構體數
23、組結構體數組數組的元素是結構體變量。數組的元素是結構體變量。常用結構體來表示記錄,那么結構體數組就可以表示一組記常用結構體來表示記錄,那么結構體數組就可以表示一組記錄。錄。案例分析案例分析全班全班 N 個學生,每個學生有學號、姓名、四門課的成績。個學生,每個學生有學號、姓名、四門課的成績。結構體結構體學號學號姓名姓名成績成績1成績成績2成績成績3成績成績4101WangHai80787681102ZhaoFei68667175130LiRui8276818420結構體數組結構體數組結構體數組結構體數組案例分析案例分析那么,可以定義結構體數組來保存那么,可以定義結構體數組來保存 N 個學生的數據
24、。個學生的數據。這樣,每個學生的數據就對應一個結構體變量(一條記錄),便于這樣,每個學生的數據就對應一個結構體變量(一條記錄),便于編程處理。編程處理。結構體結構體struct student int num; char name20; float scores4;struct student students30;21程序舉例程序舉例設某班有設某班有N名學生,每個學生數據包括學號,姓名,性別,年齡,平均成績。名學生,每個學生數據包括學號,姓名,性別,年齡,平均成績。要求輸入任意一個學號,輸出該學生的所有數據。要求輸入任意一個學號,輸出該學生的所有數據。分析:從一組數據中查找所需要的具有某特征
25、的內容,最簡單的是順序查找。分析:從一組數據中查找所需要的具有某特征的內容,最簡單的是順序查找。直到找到或找完為止。直到找到或找完為止。/*Cw1303.c 教材教材P171L11-1*/#include #define N 2struct student /定義結構體定義結構體 long int num;/學號學號 char name7;/姓名姓名 char sex3;/性別性別 int age,score;/成績成績stuN;/定義結構體數組定義結構體數組main() int i,t=-1;/t=-1為未查找到時的標志為未查找到時的標志 long int xuehao;/查找學號變量查找學
26、號變量 struct student stuN; /定義結構體類型數組定義結構體類型數組(cw1303.c)案例分析:結構體數組案例分析:結構體數組22printf(請按下列順序輸入請按下列順序輸入%d個學生的信息個學生的信息:n,N); /為結構體變量賦值為結構體變量賦值printf(t學號學號 姓名姓名 性別性別 年齡年齡 平均平均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(請輸入需查找學生的學號:請輸入需查找學生的學號:);scanf(%ld,&xuehao);for(i=0;iN;i+) if(xuehao=stui.num) t=i;break; if (t!=-1) /*以下輸出檢索結果以下輸出檢索結果*/printf(%ld%8s%4s%4d%4dn,stut.num,,stut.sex,stut.age,stut.score);else printf(查無此人查無此人!n);(cw1303.c)續(xù))續(xù)23案例分析:結構體數組案例分析:結構體數組檢索檢索問題:問題:某班有某班有 n 個學生,每個學生的數據包括學號、姓
28、名、年齡和性別。個學生,每個學生的數據包括學號、姓名、年齡和性別。要求給定任意一個學號,程序能輸出檢索的結果,并顯示對應的學要求給定任意一個學號,程序能輸出檢索的結果,并顯示對應的學生的數據。生的數據。分析分析定義結構體表示學生定義結構體表示學生用結構體數組保存學生數據用結構體數組保存學生數據采用順序查找法采用順序查找法結構體結構體輸入學生信息輸入學生信息輸入查詢條件輸入查詢條件查找學生信息,報告結果查找學生信息,報告結果24案例分析:結構體數組案例分析:結構體數組檢索檢索實現(xiàn)實現(xiàn)(cw1304.c)結構體結構體#include #define MAX 20int main() struct
29、StuRec int num; char name20; char gender; int age; studentMAX; int i, N, num;25案例分析:結構體數組案例分析:結構體數組檢索檢索實現(xiàn)實現(xiàn)結構體結構體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案例分析:結構體數組案例分析:結構體數組檢索檢索實現(xiàn)實現(xiàn)結構體結構體 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案例分析:結構體數組案例分析:結構體數組檢索檢索問題:問題:可以多次查找??梢远啻尾檎?。結構體結構體輸入學生信息輸入學生信息輸入查詢條件輸入查詢條件查找學生信息,報告結果查找學生信息,報告結果是否繼續(xù)查詢是否繼續(xù)查詢YN人機交互人機交互28案例分析:結構體數組案例分析:結構體數組檢索檢索實現(xiàn)實現(xiàn)(cw13
32、04m.c)部分代碼部分代碼結構體結構體 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小結:知識要點小結:知識要點 結構體是由若干個不同類型數據項構成的集合。結構體是由若干個不同類型數據項構成的集合。結構體類型的定義:結構體類型的定義:1. 結構體類型定義的一般
33、形式結構體類型定義的一般形式2. 結構體類型定義中的注意事項結構體類型定義中的注意事項結構體類型變量:結構體類型變量:結構體數組:結構體數組:1. 結構體數組定義的三種方法結構體數組定義的三種方法2. 結構體數組的初始化結構體數組的初始化3. 對結構體數組元素的成員進行引用對結構體數組元素的成員進行引用 1. 結構體類型變量定義的三種方法結構體類型變量定義的三種方法2. 結構體類型變量的初始化結構體類型變量的初始化3. 對結構體變量中成員的引用對結構體變量中成員的引用4. 對整個結構體變量的引用對整個結構體變量的引用 30#include /預處理調用輸入輸出頭文件預處理調用輸入輸出頭文件#i
34、nclude /#define N 10/定義符號常量定義符號常量struct stu/定義結構體定義結構體long int sno;/學號長整型學號長整型int score4;/成績浮點數一維數組三元素成績浮點數一維數組三元素studN;/定義結構體數組定義結構體數組void sort(struct stu arr)/定義結構體數組成績排序定義結構體數組成績排序int i,j; /定義循環(huán)變量定義循環(huán)變量struct stu temp; /定義結構體臨時變量定義結構體臨時變量for(i=0;iN;i+) /外循環(huán)外循環(huán)for(j=i+1;jN;j+) /內循環(huán)內循環(huán) if(arri.scor
35、e3arrj.score3) /比較前后兩行比較前后兩行 temp=arri;arri=arrj;arrj=temp;/排序交換排序交換輸入一個班輸入一個班10個學生的學號和每個學生考試三門功課(數學、英語、計算機基礎)個學生的學號和每個學生考試三門功課(數學、英語、計算機基礎)的成績。編程計算出每個學生的總分和平均分,并按學生成績優(yōu)劣排序,最后打的成績。編程計算出每個學生的總分和平均分,并按學生成績優(yōu)劣排序,最后打印一張按高分到低分名次排序的成績單。要求:印一張按高分到低分名次排序的成績單。要求:1)排序用一個函數實現(xiàn)。排序用一個函數實現(xiàn)。2)打印的成績單表項包括:序號,學號、數學、英語、計
36、算機、總分、平均分。打印的成績單表項包括:序號,學號、數學、英語、計算機、總分、平均分。 31int main()/主函數主函數int i;printf(請輸入學號和數學、英語、計算機的成績請輸入學號和數學、英語、計算機的成績n); for(i=0;iN;i+)/輸入數據輸入數據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);/調用排序函數調用排序函數printf(“名次名次t學號學號t數學數學t英語英語t計算機計算機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); 這是用結構體做實驗報告這是用結構體做實驗報告,思路方法同數組是一致的思路方法同數組是一致的.32本章到此結束,謝謝您的光臨!本章到此
38、結束,謝謝您的光臨!THANK YOU VERY THANK YOU VERY MUCH MUCH !33案例分析:結構體數組案例分析:結構體數組高性能的洗牌和發(fā)牌程序高性能的洗牌和發(fā)牌程序數據結構數據結構用一個紙牌結構體數組保存一副牌。用一個紙牌結構體數組保存一副牌。紙牌的花色和號碼名依然保存在字符串數組中。紙牌的花色和號碼名依然保存在字符串數組中。這樣,數組中的紙牌儼然已有一個順序了,則可以改進算這樣,數組中的紙牌儼然已有一個順序了,則可以改進算法。法。洗牌:隨機打亂紙牌在數組中的位置。洗牌:隨機打亂紙牌在數組中的位置。 不存在無限延期。不存在無限延期。發(fā)牌:按紙牌在數組中的順序顯示輸出。
39、發(fā)牌:按紙牌在數組中的順序顯示輸出。 數組遍歷一次。數組遍歷一次。結構體結構體34案例分析:結構體數組案例分析:結構體數組高性能的洗牌和發(fā)牌程序高性能的洗牌和發(fā)牌程序實現(xiàn)實現(xiàn)(cw1304a.c)結構體結構體#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案例分析:結構體數組案例分析:結構體數組高性能的洗牌和發(fā)牌程序高性能的
40、洗牌和發(fā)牌程序實現(xiàn)實現(xiàn)結構體結構體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案例分析:結構體數組案例分析:結構體數組高性能的洗牌和發(fā)牌程序高性能的洗牌和發(fā)牌程序實現(xiàn)實現(xiàn)結構體結構體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案例分析:結構體數組案例分析:結構體數組高性能的洗牌和發(fā)牌程序高性能的洗牌和發(fā)牌程序實現(xiàn)實現(xiàn)結構體結構體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案例分析:結構體數組案例分析:結構體數組高性能的洗牌和發(fā)牌程序高性能的洗牌和發(fā)牌程序實現(xiàn)實現(xiàn)結構體結構體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案例分析:結構體數組案例分析:結構體數組點票程序點票程序問題問題有三個候選人,有三個候選人,N個選舉人,每次輸入一個得票的候選人的名字,個選舉人,每次輸入一個得票的候選人的名字,要求最后輸出各人的得票結果。要求最后輸出各人的得票結果。定義數據
43、結構定義數據結構結構體結構體struct candidate char name20; /*姓名姓名*/ int count; /*得票數得票數*/ cand3;40案例分析:結構體數組案例分析:結構體數組點票程序點票程序算法算法結構體結構體輸入候選人信息輸入候選人信息輸入選票輸入選票查找得票人信息查找得票人信息找到否?找到否?得票人的票數增一得票人的票數增一輸出點票結果輸出點票結果點完否?點完否?YNNY41案例分析:結構體數組案例分析:結構體數組點票程序點票程序實現(xiàn)實現(xiàn)(cw1305.c)結構體結構體 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案例分析:結構體數組案例分析:結構體數組改進點票程序改進點票程序問題:問題:假設選舉人都是候選人假設選舉人都是候選人分析點票過程中數組的變化分析點票過程中數組的變化結構體結構體litaolitao wanghai litao zhaofei litaowanghailitaowanghaizhaofei43案例分析:結構體數組案例分析:
45、結構體數組改進點票程序改進點票程序數據結構和算法數據結構和算法結構體結構體struct candidate char name20; int count; candM;輸入選票輸入選票查找得票人信息查找得票人信息找到否?找到否?得票人的票數增一得票人的票數增一輸出點票結果輸出點票結果點完否?點完否?YNNY加入新的候選人;加入新的候選人;其得票數為其得票數為1。44案例分析:結構體數組案例分析:結構體數組改進點票程序改進點票程序實現(xiàn)實現(xiàn)(cw1306.c)結構體結構體。 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案例分析:結構體數組案例分析:結構體數組增強點票程序增強點票程序問題問題要求按候選人得票數要求按候選人得票數從高到低順序輸出結果。從高到低順序輸出結果。修改算法修改算法結構體結構體輸入選票輸入選票查找得票人信息查找得票人信息找到否?找到否?得票人的票數增一得票人的票數增一輸出點票結果輸出點票結果點完否?點完否?YNNY加入新的候選人;加入
47、新的候選人;其得票數賦值其得票數賦值“1”。按得票數進行排序按得票數進行排序46案例分析:結構體數組案例分析:結構體數組增強點票程序增強點票程序實現(xiàn)實現(xiàn)(cw1307.c)排序部分排序部分結構體結構體 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案例分析:結構體數組案例分析:結構體數組優(yōu)化點票程序優(yōu)化點票程序問題問題如果候選人的信息較多,為了提高排序過程中數據交換的性能,增如果候選人的信息較多,為了提高排序過程中數據交
48、換的性能,增設一數組設一數組order,用來保存排序結果。,用來保存排序結果。分析分析結構體結構體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案例分析:結構體數組案例分析:結構體數組優(yōu)化點票程序優(yōu)化點票程序實現(xiàn)實現(xiàn)(cw1308.c)結構體結構體 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);交換序號交換序號排序數組賦初值排序數組賦初值按照按照order保存的順序輸出候選人信息。保存的順序輸出候選人信息。49結構體作為函數的參數結構體作為函數的參數把結構體的單個成員傳遞給函數把結構體的單個成員傳遞給函數值傳遞。值傳遞。被調用函數不能修改調用函數中的
50、結構體成員。被調用函數不能修改調用函數中的結構體成員。把整個結構體傳遞給函數把整個結構體傳遞給函數值傳遞。值傳遞。被調用函數不能修改調用函數中的結構體。被調用函數不能修改調用函數中的結構體。把結構體指針傳遞給函數把結構體指針傳遞給函數模擬引用傳遞。模擬引用傳遞。被調用函數能修改調用函數中的結構體。被調用函數能修改調用函數中的結構體。結構體結構體50在函數中使用結構體在函數中使用結構體把整個結構體作為單個數據返回把整個結構體作為單個數據返回因為結構體變量之間可以賦值。因為結構體變量之間可以賦值。按值傳遞把數組傳遞給函數按值傳遞把數組傳遞給函數把數組作為結構體的成員,然后把結構體傳遞給函數。把數組
51、作為結構體的成員,然后把結構體傳遞給函數。被調用函數不能修改調用函數中的數組。被調用函數不能修改調用函數中的數組。結構體結構體51共用體共用體或稱為或稱為聯(lián)合聯(lián)合(Union)使幾個不同的變量共占同一段內存的結構稱為使幾個不同的變量共占同一段內存的結構稱為 “ “共用體共用體”或者或者“聯(lián)合聯(lián)合”類型的結構。類型的結構。1、共用體的概念 union number short x; char ch; float y;基本上和基本上和struct一樣一樣x、ch和和y處于處于同樣的地址同樣的地址sizeof(union xxx)取決于占空間最多的那個成員變量。取決于占空間最多的那個成員變量。11.
52、852共用體共用體 union data int i; char ch; float f;a,b,c; 同一內存單元在每一瞬時只能存放其中一種類型的成員;同一內存單元在每一瞬時只能存放其中一種類型的成員;并非同時都起作用,起作用的成員是最后一次存放的成員并非同時都起作用,起作用的成員是最后一次存放的成員不能作為函數參數不能作為函數參數union data int i; char ch; float f;; union data a,b,c;或:共用體和結構體的比較:共用體和結構體的比較:結構體變量所占內存長度是各成員占的內存長度之和。每個成員結構體變量所占內存長度是各成員占的內存長度之和。每個
53、成員分別占有其自己的內存單元。分別占有其自己的內存單元。共用體變量所占的內存長度等于最長的成員的長度。共用體變量所占的內存長度等于最長的成員的長度。上面定義的上面定義的“共用共用體體”變量、變量、各占個字節(jié)各占個字節(jié)(因為一個實型變(因為一個實型變量占個字節(jié)),量占個字節(jié)),而不是各占而不是各占個字節(jié)。個字節(jié)。例如:53共用體共用體 只有先定義了共用體變量才能引用它,而且不能引用共用只有先定義了共用體變量才能引用它,而且不能引用共用體變量,而只能引用共用體變量中的成員。體變量,而只能引用共用體變量中的成員。例如:前面定義了a、b、c為共用體變量 a.i a.i (引用共用體變量中的整型變量)引
54、用共用體變量中的整型變量) a.cha.ch(引用共用體變量中的字符變量)引用共用體變量中的字符變量) a.f a.f (引用共用體變量中的實型變量)引用共用體變量中的實型變量)2 共用體變量的引用方式 54共用體共用體 (1)(1)同一個內存段可以用來存放幾種不同類型的成員,但在每一同一個內存段可以用來存放幾種不同類型的成員,但在每一瞬時只能存放其中一種,而不是同時存放幾種。瞬時只能存放其中一種,而不是同時存放幾種。(2) (2) 共用體變量中起作用的成員是最后一次存放的成員,在存共用體變量中起作用的成員是最后一次存放的成員,在存入一個新的成員后原有的成員就失去作用。入一個新的成員后原有的成
55、員就失去作用。 (3) (3) 共用體變量的地址和它的各成員的地址都是同一地址。共用體變量的地址和它的各成員的地址都是同一地址。(4) (4) 不能對共用體變量名賦值,也不能企圖引用變量名來得到不能對共用體變量名賦值,也不能企圖引用變量名來得到一個值,又不能在定義共用體變量時對它初始化。一個值,又不能在定義共用體變量時對它初始化。(5) (5) 不能把共用體變量作為函數參數,也不能使函數帶回共用不能把共用體變量作為函數參數,也不能使函數帶回共用體變量,但可以使用指向共用體變量的指針體變量,但可以使用指向共用體變量的指針 (6) (6) 共用體類型可以出現(xiàn)在結構體類型定義中,也可以定義共共用體類
56、型可以出現(xiàn)在結構體類型定義中,也可以定義共用體數組。反之,結構體也可以出現(xiàn)在共用體類型定義中,用體數組。反之,結構體也可以出現(xiàn)在共用體類型定義中,數組也可以作為共用體的成員。數組也可以作為共用體的成員。 3 共用體類型數據的特點55共用體共用體設有若干個人員的數據,其中有學生和教師。學生的數據中包設有若干個人員的數據,其中有學生和教師。學生的數據中包括:姓名、號碼、性別、職業(yè)、括:姓名、號碼、性別、職業(yè)、班級班級。教師的數據包括:姓名、。教師的數據包括:姓名、號碼、性別、職業(yè)、號碼、性別、職業(yè)、職務職務。可以看出,學生和教師所包含的數。可以看出,學生和教師所包含的數據是不同的?,F(xiàn)要求把它們放在
57、同一表格中。據是不同的?,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、/ /* *先設人數為先設人數為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. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年湖北國土資源職業(yè)學院單招職業(yè)技能測試題庫及參考答案
- 商業(yè)綜合體改造抵押協(xié)議
- 2025年度養(yǎng)豬場動物疫病監(jiān)測與預警協(xié)議
- 2025年度個人信息保護與信息安全保密協(xié)議書
- 二零二五年度食品飲料企業(yè)財務代理記帳服務合同
- 2025年廣西自然資源職業(yè)技術學院單招職業(yè)技能測試題庫及答案一套
- 商業(yè)廣場改造貸款協(xié)議
- 2025年度公司終止職工勞動合同解除與就業(yè)援助合同
- 2025年北京綠色生態(tài)居住區(qū)拆遷補償與生態(tài)修復合同
- 2025年度商鋪轉租定金及租賃期終止處理合同
- 植入式靜脈給藥裝置護理技術課件
- 單兵綜合演練
- 疼痛中醫(yī)護理
- 歐式風格的室內設計
- GB/T 24091-2024適應氣候變化脆弱性、影響和風險評估指南
- 現(xiàn)代物流基礎題庫與參考答案
- 特色療法中藥穴位敷貼課件
- 2024寵物租賃服務詳細協(xié)議協(xié)議
- 2024年山東工程職業(yè)技術大學單招職業(yè)傾向性測試題庫(500題)含答案解析
- 2024至2030年串葉松香草種子項目投資價值分析報告
- 生活垃圾我知道(課件)二年級下冊勞動
評論
0/150
提交評論