




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
廈門理工學院計算機科學與技術系1
1本章主要內容結構體類型與結構體變量結構體數組共用體枚舉類型typedef定義類型
廈門理工學院計算機科學與技術系2
結構簡介存儲一個班級中5名學員的信息(學號、姓名、性別和成績)問題:I.使用數組MaryJohnPeterRoseKateFMFMF01020304058978.56797.564解決方案:scorenumsexname不能建立數組間的關系II.使用多維數組MaryJohnPeterRoseKateFMFMF01020304058978.56797.564C語言不允許一個數組包含多種數據類型III.使用結構體numnamesexscoreC語言引入了稱為結構體的數據存儲方式“結構體”是一種構造數據類型,它是由若干數據項組合而成的復雜數據對象,這些數據項稱為結構的成員。
廈門理工學院計算機科學與技術系3
5.1結構體的定義structstructurename{ datatypevariable1; datatypevariable2; ...};結構體成員{};結構體名structstudentintnum;charname[20];charsex;定義結構體floatscore;C語言中的有效數據類型
廈門理工學院計算機科學與技術系4
structstudent{intnum;charname[20];charsex;floatscore;};numnamesexstudent結構體定義放置在程序的開始部分,位于頭文件聲明之后;score結構體定義僅描述了一個結構的形式。如果要在程序里使用結構體,需要聲明結構體變量。5.1結構體變量的定義
廈門理工學院計算機科學與技術系5
structstudent{intnum;charname[20];charsex;intage;floatscore;charaddress[50];};結構體類型名結構體各成員定義結構體類型大括號外要加分號structstudentstu1,stu2;
系統不為結構體類型的定義開辟內存單元,只當定義了結構體變量后才會為變量分配相應大小的內存單元。stu1和stu2在內存占幾個字節?聲明一個類型為student結構的變量,將會為該變量分配內存,大小是大于或等于其所有成員變量的大小之和。
廈門理工學院計算機科學與技術系6
聲明結構變量structstudent{intnum;charname[20];charsex;floatscore;};structstudentstudent1,student2;I.先定義結構,再聲明結構變量structstudent{intnum;charname[20];charsex;floatscore;}student1,student2;II.在定義結構類型的同時聲明結構變量struct{intnum;charname[20];charsex;floatscore;}student1,student2;III.直接聲明結構變量5.1結構體變量的定義
廈門理工學院計算機科學與技術系7
幾點說明:結構體類型與結構體變量概念不同類型:不分配內存;
變量:分配內存
類型:不能賦值、存取、運算;
變量:可以(2)結構體可以嵌套
例:
structdate{intmonth;intday;intyear;};structstudent{intnum;charname[20];
structdatebirthday;}student1;numnamebirthdaymonthdayyear例:
structstudent{intnum;charname[20];structdate{intmonth;intday;intyear;}
birthday;}student1; numnamebirthdaymonthdayyearstructPoint{intx,y;};structImg{inttag;structImg*pimg;//正確,可以包含自身類型的指針
structImgimg;//錯誤,不能包含自身類型的變量};
廈門理工學院計算機科學與技術系8
structdate{intmonth;intday;intyear;};struct{intnum;charname[20];charsex;
structdatebirthday;floatscore;}student1,student2;表示結構變量成員的一般形式是:結構變量名.成員名例如:student1.num、student2.sex、student1.birthday.month、嵌套結構structStudentstudent1;charname[20];(3)結構類型中的成員名,可以與程序中的變量同名,它們代表不同的對象,互不干擾
廈門理工學院計算機科學與技術系9
結構體變量初始化賦值先定義結構體類型,再定義結構體變量時賦初值struct
結構體類型名初值表{……};struct結構體類型名變量名={成員1的值,…,成員n的值};
注意:賦初值時,{}中間的數據順序必須與結構體成員的定義順序一致,否則就會出現混亂。structStudentstu={"20020306","ZhangMing",'M',18,1,90};
nonamesexageclassnoscore√structStudentstu={18,"ZhangMing",'M',"20020306",1,90};
×structDate{intyear;//年
intmonth;//月
intday;//日};structStudent{charno[9];//學號
charname[20];//姓名
charsex;//性別
structDatebirthday;
//生日
unsignedintclassno;//班級
floatscore;//成績};structStudentstu={"20020306","ZhangMing",'M',{1986,12,10},1,90};
5.1結構體變量的賦值
廈門理工學院計算機科學與技術系10
結構體變量初始化賦值定義結構體類型的同時,定義結構體變量并賦初值struct[結構體類型名]{初值表
……}變量名={成員1的值,成員2的值,…,成員n的值};structDate
{intyear,month,day;}birthday={1986,12,10};
struct
{intyear,month,day;}birthday={1986,12,10};
或structStudent{charno[9];//學號
charname[20];//姓名
charsex;//性別
unsignedintage;//年齡
unsignedintclassno;//班級
floatgrade;//成績}stu={"20020306","ZhangMing",'M',18,1,90};
廈門理工學院計算機科學與技術系11
structStudentstu1;
strcpy(stu1.no,"20020306");strcpy(,"ZhangMing");stu1.sex='M';stu1.age=18;stu1.classno=1;stu1.grade=90;structStudentstu2;stu2=stu1;結構體變量在程序中賦值
如果在定義結構體變量時并未對其賦初始值,那么在程序中要對它賦值的話,就只能一個一個地對其成員逐一賦值,或者用已賦值的同類型的結構體變量對它賦值
逐一賦值利用已賦值的結構體變量賦值(同一結構體的不同變量之間)strcpy(stu2.no,stu1.no);strcpy(,);stu2.sex=stu1.sex;stu2.age=stu1.age;stu2.classno=stu1.classno;stu2.grade=stu1.grade;
廈門理工學院計算機科學與技術系12
student1student1.num=1;student1.name="ZhangZiLiang";student1.sex=’M’;printf("請輸入年齡:\n");scanf("%d",&student1.age);1ZhangZiLiangM用輸入語句或賦值語句來給結構體變量的各個成員賦值1818student2=student1;student21ZhangZiLiangM18
廈門理工學院計算機科學與技術系13
內存student3structstudentstudent3={3,"YaoMing",'M',90.5};
3YaoMingM定義時賦值的順序應與成員聲明時的順序一樣;允許初始化語句中的值的數目比結構體成員數目少。student3.numstudent3.sex90.5student3.score
廈門理工學院計算機科學與技術系14
例
structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}student1,student2;if(student1==student2)……..(
)引用規則結構體變量不能整體引用,只能引用變量成員引用方式:結構體變量名.成員名//非指針型結構體變量的引用可以將一個結構體變量賦值給另一個結構體變量結構體嵌套時逐級引用成員(分量)運算符結合性:從左向右例
structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}student1,student2;
student1.num=10;student1.score=85.5;student1.score+=student2.score;student1.age++;例
structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}student1,student2;printf(“%d,%s,%c,%d,%f,%s\n”,student1);(
)student1={101,“WanLin”,‘M’,19,87.5,“DaLian”};(
)結構體變量名.成員名.子成員名……最低級子成員名例
structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}student1,student2;student2=student1;(√)5.1結構體變量的引用
廈門理工學院計算機科學與技術系15
引用規則可以引用結構體成員的地址,也可以引用結構體變量的地址scanf(“%d”,&student1.num);printf(“%d”,&student1);它們要做什么?可以對結構體成員進行各種有關的運算student1.age++;If(student1.age==student2.age)printf(“thetwoareasolderaseachother.\n”);結構體變量的成員在引用時和其同類型的普通變量引用方法一致。
廈門理工學院計算機科學與技術系16
structstudent{intnum;charname[20];charsex;floatscore;}stu[30];元素為結構體類型的數組稱為結構體數組。在實際應用中,經常用結構體數組來表示具有相同數據結構體的一個群體。例如一個班的學員檔案,一個公司的職工檔案等。定義了一個結構體數組stu1,共有30個元素,stu[0]~stu[29]。每個數組元素都具有structstudent的結構體形式。5.2結構體數組
廈門理工學院計算機科學與技術系17
175.2結構體數組structstudent{intnum;charname[20];charsex;intage;floatscore;charaddress[50];}stu[3];structstudent{intnum;charname[20];charsex;intage;floatscore;charaddress[50];}stu;A、結構體數組定義
廈門理工學院計算機科學與技術系18
numnamesexagescoreaddress1001LinNinF1479103BeijingRoad1002ZhangFanM158046TangshanRoad1003WangYingF148610ZhongshanRoad18結構體數組示例5.2結構體數組
廈門理工學院計算機科學與技術系19
B、結構體數組初始化structstudent{intnum;charname[20];charsex;intage;floatscore;charaddress[50];}stu[3]={{1001,"LiNin",'M',14,79,"103BeijingRoad"},{1002,,"ZhangFan",'M',15,80,"46TangshanRoad"},{1003,"WangYing",'F',14,86,"10ZhongshanRoad"}};19
廈門理工學院計算機科學與技術系20
#include<stdio.h>voidmain(){structSTUD{charname[20];longnum;intage;charsex;floatscore;}stud[3];inti;for(i=0;i<3;i++){printf("InputallinformationabouttheNo.%dstudent:\n",i+1);gets(stud[i].name);scanf("%ld,%d,%c,%f",&stud[i].num,&stud[i].age,&stud[i].sex,&stud[i].score);getchar();}printf("\n%-20s%-10s%-4s%-4s%-6s\n","Name","Num","Age","Sex","Scores");for(i=0;i<3;i++) printf("%-20s%-10ld%-4d%-4c%-6.2f\n",stud[i].name,stud[i].num,stud[i].age,stud[i].sex,stud[i].score);}20例5.2由鍵盤輸入學生信息,并將其輸出。
廈門理工學院計算機科學與技術系21
5.5共用體學生的信息:學號姓名地址電話班級10010LiFuzhou125630722老師的信息:工號姓名地址電話職務10852WangXiamen35286prof.類別's'類別't'
廈門理工學院計算機科學與技術系22
使幾個不同的變量共占同一段內存的結構稱為共用體類型的結構。定義共用體類型變量的一般形式為:union共用體名{成員表列}變量表列;structstuTeacher{ intnum; charname[20];charaddr[50]; chartel[8];chartype;
unioninfo { charclass[10]; charjob[20]; };}1.共用體類型的定義
廈門理工學院計算機科學與技術系23
例如:uniondatauniondata
{inti;{inti;charch;或charch;floatf;floatf;}a,b,c;}; uniondataa,b,c;chif思考:變量a,b,c所占內存空間有多少?
廈門理工學院計算機科學與技術系24
對于共用體變量的定義:uniondata{ inti; charch; floatf;}a;成員的引用:a.ia.cha.f
廈門理工學院計算機科學與技術系25
voidmain(){ uniondata { inti; charch; floatf; }a; a.ch=65; a.i=28; printf("i=%d\n",a.i); printf("ch=%c\n",a.ch); printf("f=%4.1f\n",a.f);}對共用體中的i成員賦值,之前對成員ch賦值不再起作用,此時僅成員i起作用,其余成員不起作用。共用體變量和其各成員的地址均是一樣的。對共用體變量不能初始化,不能對共用體變量名賦值。共用體和結構體的比較
廈門理工學院計算機科學與技術系26
5.6枚舉類型如果一個變量只有幾種可能的值,可以把它定義成枚舉類型。所謂“枚舉”,顧名思義,就是把這種類型數據可取的值一一列舉出來。一個枚舉型變量取值僅限于列出值的范圍。枚舉數據類型通常的定義形式為:enum
枚舉類型名{
枚舉元素表};由多個標識符組成,標識符之間用逗號分開定義枚舉類型:enumweekday{sun,mon,tue,wed,thu,fri,sat};定義枚舉類型變量:enumweekday
today,nextday;enumweekday{sun,mon,tue,wed,thu,fri,sat}today,nextday;取值
廈門理工學院計算機科學與技術系27
enumweekday{sun,mon,tue,wed,thu,fri,sat}today,nextday;today=sun;nextday=mon;if(today==sat)nextday=sun;today=100;
√×
C編譯對枚舉元素實際上按整型常量處理,當遇到枚舉元素列表時,編譯程序就把其中第一個標識符賦0值,第二、三、…個標識符依此賦1,2,…。enumweekday{sun,mon,tue,wed,thu,fri,sat}today,nextday;0123456today=sun;printf("today=%d",today);運行結果:today=0
廈門理工學院計算機科學與技術系28
if(today==6)nextday=0;if(today==sat)nextday=sun;可以在枚舉類型定義時指定枚舉元素的值
enumweekday{sun,mon=5,tue,wed=10,thu,fri,sat};05610111213注意:枚舉元素是常量,在程序中不可對它賦值。例如:sun=0;mon=1;將產生錯誤。定義枚舉類型的好處:
用標識符表示數值,增加了程序的可讀性清晰不清晰
可限制變量的取值范圍
如today只能取sun~sat中的值
廈門理工學院計算機科學與技術系29
例題5-10枚舉元素序號Voidmain(){
enumweekday{sun,mon,tue,wed,thu,fri,sat}
a,b,c;a=sun;b=mon;c=tue;printf(“%d,%d,%d”,a,b,c);}思考:運行結果?
廈門理工學院計算機科學與技術系30
5.8程序設計舉例例5-11已知某年的元旦是星期幾,打印該年某一月份的日歷表#include"stdio.h"typedefstruct{ intyear,mon,day; enumweekday {nun,mon,tue,wed,thu,fri,sat}week;}daily;
voidmain(){dailydays;
printf("Whichyear?");scanf("%d",&days.year);/*哪年日歷*/printf("year%4d,Month1,day1isweekday?\n",days.year);printf("-Sun,1-Mon,2-Tue,3-Wed,4-Thu,5-Fri,6-Sat:");scanf("%d",&days.week);days.mon=days.day=1;montable(days);}30
廈門理工學院計算機科學與技術系31
monta
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 項目交付方式的選擇考量試題及答案
- 2025-2030年陶瓷纖維產業政府戰略管理與區域發展戰略研究咨詢報告
- 2025-2030年藥用乳糖市場市場現狀供需分析及投資評估規劃分析研究報告
- 2025-2030年網絡控制設備行業市場現狀供需分析及投資評估規劃分析研究報告
- 2025-2030年童鞋產業行業市場現狀供需分析及投資評估規劃分析研究報告
- 工程經濟理論與實踐結合試題及答案
- 2025-2030年真絲面料行業兼并重組機會研究及決策咨詢報告
- 2025-2030年電線行業市場發展分析及投融資與風險研究報告
- 2025-2030年電子政務行業市場現狀供需分析及投資評估規劃分析研究報告
- 2025-2030年電動自行車產業市場發展分析及發展趨勢與投資研究報告
- 人教版(人民教育出版社)小學美術三年級下冊教案(完整版)
- TSG ZF001-2006《安全閥安全技術監察規程》
- 嶺南版美術八年級上冊11課 傳統紋飾·民族風格(教學設計)
- 無芯卷紙雙百質量考試復習測試卷
- 售后服務授權書(2024版)
- (高清版)DB42T 2179-2024 裝配式建筑評價標準
- 矯形鞋墊產品技術要求標準2024年版
- 2024年江西省南昌市中考生物·地理合卷試卷真題(含答案逐題解析)
- Photoshop平面設計與制作智慧樹知到期末考試答案章節答案2024年黑龍江農業工程職業學院(松北校區)
- (教學設計)第2章第1節新知探究課7化學鍵與物質構成2023-2024學年新教材高中化學必修第二冊(魯科版2019)
- DL∕T 796-2012 風力發電場安全規程
評論
0/150
提交評論