版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第十章,大連理工大學(xué),結(jié)構(gòu)體與共用體,本章要點(diǎn),掌握結(jié)構(gòu)類型數(shù)據(jù)的定義方法和引用方法; 了解共用體和枚舉類型數(shù)據(jù)的定義方法和引用方法。,10.1 結(jié)構(gòu)體類型,如果將這些屬性分別定義為互相獨(dú)立的簡(jiǎn)單變量,則難以反映相互間的內(nèi)在聯(lián)系(同一個(gè)學(xué)生的屬性) 可采用結(jié)構(gòu)體數(shù)據(jù)結(jié)構(gòu)描述上述信息,將不同類型的數(shù)據(jù)組合成一個(gè)有機(jī)的整體,這些數(shù)據(jù)是相互聯(lián)系的。,問題:,結(jié)構(gòu)是邏輯上相互聯(lián)系的一組分量的集合。 結(jié)構(gòu)中的分量可以是不同類型的數(shù)據(jù),結(jié)構(gòu)中的分量稱為結(jié)構(gòu)的成員,一個(gè)學(xué)生有學(xué)號(hào)/姓名/性別/年齡/地址等屬性,在使用結(jié)構(gòu)之前,首先要對(duì)結(jié)構(gòu)的組成進(jìn)行描述,稱為結(jié)構(gòu)的定義。結(jié)構(gòu)定義說明了該結(jié)構(gòu)的組成成員,以及每
2、個(gè)成員的類型。,10.1.1 結(jié)構(gòu)體類型的定義,例: struct student int num; char name20; char sex; int age; char addr30; ;,定義一個(gè)結(jié)構(gòu)體類型的一般形式為:,struct 結(jié)構(gòu)體類型名 成員表列 ;,對(duì)各成員都要進(jìn)行類型說明; 成員名定名規(guī)則與變量名同。,10.1.2 結(jié)構(gòu)體變量的定義,方法一:先定義結(jié)構(gòu)體類型再定義變量名,定義studet1和sudent2 為struct student型變量,struct student int num; char name20; char sex; int age; char add
3、r30; ;,struct student student1, student2;,方法二:在定義類型的同時(shí)定義變量,如:,struct student int num; char name20; char sex; int age; char addr30; student1, student2;,一般形式是: struct 結(jié)構(gòu)體名 成員表列 變量名表列;,方法三:直接定義結(jié)構(gòu)類型變量。,其一般形式是: struct 成員表列 變量名表列;,此時(shí),不出現(xiàn)結(jié)構(gòu)體名,可用符號(hào)常量代表一個(gè)結(jié)構(gòu)體類型,如:,#define STUDENT struct student STUDENT int nu
4、m; char name20; char sex; int age; char addr30; ;,這樣,可直接用STUDENT 定義變量,如: STUDENT student1, student2; 此時(shí),不必再寫關(guān)鍵字struct,幾點(diǎn)說明:,1. 類型與變量是不同概念,不要混淆; 2. 結(jié)構(gòu)體中的成員,可以單獨(dú)使用,其作用與地位相當(dāng)于普通變量; 3. 成員也可以是一個(gè)結(jié)構(gòu)體變量;例如:,struct date int month; int day; int year; ;,struct student int num; char name20; int age; struct date
5、birthday; student1,student2;,4. 成員名可以與程序中的變量名相同,二者不代表同一對(duì)象。,10.1.3 結(jié)構(gòu)體變量的引用,規(guī)則: 1. 不能將一個(gè)結(jié)構(gòu)體變量作為一個(gè)整體進(jìn)行賦值和輸出;只能對(duì)其各個(gè)成員分別輸出(引用形式為:結(jié)構(gòu)體變量名.成員名)。 printf(,student1); printf( %d, student1.num); 輸出 10010,錯(cuò)!,正確!,2 .若成員本身又屬一個(gè)結(jié)構(gòu)體類型,只能對(duì)最低級(jí)的成員進(jìn)行賦值或存取以及運(yùn)算。 如:student1.birthday.year,(接上片),3. 對(duì)成員變量可以象普通變量一樣進(jìn)行各種運(yùn)算,如: su
6、mage=student1.age+student2.age; 4. 可以引用成員的地址,也可以引用結(jié)構(gòu)體變量的地址,如 scanf(%d,錯(cuò)!,輸入student1.num的值,輸出student1的首地址,10.1.4 結(jié)構(gòu)體變量的初始化,struct student long int num; char name20; char sex; char addr20; a=9801, Wang hong,W, 2 Linggong Road; main( ) printf(No.:%ldnname:%snsex:%cnaddress:%sn,a.num,,a.sex,a.addr
7、); ,運(yùn)行結(jié)果為: No.:9801 name:Wang hong sex:W address:2 Linggong Road,10.2 結(jié)構(gòu)體數(shù)組,在結(jié)構(gòu)體中使用數(shù)組類型作為結(jié)構(gòu)的一個(gè)成員; 用結(jié)構(gòu)體類型作為數(shù)組元素的基類型構(gòu)成數(shù)組。,結(jié)構(gòu)與數(shù)組的關(guān)系,例: struct student int num; char name14 ; char sex; int ade; char add20; s96 ;,96個(gè)元素都具有 結(jié)構(gòu)數(shù)據(jù)類型,結(jié)構(gòu)體數(shù)組是一個(gè)數(shù)組,數(shù)組中的每一個(gè)元素都是結(jié)構(gòu)類型。 說明結(jié)構(gòu)數(shù)組的方法:先定義一個(gè)結(jié)構(gòu),再用結(jié)構(gòu)類型說明一個(gè)數(shù)組變量。,例:為記錄100個(gè)人的基本情況
8、,說明一個(gè)有100個(gè)元素的數(shù)組。數(shù)組的基類型為結(jié)構(gòu)體 struct person char name 30; char sex; struct date birthday man100;,10.2.1結(jié)構(gòu)體數(shù)組的定義,man就是有100個(gè)元素的結(jié)構(gòu)數(shù)組,數(shù)組的每個(gè)元素為 person 結(jié)構(gòu)類型。,struct date int month; int day; int year; ;,例如: struct student int num; char name20; char sex; int age; char addr30; ; struct student stu3 ;,struct stu
9、dent int num; stu3; 或struct int num; stu3;,struct student int num; struct student stu3;,10.2.2 結(jié)構(gòu)體數(shù)組的引用,訪問結(jié)構(gòu)體數(shù)組中的具體元素,必須遵守?cái)?shù)組使用的規(guī)定按下標(biāo)進(jìn)行訪問。,要訪問結(jié)構(gòu)體數(shù)組中某個(gè)具體元素下的成員,又要遵守有關(guān)訪問結(jié)構(gòu)成員的規(guī)定,使用“.”訪問運(yùn)算符和成員名,例:為記錄100個(gè)人的基本情況,說明一個(gè)有100個(gè)元素的數(shù)組。數(shù)組的基類型為結(jié)構(gòu)體 struct person char name 30; char sex; struct date birthday man100;,st
10、ruct date int month; int day; int year; ;,strcpy ( , Fangjin ); man3.sex = M; man3.birthday.year = 1963; man3.birthday.month = 9; man3.birthday.day = 13;,例如: 要將數(shù)組man中的 3 號(hào)元素賦值為: Fangjin, M, 1963, 9, 13 使用下列語句:,結(jié)構(gòu)數(shù)組存放在連續(xù)的內(nèi)存區(qū)域中,所占內(nèi)存大小為結(jié)構(gòu)類型的大小乘以數(shù)組元素的數(shù)量。 例如TC環(huán)境下: struct person man100: 37*100 =
11、3700字節(jié),將Fangjin改為Fangjun: 5 = u; /*為數(shù)組中元素的數(shù)組成員中的一個(gè)字符賦值*/,為數(shù)組中一個(gè)元素的一個(gè)成員賦值,10.2.3 結(jié)構(gòu)體數(shù)組的初始化,struct student int num; char name20; char sex; int age; char addr30; stu3=111, Li, M,18, Dalian,;,結(jié)構(gòu)體數(shù)組的初始化的一般形式是在 定義數(shù)組后面加上: =初值表列;,也可采用: struct student int num; ; struct student stu=,;,#include struct
12、 person char name20; int count; leader3=Li,0, zhang,0, Liu,0; main( ) int i, j; char leader_name20; for( i=1;i=10;i+) scanf(%s, leader_name); for(j=0;j成員名 或者 (*p).成員名 例如: p-num=9901; strcpy(p-name, Li Min); p-sex=W;,例: printf(%d, man.birthday.year); 傳遞結(jié)構(gòu)成員的值 scanf(%d, 傳遞結(jié)構(gòu)成員的地址,10.4 結(jié)構(gòu)體類型數(shù)據(jù)在函數(shù)間的傳遞,結(jié)
13、構(gòu)體與函數(shù)的關(guān)系,向函數(shù)中傳遞結(jié)構(gòu)的成員; 在函數(shù)之間傳遞整個(gè)結(jié)構(gòu); 向函數(shù)傳遞結(jié)構(gòu)的地址(指針)。,向函數(shù)中傳遞結(jié)構(gòu)的成員,在函數(shù)中傳遞結(jié)構(gòu)成員的方法與傳遞簡(jiǎn)單變量的方法相同: 在函數(shù)之間傳遞成員的值; 在函數(shù)之間傳遞成員的地址。,閱讀程序:,main() struct student int num; int age; ; struct student stu3=1000,20,1001,19,1003,23; struct student *p; p=stu; printf(%dn, (*p+).num); ,輸出結(jié)果:?,例:利用結(jié)構(gòu)變量求解兩個(gè)復(fù)數(shù)之積。 (3+4i)(5+6i),將
14、結(jié)構(gòu)作為整體,在函數(shù)之間傳遞: 將結(jié)構(gòu)變量作為形參; 函數(shù)的返回值也可為一個(gè)結(jié)構(gòu)類型。,在函數(shù)之間傳遞整個(gè)結(jié)構(gòu),例:利用結(jié)構(gòu)變量求解兩個(gè)復(fù)數(shù)之積。 (3+4i)(5+6i) struct complx int real, im; ; struct complx cmult (struct complx za, struct complx zb ) struct complx w; w.real = za.real * zb.real - za.im * zb.im; w.im = za.real * zb.im + za.im * zb.real; return ( w ); /* 返回結(jié)果,
15、為結(jié)構(gòu)體類型 */ ,main ( ) struct complx za = 3, 4 ; struct complx zb = 5, 6 ; struct complx z; z=cmult(za, zb); printf (%d+%di)*(%d+%di)=,za.real, za.im, zb.real, zb.im); printf (%d+%di)n, z.real, z.im); ,10.4 共用體,10.4.1 共用體的概念 共用體:使幾個(gè)不同的變量共享同一段內(nèi)存。 “共用體”類型變量的定義形式為: union 共用體名 成員表列 變量表列;,或 union data int i
16、; char ch; float f; ; union data a,b,c;,或 union int i; char ch; float f; a,b,c;,直接 定義,先定義 類型,union data int i; char ch; float f; a,b,c;,union int i; char ch; float f; a; a.i=20; /*把整型類型的數(shù)據(jù)放在地址1000處開始的內(nèi)存中*/ a.ch=a; /*把字符型類型的數(shù)據(jù)放在地址1000處開始的內(nèi)存中*/ a.f=33.4; /*把實(shí)型類型的數(shù)據(jù)放在地址1000處開始的內(nèi)存中*/,共用體中各個(gè)成員不能同時(shí)存在,使用時(shí)共
17、用體變量只有一個(gè)成員在內(nèi)存中。,注意:共用體類型變量與結(jié)構(gòu)體類型變量的區(qū)別:,結(jié)構(gòu)體類型變量所占內(nèi)存長(zhǎng)度是各成員占的內(nèi)存長(zhǎng)度之和。 共用體類型變量所占內(nèi)存長(zhǎng)度等于最長(zhǎng)的成員的長(zhǎng)度。 成員分量之間是相互聯(lián)系的,所進(jìn)行的操作相互依賴。,10.4.3 共用體類型數(shù)據(jù)的特點(diǎn),1.每一瞬時(shí)只有一個(gè)成員起作用 ; 2. 共用體變量中起作用的成員是最后一次存放的成員; 3.共用體變量的地址和它的各成員的地址都是同一地址; 4.不能對(duì)共用體變量名賦值,也不能企圖引用變量名來得到成員的值,又不能在定義共用體變量時(shí)對(duì)它初始化。 5. 不能把共用體變量作為函數(shù)參數(shù),也不能使函數(shù)帶回共用體變量,但可使用指向共用體變量
18、的指針; 6. 共用體類型可以出現(xiàn)在結(jié)構(gòu)體類型定義中,也可以定義共用體數(shù)組。而結(jié)構(gòu)體也可以出現(xiàn)在共用體類型定義中,數(shù)組也可以作為共用體的成員。,10.6 用typedef定義數(shù)據(jù)類型,10.6.1 自定義類型,標(biāo)準(zhǔn)類型(如int、char、long、double等):系統(tǒng)已經(jīng)定義好的類型,用戶可以直接使用,無須再進(jìn)行定義。,用戶自定義類型:用戶根據(jù)自己的實(shí)際要求,自己定義的新的數(shù)據(jù)類型。,例: typedef int INTEGER; typedef float REAL; 在具有上述typedef語句的程序中,下列語句是等價(jià)的: int i,j; float pai; 等價(jià)于 INTEGER
19、 i, j; REAL pai;,10.6.2 typedef語句的一般形式,typedef 已定義的類型 新的類型,例: typedef struct int data; struct *link; JD 定義了一個(gè)新的結(jié)構(gòu)體類型JD,它代表一個(gè)結(jié)構(gòu)體,可以使用JD來定義變量: JD *s; 定義指向結(jié)點(diǎn)類型的指針s,折半查找(二分法查找) 思想:先確定待查找記錄所在的范圍,然后逐步縮小范圍,直到找到或確認(rèn)找不到該記錄為止。 前提:必須在具有順序存儲(chǔ)結(jié)構(gòu)的有序表中進(jìn)行。,分三種情況: 1)若中間項(xiàng)的值等于x,則說明已查到。 2)若x小于中間項(xiàng)的值,則在線性表的前半部分查找; 3)若x大于中間
20、項(xiàng)的值,則在線性表的后半部分查找。 特點(diǎn):比順序查找方法效率高。,查找23和79的過程如下圖:,mid=(low+high)/2,( 8, 14, 23, 37, 46, 55, 68, 79, 91 ),( 8, 14, 23, 37, 46, 55, 68, 79, 91 ),( 8, 14, 23, 37, 46, 55, 68, 79, 91 ),( 8, 14, 23, 37, 46, 55, 68, 79, 91 ),typedef struct int num; char name10; float score; Student; main() int j,num; Studen
21、t s4=10,Li,98,40,Wang,88,55,Zhang,89,60,Lin,95; scanf(%d, ,int search(Student s,int key, int n)/*折半查找*/ int low,high,mid; low=1;high=n; while(lowcircle.radius ; break; case T_RECTANGLE: area= fabs(ps-rectangle.x2 ps-rectangle.x1) * (ps-rectangle.y2 ps-rectangle.y1); break; return area; ,/* 編寫cshapes
22、1.c文件,定義有關(guān)圖形處理的函數(shù) */,void draw(SHAPE *ps) printf(DRAW:); switch(type) case T_CIRCLE: printf(Circle : radius %f at(%f,%f)n, ps-circle.radius,ps-circle.x,ps-circle.y); break; case T_RECTANGLE: printf(Rectangle with corners: (%f,%f) and (%f,%f)n, ps-rectangle.x1, ps-rectangle.y1, ps-rectangle.x2, ps-rectangle.y2); break; ,/* 編寫cshapes1.c文件,定義有關(guān)圖形處理的函數(shù) */,#include #include cshapes1.h main() int k; SHAPE ci
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年河南輕工職業(yè)學(xué)院高職單招職業(yè)適應(yīng)性測(cè)試模擬試題有答案解析
- 2026年河北勞動(dòng)關(guān)系職業(yè)學(xué)院高職單招職業(yè)適應(yīng)性測(cè)試參考題庫帶答案解析
- 神經(jīng)外科微創(chuàng)手術(shù)技術(shù)
- 財(cái)險(xiǎn)合規(guī)培訓(xùn)課件
- 胡蜂螫傷規(guī)范化診治專家共識(shí)總結(jié)2026
- 生物材料在組織工程中的應(yīng)用前景
- 護(hù)理護(hù)理護(hù)理信息化建設(shè)與護(hù)理管理
- 醫(yī)療護(hù)理專業(yè)禮儀與形象
- 2026年常州工程職業(yè)技術(shù)學(xué)院?jiǎn)握芯C合素質(zhì)筆試參考題庫帶答案解析
- 心臟重癥護(hù)理流程優(yōu)化
- 液壓支架裝配翻轉(zhuǎn)平臺(tái)施工方案
- 房地產(chǎn)企業(yè)財(cái)務(wù)風(fēng)險(xiǎn)分析及防范措施研究-以碧桂園為例
- 髕骨骨折護(hù)理查房課件
- 農(nóng)業(yè)安全用藥培訓(xùn)機(jī)械課件
- 直播間合伙人合同協(xié)議書
- 貴州中醫(yī)藥大學(xué)時(shí)珍學(xué)院《Java程序設(shè)計(jì)A》2024-2025學(xué)年第一學(xué)期期末試卷
- (2025年標(biāo)準(zhǔn))園區(qū)基金投資協(xié)議書
- 2025秋季學(xué)期國開電大法律事務(wù)??啤睹穹▽W(xué)(2)》期末紙質(zhì)考試多項(xiàng)選擇題庫珍藏版
- 無人機(jī)裝調(diào)檢修工基礎(chǔ)技能培訓(xùn)手冊(cè)
- 陽江海上風(fēng)電項(xiàng)目建議書
- 體育課堂常規(guī)
評(píng)論
0/150
提交評(píng)論