第10章構造數據類型_第1頁
第10章構造數據類型_第2頁
第10章構造數據類型_第3頁
第10章構造數據類型_第4頁
第10章構造數據類型_第5頁
已閱讀5頁,還剩43頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第10章 構造數據類型南開大學非計算機專業(yè)理工科面向對象程序設計課程2課程內容安排(課程內容安排(2 2課時)課時)結構體結構體枚舉枚舉類型重定義類型重定義typedef3結構體數組是由若干同一類型的數據元素構成的有序集合。例如可以用一個數組表示某個學生所有科目的成績,但是如果想要表示某個學生的學號、姓名、性別、年齡、成績等不同類型的數據集合,用數組顯然無法實現(xiàn)。這時程序員可以定義一個表示學生數據的結構體數據類型,即學生結構體類型,其中包括學生的各項數據說明,然后再根據新定義的結構體類型定義相應的結構體變量,用來表示和存儲某個具體的學生數據。 下面分別介紹結構體類型的定義、結構體變量的定義及其

2、它們的使用。 4結構體10.1.1 結構體類型的定義結構體類型定義的一般形式為:struct 結構體類型名結構體類型名成員列表成員列表;其中,struct是關鍵字,表示結構體類型的開始。struct后面就是定義的結構體類型的名稱。大括號中是若干個成員的說明,每個成員說明的形式為:類型類型 成員名成員名;整個定義的最后以分號結束。5結構體 在這段結構體類型的定義中,student是結構體類型名是結構體類型名,即新定義的一種構造數據類型。大括號中列出了學生結構體中包含的各成員的類型及名稱,即學生類型包含的各項信息。定義了結構體類型student之后,就可以定義相應的結構體變量表示具體的學生數據了。

3、例如學生結構體類型定義如下:struct studentchar num8;char name10;char sex;int age;float score;6結構體提示:結構體類型定義以關鍵字struct開頭,一對大括號不能少,尤其不要忘記最后以分號結束。結構體類型的定義一般放在程序開始的文件包含語句后面,也可以放到某個函數內部。結構體中的成員可以是前面學過的任意類型,甚至可以是結構體類型。結構體類型定義只是定義了一種新的數據類型,并不是變量,不占用內存空間。7結構體10.1.2 結構體變量的定義和初始化1. 結構體變量的定義結構體變量的定義方法有三種(1)先定義結構體類型,再定義結構體變量

4、 如前面定義過結構體類型student后,可以用以下形式定義變量: student s1,s2; 該語句定義了student類型的結構體變量s1和s2。s1和s2表示具體的兩個學生變量,它們各自有學號、姓名、性別、年齡和成績等數據成員。8結構體(2)定義結構體類型的同時定義結構體變量struct studentchar num8;char name10;char sex;int age;float score;stu1,stu2; 在定義結構體類型的同時定義兩個結構體變量,然后再以分號結束。9結構體(3)不聲明結構體類型名,直接定義結構體變量struct char num8;char name

5、10;char sex;int age;float score;stu; 直接定義上面這種結構體類型的變量stu,但是沒有給出類型名,以后就不能再定義該類型的變量了。10結構體2. 結構體變量的初始化和其他類型的變量一樣,定義結構體變量的同時可以對其進行初始化,例如:student s1=0911001,zhang san,m,18,606;或struct studentchar num8;char name10;char sex;int age;float score;s2=0911002,wang li,f,17,666;11結構體10.1.3 結構體變量的引用定義結構體變量之后,系統(tǒng)為其

6、分配內存并可以對其引用,即對其賦值和其他操作。但是要注意一個結構體變量由若干成員組成,所以引用結構體變量一般是對其各個成員的引用。引用結構體變量的成員的形式如下:結構體變量名結構體變量名. .成員名成員名其中,“.”是成員運算符。12結構體如已有定義“student stu;”,則可以進行如下操作:strcpy(stu.num, 0912003);;stu.sex=f;stu.age=16;cinstu.score;13結構體 另外,相同類型的結構體變量之間可以整體賦值,例如:student s1,s2=0911001,zhang san,m,18,606;s1=s2;這

7、樣,s1和s2兩個變量的內容完全相同,相當于將s2的各成員的值依次賦值給s1的各成員。14結構體【例10-1】編寫程序,記錄某學生的學號、姓名和三科成績,計算并輸出其平均成績。/p10_1.cpp#include using namespace std;struct student char num8;char name10;float score3;stu=0910128, li ming, 86, 91, 78;15結構體int main() float s=0;for(int i=0; i3; i+)s=s+stu.scorei;endls/

8、3stu.score0;”等形式。如果寫成“stu=0910128, li ming, 86, 91, 78;”則是錯誤的,不能同時對結構體變量整體輸入輸出,如“cinstu;”“coutstu;”等都是錯誤的。17結構體3如果結構體成員仍然是結構體類型的,則要對數據成員進行多層引用。如:struct dateint year,month,day;struct student char num8, name10;date birthday;float score3;stu;則要引用學生stu的出生年份,就應該表示為:stu.birthday.year。18結構體10.1.4 結構體指針結構體變

9、量定義后,系統(tǒng)為其分配內存空間,具體分配的字節(jié)數可由sizeof(結構體類型名)或者sizeof(變量名)求得。結構體變量的內存空間的首地址表示為:&結構體變量名??梢远x結構體類型的指針變量,讓其指向結構體變量,指針變量訪問結構體變量的成員時借助箭頭成員運算符“-”,形式為:指針指針變量變量-成員名成員名。19結構體【例10-2】利用結構體指針變量實現(xiàn):輸入學生數據,然后輸出平均成績。/p10_2.cpp#include using namespace std;struct student char num8;char name10;float score3;20結構體int main()

10、student stu,*p;p=&stu; /指針p指向變量stucout請輸入學生的學號、姓名和三科成績:p-nump-name;for(int i=0;ip-scorei;cout平均成績?yōu)椋骸?score0+p-score1+p-score2)/3num等價于stu.num,也可以表示為(*p).num。其他成員的訪問同理。21結構體10.1.5 結構體數組如果要操作多個學生的信息,可以定義學生類型的結構體數組,如語句“student stu3;”定義了結構體數組stu,它有3個元素stu0、stu1、stu2,這3個元素就是3個結構體變量,表示3個學生,而每個元素都有學號、姓名等成員

11、,用stui.num、(其中i的取值為0、1、2)等形式引用。22結構體對結構體數組可以在定義的同時進行初始化,例如:struct student char num8;char name10;float score3;stu2=0910127, li ming, 86, 91, 78,0910128, zhou xun, 88, 81, 79;23結構體【例 10-3】學生結構體類型包括學號、姓名、英語成績、數學成績、計算機成績,求某班計算機成績的最高分。#include using namespace std;struct student char num8;char na

12、me10;float score3;24結構體int main()const int n=3;student stun;for(int i=0;in;i+)cout輸入學號、姓名和三科成績:;for(int j=0;jstui.scorej;25結構體 float maxscore=stu0.score2; for(int i=1;imaxscore)maxscore=stui.score2;cout全班計算機最高成績?yōu)椋簃axscoreendl; return 0;26回答問題時間回答問題時間請思考并回答:請思考并回答:1如何求每位學生的成績最高分max?2

13、如何求全班所有學生的三科成績中有不及格成績的學生總人數?3如何對學生按照某科成績進行排序?27結構體10.1.6 結構體與函數結構體類型的數據可以作為函數參數,在函數內對該參數進行操作。另外函數的返回值也可以是結構體類型的數據,函數的返回值可以是結構體類型的數據或結構體類型的指針。結構體類型作為函數參數有以下幾種情況:(1)結構體變量作為函數參數;(2)結構體數組作為函數參數;(3)結構體指針或引用作為函數參數。28結構體【例10-4】學生結構體類型包括學號、姓名、英語成績、數學成績、計算機成績,輸入n個學生的數據,然后求n個學生所有成績的最高分。#include using namespac

14、e std;struct student char num8;char name10;float score3;29結構體void input(student &s) /結構體引用作參數,輸入某個學生的數據cout輸入學號、姓名和三科成績:;for(int j=0;js.scorej;30結構體void output(student s) /結構體變量作參數,輸出某個學生的數據couts.num ;for(int j=0;j3;j+)couts.scorej ;coutendl;31結構體float findmax(student *s,int m,int

15、n) /結構體指針(數組)作參數,求最高成績float maxscore=s0.score0; for(int i=0;im;i+)for(int j=0;jmaxscore)maxscore=si.scorej;return maxscore;32結構體int main() const int n=3;student stun;int i;for(i=0;in;i+)input(stui);coutn個學生的信息如下:endl;for(i=0;in;i+)output(stui);float max=findmax(stu,n,3);cout全班最高成績?yōu)椋簃axendl; return 0

16、;33結構體input()函數中,結構體引用作為函數參數。主函數中調用input()函數時,實參stui傳遞給形參s,s成為stui的引用,input()函數中對s的操作相當于對主函數中stu的操作。34結構體output()函數中,結構體變量作為函數參數。主函數調用output()函數時,將實參stui的值傳遞給形參s,在函數中輸出s,相當于將主函數中stui的值輸出;但是和引用作參數不同的是,變量作參數,是形參向實參的單向值傳遞,實參獲得形參的值之后,它們之間就沒有關系了,如果在函數內部改變實參的值,不會影響形參。35結構體findmax()函數中,結構體指針作為函數參數,接收到的實參是主

17、函數中的結構體數組名(即數組的首地址),形參s指向了主函數中的數組stu,在函數中對si的操作相當于對主函數中stui的操作。本程序中注意各形參和實參的對應關系和書寫格式。36枚舉10.2 枚 舉實際應用中,有些變量只有幾個可能的值,而且可以用整數來表示這些值,如一周有7天,一年有12個月等。這時,可以定義枚舉(enumeration)類型,將幾個可能的值列舉出來。37枚舉10.2.1 枚舉類型的定義枚舉類型的定義形式為:enum 枚舉類型名枚舉類型名枚舉常量列表枚舉常量列表;其中,enum是枚舉類型關鍵字,枚舉類型名是新定義的一種構造數據類型,大括號中將這種枚舉類型可能有的幾個常量的名字列舉

18、出來,最后以分號結束。38枚舉例如:enum weekdaysun,mon,tue,wed,thu,fri,sat;定義了枚舉類型weekday,這個類型的7個數據在大括號中被列舉出來,sun,mon,tue, wed,thu,fri,sat等被稱為weekday的枚舉常量,表示一周中的七天,而且它們默認對應7個整數值0,1,2,3,4,5,6。39枚舉在定義枚舉類型時,也可以指定枚舉常量對應的整數值。例如:enum weekdaysun=7,mon=1,tue,wed,thu,fri,sat;這時,枚舉常量的值依次是7,1,2,3,4,5,6。又如:enum colorred,green,b

19、lue,white=0,black;枚舉常量的值依次是0,1,2,0,1。40枚舉10.2.2 枚舉變量的定義和引用定義枚舉類型之后,就可以定義相應的枚舉變量,可以先定義枚舉類型,再定義枚舉變量,也可以在定義枚舉類型的同時定義枚舉變量。例如:enum colorred,green,blue,white,blackco1,co2;或者:enum colorred,green,blue,white,black;color co1,co2;41枚舉定義了枚舉變量之后,可以對枚舉變量進行引用即可以對枚舉變量進行初始化、賦值或其他操作,不過應該注意的是對枚舉變量只能賦值為枚舉常量之一。如:enum co

20、lorred,green,blue,white,blackco1=red,co2;co2=blue; /不能寫為:co2=2;但是在參加其他計算或操作時,co1的值相當于整數0,co2的值相當于整數2,如:coutco2endl;的輸出結果為2;coutco1+5endl;的輸出結果為5;42枚舉【例10-5】函數output的功能是輸出參數對應的顏色。/p10_5.cpp#include using namespace std;enum colorred,green,blue,white,black;43枚舉void output(color co)switch(co)case 0:coutredendl;break;case 1:coutgreenendl;break;case 2:coutblueendl;break;case 3:coutwhiteendl;break;case 4:coutblackendl;break;44枚舉int main() color co1=red,co2=white; ou

溫馨提示

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

評論

0/150

提交評論