第14章 結(jié)構(gòu)體、共用體和用戶定義類型_第1頁
第14章 結(jié)構(gòu)體、共用體和用戶定義類型_第2頁
第14章 結(jié)構(gòu)體、共用體和用戶定義類型_第3頁
第14章 結(jié)構(gòu)體、共用體和用戶定義類型_第4頁
第14章 結(jié)構(gòu)體、共用體和用戶定義類型_第5頁
已閱讀5頁,還剩19頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第十四章第十四章結(jié)構(gòu)體、共用體和用戶定義類型結(jié)構(gòu)簡介存儲一個班級中 5 名學(xué)員的信息(學(xué)號、姓名、性別和成績)問題:I. 使用數(shù)組MaryJohnPeterRoseKateFMFMF01020304058978.56797.564解決方案:scorenumsexname不能建立數(shù)組間的關(guān)系II. 使用多維數(shù)組MaryJohnPeterRoseKateFMFMF01020304058978.56797.564C 語言不允許一個數(shù)組包含多種數(shù)據(jù)類型III. 使用結(jié)構(gòu)numnamesexscoreC 語言引入了稱為結(jié)構(gòu)的數(shù)據(jù)存儲方式“結(jié)構(gòu)” 是一種構(gòu)造數(shù)據(jù)類型,它是由若干數(shù)據(jù)項組合而成的復(fù)雜數(shù)據(jù)對象

2、,這些數(shù)據(jù)項稱為結(jié)構(gòu)的成員。 定義結(jié)構(gòu)1struct structurenamedatatype variable1;datatype variable2;.;結(jié)構(gòu)成員;結(jié)構(gòu)名structstudentint num;char name20;char sex;定義結(jié)構(gòu)float score;C 語言中的有效數(shù)據(jù)類型定義結(jié)構(gòu)2struct student int num; char name20; char sex; float score;num name sexstudent 結(jié)構(gòu)定義并不預(yù)留內(nèi)存 結(jié)構(gòu)定義放置在程序的開始部分,位于頭文件聲明之后 score 結(jié)構(gòu)定義僅描述了一個結(jié)構(gòu)的形式。

3、如果要在程序里使用結(jié)構(gòu),需要聲明結(jié)構(gòu)變量。聲明結(jié)構(gòu)變量聲明結(jié)構(gòu)變量struct student int num; char name20; char sex; float score;struct student student1,student2;I.先定義結(jié)構(gòu),再聲明結(jié)構(gòu)變量struct student int num; char name20; char sex; float score;student1,student2;II.在定義結(jié)構(gòu)類型的同時聲明結(jié)構(gòu)變量struct int num; char name20; char sex; float score;student1,stud

4、ent2;III. 直接聲明結(jié)構(gòu)變量聲明一個類型為 student 結(jié)構(gòu)的變量,將會為該變量分配內(nèi)存,大小是大于或等于其所有成員變量的大小之和。 聲明結(jié)構(gòu)變量 第四種方式 typedef struct char name12; char sex; struct date brthday; float sc4; STREC;STREC std,pers3,*pstd;struct date int month; int day; int year;嵌套結(jié)構(gòu)struct int num; char name20; char sex; struct date birthday; float scor

5、e;student1,student2;表示結(jié)構(gòu)變量成員的一般形式是:結(jié)構(gòu)變量名.成員名例如:student1.num、student2.sex、student1.birthday.month內(nèi)存student3struct student student3=3,Yao Ming ,M,90.5; 結(jié)構(gòu)變量初始化3Yao MingM賦值的順序應(yīng)與成員聲明時的順序一樣;允許初始化語句中的值的數(shù)目比結(jié)構(gòu)成員數(shù)目少。student3.sex90.5student3.scorestudent1student1.num=1;=Z

6、hang Zi Liang;student1.sex=M;printf(請輸入成績:請輸入成績:n);scanf(%f,&student1.score);結(jié)構(gòu)變量賦值1Zhang Zi Liang Mq 用輸入語句或賦值語句來給結(jié)構(gòu)變量的各個成員賦值7878student2 = student1; student21Zhang Zi Liang M78問題描述:根據(jù)學(xué)員的成績,輸出不及格學(xué)員的詳細信息。 使用結(jié)構(gòu)示例#includestruct studentint num;/學(xué)號char *name;/姓名char sex;/性別float score;/成績;void main() sta

7、tic struct student stu1=1,李亞鵬,M,61; static struct student stu2=2,周晶晶,F,92.5; static struct student stu3=3,姚光明,M,59; printf(不及格學(xué)員的名單如下:n); if(stu1.score60) printf(%dt%st%ct%5.2fn,stu1.num,,stu1.sex,stu1.score); if(stu2.score60) printf(%dt%st%ct%5.2fn,stu2.num,,stu2.sex,stu2.score);

8、if(stu3.score=60 & stu2.score=60 & stu3.score=60) printf(沒有不及格的學(xué)員。n);不及格學(xué)員的名單如下:3 姚光明 M 59.00stu11李亞鵬M78stu22周晶晶F92stu33姚光明M59struct stu *pstu;(*pstu).num 或者: pstu-num結(jié)構(gòu)指針變量q 一個指針當(dāng)用來指向一個結(jié)構(gòu)時, 稱之為結(jié)構(gòu)指針變量。q 結(jié)構(gòu)指針變量中的值是所指向的結(jié)構(gòu)變量的首地址。q 結(jié)構(gòu)指針變量聲明的一般形式為: struct 結(jié)構(gòu)名 *結(jié)構(gòu)指針變量名q 通過結(jié)構(gòu)指針可以訪問該結(jié)構(gòu)變量的成員,一般形式為: (*結(jié)構(gòu)指針變量)

9、.成員名 或者 結(jié)構(gòu)指針變量-成員名 結(jié)構(gòu)體變量的引用結(jié)構(gòu)體變量的引用:(1)不能將一個結(jié)構(gòu)變量作為一個整體進行輸入和輸出不能將一個結(jié)構(gòu)變量作為一個整體進行輸入和輸出.例如已定義例如已定義st1,st2為結(jié)為結(jié)構(gòu)體變量并且它們已有值構(gòu)體變量并且它們已有值,不能這樣引用不能這樣引用:printf(“%d,%s,%c,%d,%f,%sn”,st1);只能對結(jié)構(gòu)體變量中的各個成員分別只能對結(jié)構(gòu)體變量中的各個成員分別進行輸入和輸出進行輸入和輸出. 結(jié)構(gòu)體變量名結(jié)構(gòu)體變量名.成員名成員名(2)如果成員本身又屬一個結(jié)構(gòu)體類型如果成員本身又屬一個結(jié)構(gòu)體類型,則要用若干個成員運算符則要用若干個成員運算符,一級

10、一級地一級一級地找到最低的一級成員找到最低的一級成員,只能對最低級的成員進行賦值或存取以及運算只能對最低級的成員進行賦值或存取以及運算.例如例如: student1.birthday.month(3)對結(jié)構(gòu)體變量的成員可以像普通變量一樣進行各種運算對結(jié)構(gòu)體變量的成員可以像普通變量一樣進行各種運算(根據(jù)其類型決定可根據(jù)其類型決定可以進行的運算以進行的運算).student1.num+ 或或+ student1.num 由于由于.運算符的優(yōu)先級最高運算符的優(yōu)先級最高,因此因此,student1.num+j是對是對student1.num進行自加運算進行自加運算,面不是先對面不是先對num進行自進行

11、自加運算加運算.(4)可以引用結(jié)構(gòu)體變量成員的地址可以引用結(jié)構(gòu)體變量成員的地址,也可以引用結(jié)構(gòu)體變量的地址也可以引用結(jié)構(gòu)體變量的地址.如下如下:scanf(“%d”,&student1.num); /輸入輸入student1.num的值的值printf(“%x”,&student1); /輸出輸出student1的首地址的首地址)但不能用以下語句整體讀入結(jié)構(gòu)體變量但不能用以下語句整體讀入結(jié)構(gòu)體變量.如如:scanf(“%d,%s,%c,%d,%f,%s”,&student1);結(jié)構(gòu)體變量的地址主要用于作函數(shù)參數(shù)結(jié)構(gòu)體變量的地址主要用于作函數(shù)參數(shù),傳遞結(jié)構(gòu)體的地址傳遞結(jié)構(gòu)體的地址.#includ

12、estruct studentint num;char *name;char sex;float score;stu=1,張賓,F,55,*pstu;void main() pstu=&stu; printf(學(xué)號:%d 姓名:%sn,stu.num,); printf(性別:%c 成績:%5.2fnn,stu.sex,stu.score); printf(學(xué)號:%d 姓名:%sn,(*pstu).num,(*pstu).name); printf(性別:%c 成績:%5.2fnn,(*pstu).sex,(*pstu).score); printf(學(xué)號:%d 姓名:%sn,

13、pstu-num,pstu-name); printf(“性別:%c 成績:%5.2fnn,pstu-sex,pstu-score);學(xué)號:1 姓名:張賓性別:F 成績:55.00學(xué)號:1 姓名:張賓性別:F 成績:55.00學(xué)號:1 姓名:張賓性別:F 成績:55.00Press any key to continue 在上面的例子中(*pstu).num和(*pstu).name 是pstu指向了結(jié)構(gòu)變量中的成員num和name.注意*p兩側(cè)的括弧不可省,因為成員運算符“ . ”優(yōu)先于“ * ”運算符,*pstu.num就等價于*(pstu.num). 請分析以下幾種運算符: 1:p-n

14、得到p指向的結(jié)構(gòu)體變量中的成員n的值 2:p-n+ 得到p指向的結(jié)構(gòu)體變量中的成員n的值,用完該值后使它加1 3:+p-n 得到p指向的結(jié)構(gòu)體變量中的成員n的值使之加1(先加) 結(jié)構(gòu)體數(shù)組應(yīng)用舉例結(jié)構(gòu)體數(shù)組應(yīng)用舉例2: 對候選人得票的統(tǒng)計程序?qū)蜻x人得票的統(tǒng)計程序.設(shè)有設(shè)有3個候選人個候選人,每次輸入一個得票的候選人的每次輸入一個得票的候選人的名字名字,要求最后輸出各人得票結(jié)果要求最后輸出各人得票結(jié)果.#includeStruct person char name20; int count;leader3=“Li”,0, “Zhang”,0, “fun”,0,;main() int I,j;C

15、har leader_name20;For(i=1;i=10;i+) scanf(“%s”,leader_name); for(j=0;j3;j+) If(strcmp(leader_name,)=0)leaderj.count+;Printf(“n”);For(i=0;i3;i+)Printf(“%5s:%dn”,,leaderi.count);struct student int num; char* name; char sex; float score;stu30;結(jié)構(gòu)數(shù)組q 元素為結(jié)構(gòu)類型的數(shù)組稱為結(jié)構(gòu)數(shù)組。q 在實際應(yīng)用中,經(jīng)常用結(jié)構(gòu)

16、數(shù)組來表示具有相同數(shù)據(jù)結(jié)構(gòu)的一個群體。例如一個班的學(xué)員檔案,一個公司的職工檔案等。定義了一個結(jié)構(gòu)數(shù)組stu1,共有30個元素,stu0stu29。每個數(shù)組元素都具有struct student的結(jié)構(gòu)形式。問題描述:求學(xué)員的總成績和平均成績,并統(tǒng)計不及格人數(shù)。 結(jié)構(gòu)指針變量struct studentint num;char *name;char sex;float score;stuN= 1,李芳,F,45,2,于紅,F,62.5,3,何萬山,M,92.5,4,程亞麗,M,87,5,王明,M,58;void main()int i,count=0; float ave,sum=0;for(i=

17、0;iN;i+)sum+=stui.score;if(stui.score60)count+;printf(總分:%7.2fn,sum);ave=sum/5;printf(平均分:%5.2fn,ave);printf(不及格人數(shù)為:%dn,count);總分: 345.00平均分:69.00不及格人數(shù)為:2Press any key to continue指向結(jié)構(gòu)體數(shù)組的指針指向結(jié)構(gòu)體數(shù)組的指針例題:例題:struct student int num;Char name20;Char sex;Int age;Struct student stu3=10101,“Li Lin”,m,18,101

18、02,“Zhang Fun”,m,19,10104,“Wang Min”,F,20;main() struct student *p;Printf(“no./t name /t sex /t age n”);For(p=stu;pnum,p-name,p-sex,p-age); 注意以下兩點:注意以下兩點:1、如果、如果p的初值為的初值為stu,即指向每個元素,則即指向每個元素,則p+1后指向下一元素的起始地址。后指向下一元素的起始地址。例如例如(+p)-num先使先使p自加自加1,然后得到它指向的元素中的然后得到它指向的元素中的num成員值(即成員值(即10102).(p+)-num先得到先

19、得到p-num的值(即的值(即10101)然后使)然后使p自加自加1,指向,指向stu1.2、程序已定義了指針、程序已定義了指針p為指向為指向struct student 類型數(shù)據(jù)的變量,類型數(shù)據(jù)的變量,它只能指向它只能指向一個一個struct student型的數(shù)據(jù)型的數(shù)據(jù)(p的值是的值是stu數(shù)組的一個元素的起始地址),數(shù)組的一個元素的起始地址),而不能指向而不能指向stu數(shù)組元素中的某一成員(即數(shù)組元素中的某一成員(即p的地址不能是成員的地址),的地址不能是成員的地址),例如,下面是不對的。例如,下面是不對的。P=&;編譯是將出錯,千萬不要認為反正編譯是將出錯,千萬不要

20、認為反正p是存放地址的,可以將任何地址賦給是存放地址的,可以將任何地址賦給它,如果地址類型不相同,可以用強制類型轉(zhuǎn)換。例如:它,如果地址類型不相同,可以用強制類型轉(zhuǎn)換。例如:P=(struct student *)&;此時,在此時,在p中存放中存放stu1元素元素name成成員的起始地址。員的起始地址。191頁對結(jié)構(gòu)體變量中的成員進行操作頁對結(jié)構(gòu)體變量中的成員進行操作結(jié)構(gòu)作為函數(shù)參數(shù)q可以將結(jié)構(gòu)作為參數(shù)傳遞給函數(shù),也可以定義返回結(jié)構(gòu)值的函數(shù)。q結(jié)構(gòu)作為函數(shù)參數(shù)有三種不同方法:192頁6種方式q將結(jié)構(gòu)成員的值傳遞給函數(shù)處理。q將整個結(jié)構(gòu)作為參數(shù)值傳遞給函數(shù)。q將結(jié)構(gòu)指針變量做函數(shù)的參數(shù)。把結(jié)構(gòu)作為整體來處理,但作用方式和效果不同。結(jié)構(gòu)成員作為函數(shù)參數(shù)struct film char name25; /電影名 char director25; /導(dǎo)演 int duration; /

溫馨提示

  • 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. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論