版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、共 50 頁 第 1 頁第十章C語言程序設(shè)計結(jié)構(gòu)體與共用體共 50 頁 第 2 頁本章要點 掌握結(jié)構(gòu)類型數(shù)據(jù)的定義和引用; 了解共用體類型數(shù)據(jù)的定義和引用。共 50 頁 第 3 頁10.1 結(jié)構(gòu)體類型 如果將這些屬性分別定義為互相獨立的簡單變量,則難以反映相互間的內(nèi)在聯(lián)系(同一個學(xué)生的屬性) 可采用結(jié)構(gòu)體數(shù)據(jù)結(jié)構(gòu)描述上述信息,將不同類型的數(shù)據(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)的組成進行描述,稱為結(jié)構(gòu)的定義。結(jié)構(gòu)
2、定義說明了該結(jié)構(gòu)的組成成員,以及每個成員的類型。共 50 頁 第 4 頁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)體類型名 成員表列 ;對各成員都要進行類型說明;成員名定名規(guī)則與變量名同。共 50 頁 第 5 頁10.1.2 結(jié)構(gòu)體變量的定義方法一:先定義結(jié)構(gòu)體類型再定義變量名struct student int num; char name20; char sex; int age; char addr30;;st
3、ruct student student1, student2;定義studet1和sudent2為struct student類型變量不能只指定一個變量為“struct型”而不指定結(jié)構(gòu)體名共 50 頁 第 6 頁方法二:在定義類型的同時定義變量,如:struct student int num; char name20; char sex; int age; char addr30;student1, student2;一般形式:struct 結(jié)構(gòu)體名 成員表列 變量名表列;共 50 頁 第 7 頁方法三:直接定義結(jié)構(gòu)類型變量。其一般形式是:struct 成員表列 變量名表列;此時,不出現(xiàn)結(jié)
4、構(gòu)體名共 50 頁 第 8 頁幾點說明:1. 類型與變量是不同概念,不要混淆;2. 結(jié)構(gòu)體中的成員,可以單獨使用,其作用與地位相當(dāng)于普通變量;3. 結(jié)構(gòu)體成員也可以是一個結(jié)構(gòu)體變量;形成結(jié)構(gòu)類型嵌套。struct date int month; int day; int year; ;struct student int num; char name20; int age; struct date birthday;student1,student2;4. 成員名可以與程序中的變量名相同,二者不代表同一對象。5. C只對變量分配單元,不對類型分配存儲單元。共 50 頁 第 9 頁可用符號常量代
5、表一個結(jié)構(gòu)體類型,如:#define STUDENT struct studentSTUDENT int num; char name20; char sex; int age; char addr30;這樣,可直接用STUDENT定義變量,如:STUDENT student1, student2;此時,不必再寫關(guān)鍵字struct共 50 頁 第 10 頁10.1.3 結(jié)構(gòu)體變量的引用規(guī)則:不能將一個結(jié)構(gòu)體變量作為一個整體進行賦值和輸出;只能對其各個成員分別輸出 引用形式為:結(jié)構(gòu)體變量名.成員名printf(“”,student1);printf(“ %d”, student1.num); 輸
6、出 10010錯!正確!2 . 若成員本身又屬于一個結(jié)構(gòu)體類型,只能對最低級的成員進行賦值、存取以及運算。 如:student1.birthday.year共 50 頁 第 11 頁(接上)3. 對成員變量可以象普通變量一樣進行各種運算,如: sumage=student1.age+student2.age;4. 可以引用成員的地址,也可以引用結(jié)構(gòu)體變量的地址,如 scanf(“%d”,&student1.num); printf(“%o”,&student1); scanf(“%d,%s,%c,%d,%s”,&student1);錯!輸入student1.num的值輸出student1的首地
7、址共 50 頁 第 12 頁 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);運行結(jié)果為:No.:9801name:Wang hongsex:Waddress:2 Linggong Road共 50 頁 第 13 頁10.2 結(jié)構(gòu)體數(shù)組 在結(jié)構(gòu)體中使用
8、數(shù)組類型作為結(jié)構(gòu)的一個成員; 用結(jié)構(gòu)體類型作為數(shù)組元素的基類型構(gòu)成數(shù)組。結(jié)構(gòu)與數(shù)組的關(guān)系例:struct student int xh; char xm14; char xb; float sx; xscj96;96個元素都具有結(jié)構(gòu)數(shù)據(jù)類型共 50 頁 第 14 頁結(jié)構(gòu)體數(shù)組是一個數(shù)組,數(shù)組中的每一個元素都是結(jié)構(gòu)類型。說明結(jié)構(gòu)數(shù)組的方法:先定義一個結(jié)構(gòu),再用結(jié)構(gòu)類型說明一個數(shù)組變量。例:為記錄100個人的基本情況,說明一個有100個元素的數(shù)組。數(shù)組的基類型為結(jié)構(gòu). struct person char name 30; char sex; struct date birthday man100
9、;man就是有100個元素的結(jié)構(gòu)數(shù)組,數(shù)組的每個元素為 person 型。10.2.1結(jié)構(gòu)體數(shù)組的定義共 50 頁 第 15 頁例如:struct student int num; char name20; char sex; int age; char addr30; struct student stu3;struct student int num; stu3;或struct int num; stu3;一般形式:struct 結(jié)構(gòu)體類型名 元素個數(shù) ;struct 結(jié)構(gòu)體類型名 結(jié)構(gòu)體數(shù)組名;共 50 頁 第 16 頁10.2.2 結(jié)構(gòu)體數(shù)組的引用訪問結(jié)構(gòu)體數(shù)組中的具體元素,必須遵守數(shù)
10、組使用的規(guī)定按下標(biāo)進行訪問。要訪問結(jié)構(gòu)體數(shù)組中某個具體元素下的成員,又要遵守有關(guān)訪問結(jié)構(gòu)成員的規(guī)定 使用“.”訪問運算符和成員名共 50 頁 第 17 頁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,使用下列語句:為數(shù)組中一個元素的一個成員賦值共 50 頁 第 18 頁結(jié)構(gòu)數(shù)組存放在連續(xù)的內(nèi)存區(qū)域中,所占內(nèi)存大小為結(jié)構(gòu)類型
11、的大小乘以數(shù)組元素的數(shù)量。(以標(biāo)準C為例)struct person man100: sizeof(struct person) *100 字節(jié),TC系統(tǒng)=370字節(jié)301222301222301222.nsymdnsymdnsymdman0man1man99 將“Fangjin”改為“Fangjun”: 5 = u;/*為數(shù)組中元素的數(shù)組成員中的一個字符賦值*/共 50 頁 第 19 頁10.2.3 結(jié)構(gòu)體數(shù)組的初始化struct student int num; char name20; char sex; int age; char addr30; stu3=111,”
12、Li”,M,18,”Dalian”,;也可采用:struct student int num; ; struct student stu=,;結(jié)構(gòu)體數(shù)組的初始化的一般形式是在定義數(shù)組后面加上:=初值表列;共 50 頁 第 20 頁例10-1: 編寫一個30名學(xué)生信息狀況的示意性檢索程序,每名學(xué)生的信息包括:xh(學(xué)號)、xb(性別)、cj(成績)、xm(姓名)。要求:(1)輸入30名學(xué)生信息;(2)輸出男同學(xué)中成績大于90的學(xué)生的xm、xb、cj。 共 50 頁 第 21 頁#include struct student int xh; char xb; int cj; char xm20;
13、;main() struct student stu30; int i; for(i=0;i30;i+) scanf(%d%c%d,&stui.xh,&stui.xb,&stui.cj); gets(stui.xm); for(i=0;i=90) printf(%s,%c,%dn,stui.xm,stui.xb,stui.cj);共 50 頁 第 22 頁例10-2:設(shè)有三個候選人,每次輸入一個得票的候選人的名字,要求最后輸出各人得票結(jié)果。#include “stdio.h”#include “string.h”struct person char name10; int count;lead
14、er3=“Li”,0,”zhang”,0,”Liu”,0;main( ) int i, j; char leader_name10; for( i=1;i=100;i+) scanf(“%s”,leader_name); for(j=0;j3;j+) if(strcmp(leader_name,)=0) leaderj.count+; for(i=0;i”進行操作。結(jié)構(gòu)指針-成員名“-”運算符優(yōu)先級最高(15級),從左至右結(jié)合。 如: p-成員名分析以下運算:p-n 得到p指向的結(jié)構(gòu)體變量中的成員n的值p-n+ 得到p指向的結(jié)構(gòu)體變量中的成員n的值用完后使它加1; 相當(dāng)
15、于:(p-n)+ +p-n 得到p指向的結(jié)構(gòu)體變量中的成員n的值 使其先加1;相當(dāng)于:+(p-n) 常用方法共 50 頁 第 25 頁例如:main( )struct studentlong int num; char name20; char sex;struct student stu_1;struct student *p;p=&stu_1;stu.num=9901;strcpy(stu_1.name,”Li Min”);stu_1.sex=W;printf(“No.:%ldnname%snsex:%cn”,stu_1.num,stu_1.name,stu_1.sex);printf(“
16、nNo.:%ldnname%snsex:%cn”,(*p).num,(*p).name,(*p).sex);共 50 頁 第 26 頁閱讀程序:main() struct student int num; int age; ; struct student stu3=1000,20,2000,19,3000,23; struct student *p; p=stu; printf(“%dn”,p-num+); printf(“%dn”,+p-num); printf(“%dn”,(*p+).num); printf(“%dn”,(*+p).num);輸出結(jié)果:共 50 頁 第 27 頁例: p
17、rintf(%d, man1.birthday.year); 傳遞結(jié)構(gòu)成員的值 scanf(%d, &man1.birthday.year); 傳遞結(jié)構(gòu)成員的地址 gets ( ); 傳遞結(jié)構(gòu)成員的地址10.4 結(jié)構(gòu)體類型數(shù)據(jù)在函數(shù)間的傳遞 結(jié)構(gòu)體與函數(shù)的關(guān)系 向函數(shù)中傳遞結(jié)構(gòu)的成員;在函數(shù)之間傳遞整個結(jié)構(gòu);將結(jié)構(gòu)作為整體,在函數(shù)之間傳遞;向函數(shù)傳遞結(jié)構(gòu)的地址(指針)。在函數(shù)中傳遞結(jié)構(gòu)成員的方法與傳遞簡單變量的方法相同:在函數(shù)之間傳遞成員的值;在函數(shù)之間傳遞成員的地址。共 50 頁 第 28 頁#include “stdio.h”struct student int num
18、; char name20; float score3;stu=20701,”lili”,67.5,88,79.6; void print(struct student p) printf(“%d %s %5.1f %5.1f %5.1fn”, p.num,,p.score0, p.score1,p.score2); main() print(stu);例:用結(jié)構(gòu)體變量作參數(shù)。共 50 頁 第 29 頁#include “stdio.h”struct student int num; char name20; float score3;stu=20701,”lili”,67.5,8
19、8,79.6; void print(struct student *p) printf(“%d %s %5.1f %5.1f %5.1fn”,p-num,p-name,p-score0,p-score1,p-score2); main() print (&stu); 例:用指向結(jié)構(gòu)體變量的指針作參數(shù)。共 50 頁 第 30 頁 10.4 共用體10.4.1 共用體的概念共用體:使幾個不同的變量占用同一段內(nèi)存的結(jié)構(gòu),稱為“共用體”類型的結(jié)構(gòu)?!肮灿皿w”類型變量的定義形式為:union 共用體名 成員表列 變量表列;例如:union dataint i; char ch; float f;a,b
20、,c;或union dataint i;char ch;float f;union data a,b,c;或union int i;char ch;float f; a,b,c;直接定義先定義類型共 50 頁 第 31 頁注意:共用體類型變量與結(jié)構(gòu)體類型變量的區(qū)別:結(jié)構(gòu)體類型變量所占內(nèi)存長度是各成員占的內(nèi)存長度之和。共用體類型變量所占內(nèi)存長度等于最長的成員的長度。成員分量之間是相互聯(lián)系的,所進行的操作相互依賴。共 50 頁 第 32 頁10.4.2 共用體變量的引用方式注意:只能引用共用體變量中的成員,不能引用共用體變量本身。如:可以引用 a .i(引用共用體變量中的整型變量i) a .ch(
21、引用共用體變量中的字符變量ch) a .f(引用共用體變量中的實型變量f)不能只引用共用體變量,如: printf(“%d”,a);錯!共 50 頁 第 33 頁閱讀程序 #include union pp short int i; char ch2; a; main() a.ch0=1; a.ch1=3; printf(“%dn”,a.i); printf(“%on”,a.i); a的內(nèi)存存儲情況如下:a.ia.ch1a.ch00 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1輸出結(jié)果:769 1401低字段高字段(1401)8共 50 頁 第 34 頁10.4.3 共用體類型數(shù)
22、據(jù)的特點1.每一瞬時只有一個成員起作用 ;2.共用體變量中起作用的成員是最后一次存放的成員;3.共用體變量的地址和它的各成員的地址都是同一地址;4.不能對共用體變量名賦值,也不能通過引用變量名來得到成員的值,不能在定義共用體變量時對它初始化。5.不能把共用體變量作為函數(shù)參數(shù),也不能使函數(shù)帶回共用體變量,但可使用指向共用體變量的指針;6.共用體類型可以出現(xiàn)在結(jié)構(gòu)體類型定義中,也可以定義共用體數(shù)組。而結(jié)構(gòu)體也可以出現(xiàn)在共用體類型定義中,數(shù)組也可以作為共用體的成員。共 50 頁 第 35 頁 10.5 枚舉類型若一個變量只有幾種可能的值,可以定義為枚舉類型。所謂“枚舉”是指將變量的值一一列舉出來,變
23、量的值只限于列舉出來的值的范圍內(nèi)。定義方法:先定義枚舉類型 enum weekday sun, mon, tue, wed, thu, fri, sat;再用此類型定義變量,如:enum weekday workday, week_end;或直接定義枚舉變量。如:enum weekday sun, mon, tue, wed, thu, fri, sat workday,week_end;共 50 頁 第 36 頁說明:枚舉元素為常量,不是變量,故不能對它們賦值枚舉常量有值。如上面定義中,sun 、 mon 、 tue sat的值依次為0、1、27也可改變枚舉元素的值,在定義時指出,如: en
24、um weekdaysun=7,mon=1,tue,wed,thu,fri,sat;枚舉值可用來作判斷比較,如: if(workday=mon) if(workdaysun)一個整數(shù)不能直接賦值給一個枚舉變量,應(yīng)先進行強制類型轉(zhuǎn)換才能賦值,如: workday=(enum weekday)2; (相當(dāng)于將序號為2的枚舉元素值賦給workday , 即:workday=tue;共 50 頁 第 37 頁10.6 用typedef定義數(shù)據(jù)類型10.6.1 自定義類型 標(biāo)準類型(如int、char、long、double等)系統(tǒng)已經(jīng)定義好的類型,用戶可以直接使用,無須再進行定義。 用戶自定義類型:用
25、戶根據(jù)自己的實際要求,將已有的類型重新命名為一個新的簡單類型。除結(jié)構(gòu)和聯(lián)合等類型之外,還可以用類型說明語句typedef定義新的類型來代替已有的類型。共 50 頁 第 38 頁例 typedef int INTEGER; typedef float REAL;在具有上述typedef語句的程序中,下列語句是等價的: int i,j; float pai; 等價于 INTEGER i, j; REAL pai; 10.6.2 typedef語句的一般形式typedef 已定義的類型 新的類型共 50 頁 第 39 頁例 typedef struct node int data; struct *
26、link; JD定義了一個新的結(jié)構(gòu)體類型JD,它代表結(jié)構(gòu)體struct node .以后可以使用JD來定義變量: JD *s; 定義指向結(jié)點類型的指針s共 50 頁 第 40 頁綜合練習(xí):折半查找(二分法查找)思想:先確定待查找記錄所在的范圍,然后逐步縮小范圍,直到找到或確認找不到該記錄為止。前提:必須在具有順序存儲結(jié)構(gòu)的有序表中進行。分三種情況:1)若中間項的值等于x,則說明已查到。2)若x小于中間項的值,則在線性表的前半部分查找;3)若x大于中間項的值,則在線性表的后半部分查找。特點:比順序查找方法效率高。共 50 頁 第 41 頁查找23的過程如下圖:mid=(low+high)/2(
27、8, 14, 23, 37, 46, 55, 68, 79, 91 )( 8, 14, 23, 37, 46, 55, 68, 79, 91 )lowhighmid( 8, 14, 23, 37, 46, 55, 68, 79, 91 )lowhigh=mid-1mid( 8, 14, 23, 37, 46, 55, 68, 79, 91 )low=mid+1highmid共 50 頁 第 42 頁typedef struct int num; char name10; float score;Student;main() int j,num; Student s4=10,Li,98,40,W
28、ang,88,55,Zhang,89,60,Lin,95; scanf(%d,&num); j=search(s,num,4); if(j!=-1)printf(Name=%s,Score=%f,,sj.score); else printf(No Number);int search(Student s,int key, int n)/*折半查找*/ int low,high,mid; low=1;high=n; while(low=high) mid=(low+high)/2; if(smid-1.num=key) return (mid-1); else if(keynum
29、1,&p1-score); head=NULL; while(p1-num!=0) n=n+1; if(n=1) head=p1; else p2-link=p1; p2=p1; p1=(stu *)malloc(sizeof(stu); scanf(%d,%f,&p1-num,&p1-score); p2-link=NULL; return(head); 共 50 頁 第 47 頁 遍歷就是逐一的訪問鏈表中的每個結(jié)點。設(shè)線性鏈表頭指針為h,設(shè)指針變量p指向不同的結(jié)點。沿著鏈頭開始向后查找結(jié)點中學(xué)號為x的結(jié)點,若找到,則返回該結(jié)點在鏈表中的位置,否則返回空地址。NODE *lbcz (NODE *L, int x) NODE *p; p=L-link ; /* p先指向第
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度高端辦公室文件消毒及深度保養(yǎng)合同
- 租賃期間房屋買賣合同
- 公司之間的借款協(xié)議
- 出租車停運損失上訴狀
- 電器代理合同協(xié)議
- 財務(wù)管理系統(tǒng)操作與應(yīng)用手冊指南
- 農(nóng)業(yè)科技行業(yè)現(xiàn)代農(nóng)業(yè)技術(shù)推廣與應(yīng)用策略
- 廣告招牌安裝合同年
- 辦公室租賃合同書
- 安全事故賠償協(xié)議書
- 新教科版三年級下冊科學(xué) 第二單元重點題型練習(xí)課件
- 靜脈中等長度導(dǎo)管臨床應(yīng)用專家共識-
- 中小學(xué)教師教育法律法規(guī)培訓(xùn)PPT頁
- 事故隱患報告和舉報獎勵制度
- 陶行知教育名篇讀書分享ppt
- 學(xué)前兒童數(shù)學(xué)教育高職全套完整教學(xué)課件
- 高考百日誓師教師誓詞
- 2023年河南省開封市中考一模數(shù)學(xué)試題
- 幼兒園中班配班下學(xué)期工作計劃述職匯報PPT模板9下載
- 建筑施工人員安全教育培訓(xùn)考試試卷及答案
- 部編人教版道德與法治六年級下冊全冊課時練習(xí)講解課件
評論
0/150
提交評論