版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第6章復雜數(shù)據(jù)類型概述在事務(wù)處理中,常需要將一些關(guān)系密切但類型不同的數(shù)據(jù)項組織在一起,并為其取一個整體名字,形成一個結(jié)構(gòu)。C語言中,就稱其為結(jié)構(gòu)體。結(jié)構(gòu)體通常由不同數(shù)據(jù)類型的數(shù)據(jù)項(成員)組成一個結(jié)構(gòu)體可包含若干成員,每個成員具有自己的名字及數(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)體定義標識符,而結(jié)構(gòu)體名則由程序員自己命名。大括號中的結(jié)構(gòu)體成員表包含若干成員,每一個成員都具有如下的形式:數(shù)據(jù)類型標識符成員名;struct
stud_type{charname[10];longnum;charsex;intage;floatscore[5];charaddress[10];};對一個學生的描述,其結(jié)構(gòu)體類型定義如下:說明:(1)
定義一個結(jié)構(gòu)體類型只是描述了此結(jié)構(gòu)體的組織形式,在編譯時并不為其分配存儲空間,即僅描述此數(shù)據(jù)結(jié)構(gòu)的形態(tài)或者說模型,故不能對定義的一個結(jié)構(gòu)體類型進行賦值、存取或運算。(2)
結(jié)構(gòu)體的成員可以是簡單變量、數(shù)組、指針、結(jié)構(gòu)體等。(3)
結(jié)構(gòu)體類型定義可以放在函數(shù)內(nèi)部,也可以放在函數(shù)外部。若放在內(nèi)部,則只在函數(shù)內(nèi)有效;
若放在外部,則從定義點到源文件尾之間的所有函數(shù)都有效。(4)
結(jié)構(gòu)體成員的名字可以同程序中的其它變量同名,
二者不會相混,系統(tǒng)會自動識別它。結(jié)構(gòu)體變量結(jié)構(gòu)體變量的定義(1)先定義類型再定義變量structstud_type{charname[10];longnum;charsex;intage;floatscore[5];};structstud_typestudent1,student2;(2)在定義類型的同時定義變量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)體類型時,系統(tǒng)并不分配內(nèi)存空間,僅當定義結(jié)構(gòu)體變量時,系統(tǒng)才為被定義的每一變量分配相應(yīng)的存儲單元。(2)
結(jié)構(gòu)體變量的定義一定要在結(jié)構(gòu)體類型定義之后或同時進行,對尚未定義的結(jié)構(gòu)體類型,不能用它來定義結(jié)構(gòu)體變量。結(jié)構(gòu)體變量的初始化所謂結(jié)構(gòu)體變量初始化,就是對其成員變量賦初值在賦值時應(yīng)注意按順序及類型依次為每個結(jié)構(gòu)體成員指定初始值。一般格式:struct結(jié)構(gòu)體類型名結(jié)構(gòu)體變量={初始化值列表};說明:(1)初始化值列表中初始化數(shù)據(jù)之間用逗號分隔。(2)
初始化數(shù)據(jù)的個數(shù)一般與成員的個數(shù)相同,若小于成員數(shù),則剩余的成員將被自動初始化為0。(3)
初始化數(shù)據(jù)的類型要與相應(yīng)成員變量的類型一致。
初始化時只能對整個結(jié)構(gòu)體變量進行,不能僅對結(jié)構(gòu)體類型中的某些成員進行初始化賦值。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)變量整體進行輸入輸出操作和除賦值外的各種運算,只能是對其成員進行此類操作。引用結(jié)構(gòu)體變量成員的一般形式:結(jié)構(gòu)體變量名.成員名其中“.”是結(jié)構(gòu)體成員運算符,其優(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);若有以下定義,則正確的賦值語句為
。structcomplex{floatreal;floatimage;};structvalue{intno;structcomplexcom;}val1;A)com.real=1; B)plex.real=1;C).real=1; D)val1.real=1;√例.輸入一個職工的工資信息,整體賦值給另一個變量,在屏幕上輸出。structym_type{inty;intm;};structsalary_type{charnum[5]; charname[17];
structym_typeym; floatsalary; floatother; floatcost;};結(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_type
s2[5];結(jié)構(gòu)體數(shù)組的初始化stuctstud_types3[2]={{"wang",196103,'m',1978,10,12,98,"xian"},{"zhang",196102,'f',1977,1,10,87,"Beijing"}};例.用結(jié)構(gòu)體數(shù)組存儲學生信息,每個學生有姓名、學號和成績。從鍵盤按學號順序輸入N名學生信息,再按成績從高到低的順序輸出各學生的全部信息。
#defineN5struct{intnum;charname[11];intscore;}t,s[N];main(){
/*輸入基本信息*//*選擇排序成績*//*輸出基本信息*/}/*選擇排序成績*/
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;}}/*輸入基本信息*/inti,j,k;printf("\n請輸入第一個學生的學號:");scanf("%d",&k);printf("\n請輸入學生的姓名、成績\n");for(i=0;i<N;i++){printf("%d",s[i].num=k+i);
scanf("%s%d",s[i].name,&s[i].score);}/*輸出基本信息*/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ù)的實參,而形參為與成員同類型的變量。此時傳遞的是單個成員值,與同類型的變量傳遞規(guī)則相同。例.在main()函數(shù)中,輸入一個學生信息,再調(diào)用print函數(shù)輸出。#include"stdio.h"structst_type{charnum[7];charname[21];charsex;intage;floatscore;};voidprint(structst_types){printf("輸出:學號姓名性別年齡成績\n");printf("%9s%20s%4c%6d%8.1f\n",s.num,,s.sex,s.age,s.score);}main(){structst_types0;printf("請輸入姓名(可含空格):");gets();printf("請輸入學號、性別、年齡、成績(各項用空格分開)\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ù)名(形參表)#include"stdio.h"structst_type{charnum[7];charname[21];charsex;intage;floatscore;};main(){inti;
structst_types[2];for(i=0;i<2;i++)s[i]=input();for(i=0;i<2;i++)
print(s[i]);}
input(){structst_types0;printf(“請輸入姓名、學號、性別、年齡、成績\n");
scanf("%s%s%c%d%f",,s0.num,&s0.sex,&s0.age,&s0.score);returns0;}voidprint(
){printf("輸出:學號姓名性別年齡成績\n");printf("%11s",s0.num);printf("16s",);printf("%4c",s0.sex);printf("%8.2f\n",s0.score);}整體輸入輸出分行輸入輸出structst_typestructst_types0結(jié)構(gòu)體與指針指向結(jié)構(gòu)體變量的指針結(jié)構(gòu)體指針變量的定義:struct結(jié)構(gòu)體名
*指針變量名;structstudent{intnum;charname[20];charsex;intage;}stu;structstudent*pt=&stu;agesexnamenumstup&stu使用結(jié)構(gòu)體指針變量引用成員形式(*結(jié)構(gòu)體指針名).成員名結(jié)構(gòu)體指針名->成員名結(jié)構(gòu)體變量名.成員名structstudent{intnum;charname[20];charsex;intage;}stu;structstudent*p=&stu;(*p).nump->numstu.nump=&stu.numagesexnamenumstup&stu#include<stdio.h>#include<string.h>structplayer{intnum;charname[20];charsex;
intage;};main(){structplayerx,*p;p=&x;x.num=10011;strcpy(,"KobeBryant");
p->sex='M';p->age=39;
printf("\nNo:%d\nname:%s\nsex:%c\nscore:%d\n",(*p).num,p->name,x.sex,p->age);}結(jié)構(gòu)體數(shù)組與指針structstudent{intnum;charname[20];charsex;intage;}stu[3]=
{{10101,"LiLin",'M',18},{10102,"ZhangFun",'M',19},{10103,"WangMin",'F',20}};main(){structstudent*p;for(p=stu;p<stu+3;p++)printf("%-6d%s\t%-3c%d\n",
p->num,p->name,p->sex,p->age);}10101LiLinM18stu[0]pstu[1]stu[2]p+1p+210102ZhangFunM1910103WangMinF20結(jié)構(gòu)體指針作函數(shù)參數(shù)用結(jié)構(gòu)體變量的成員作參數(shù)---單值傳遞用結(jié)構(gòu)體變量作參數(shù)---多值傳遞用指向結(jié)構(gòu)體變量或數(shù)組的指針作參數(shù)---地址傳遞。#defineN4#include<string.h>#defineFMT"%5d%-11s%5d%8d%8d%10.1f\n"structst{intnum;charname[11];ints[3];floataver;};voidinput(){scanf("%d%s%d%d%d",&q->num,q->name,&q->s[0],&q->s[1],&q->s[2]);q->aver=(q->s[0]+q->s[1]+q->s[2])/3.0;}main(){structsta[N],*p=a;while(p<a+N)
input(p++);for(p=a;p<a+N;p++)printf(FMT,p->num,p->name,p->s[0],p->s[1],p->s[2],p->aver);}structst*q一個班體育課成績,男生測驗1500米成績?yōu)椤练帧撩耄鷾y驗柔韌性(分A、B、C、D和E5等)和仰臥起坐次數(shù),將測驗數(shù)據(jù)放在一張表中,表中包括學號、姓名、性別和體育成績。最后一項“體育成績”的內(nèi)容根據(jù)性別填寫不同的內(nèi)容,編寫程序,輸入、輸出表中的信息。共用體共用體定義的一般形式:union共用體名{成員表列;}變量表列;共用體變量所占的內(nèi)存長度等于最長的成員的長度共用體變量的引用方式只有先定義了共用體變量才能引用它不能引用共用體變量,只能引用共用體變量中的成員例.一個班體育課成績,男生測驗1500米成績?yōu)椤练帧撩耄鷾y驗柔韌性(分A、B、C、D和E5等)和仰臥起坐次數(shù),將測驗數(shù)據(jù)放在一張表中,表中包括學號、姓名、性別和體育成績。最后一項“體育成績”的內(nèi)容根據(jù)性別填寫不同的內(nèi)容,編寫程序,輸入、輸出表中的信息。structMscore{intm;floats;};structFscore{charg;intn;};
structSTU{charnum[7];charname[10];charsex;
union{structMscoresm;
structFscoresf;}score;}st[N];
main(){intn,i;for(i=0;i<N;i++){printf("請輸入:學號、姓名、性別\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.sm.m,&st[i].score.sm.s);}
else{printf(“請輸入她的仰臥起坐次數(shù)和柔韌性等級:");scanf("%d%c",&st[i].score.sf.n,&st[i].score.sf.g);}/*輸出成績*/}/*輸出成績*/for(i=0;i<N;i++){printf(“%-8s%-10s”,st[i].num,st[i].name);
if(st[i].sex=='m'||st[i].sex=='M')printf(“男1500米:%d分%4.1f秒\n",st[i].score.sm.m,st[i].score.sm.s);
elseprintf(“女仰臥起坐:%d次,柔韌性:%c等\n",st[i].score.sf.n,st[i].score.sf.g)};共用體類型數(shù)據(jù)的特點1.同一個內(nèi)存段可以用來存放幾種不同類型的成員,但在每一瞬間只能存放其中一種,而不是同時都存放;2.共用體變量中起作用的成員是最后一次存放的成員,在存入一個新的成員后原有的成員就失去作用;3.共用體變量的地址和它的成員的地址都是同一地址;4.共用體類型可以出現(xiàn)在結(jié)構(gòu)體類型定義中。枚
舉
類
型
枚舉類型定義一般形式是:enum類型標識符{枚舉值名表};花括號中的枚舉值形式如下:常量標識符1,常量標識符2,…,常量標識符n
enumweekday{Sun,Mon,Tue,Wed,Thu,Fri,Sat};
枚舉類型的變量
enumweekdayd1,d2;
/*定義枚舉變量d1和d2*/d1=Sun;d2=d1;
正確d1=7;錯誤d1=(enumweekday)2;相當于d1=Tue;
enumlanguage{English=6,French,Chinese=
溫馨提示
- 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)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年度協(xié)議離婚與訴訟離婚婚姻登記與合同簽訂流程規(guī)范3篇
- 2024年智能養(yǎng)殖場承包合作項目合同范本3篇
- 采購合同管理中的合同管理工具3篇
- 采購合同評審表的填寫指導3篇
- 采購合同框架協(xié)議的簽訂前景3篇
- 采購合同風險評估的理論研究3篇
- 采購合同范本實戰(zhàn)3篇
- 2024年度供應(yīng)鏈管理系統(tǒng)軟件開發(fā)與優(yōu)化服務(wù)合同3篇
- 采購法務(wù)與合同的合同審核流程3篇
- 采購合同要素詳盡解讀3篇
- 2024預(yù)防流感課件完整版
- 電梯維保管理體系手冊
- 2024年國家電網(wǎng)招聘之通信類題庫及參考答案(考試直接用)
- 第12課《詞四首》課件+2023-2024學年統(tǒng)編版語文九年級下冊
- 合伙開公司股份分配協(xié)議書
- 2023年聊城市人民醫(yī)院招聘備案制工作人員考試真題
- 儺戲面具制作課程設(shè)計
- 2024中國華電集團限公司校招+社招高頻難、易錯點練習500題附帶答案詳解
- 智能工廠梯度培育行動實施方案
- 23J916-1 住宅排氣道(一)
- AD域控規(guī)劃方案
評論
0/150
提交評論