C語言新教材PPT課堂課件-8-結(jié)構(gòu)枚舉等_第1頁
C語言新教材PPT課堂課件-8-結(jié)構(gòu)枚舉等_第2頁
C語言新教材PPT課堂課件-8-結(jié)構(gòu)枚舉等_第3頁
C語言新教材PPT課堂課件-8-結(jié)構(gòu)枚舉等_第4頁
C語言新教材PPT課堂課件-8-結(jié)構(gòu)枚舉等_第5頁
已閱讀5頁,還剩41頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、1第八章 用戶自定義數(shù)據(jù)類型8.1 結(jié)構(gòu)類型及其變量的定義8.2 結(jié)構(gòu)數(shù)組8.3 結(jié)構(gòu)和指針8.4 聯(lián)合類型8.5 枚舉類型8.6 用typedef 定義類型別名補(bǔ): 編譯預(yù)處理28.1 結(jié)構(gòu)類型及其變量的定義數(shù)組是一種存放一組相關(guān)的同類型數(shù)據(jù)的構(gòu)造類型,但是不能將不同類型的數(shù)據(jù)放入同一數(shù)組中。如果需要把一個(gè)學(xué)生的學(xué)號(hào)、姓名、性別、年齡、成績等不同類型的數(shù)據(jù)作為一個(gè)有機(jī)的整體,就需要一種新的構(gòu)造類型結(jié)構(gòu)類型。結(jié)構(gòu)類型變量中的各個(gè)數(shù)據(jù)項(xiàng)各自獨(dú)立存放。3結(jié)構(gòu)類型需要自定義,先定義結(jié)構(gòu)類型后,再定義結(jié)構(gòu)變量。結(jié)構(gòu)類型定義包含:各個(gè)成員的名稱、類型。結(jié)構(gòu)變量定義包含:結(jié)構(gòu)類型、結(jié)構(gòu)體變量名稱。48.1

2、.1 結(jié)構(gòu)類型的定義一般格式: struct 結(jié)構(gòu)類型名 類型 成員1; 類型 成員2; 類型 成員n; ;例8.1: struct Student int number; char name9; int age; char sex; ;定義結(jié)構(gòu)類型,系統(tǒng)是不會(huì)為之分配內(nèi)存單元。只有在定義了結(jié)構(gòu)變量后,系統(tǒng)才會(huì)分配內(nèi)存單元給變量。成員名可以與程序中其它變量同名,二者不代表同一對(duì)象,但為增強(qiáng)可讀性,不提倡這樣做。 * struct Student int number; char name9; struct Birthday int year; int month; int day; birth

3、day; char sex; ;例8.2:成員也可以是一個(gè)結(jié)構(gòu)變量??梢杂胹izeof運(yùn)算符計(jì)算結(jié)構(gòu)類型的長度。sizeof(struct Student)的值是18numbername9birthdaysex 2 9 6 1 68.1.2 結(jié)構(gòu)變量的定義 (1)先定義結(jié)構(gòu)類型,再定義結(jié)構(gòu)變量struct Student int number; char name9; int age; char sex;struct Student student1;結(jié)構(gòu)類型只是模型,結(jié)構(gòu)變量才是可操作的實(shí)體應(yīng)區(qū)分結(jié)構(gòu)類型名與結(jié)構(gòu)變量名。三種方式7(2)在定義結(jié)構(gòu)類型的同時(shí)定義結(jié)構(gòu)變量 struct Stud

4、ent int number; char name9; int age; char sex; student1;結(jié)構(gòu)變量的定義(3)定義結(jié)構(gòu)類型但不命名,同時(shí)定義結(jié)構(gòu)變量struct int number; char name9; int age; char sex; student1;無名結(jié)構(gòu)體8結(jié)構(gòu)變量的初始化 struct Student int number; char name9; struct int year; int month; int day; birthday; char sex; student1=1101,lilin, 1985, 8, 1, M ;birthday各

5、成員的初值 如:98.1.3 結(jié)構(gòu)成員的引用引用結(jié)構(gòu)成員的一般形式如下:結(jié)構(gòu)變量名. 成員名 例如:struct Student int number; char name9; int age; char sex; student1;各成員的引用: student1.number,, student1.age,student1.sex成員運(yùn)算符: . 功能: 訪問結(jié)構(gòu)體變量中指定的成員優(yōu)先級(jí)1,左結(jié)合性不能用 Student.number 等10允許對(duì)結(jié)構(gòu)變量進(jìn)行整體賦值操作。 如: student2= student1; student1、student2為類型相同

6、的結(jié)構(gòu)體變量不允許將一組常量直接賦給一個(gè)結(jié)構(gòu)變量。如: student2=1101, lilin, 1985,8,1, M; 錯(cuò)誤!不允許對(duì)結(jié)構(gòu)變量進(jìn)行整體輸入輸出,而只能對(duì)結(jié)構(gòu)變量中各個(gè)成員分別進(jìn)行輸入輸出。如:printf(, student1); 錯(cuò)誤!結(jié)構(gòu)變量引用注意事項(xiàng)11如果成員本身又是一個(gè)結(jié)構(gòu),欲對(duì)最后一級(jí)成員進(jìn)行訪問,必須通過多級(jí)成員運(yùn)算符。 如: student1.birthday.year結(jié)構(gòu)變量的成員其作用和地位相當(dāng)于普通變量,可以像普通變量一樣進(jìn)行各種運(yùn)算??梢砸贸蓡T的地址,也可以引用結(jié)構(gòu)變量的地址。如: &student1表示結(jié)構(gòu)變量student1的首地址 &st

7、udent1.age 表示結(jié)構(gòu)變量student1的成員age的地址結(jié)構(gòu)變量引用注意事項(xiàng)12 結(jié)構(gòu)類型定義:struct Employee long code; char name20; float salary; char address50; char phone11;例8.4 職工數(shù)據(jù)包括職工編號(hào)、姓名、工資、地址、電話,定義職工類型并用它來聲明職工變量,然后訪問其各個(gè)成員。 舉例1 結(jié)構(gòu)類型及變量定義、成員訪問13用2個(gè)結(jié)構(gòu)變量存放2個(gè)職工記錄:#include #include void main() struct Employee ps1=123,chen,2000.0, 泉州,2

8、699999, ps2; /*以下給結(jié)構(gòu)變量ps2各成員輸入值或賦值*/ printf (code: ); scanf (%ld,&ps2.code); printf (name: ); scanf (%s, ); printf (phone: ); scanf (%s, ps2.phone); strcpy(ps2.address, ps1.address); ps2.salary=ps1.salary*1.5;可改用:getchar();gets(); getchar() 用來“吃掉”作為code輸入結(jié)束符的回車鍵;gets函數(shù)可輸入含空格的姓名。14/*以

9、下輸出結(jié)構(gòu)變量ps1、ps2各成員的值*/ printf (ncode:%ldn, ps1.code); printf (name:%s=n, ); printf (salary:%6.2fn, ps1.salary); printf (address:%sn,ps1.address); printf (phone:%sn,ps1.phone); printf (ncode:%ldn,ps2.code); printf (name:%sn,); printf (salary:%6.2fn,ps2.salary); printf (address:%sn,ps2.

10、address); printf (phone:%sn,ps2.phone);15舉例2 結(jié)構(gòu)類型及變量定義、成員訪問#include void main() struct Student int number; char name9; struct Birthday int year; int month; int day; birthday; char sex; s;numbername9birthdaysexs scanf (%d,&s.number); scanf (%s, ); scanf (%d-%d-%d, &s.birthday.year, &s.birthday.

11、month, &s.birthday.day); scanf ( %c,&s.sex); printf (%d,%s, %d-%d-%d, %cn, s.number, , s.birthday.year, s.birthday.month, s.birthday.day, s.sex); 168.2 結(jié)構(gòu)數(shù)組如:方式(2)struct Student int number; char name20; struct int year; int month; int day; birthday; char sex; student2= 1101,lilin,1985,8,1, M,

12、1102,wangjing,1985,7,1,F ;結(jié)構(gòu)數(shù)組初始化 結(jié)構(gòu)數(shù)組的定義也有三種方式student0numbername9birthdaystudent1sex17結(jié)構(gòu)數(shù)組應(yīng)用舉例例8.5 計(jì)算學(xué)生的平均年齡 #include struct Student int number; char name20; int age; stu4;void main ( ) int i; float ave,s=0; for (i=0;i4;i+) scanf(%d%s%d,&stui.number,, &stui.age); for (i=0; i 成員名二、通過指針引用結(jié)構(gòu)變

13、量成員 +pman-name 等同于 +(pman-name)*pman-name 等同于 *(pman-name)指向運(yùn)算符: - 功能: 對(duì)指針?biāo)赶虻慕Y(jié)構(gòu)的成員進(jìn)行訪問優(yōu)先級(jí)1,左結(jié)合性20舉例 用結(jié)構(gòu)指針間接訪問結(jié)構(gòu)變量成員#include #include struct Student long num; char name20; int age; ; void main ( ) struct Student student,*p=&student; strcpy(p-name, Wang Li); p-num=89101; p-age=18; printf(name: %snnum

14、ber:%ldnage:%dn, (*p).name, (*p).num, (*p).age ); 類例8.7 *類例8.9 學(xué)生類型結(jié)構(gòu)數(shù)組中存放若干學(xué)生的數(shù)據(jù),通過結(jié)構(gòu)指針輸出各個(gè)學(xué)生的數(shù)據(jù)。舉例 用結(jié)構(gòu)指針間接訪問結(jié)構(gòu)數(shù)組元素的成員#include struct Student int number; char name20; int age; ; void main() struct Student stu2=10101,li lin,18, 10102,zhang fan,19; struct Student *p; printf(No. Name agen); for (p=stu

15、; pnumber,p-name,p-age); p+后,p指向下一個(gè)結(jié)構(gòu)數(shù)組元素 *三、指針變量作為結(jié)構(gòu)成員輸出:lili例8.8#include struct Student int number; char *name; /*成員name為指針變量*/; void main() struct Student stu=1101,lili; puts( ); 如果沒有給結(jié)構(gòu)變量stu初始化,而是通過scanf來輸入各個(gè)成員的值,則指針name沒有明確指向,無法輸入字符串。了解23四、結(jié)構(gòu)指針作為函數(shù)參數(shù) 允許用結(jié)構(gòu)變量作函數(shù)參數(shù),但數(shù)據(jù)傳遞方式是逐個(gè)成員傳遞,特別是成員為數(shù)

16、組時(shí)將會(huì)使傳遞的時(shí)間和空間開銷很大,嚴(yán)重地降低了程序的效率。最好的辦法是使用結(jié)構(gòu)指針變量作函數(shù)參數(shù),這時(shí)由實(shí)參傳向形參的只是地址,從而減少了時(shí)間和空間的開銷。形參:結(jié)構(gòu)指針變量實(shí)參:結(jié)構(gòu)指針24例:給出年月日計(jì)算它是該年的第幾天 。結(jié)構(gòu)指針作函數(shù)參數(shù)舉例#include void main()int days(struct Date *); /*函數(shù)原型聲明*/ struct Date d1; printf(Enter year,month,day:); scanf(%d-%d-%d,&d1.year,&d1.month,&d1.day); printf(是第%d天, days(&d1); /

17、*函數(shù)調(diào)用*/ struct Date int year; int month; int day; ;25int days(struct Date *sp) int monthtable13 =0,31,28,31,30,31,30,31,31,30,31,30,31; int i,day_sum = 0; for (i=1;imonth;i+) day_sum += monthtablei; i=sp-year; if( i2 & (i%4=0)&(i%100!=0)|i%400=0) day_sum += 1; day_sum += sp-day; return day_sum ;月份大于

18、2時(shí)判斷是否為閏年結(jié)構(gòu)指針作函數(shù)參數(shù)舉例26 聯(lián)合類型是一種類似于結(jié)構(gòu)類型的構(gòu)造型數(shù)據(jù)類型,它準(zhǔn)許不同類型和不同長度的數(shù)據(jù)共享同一塊存儲(chǔ)空間。 也稱為“共用體”。 8.4 聯(lián)合類型27聯(lián)合類型的定義與結(jié)構(gòu)類似: union 聯(lián)合類型名 類型 成員名1; 類型 成員名n; ;union data char ch; int i; float f;一、聯(lián)合類型的定義 幾個(gè)成員占用同一個(gè)內(nèi)存段,因此,共用體變量所占的內(nèi)存長度應(yīng)為最長的成員長度地址1000ichf28結(jié)構(gòu)與聯(lián)合可以互相嵌套,例如:union uniontype int i; float f; ;struct structtype sho

19、rt s; long l; ;struct sutype char c; union uniontype u; ;union ustype int i; struct structtype st;聯(lián)合類型的定義29聯(lián)合變量的定義與結(jié)構(gòu)變量定義一樣,有三種方式例如:(2) union uniontype int a; long d; my_data; (3)union int a; long d;my_data; (1)union uniontype int a; long d; ;union uniontype my_data; 二、聯(lián)合變量的定義30聯(lián)合類型和聯(lián)合變量的定義舉例struct

20、Personchar name20; char sex; int age; union int single; struct char spouseName20; int child; married; struct Date int year; int month; int day; divorcedDay; marital; int marryFlag; person1; 姓名性別年齡婚姻狀況婚姻狀況標(biāo)記未婚已婚離婚配偶名子女?dāng)?shù)年月日31 聯(lián)合變量成員的引用類似結(jié)構(gòu)變量,也是利用運(yùn)算符“.”和“”。例如: union uniontype int i; char c; my_data; un

21、ion uniontype *p; p = &my_data; 下列引用都是合法的:my_data.i , my_data.c,p-i , p-c 三、聯(lián)合變量成員的引用32同一內(nèi)存段可用來存放幾種不同類型的成員,但每一瞬間只有最后被賦值的成員在起作用。聯(lián)合變量和它的各成員都是同一地址。不能對(duì)聯(lián)合變量表列賦值,這一點(diǎn)與結(jié)構(gòu)不一樣,如: union int i; char ch; float b; a=1,a,1.5; -不對(duì)!四、使用聯(lián)合變量應(yīng)注意的問題 33枚舉的概念: 枚舉類型也是一種數(shù)據(jù)類型。對(duì)那些只可能取有限的某幾種值的數(shù)據(jù),可以把它定義為枚舉類型數(shù)據(jù)。如果某些變量只有幾種可能,如:

22、星期一、星期二、 星期日又如,性別的取值,月份的取值可以通過枚舉法將變量的值一一列出,在這種情況下可以使用枚舉類型變量8.5 枚舉類型 34枚舉類型定義的一般形式為: enum 枚舉名枚舉常量1,枚舉常量2,枚舉常量n;一、枚舉類型的定義例如: enum weekday Sun,Mon,Tue,Wed,Thu,Fri,Sat; /*該枚舉類型只準(zhǔn)許取7種值 */ enum month Jan,Feb,Mar,Apr,May,Jun, Jul,Aug,Sep,Oct,Nov,Dec; /*該枚舉類型只準(zhǔn)許取12種值 */ 35請(qǐng)注意: 列在枚舉類型定義的 中的是枚舉常量名,它們類似于符號(hào)常量,不

23、是串常量(不能加引號(hào)),也不是變量名(不能被賦值)。 每個(gè)枚舉常量均有對(duì)應(yīng)的整數(shù)值,稱為枚舉常量值,默認(rèn)值分別為0、1、n-1。例如: enum weekday Sun,Mon, Tue, Wed, Thu, Fri, Sat ; 枚舉常量分別是Sun、Mon、Tue、Wed、Thu、Fri、Sat,對(duì)應(yīng)值分別為0、1、2、3、4、5、6。36 枚舉常量的值可在定義時(shí)重指定,而對(duì)于沒有指定值的元素,其值按順序加1例如:enum weekday Sun=7,Mon=1, Tue,Wed, Thu, Fri, Sat ;枚舉常量SunMonTueWedThuFriSat值7123456又如:enu

24、m weekday Sun=7,Mon, Tue=5, Wed, Thu=6, Fri, Sat ;枚舉常量SunMonTueWedThuFriSat值785667837枚舉型變量的定義也有三種方式,如:(1) enum weekday Sun,Mon,Tue ; enum weekday day; (2) enum weekday Sun,Mon,Tue day;(3) enum Sun,Mon,Tue day;二、枚舉型變量的定義38三、枚舉型變量的使用 1)可對(duì)枚舉變量賦值:直接賦予枚舉常量名,或間接賦予枚舉常量的值。如: enum weekday Sun,Mon, Tue, Wed,

25、Thu, Fri, Satworkday; workday=Sat; 正確! workday=6; 語法上錯(cuò)誤! workday =(enum weekday)6; 正確!2)枚舉變量的值不能用scanf函數(shù)輸入,但可用printf函數(shù)輸出輸出枚舉常量的值(整數(shù)型)。393)可對(duì)枚舉變量進(jìn)行判斷或比較操作。 enum flag true,false my_flag; if (my_flag = true) 4)枚舉變量可進(jìn)行自增(+)、自減(-)運(yùn)算。 利用4)、5),可用枚舉變量控制for循環(huán)。枚舉型變量的使用 枚舉常量名40類習(xí)題8.2:三種顏色取兩色,輸出各種組合情況。#include

26、void main() enum colorred,yellow,blue i, j; int n=0; for (i=red;i=blue;i+) for (j=red;j=blue;j+) if(j!=i) n=n+1; printf(%-4d,n); switch(i) case red: printf(%-10s,red);break; case yellow: printf(%-10s,yellow);break; case blue: printf(%-10s,blue); switch(j) case red: printf(%-10s,red);break; case yellow: printf(%-10s,yellow);break; case blue: printf(%-10s,blue); printf(n); 結(jié)果:1redblue2redyellow3yellowblue4yellowred5bluered6blueyellow41用typedef給已存在的數(shù)據(jù)類型取別名 一般形式: typedef 類型名 別名; 例如: 1)為int命名一個(gè)新名字INTEGER typedef i

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論