![結(jié)構(gòu)體與共用體培訓(xùn)課件_第1頁](http://file4.renrendoc.com/view6/M01/1C/34/wKhkGWd9w_eAPgeCAABfN_RsBP0271.jpg)
![結(jié)構(gòu)體與共用體培訓(xùn)課件_第2頁](http://file4.renrendoc.com/view6/M01/1C/34/wKhkGWd9w_eAPgeCAABfN_RsBP02712.jpg)
![結(jié)構(gòu)體與共用體培訓(xùn)課件_第3頁](http://file4.renrendoc.com/view6/M01/1C/34/wKhkGWd9w_eAPgeCAABfN_RsBP02713.jpg)
![結(jié)構(gòu)體與共用體培訓(xùn)課件_第4頁](http://file4.renrendoc.com/view6/M01/1C/34/wKhkGWd9w_eAPgeCAABfN_RsBP02714.jpg)
![結(jié)構(gòu)體與共用體培訓(xùn)課件_第5頁](http://file4.renrendoc.com/view6/M01/1C/34/wKhkGWd9w_eAPgeCAABfN_RsBP02715.jpg)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第8章結(jié)構(gòu)體與共用體概述在事務(wù)處理中,常需要將一些關(guān)系密切但類型不同的數(shù)據(jù)項(xiàng)組織在一起,并為其取一個(gè)整體名字,形成一個(gè)結(jié)構(gòu)。C語言中,就稱其為結(jié)構(gòu)體。結(jié)構(gòu)體通常由不同數(shù)據(jù)類型的數(shù)據(jù)項(xiàng)(成員)組成一個(gè)結(jié)構(gòu)體可包含若干成員,每個(gè)成員具有自己的名字及數(shù)據(jù)類型。結(jié)構(gòu)體類型的定義和簡單類型不同,結(jié)構(gòu)體類型是根據(jù)需要由程序員自行定義,因此在使用之前必須先定義結(jié)構(gòu)體類型一般格式:struct結(jié)構(gòu)體名{結(jié)構(gòu)體成員表;};struct是關(guān)鍵字,稱為結(jié)構(gòu)體定義標(biāo)識符,而結(jié)構(gòu)體名則由程序員自己命名。大括號中的結(jié)構(gòu)體成員表包含若干成員,每一個(gè)成員都具有如下的形式:數(shù)據(jù)類型標(biāo)識符成員名;對一個(gè)學(xué)生的描述,其結(jié)構(gòu)體類型定義如下:structstud_type{charname[10];longnum;charsex;intage;floatscore[5];charaddress[10];};結(jié)構(gòu)體變量結(jié)構(gòu)體變量的定義(1)先定義類型再定義變量structstud_type{charname[10];longnum;charsex;intage;floatscore[5];};structstud_typestudent1,student2;(2)在定義類型的同時(shí)定義變量structstud_type{charname[10];longnum;charsex;intage;floatscore[5];}student1,student2;(3)直接定義結(jié)構(gòu)體變量struct{charname[10];longnum;charsex;intage;floatscore[5];}student1,student2;
說明:(1)
在定義結(jié)構(gòu)體類型時(shí),系統(tǒng)并不分配內(nèi)存空間,僅當(dāng)定義結(jié)構(gòu)體變量時(shí),系統(tǒng)才為被定義的每一變量分配相應(yīng)的存儲單元。(2)
結(jié)構(gòu)體變量的定義一定要在結(jié)構(gòu)體類型定義之后或同時(shí)進(jìn)行,對尚未定義的結(jié)構(gòu)體類型,不能用它來定義結(jié)構(gòu)體變量。結(jié)構(gòu)體變量的初始化所謂結(jié)構(gòu)體變量初始化,就是對其成員變量賦初值在賦值時(shí)應(yīng)注意按順序及類型依次為每個(gè)結(jié)構(gòu)體成員指定初始值。一般格式:struct結(jié)構(gòu)體類型名結(jié)構(gòu)體變量={初始化值列表};說明:(1)初始化值列表中初始化數(shù)據(jù)之間用逗號分隔。(2)
初始化數(shù)據(jù)的個(gè)數(shù)一般與成員的個(gè)數(shù)相同,若小于成員數(shù),則剩余的成員將被自動初始化為0。(3)
初始化數(shù)據(jù)的類型要與相應(yīng)成員變量的類型一致。
初始化時(shí)只能對整個(gè)結(jié)構(gòu)體變量進(jìn)行,不能僅對結(jié)構(gòu)體類型中的某些成員進(jìn)行初始化賦值。structdate_type{intyear;intmonth;intday;};structstud_type{charname[10];longnum;charsex;structdate_typebirthday;floatscore;};main(){structstud_types1={"wang",196103,'m',1978,10,12,98};structstud_types2={"liu",196105,'m',1980,9,22,88};}結(jié)構(gòu)體變量的引用對結(jié)構(gòu)體變量成員的引用在C語言程序中,不允許對結(jié)構(gòu)變量整體進(jìn)行輸入輸出操作和除賦值外的各種運(yùn)算,只能是對其成員進(jìn)行此類操作。引用結(jié)構(gòu)體變量成員的一般形式:結(jié)構(gòu)體變量名.成員名其中“.”是結(jié)構(gòu)體成員運(yùn)算符,其優(yōu)先級別最高,結(jié)合性是自左至右。如:對上例定義的結(jié)構(gòu)體變量s1,s2,可如下操作:scanf("%s",);scanf("%f",&s1.score);s1.birthday.year=1978;s1.birthday.month=10;s1.birthday.day=12;s2.birthday.year=s1.birthday.year+2;printf("%s=%f",,s1.score);【例8.1】輸入一個(gè)職工的工資信息,整體賦值給另一個(gè)變量,在屏幕上輸出。#include"stdio.h"structym_type{inty;intm;};structsalary_type{charnum[5]; charname[17]; structym_typeym; floatsalary; floatother; floatcost;};main(){structsalary_typew,w0;printf("請輸入姓名(其中可以包含空格):");gets();printf("請輸入工作證號、參加工作年、月、基本工資、其他工資、扣款\n");scanf("%s%d%d%f%f%f",w0.num,&w0.ym.y,&w0.ym.m,&w0.salary,&w0.other,&w0.cost);w=w0;printf("工號
姓名
基本工資
其他工資
扣款
實(shí)發(fā)工資\n");printf("%-5s%-16s%8.2f%8.2f%8.2f%8.2f\n",w.num,,w.salary,w.other,w.cost,w.salary+w.other-w.cost);}
結(jié)構(gòu)體數(shù)組結(jié)構(gòu)體數(shù)組的定義structdate_type{intyear;intmonth;intday;};structstud_type{charname[10];longnum;charsex;structdate_typebirthday;floatscore;charaddress[10];}s1[3];structstud_types2[5];結(jié)構(gòu)體數(shù)組的初始化stuctstud_types3[2]={{"wang",196103,'m',1978,10,12,98,"xian"},{"zhang",196102,'f',1977,1,10,87,"Beijing"}};【例8.2】用結(jié)構(gòu)體數(shù)組存儲學(xué)生信息,每個(gè)學(xué)生有姓名、學(xué)號和成績。從鍵盤按學(xué)號順序輸入N名學(xué)生信息,再按成績從高到低的順序輸出各學(xué)生的全部信息。
#defineN4#include<string.h>struct{intnum;charname[11];intscore;}t,s[N];main(){inti,j,k;printf("\n請輸入第一個(gè)學(xué)生的學(xué)號:");scanf("%d",&k);printf("\n請輸入學(xué)號對應(yīng)學(xué)生的姓名(不可含空格)、成績\n");for(i=0;i<N;i++){printf("%d",s[i].num=k+i);scanf("%s%d",s[i].name,&s[i].score);}for(i=0;i<N-1;i++){k=i;for(j=i+1;j<N;j++)if(s[k].score<s[j].score)k=j;if(k!=i){t=s[i];s[i]=s[k];s[k]=t;}}printf("按成績排序輸出:\n");for(i=0;i<N;i++)printf("%d%-10s%5d\n",s[i].num,s[i].name,s[i].score);}結(jié)構(gòu)體和函數(shù)結(jié)構(gòu)體成員可以作為函數(shù)的實(shí)參,而形參為與成員同類型的變量。此時(shí)傳遞的是單個(gè)成員值,與同類型的變量傳遞規(guī)則相同。【例8.3】
在main()函數(shù)中,輸入一個(gè)學(xué)生信息,再調(diào)用print函數(shù)輸出。顯然print函數(shù)的形參可以用結(jié)構(gòu)體變量。
#include"stdio.h"structst_type{charnum[7];charname[21];charsex;intage;floatscore;};voidprint(structst_types){printf("輸出:學(xué)號
姓名
性別
年齡
成績\n");printf("%9s%20s%4c%6d%8.1f\n",s.num,,s.sex,s.age,s.score);}main(){structst_types0;printf("請輸入姓名(可含空格):");gets();printf("請輸入學(xué)號、性別、年齡、成績(各項(xiàng)用空格分開)\n");scanf("%s%c%d%f",s0.num,&s0.sex,&s0.age,&s0.score);print(s0);}返回值為結(jié)構(gòu)體類型的函數(shù)
定義返回值為結(jié)構(gòu)體類型函數(shù)的一般形式為:結(jié)構(gòu)體類型名
函數(shù)名(形參表)【例8.4】在main函數(shù)中定義一個(gè)結(jié)構(gòu)體數(shù)組,多次調(diào)用input函數(shù)輸入各學(xué)生的信息,返回值賦給結(jié)構(gòu)體數(shù)組元素,再多次調(diào)用print函數(shù)輸出。#include"stdio.h"structst_type{charnum[7];charname[21];charsex;intage;floatscore;};structst_typeinput(){structst_types0;printf("請輸入姓名(其中可以包含空格):");gets();printf("請輸入學(xué)號、性別、年齡、成績(各項(xiàng)用空格分開)\n");scanf("%s%c%d%f",s0.num,&s0.sex,&s0.age,&s0.score);getchar();returns0;}voidprint(structst_types0){printf("輸出:學(xué)號
姓名
性別
年齡
成績\n");printf("%11s%16s%4c%6d%8.2f\n",s0.num,,s0.sex,s0.age,s0.score);}main(){inti;structst_types[2];for(i=0;i<2;i++)s[i]=input();for(i=0;i<2;i++)print(s[i]);}
在需要節(jié)省內(nèi)存儲空間時(shí),C語言還提供了一種由若干個(gè)不同類型的數(shù)據(jù)項(xiàng)組成,但共享同一存儲空間的構(gòu)造類型。共用體由于共享的特性,只有最新存儲的數(shù)據(jù)是有效的。一種構(gòu)造類型數(shù)據(jù),共用體由若干不同類型的數(shù)據(jù)項(xiàng)組成,構(gòu)成共用體的各個(gè)數(shù)據(jù)項(xiàng)稱為共用體成員。共用體定義的一般形式:union共用體名{成員表列;}變量表列;共用體變量所占的內(nèi)存長度等于最長的成員的長度共用體變量只有先定義了共用體類型,才能定義基于該類型的變量不能直接引用共用體變量,只能引用共用體變量中的成員共用體類型數(shù)據(jù)的特點(diǎn)1.同一個(gè)內(nèi)存段可以用來存放幾種不同類型的成員,但在每一瞬間只能存放其中一種,而不是同時(shí)都存放;2.共用體變量中起作用的成員是最后一次存放的成員,在存入一個(gè)新的成員后原有的成員就失去作用;3.共用體變量的地址和它的成員的地址都是同一地址;4.共用體類型可以出現(xiàn)在結(jié)構(gòu)體類型定義中。共用體應(yīng)用舉例
【例8.5】通過共用體變量,將一個(gè)整數(shù)的兩個(gè)字節(jié)分別按十六進(jìn)制和字符方式輸出。
unionint_char{inti;charch[2];};print(unionint_charx){printf("i=%d\ni=%X\n",x.i,x.i);printf("ch0=%X,ch1=%X\n",x.ch[0],x.ch[1]);printf("ch0=%c,ch1=%c\n",x.ch[0],x.ch[1]);}main(){
unionint_charx;
x.i=25419;print(x);}0110001101001011低字節(jié)高字節(jié)0100101101100011ch[0]ch[1]
4B
63運(yùn)行結(jié)果:i=25419i=634B
ch0=4B,ch1=63ch0=K,ch1=ci【例8.6】
一個(gè)班體育課成績,男生測驗(yàn)1500米成績?yōu)椤练帧撩?,女生測驗(yàn)柔韌性(分A、B、C、D和E5等)和俯臥撐次數(shù),將測驗(yàn)數(shù)據(jù)放在一張表中,表中包括學(xué)號、姓名、性別和體育成績。最后一項(xiàng)“體育成績”的內(nèi)容根據(jù)性別填寫不同的內(nèi)容,編寫程序,若輸入、輸出表中的信息。#defineN2#include<string.h>structboy{intm;floats;};structgirl{charf;intn;};structstudent{charnum[7];charname[10];charsex;
union{structboyms;structgirlfn;}score;}st[N];
main(){intn,i;for(i=0;i<N;i++){printf("請輸入:學(xué)號、姓名、性別\n");scanf("%s%s%c",st[i].num,st[i].name,&st[i].sex);if(st[i].sex=='m'||st[i].sex=='M'){printf("請輸入他的1500米成績(分秒):");scanf("%d,%f",&st[i].score.ms.m,&st[i].score.ms.s);}else{printf("請輸入她的柔韌性等級和俯臥撐次數(shù):");scanf("%c,%d",&st[i].score.fn.f,&st[i].score.fn.n);}}for(i=0;i<N;i++)if(st[i].sex=='m'||st[i].sex=='M')printf("%-8s%-10s男1500米成績:%d分%4.1f秒\n",st[i].num,st[i].name,st[i].score.ms.m,st[i].score.ms.s);elseprintf(“%-8s%-10s女柔韌性:%c等俯臥撐:%d次\n",st[i].num,st[i].name,st[i].score.fn.f,st[i].score.fn.n);}結(jié)構(gòu)體與共用體的比較定義形式相似,但是它們的含義不同。結(jié)構(gòu)體是將多個(gè)不同類型的數(shù)據(jù)組合成一個(gè)整體進(jìn)行存儲與管理。共用體則是使多個(gè)不同類型的數(shù)據(jù)使用同一存儲空間進(jìn)行存儲。存儲空間的分配方式不同結(jié)構(gòu)體變量所占內(nèi)存長度是各個(gè)成員占的內(nèi)存長度之和,其每個(gè)成員均有自己的存儲空間。共用體變量所占的內(nèi)存長度等于最長的成員的長度,任何時(shí)候,共用體變量只能存放一個(gè)成員。枚
舉
類
型
枚舉類型定義一般形式:enum
類型標(biāo)識符{枚舉值名表};花括號中的枚舉值形式如下:常量標(biāo)識符1,常量標(biāo)識符2,…,常量標(biāo)識符n
例如:enumweekday{sun,mon,tue,wed,thu,fri,sat};
枚舉類型的變量
enumweekdayd1,d2;/*定義枚舉變量d1和d2*/
注意:一個(gè)枚舉變量的值只能取該類型定義的幾個(gè)枚舉常量d1=sun;d2=d1;若想將整數(shù)值賦給枚舉變量,須作強(qiáng)制類型轉(zhuǎn)換。d1=(enumweekday)
溫馨提示
- 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 蘇科版數(shù)學(xué)八年級上冊聽評課記錄《4-3實(shí)數(shù)(2)》
- 中考人教版地理一輪復(fù)習(xí):八年級下冊第九章 青藏地區(qū) 聽課評課記錄
- 小學(xué)二年級加減數(shù)學(xué)口算練習(xí)題
- 湘教版地理七年級下冊《 第八章 走進(jìn)國家 第四節(jié)法國導(dǎo)》聽課評課記錄
- 五年級口算題50道
- 學(xué)生營養(yǎng)餐供貨協(xié)議書范本
- 醫(yī)院和醫(yī)院合作協(xié)議書范本
- 機(jī)器購銷合同范本
- 2025年度知識產(chǎn)權(quán)交易市場運(yùn)營管理協(xié)議
- 北京市房屋租賃合同范本
- 2025年?duì)I口職業(yè)技術(shù)學(xué)院高職單招職業(yè)適應(yīng)性測試近5年??及鎱⒖碱}庫含答案解析
- 藥膳與食療理論試題答案
- 七年級歷史下冊第2課唐朝建立與貞觀之治
- 李四光《看看我們的地球》原文閱讀
- 手術(shù)分級目錄(2023年修訂)
- 抖音火花合同電子版獲取教程
- 電力配網(wǎng)工程各種材料重量表總
- 2024年湖南高速鐵路職業(yè)技術(shù)學(xué)院單招職業(yè)技能測試題庫及答案解析
- 中國農(nóng)業(yè)發(fā)展銀行XX支行 關(guān)于綜合評價(jià)自評情況的報(bào)告
- 2010年宣武區(qū)第六屆中小學(xué)生地理知識競賽題庫
- QC課題提高檢查井周邊壓實(shí)
評論
0/150
提交評論