C程序設(shè)計英文課件:CHAPTE 6 Structures_第1頁
C程序設(shè)計英文課件:CHAPTE 6 Structures_第2頁
C程序設(shè)計英文課件:CHAPTE 6 Structures_第3頁
C程序設(shè)計英文課件:CHAPTE 6 Structures_第4頁
C程序設(shè)計英文課件:CHAPTE 6 Structures_第5頁
已閱讀5頁,還剩59頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、CHAPTE 66.1 Basics of Structures6.2 Structures and Functions6.3 Arrays of Structures6.4 Pointers to Structures6.5 Self-referential Structures6.6 Table Lookup6.7 Typedef6.8 Unions6.9 Bits-fieldsemployeenameaddressbirthdaycard number6.1 Basic of Structures概述結(jié)構(gòu)體是一種構(gòu)造數(shù)據(jù)類型用途:把不同類型的數(shù)據(jù)組合成一個整體-自定義數(shù)據(jù)類型結(jié)構(gòu)體類型聲

2、明struct 結(jié)構(gòu)體名 類型標識符 成員名; 類型標識符 成員名; .;成員類型可以是基本型或構(gòu)造型struct是關(guān)鍵字,不能省略合法標識符可省:無名結(jié)構(gòu)體6.1 Basic of structures例 struct student int num; char name20; char sex; int age; float score; char addr30; ; namenumsexagescoreaddr2字節(jié)2字節(jié)20字節(jié)1字節(jié)4字節(jié)30字節(jié).結(jié)構(gòu)體類型聲明描述結(jié)構(gòu)的組織形式,不分配內(nèi)存6.1 Basic of structures例 struct student int num

3、; char name20; char sex; int age; float score; char addr30; ; struct student stu1,stu2;定義結(jié)構(gòu)體類型變量的方法先聲明結(jié)構(gòu)體類型,再定義變量名一般形式: struct 結(jié)構(gòu)體名 類型標識符 成員名; 類型標識符 成員名; .;struct 結(jié)構(gòu)體名 變量名表列;例 #define STUDENT struct student STUDENT int num; char name20; char sex; int age; float score; char addr30; ; STUDENT stu1,stu

4、2; 聲明結(jié)構(gòu)體類型的同時定義結(jié)構(gòu)體變量一般形式:struct 結(jié)構(gòu)體名 類型標識符 成員名; 類型標識符 成員名; .變量名表列;例 struct student int num; char name20; char sex; int age; float score; char addr30; stu1,stu2; 直接定義結(jié)構(gòu)體變量一般形式:struct 類型標識符 成員名; 類型標識符 成員名; .變量名表列;例 struct int num; char name20; char sex; int age; float score; char addr30; stu1,stu2; 用無

5、名結(jié)構(gòu)體直接定義變量,只能一次例 struct date int month; int day; int year; ; struct student int num; char name20; struct date birthday; stu;numnamebirthdaymonthdayyear例 struct student int num; char name20; struct date int month; int day; int year; birthday; stu;numnamebirthdaymonthdayyear說明結(jié)構(gòu)體類型與結(jié)構(gòu)體變量概念不同類型: 不分配內(nèi)存;

6、 變量: 分配內(nèi)存類型: 不能賦值、存取、運算; 變量: 可以對結(jié)構(gòu)體中的成員可以單獨使用,它的作用與地位相當(dāng)于普通變量。結(jié)構(gòu)體中成員名與程序中變量名可相同,不會混淆結(jié)構(gòu)體可嵌套,即成員也可以是一個結(jié)構(gòu)體變量結(jié)構(gòu)體變量的引用引用規(guī)則 結(jié)構(gòu)體變量不能整體引用, 只能引用變量成員可以將一個結(jié)構(gòu)體變量賦值給另一個結(jié)構(gòu)體變量結(jié)構(gòu)體嵌套時逐級引用成員(分量)運算符優(yōu)先級: 1結(jié)合性:從左向右引用方式: 結(jié)構(gòu)體變量名. 成員名例 struct student int num; char name20; char sex; int age; float score; char addr30; stu1,st

7、u2; stu1.num=10;stu1.score=85.5;stu1.score+=stu2.score; stu1.age+;例 struct student int num; char name20; struct date int month; int day; int year; birthday; stu1,stu2;numnamebirthdaymonthdayyearstu1.birthday.month=12;例 struct student int num; char name20; char sex; int age; float score; char addr30;

8、 stu1,stu2; if(stu1=stu2). ()例 struct student int num; char name20; char sex; int age; float score; char addr30; stu1,stu2; stu2=stu1; ( )結(jié)構(gòu)體變量的初始化形式一:struct 結(jié)構(gòu)體名 類型標識符 成員名; 類型標識符 成員名; .;struct 結(jié)構(gòu)體名 結(jié)構(gòu)體變量=初始數(shù)據(jù);例:struct student int num; char name20; char sex; int age; char addr30; struct student stu1

9、=112,“Wang Lin”,M,19, “200 Beijing Road”;形式二:struct 結(jié)構(gòu)體名 類型標識符 成員名; 類型標識符 成員名; .結(jié)構(gòu)體變量=初始數(shù)據(jù);例 struct student int num; char name20; char sex; int age; char addr30; stu1=112,“Wang Lin”,M,19, “200 Beijing Road”; 形式三:struct 類型標識符 成員名; 類型標識符 成員名; .結(jié)構(gòu)體變量=初始數(shù)據(jù);例 struct int num; char name20; char sex; int ag

10、e; char addr30; stu1=112,“Wang Lin”,M,19, “200 Beijing Road”; 結(jié)構(gòu)體數(shù)組定義結(jié)構(gòu)體數(shù)組三種形式:形式一: struct student int num; char name20; char sex; int age;struct student stu2;形式二: struct student int num; char name20; char sex; int age; stu2;形式三: struct int num; char name20; char sex; int age; stu2;numnamesexagenumn

11、amesexagestu0stu125B分行初始化: struct student int num; char name20; char sex; int age; ; struct student stu =100,“Wang Lin”,M,20, 101,“Li Gang”,M,19, 110,“Liu Yan”,F,19; 全部初始化時維數(shù)可省結(jié)構(gòu)體數(shù)組初始化例 struct int num; char name20; char sex; int age; stu =,;例 struct student int num; char name20; char sex; int age; s

12、tu =,;結(jié)構(gòu)體數(shù)組應(yīng)用舉例引用方式: 結(jié)構(gòu)體數(shù)組名下標. 成員名 struct student int num; char name20; char sex; int age; str3;stu1.age+;strcpy(,”ZhaoDa”);例 對侯選人選票的統(tǒng)計程序#include #include struct person char name20; int count;leader3=Li,0,Zhang,0, Wang,0; main() int i,j; char leader_name20; for(i=1;i=10;i+) scanf(%s,leader_

13、name); for(j=0;j3;j+)if(strcmp(leader_name,)=0) leaderj.count+; for(i=0;i3;i+) printf(%5s:%dn,,leaderi.count);namecountLiZhangWang000Example :建立同學(xué)錄#includestdio.h#define NUM 3main() struct mem char name20; char phone11; ; struct mem manNUM; int i; for(i=0;i成員名 互相等價 結(jié)構(gòu)體變量名. 成員

14、名指向運算符優(yōu)先級: 1結(jié)合方向:從左向右#include #include main() struct student long int num; char name20; char sex; float score; stu_1,*p; p=&stu_1; stu_1.num=89101; strcpy(stu_1.name,Li Lin); p-sex=M; p-score=89.5; printf(nNo:%ldnname:%snsex:%cnscore:%fn, (*p).num,p-name,stu_1.sex,p-score);指向結(jié)構(gòu)體數(shù)組的指針例 指向結(jié)構(gòu)體數(shù)組的指針#inc

15、lude /*c10_3.c*/struct student int num; char name20; char sex; int age;stu3=10101,Li Lin,M,18, 10102,Zhang Fun,M,19, 10104,Wang Min,F,20;main() struct student *p; for(p=stu;pnum, p-name,p-sex,p-age);pnumnamesexagestu0stu1stu2pp6.3 Structures and Functions用結(jié)構(gòu)體變量和指向結(jié)構(gòu)體的指針作函數(shù)參數(shù)用結(jié)構(gòu)體變量的成員作參數(shù)-值傳遞用指向結(jié)構(gòu)體變量或

16、數(shù)組的指針作參數(shù)-地址傳遞用結(jié)構(gòu)體變量作參數(shù)-多值傳遞,效率低#include /*c10_4.c*/struct data int a, b, c; ;main() void func(struct data); struct data arg; arg.a=27; arg.b=3; arg.c=arg.a+arg.b; printf(arg.a=%d arg.b=%d arg.c=%dn,arg.a,arg.b,arg.c); printf(Call Func().n); func(arg); printf(arg.a=%d arg.b=%d arg.c=%dn,arg.a,arg.b,a

17、rg.c);void func(struct data parm) printf(parm.a=%d parm.b=%d parm.c=%dn,parm.a,parm.b,parm.c); printf(Process.n); parm.a=18; parm.b=5; parm.c=parm.a*parm.b; printf(parm.a=%d parm.b=%d parm.c=%dn,parm.a,parm.b,parm.c); printf(Return.n);例 用結(jié)構(gòu)體變量作函數(shù)參數(shù)copyarga :27b: 3c :30(main)arga :27b: 3c :30(main)(f

18、unc)parma :27b: 3c :30arga :27b: 3c :30(main)arga :27b: 3c :30(main)(func)parma :18b: 5c :90#include /*c10_5.c*/struct data int a, b, c; ;main() void func(struct data *parm); struct data arg; arg.a=27; arg.b=3; arg.c=arg.a+arg.b; printf(arg.a=%d arg.b=%d arg.c=%dn,arg.a,arg.b,arg.c); printf(Call Fun

19、c().n); func(&arg); printf(arg.a=%d arg.b=%d arg.c=%dn,arg.a,arg.b,arg.c);void func(struct data *parm) printf(parm-a=%d parm-b=%d parm-c=%dn,parm-a,parm-b,parm-c); printf(Process.n); parm-a=18; parm-b=5; parm-c=parm-a*parm-b; printf(parm-a=%d parm-b=%d parm-c=%dn,parm-a,parm-b,parm-c); printf(Return

20、.n);例 用結(jié)構(gòu)體指針變量作函數(shù)參數(shù)arg(main)a :27b: 3c :30(func)parm*a :18b: 5c :90Example:Somebody fishes for three days and then sleeps for two days since 1/1/2000,could you tell us he would fish or sleep in someday?struct date int year; int month; int day; ;int days(struct date day) static int day_tab213= 0,31,2

21、8,31,30,31,30,31,31,30,31,30,31 0,31,28,31,30,31,30,31,31,30,31,30,31;int i,lp;lp=day.year%4=0&day.year%100!=0|day.year%400=0;for(i=1;iday.month; i+) day.day+=day_tablpi;Return(day.day); main() struct date today,term; int yd,year,day; scanf(“%d%d%d”,&today.year,&today.month,&today.day); term.month=1

22、2; term.day=31;for(yd=0,year=2000;year0&daynum,p-score); p=p-next; while(p!=null);6.5 Self-referential Structures6.6 Table LookupStructure of Table Lookup nodestruct student int num;float score;struct student *next;#define LEN sizeof(struct student);6.6 Table Lookup#include void *malloc(size) 在內(nèi)存的動態(tài)

23、存儲區(qū)域中分配一個長度為size的連續(xù)空間。返回值為該區(qū)域的起始地址,如果沒有成功執(zhí)行,則返回0#include void *calloc(n,size)在內(nèi)存的動態(tài)存儲區(qū)域中分配n個長度為size的連續(xù)空間。返回值為該區(qū)域的起始地址,如果沒有成功執(zhí)行,則返回0#include void free(*ptr) 釋放由ptr指向的內(nèi)存區(qū)域6.6 Table Lookup建立鏈表:從無到有的建立一個鏈表,輸入各個節(jié)點的數(shù)據(jù),并建立起前后鏈表的關(guān)系。默認:學(xué)號從小到大排列。 學(xué)生的學(xué)號不為零,因此當(dāng)出現(xiàn)0學(xué)號時視為鏈表結(jié)束6.6 Table Lookup1、設(shè)head、p1、p2三個student類

24、型的指針2、創(chuàng)建一個新的節(jié)點空間,p1、p2均指向該節(jié)點3、讀入數(shù)據(jù)給p1所指向的節(jié)點4、如果p1-num不為零,而且輸入的是第一個節(jié)點的時候, 令head=p1;5、再創(chuàng)建新的節(jié)點,使p1指向它,并輸入數(shù)據(jù)6、如果p1-num!=0則將p1賦給p2-next。7、接著使得p2=p1;既p2指向剛建立的節(jié)點8、對于新的節(jié)點重復(fù)5-8的過程9、如果新輸入的節(jié)點num=0,則不再循環(huán),此節(jié)點不聯(lián)入鏈 表,并p2-next=NULL,表示鏈表結(jié)束。6.6 Table Lookup6.6 Table Lookup#include #include #define NULL 0#define LEN s

25、izeof(struct student)struct student long num; float score; struct student *next;int n;main() struct student *head; head=creat();struct student *creat(void) struct student *head; struct student *p1,*p2; n=0; head=NULL; p1=p2=(struct student*)malloc(LEN); scanf(%ld,%f,&p1-num,&p1-score); while(p1-num!

26、=0) n=n+1; if(n=1) head=p1; else p2-next=p1; p2=p1; p1=(struct student*)malloc(LEN); scanf(%ld,%f,&p1-num,&p1-score); p2-next=NULL; return(head);強制類型轉(zhuǎn)換p2p1刪除節(jié)點6.6 Table Lookup struct student *del(struct student *head, long num) struct student *p1,*p2; if(head=NULL) printf(“n list null!n”); return (h

27、ead); p1=head; while(num!=p1-num&p1-next!=NULL)p2=p1;p1=p1-next; /*搜索節(jié)點*/ if(num=p1-num) /*找到節(jié)點*/ if (p1=head) head=p1-next; else p2-next=p1-next; printf(“delete: %ldn”,num); n-; else printf(“%ld not been found!n”,num); return(head);/*如果p1指向頭節(jié)點,則把第二個節(jié)點賦給head; 否則將下一個節(jié)點的地址賦給前一個節(jié)點。*/6.6 Table LookupP2P

28、1P2P0P0P1添加節(jié)點6.6 Table Lookup struct student *insert(struct student *head, struct student *stud) struct student *p0, *p1,*p2; p1=head; p0=stud; if(head=NULL) head=p0; p0-next=NULL; /*原來是空表*/ else while(p0-nump1-num)&(p1-next!=NULL) p2=p1; p1=p1-next; /*搜索位置*/ if(p0-numnum) if(head=p1) head=p0; /*插入到

29、原頭節(jié)點之前*/ else p2-next=p0; p0-next=p1; /*插入p2節(jié)點之后*/ else p1-next=p0;p0-next=NULL; /*插入到最后節(jié)點的后面*/ n+; return(head);6.6 Table Lookup1)有5個學(xué)生,建立一個鏈表,每個結(jié)點包括學(xué)生的:學(xué)號、姓名、性別、年齡。輸入一個年齡,如果鏈表中的結(jié)點包含的年齡等于此年齡,就將此結(jié)點刪去。homework6.7 Typedef6.7 用typedef定義類型功能:用自定義名字為已有數(shù)據(jù)類型命名類型定義簡單形式: typedef type name; define typedef預(yù)編譯時

30、處理 編譯時處理簡單字符置換 為已有類型命名 例 typedef int INTEGER;類型定義語句關(guān)鍵字已有數(shù)據(jù)類型名用戶定義的類型名例 typedef float REAL;類型定義后,與已有類型一樣使用例 INTEGER a,b,c; REAL f1,f2; int a,b,c; float f1,f2; 說明:typedef 沒有創(chuàng)造新數(shù)據(jù)類型typedef 是定義類型,不能定義變量typedef 與 define 不同typedef char *STRING; /* 定義STRING為字符指針類型*/STRING p,lineptrMAXLINES; typedef int ARR

31、100; /* 定義ARR為整型數(shù)組類型*/ARR n; 6.7 Typedef6.8 Unions6.8 Unions1 共用體的概念構(gòu)造數(shù)據(jù)類型,也叫聯(lián)合體用途:使幾個不同類型變量共占一段內(nèi)存(相互覆蓋)共用體類型聲明聲明形式:union 共用體名 類型標識符 成員名; 類型標識符 成員名; .;例 union data int i; char ch; float f; ;fchi類型聲明不分配內(nèi)存形式二: union data int i; char ch; float f; a,b;形式一: union data int i; char ch; float f; ; union dat

32、a a,b,c,*p,d3;形式三: union int i; char ch; float f; a,b,c;共用體變量的定義共用體變量定義分配內(nèi)存,長度=最長成員所占字節(jié)數(shù)共用體變量任何時刻只有一個成員存在iichchffab例 union int i; char ch; float f; a; a=1; () union data int i; char ch; float f;union data a,b,c,*p,d3; a.i a.ch a.f p-i p-ch p-f (*p).i (*p).ch (*p).fd0.i d0.ch d0.f2 共用體變量的引用方式引用方式:引用規(guī)

33、則不能引用共用體變量,只能引用其成員共用體變量中起作用的成員是最后一次存放的成員不能在定義共用體變量時初始化可以用一個共用體變量為另一個變量賦值共用體變量名.成員名共用體指針名-成員名 互相等價 (*共用體指針名).成員名例 a.i=1; a.ch=a; a.f=1.5; printf(“%d”,a.i); ( 編譯通過,運行結(jié)果不對) 例 union int i; char ch; float f; a=1,a,1.5; () 例 float x; union int i; char ch; float f; a,b; a.i=1; a.ch=a; a.f=1.5; b=a; () x=a.f; ()例 將一個整數(shù)按字節(jié)輸出01100001 01000001低字節(jié)高字節(jié)0100000101100001ch0ch1運行結(jié)果:i=60501ch0=101,ch1=141ch0=A,ch1=a#include main() union int_char int i; char ch2; x; x.i=24897; printf(i=%on,x.i); printf(ch0=%o,ch1=%on, ch0=%c,ch1=%cn, x.ch0,x.ch1,x.ch0,x.

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論