cc課件C試卷_20200520_130735chp7_第1頁
cc課件C試卷_20200520_130735chp7_第2頁
cc課件C試卷_20200520_130735chp7_第3頁
cc課件C試卷_20200520_130735chp7_第4頁
cc課件C試卷_20200520_130735chp7_第5頁
已閱讀5頁,還剩89頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、第7章 用戶自定義數(shù)據(jù)類型,7.1 結(jié)構體類型 7.2 共用體類型 7.3 枚舉類型 7.4 用typedef聲明新的類型名,假設要存儲有關學生的信息,則可能需要存儲: 學號、姓名、性別、年齡、成績、家庭地址等。 定義一種數(shù)據(jù)格式可以將所有這些不同類型的信息集中存儲在一個組合項中。 含有多個數(shù)據(jù)項; 數(shù)據(jù)項有不同類型;,7.1 結(jié)構體類型 7.1.1 為什么需要用結(jié)構體類型,結(jié)構體類型可以滿足要求,結(jié)構體(structure)類型(也稱結(jié)構)可以將有關學生的各種類型的數(shù)據(jù)信息放在一個結(jié)構體中,從而將各數(shù)據(jù)項合并到一起(在一個結(jié)構體中)。 是比數(shù)組更靈活的的數(shù)據(jù)格式,同一個結(jié)構體可以存儲多種類型

2、的數(shù)據(jù)。,首先要聲明一個結(jié)構體類型,例如,要創(chuàng)建一種類型來描述學生信息: struct Student /聲明結(jié)構體類型 int num; /包含一個int成員 char name20; /包含一個char數(shù)組成員 char sex; /包含一個char成員 int age; /包含一個int成員 float score; /包含一個float成員 char addr30; /包含一個char數(shù)組成員 ;,結(jié)構體類型描述的組成部分,struct Student int num; char name20; char sex; int age; float score; char addr30;

3、;,struct 關鍵字,標識符成為結(jié)構體類型的名稱,成員(域)表,起始括號和 結(jié)束括號,分號結(jié)束,結(jié)構體類型描述的組成部分,struct Book int num; / 書編號 char bookname30; / 書名 char author40; / 作者 char publisher40; / 出版社 float price; / 單價 ;,struct 關鍵字,標識符成為結(jié)構體類型的名稱,有了結(jié)構體類型后,可以定義這種類型的變量了: Student stu1; /stu1是Student結(jié)構體類型的變量 Student stu2; /Student類型變量 stu2 Student

4、s3,s4; /Student類型變量 s3,s4 Book book; / Book類型的變量 book 定義結(jié)構體變量的三種方法: 先定義結(jié)構體類型,再定義結(jié)構體變量(此方法用得最多) 如:先定義了Student結(jié)構體類型,然后再定義變量stu: Student stu;,7.1.2 結(jié)構體類型變量的定義方法及其初始化,2. 定義結(jié)構體類型的同時,定義結(jié)構體變量 如:定義Student結(jié)構體類型的同時,定義變量stu: struct Student int num; char name20; char sex; int age; float score; char addr30; stu;

5、,在定義結(jié)構體類型的同時,定義結(jié)構體變量,3. 直接定義結(jié)構體變量,不給結(jié)構體類型起類型名 如:直接定義結(jié)構體變量stu: struct int num; char name20; char sex; int age; float score; char addr30; stu;,沒有結(jié)構體類型名,直接定義結(jié)構體變量stu,使用成員運算符(.)訪問各成員(域),Student stu1,stu2; 例如: stu1.num 結(jié)構變量stu1的num成員 結(jié)構變量stu1的name成員 stu2.num 結(jié)構變量stu2的num成員 stu2.score 結(jié)構變量stu2的s

6、core成員 通過成員運算符 “.” 訪問結(jié)構成員。,/例 structur.cpp #include using namespace std; struct Student /定義結(jié)構體類型 int num; char name20; float score; ; int main() /定義結(jié)構體變量s1并對成員初始化 Student s1=2005001, “zhang san” , 82.5; /定義另一個結(jié)構體變量s2并對成員初始化 Student s2=2005002, “l(fā)i si” , 78; cout兩位學生:; cout和endl; cout學號

7、分別為:s1.num和s2.numendl; cout兩人的平均分為:(s1.score+s2.score)/2endl; return 0; ,結(jié)構體類型變量的定義方法及其初始化,兩位學生:zhang san 和 li si 學號分別為:2005001和2005002 兩人的平均分為:80.25,說明:結(jié)構體聲明的位置很重要,有兩種選擇: 放在main()之前,稱為外部聲明; 放在main()函數(shù)中,稱為內(nèi)部聲明; 外部聲明可以被其后面的任何函數(shù)使用; 內(nèi)部聲明只能被該聲明所屬的函數(shù)使用; 通常應使用外部聲明,這樣所以函數(shù)都可以使用這種類型的結(jié)構。,7.1.3引用結(jié)構體變量,一般方式:結(jié)構體

8、變量.成員名 stu1是Student結(jié)構體變量 stu1.num是int型變量; stu1.score是float型變量; 是char數(shù)組: ; /把該成員顯示為字符串 0; /是否合法? coutstu1; /是否合法?,不能直接輸出一個結(jié)構體變量,struct Date / 定義一個日期類型Date int yy; int mm; int dd; ; struct Student / 定義一個學生類型 char name20; Date birthday; / 成員是結(jié)構體類型 float score; stu1=“w

9、ang li”, 1980, 10,1, 91.5 ; 引用: stu1.birthday.yy stu1.birthday.mm,C+使得用戶定義的類型與基本類型盡可能使用方法一致,可以將結(jié)構體傳遞給函數(shù)(結(jié)構體作為參數(shù)); 可以讓函數(shù)返回一個結(jié)構體; 可以使用賦值運算符(=)將結(jié)構體賦給另一個同類型的結(jié)構體。 可以定義指向結(jié)構體變量的指針變量。,/例,/例 structur.cpp #include using namespace std; struct Student /結(jié)構體定義 int num; char name20; float score; ; int ma

10、in() Student s1=2005001, zhang san , 82.5 ; Student s2; s2=s1; /將結(jié)構體變量賦值給另一個結(jié)構體變量 stu0.num; endl; coutstu2.score;,7.1.4 結(jié)構體數(shù)組,Student stu3; stu本身是一個數(shù)組,而不是結(jié)構體; 判斷以下用法是否合法: stu0.num+; ; 0; 0; coutleader_name; /先后輸入10張票上所寫的姓名 for(j=0;j3

11、;j+) /將票上姓名與3個候選人的姓名比較 if(strcmp(leader_name,)=0) leaderj.count+; /如果與某一候選人姓名相同,給他加一票 ,coutendl; for(i=0;i3;i+) /輸出3個候選人的姓名與最后得票數(shù) :leaderi.countleader_name; /先后輸入10張票上所寫的姓名 for(j=0;j3;j+) /將票上姓名與3個候選人的姓名比較 if(leader_name=) leaderj.count+; /如果與某一候選人姓名相同,給他加一票 ,

12、coutendl; for(i=0;i3;i+) /輸出3個候選人的姓名與最后得票數(shù) :leaderi.countnum 讀成:p指向的結(jié)構體變量中的num p-name 讀作:p指向的結(jié)構體變量中的name p-score,7.1.5 指向結(jié)構體變量的指針,#include #include using namespace std; int main( ) struct Student /聲明結(jié)構體類型student int num; string name; char sex; float score; ; Student stu; /定義Student類型

13、的變量stu Student *p=,例7.3 指向結(jié)構體變量的指針的應用。,coutnumname sexscorescore a.next 表示為:(*head).next 或 head-next,用結(jié)構體變量和指向結(jié)構體變量的指針構成鏈表,由頭指針head指向的單鏈表,變量b可表示為:*(*head).next) 或 *(head-next) b.num 表示為:(*(head-next).num 或 head-next-num b.score 表示為:head-next-score c.num 表示為:head-next-next-num c.score 表示為:head-next-n

14、ext-score,用結(jié)構體變量和指向結(jié)構體變量的指針構成鏈表,由頭指針head指向的單鏈表,一般用一個輔助指針變量p指向當前要處理的結(jié)點 p=head; / p指向了變量a coutnumscorenext; / p指向了下一個變量b coutnumscorenext; / p指向了下一個變量c coutnumscoreendl; 顯示 31007 85,例7.4 建立一個單鏈表,它由3個學生數(shù)據(jù)的結(jié)點組成。輸出各結(jié)點中的數(shù)據(jù)。 #define NULL 0 #include struct Student long num; float score; struct Student *next

15、; ; int main( ) Student a,b,c, *head, *p; a. num=31001; a.score=89.5; /對結(jié)點a的num和score成員賦值 b. num=31003; b.score=90; /對結(jié)點b的num和score成員賦值 c. num=31007; c.score=85; /對結(jié)點c的num和score成員賦值 head= /將結(jié)點a的起始地址賦給頭指針head,a.next= ,7.1.6 結(jié)構體作為函數(shù)的參數(shù),用結(jié)構體變量作為參數(shù) 用結(jié)構體變量的指針作為參數(shù) 用結(jié)構體變量的引用變量作為參數(shù),#include #include using n

16、amespace std; struct Student /聲明結(jié)構體類型Student int num; char name20; float score3; ; int main( ) void print(Student); /函數(shù)聲明,形參類型為結(jié)構體Student Student stu; / 定義結(jié)構體變量 stu.num=12345; /以下5行對結(jié)構體變量各成員賦值 =Li Fung; stu.score0=67.5; stu.score1=89; stu.score2=78.5; print(stu); /調(diào)用print函數(shù),輸出stu各成員的值 return

17、 0; void print(Student stud) coutstud.num stud.score0 stud.score1 stud.score2pi; for (i=0;in;i+) coutpinum = 10123; p-sex = m; coutnamenumsexscore=67.5; head-next=NULL; p=new student; p-num=1003; p-score=56; p-next=NULL; head-next=p; ,建立鏈表的過程:動態(tài)申請新內(nèi)存空間,2000,3000,2000,定義一個指向鏈表結(jié)點類型的輔助指針變量 p=

18、head; /指向頭結(jié)點 do coutnumscorenext; while (p!=NULL);,/輸出*p結(jié)點數(shù)據(jù) /p指向下一個結(jié)點,遍歷鏈表:依次輸出各個結(jié)點的數(shù)據(jù),3000,1000,int main( ) Student *head,*p_new,*p_tail; int number; float score; head=NULL; /初始化一個空鏈表 cinnumberscore; /鍵盤輸入數(shù)據(jù) while( number!=0 ) p_new=new Student; / 得到1個新結(jié)點 p_new-num=number; p_new-score=score; if(he

19、ad=NULL) head=p_new; /如果是空表新結(jié)點作為頭結(jié)點 else p_tail-next=p_new; /否則新結(jié)點加入表尾 p_tail=p_new; /加入的新結(jié)點成為表尾 cinnumberscore; p_tail-next=NULL; /做尾結(jié)點 . 下面是鏈表的使用 ,/依次輸入學號、成績,動態(tài)建立新鏈表,當num=0時結(jié)束,/習題6.5 #include using namespace std; int main() int i,k,m,n,num50,*p; coutn; p=num; for (i=0;in;i+) *(p+i)=i+1; / 以1至n為序給每

20、個人編號 i=0; / i為每次循環(huán)時計數(shù)變量 k=0; / k為按1,2,3報數(shù)時的計數(shù)變量 m=0; / m為退出人數(shù) while (mn-1) / 當退出人數(shù)比n-1少時(即未退出人數(shù)大于1時)執(zhí)行循環(huán)體 if (*(p+i)!=0) k+; if (k=3) / 將退出的人的編號置為0 *(p+i)=0; k=0; m+; i+; if (i=n) i=0; / 報數(shù)到尾后,i恢復為0 while(*p=0) p+; coutThe last one is NO.*pi=120;p-f=12.34;,union data char ch; int i; float f; ;,h,120

21、,12.34,共用體指針p指向共用體變量b p=,2000,h,120,12.34,共用體(union)能夠存儲不同的數(shù)據(jù)類型,但每次只能存儲其中的一種類型; 共用體的長度為其最大成員的長度;,共用體,例 畫出以下共用體類型的內(nèi)存設置圖:,(1)union ast char name10; int post; double rate; ;,(2)union point char *ps; int *pd; float *pf; ;,例 畫出以下共用體類型的內(nèi)存設置圖:,(3)struct qw short int q; char w; union short int x; float y; u

22、; ;,例 畫出以下共用體類型的內(nèi)存設置圖:,(4)union un char str10; struct short int x; short int y; float z; dat; ;,un a; /定義un型變量a /引用舉例 a.str0=h; a.dat.x=12; a.dat.y=12345; a.dat.z=3.14; strcpy(a.str, ”hello abc”);,例 畫出以下共用體類型的內(nèi)存設置圖:,共用體的應用舉例,strcut widget char brand20; /名稱 int type; /類別 union id long id_num; char id

23、_char20; id_val; /商品id ; widget prize; if(prize.type=1) /根據(jù)類別的不同取值決定id的用法 cinprize.id_val.id_num; else cinprize.id_val.id_char;,共用體的用途之一是: 當數(shù)據(jù)項使用兩種或更多種格式(但不會同時使用)時,可節(jié)省空間。 例如:一個管理小商品目錄,其中有一些商品的ID為整數(shù),而另一些的ID為字符串;,如果一個變量只能取幾種可能的整數(shù)值,而這些整數(shù)值在應用中有特定的含義,可以為每個特定的整數(shù)值起一個英文名字。這類變量的類型叫枚舉類型。 如:顏色號:紅0,黃1,藍2, 白-3,黑

24、-4 將color定義成枚舉類型: enum color red, yellow, bule, white, black; 定義要完成兩項工作: 定義color成為新類型名,color被稱為枚舉類型(enumeration); 將red、yellow等作為符號常量,它們對應整數(shù)值0-4,這些常量叫做枚舉量(enumerator),是color型變量可取的值。,7.3 枚舉類型,enum daySun, Mon, Tue, Wed, Thu, Fri, Sat; Sun為0 Mon為1 . Sat為6 enum daySun=5,Mon,Tue,Wed,Thu,Fri,Sat; Sun, Mon, Tue, Wed, Thu, Fri, Sat分別為: 5, 6, 7, 8, 9, 10, 11 enum daySun, Mon, Tue, Wed=7, Thu, Fri, Sat; Sun, Mon, Tue, Wed, Thu, Fri, Sat分別為: 0, 1, 2, 7, 8, 9, 10,例.枚舉量與枚舉量對應的整數(shù)值,枚舉變量的特殊屬性,color a;/定義color型變量a a=red; /合法,將枚舉量賦給枚舉變量 a=0; /不合法,不能

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論