c語言教程第十_第1頁
c語言教程第十_第2頁
c語言教程第十_第3頁
c語言教程第十_第4頁
c語言教程第十_第5頁
已閱讀5頁,還剩41頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第十章,大連理工大學(xué),結(jié)構(gòu)體與共用體,本章要點,掌握結(jié)構(gòu)類型數(shù)據(jù)的定義方法和引用方法; 了解共用體和枚舉類型數(shù)據(jù)的定義方法和引用方法。,10.1 結(jié)構(gòu)體類型,如果將這些屬性分別定義為互相獨立的簡單變量,則難以反映相互間的內(nèi)在聯(lián)系(同一個學(xué)生的屬性) 可采用結(jié)構(gòu)體數(shù)據(jù)結(jié)構(gòu)描述上述信息,將不同類型的數(shù)據(jù)組合成一個有機(jī)的整體,這些數(shù)據(jù)是相互聯(lián)系的。,問題:,結(jié)構(gòu)是邏輯上相互聯(lián)系的一組分量的集合。 結(jié)構(gòu)中的分量可以是不同類型的數(shù)據(jù),結(jié)構(gòu)中的分量稱為結(jié)構(gòu)的成員,一個學(xué)生有學(xué)號/姓名/性別/年齡/地址等屬性,在使用結(jié)構(gòu)之前,首先要對結(jié)構(gòu)的組成進(jìn)行描述,稱為結(jié)構(gòu)的定義。結(jié)構(gòu)定義說明了該結(jié)構(gòu)的組成成員,以及每

2、個成員的類型。,10.1.1 結(jié)構(gòu)體類型的定義,例: struct student int num; char name20; char sex; int age; char addr30; ;,定義一個結(jié)構(gòu)體類型的一般形式為:,struct 結(jié)構(gòu)體類型名 成員表列 ;,對各成員都要進(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;,方法二:在定義類型的同時定義變量,如:,struct student int num; char name20; char sex; int age; char addr30; student1, student2;,一般形式是: struct 結(jié)構(gòu)體名 成員表列 變量名表列;,方法三:直接定義結(jié)構(gòu)類型變量。,其一般形式是: struct 成員表列 變量名表列;,此時,不出現(xiàn)結(jié)構(gòu)體名,可用符號常量代表一個結(jié)構(gòu)體類型,如:,#define STUDENT struct student STUDENT int nu

4、m; char name20; char sex; int age; char addr30; ;,這樣,可直接用STUDENT 定義變量,如: STUDENT student1, student2; 此時,不必再寫關(guān)鍵字struct,幾點說明:,1. 類型與變量是不同概念,不要混淆; 2. 結(jié)構(gòu)體中的成員,可以單獨使用,其作用與地位相當(dāng)于普通變量; 3. 成員也可以是一個結(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. 成員名可以與程序中的變量名相同,二者不代表同一對象。,10.1.3 結(jié)構(gòu)體變量的引用,規(guī)則: 1. 不能將一個結(jié)構(gòu)體變量作為一個整體進(jìn)行賦值和輸出;只能對其各個成員分別輸出(引用形式為:結(jié)構(gòu)體變量名.成員名)。 printf(,student1); printf( %d, student1.num); 輸出 10010,錯!,正確!,2 .若成員本身又屬一個結(jié)構(gòu)體類型,只能對最低級的成員進(jìn)行賦值或存取以及運算。 如:student1.birthday.year,(接上片),3. 對成員變量可以象普通變量一樣進(jìn)行各種運算,如: su

6、mage=student1.age+student2.age; 4. 可以引用成員的地址,也可以引用結(jié)構(gòu)體變量的地址,如 scanf(%d,錯!,輸入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、); ,運行結(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)的一個成員; 用結(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個元素都具有 結(jié)構(gòu)數(shù)據(jù)類型,結(jié)構(gòu)體數(shù)組是一個數(shù)組,數(shù)組中的每一個元素都是結(jié)構(gòu)類型。 說明結(jié)構(gòu)數(shù)組的方法:先定義一個結(jié)構(gòu),再用結(jié)構(gòu)類型說明一個數(shù)組變量。,例:為記錄100個人的基本情況

8、,說明一個有100個元素的數(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個元素的結(jié)構(gòu)數(shù)組,數(shù)組的每個元素為 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ù)組中的具體元素,必須遵守數(shù)組使用的規(guī)定按下標(biāo)進(jìn)行訪問。,要訪問結(jié)構(gòu)體數(shù)組中某個具體元素下的成員,又要遵守有關(guān)訪問結(jié)構(gòu)成員的規(guī)定,使用“.”訪問運算符和成員名,例:為記錄100個人的基本情況,說明一個有100個元素的數(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 號元素賦值為: 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ù)組成員中的一個字符賦值*/,為數(shù)組中一個元素的一個成員賦值,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ù)之間傳遞整個結(jié)構(gòu); 向函數(shù)傳遞結(jié)構(gòu)的地址(指針)。,向函數(shù)中傳遞結(jié)構(gòu)的成員,在函數(shù)中傳遞結(jié)構(gòu)成員的方法與傳遞簡單變量的方法相同: 在函數(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)變量求解兩個復(fù)數(shù)之積。 (3+4i)(5+6i),將

14、結(jié)構(gòu)作為整體,在函數(shù)之間傳遞: 將結(jié)構(gòu)變量作為形參; 函數(shù)的返回值也可為一個結(jié)構(gòu)類型。,在函數(shù)之間傳遞整個結(jié)構(gòu),例:利用結(jié)構(gòu)變量求解兩個復(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 共用體的概念 共用體:使幾個不同的變量共享同一段內(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ù)據(jù)放在地址1000處開始的內(nèi)存中*/,共用體中各個成員不能同時存在,使用時共

17、用體變量只有一個成員在內(nèi)存中。,注意:共用體類型變量與結(jié)構(gòu)體類型變量的區(qū)別:,結(jié)構(gòu)體類型變量所占內(nèi)存長度是各成員占的內(nèi)存長度之和。 共用體類型變量所占內(nèi)存長度等于最長的成員的長度。 成員分量之間是相互聯(lián)系的,所進(jìn)行的操作相互依賴。,10.4.3 共用體類型數(shù)據(jù)的特點,1.每一瞬時只有一個成員起作用 ; 2. 共用體變量中起作用的成員是最后一次存放的成員; 3.共用體變量的地址和它的各成員的地址都是同一地址; 4.不能對共用體變量名賦值,也不能企圖引用變量名來得到成員的值,又不能在定義共用體變量時對它初始化。 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ù)據(jù)類型。,例: typedef int INTEGER; typedef float REAL; 在具有上述typedef語句的程序中,下列語句是等價的: int i,j; float pai; 等價于 INTEGER

19、 i, j; REAL pai;,10.6.2 typedef語句的一般形式,typedef 已定義的類型 新的類型,例: typedef struct int data; struct *link; JD 定義了一個新的結(jié)構(gòu)體類型JD,它代表一個結(jié)構(gòu)體,可以使用JD來定義變量: JD *s; 定義指向結(jié)點類型的指針s,折半查找(二分法查找) 思想:先確定待查找記錄所在的范圍,然后逐步縮小范圍,直到找到或確認(rèn)找不到該記錄為止。 前提:必須在具有順序存儲結(jié)構(gòu)的有序表中進(jìn)行。,分三種情況: 1)若中間項的值等于x,則說明已查到。 2)若x小于中間項的值,則在線性表的前半部分查找; 3)若x大于中間

20、項的值,則在線性表的后半部分查找。 特點:比順序查找方法效率高。,查找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等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論