理學(xué)結(jié)構(gòu)體與共用體_第1頁
理學(xué)結(jié)構(gòu)體與共用體_第2頁
理學(xué)結(jié)構(gòu)體與共用體_第3頁
理學(xué)結(jié)構(gòu)體與共用體_第4頁
理學(xué)結(jié)構(gòu)體與共用體_第5頁
已閱讀5頁,還剩28頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

廈門理工學(xué)院計算機科學(xué)與技術(shù)系1

1本章主要內(nèi)容結(jié)構(gòu)體類型與結(jié)構(gòu)體變量結(jié)構(gòu)體數(shù)組共用體枚舉類型typedef定義類型

廈門理工學(xué)院計算機科學(xué)與技術(shù)系2

結(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ù)對象,這些數(shù)據(jù)項稱為結(jié)構(gòu)的成員。

廈門理工學(xué)院計算機科學(xué)與技術(shù)系3

5.1結(jié)構(gòu)體的定義structstructurename{ datatypevariable1; datatypevariable2; ...};結(jié)構(gòu)體成員{};結(jié)構(gòu)體名structstudentintnum;charname[20];charsex;定義結(jié)構(gòu)體floatscore;C語言中的有效數(shù)據(jù)類型

廈門理工學(xué)院計算機科學(xué)與技術(shù)系4

structstudent{intnum;charname[20];charsex;floatscore;};numnamesexstudent結(jié)構(gòu)體定義放置在程序的開始部分,位于頭文件聲明之后;score結(jié)構(gòu)體定義僅描述了一個結(jié)構(gòu)的形式。如果要在程序里使用結(jié)構(gòu)體,需要聲明結(jié)構(gòu)體變量。5.1結(jié)構(gòu)體變量的定義

廈門理工學(xué)院計算機科學(xué)與技術(shù)系5

structstudent{intnum;charname[20];charsex;intage;floatscore;charaddress[50];};結(jié)構(gòu)體類型名結(jié)構(gòu)體各成員定義結(jié)構(gòu)體類型大括號外要加分號structstudentstu1,stu2;

系統(tǒng)不為結(jié)構(gòu)體類型的定義開辟內(nèi)存單元,只當(dāng)定義了結(jié)構(gòu)體變量后才會為變量分配相應(yīng)大小的內(nèi)存單元。stu1和stu2在內(nèi)存占幾個字節(jié)?聲明一個類型為student結(jié)構(gòu)的變量,將會為該變量分配內(nèi)存,大小是大于或等于其所有成員變量的大小之和。

廈門理工學(xué)院計算機科學(xué)與技術(shù)系6

聲明結(jié)構(gòu)變量structstudent{intnum;charname[20];charsex;floatscore;};structstudentstudent1,student2;I.先定義結(jié)構(gòu),再聲明結(jié)構(gòu)變量structstudent{intnum;charname[20];charsex;floatscore;}student1,student2;II.在定義結(jié)構(gòu)類型的同時聲明結(jié)構(gòu)變量struct{intnum;charname[20];charsex;floatscore;}student1,student2;III.直接聲明結(jié)構(gòu)變量5.1結(jié)構(gòu)體變量的定義

廈門理工學(xué)院計算機科學(xué)與技術(shù)系7

幾點說明:結(jié)構(gòu)體類型與結(jié)構(gòu)體變量概念不同類型:不分配內(nèi)存;

變量:分配內(nèi)存

類型:不能賦值、存取、運算;

變量:可以(2)結(jié)構(gòu)體可以嵌套

例:

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;//錯誤,不能包含自身類型的變量};

廈門理工學(xué)院計算機科學(xué)與技術(shù)系8

structdate{intmonth;intday;intyear;};struct{intnum;charname[20];charsex;

structdatebirthday;floatscore;}student1,student2;表示結(jié)構(gòu)變量成員的一般形式是:結(jié)構(gòu)變量名.成員名例如:student1.num、student2.sex、student1.birthday.month、嵌套結(jié)構(gòu)structStudentstudent1;charname[20];(3)結(jié)構(gòu)類型中的成員名,可以與程序中的變量同名,它們代表不同的對象,互不干擾

廈門理工學(xué)院計算機科學(xué)與技術(shù)系9

結(jié)構(gòu)體變量初始化賦值先定義結(jié)構(gòu)體類型,再定義結(jié)構(gòu)體變量時賦初值struct

結(jié)構(gòu)體類型名初值表{……};struct結(jié)構(gòu)體類型名變量名={成員1的值,…,成員n的值};

注意:賦初值時,{}中間的數(shù)據(jù)順序必須與結(jié)構(gòu)體成員的定義順序一致,否則就會出現(xiàn)混亂。structStudentstu={"20020306","ZhangMing",'M',18,1,90};

nonamesexageclassnoscore√structStudentstu={18,"ZhangMing",'M',"20020306",1,90};

×structDate{intyear;//年

intmonth;//月

intday;//日};structStudent{charno[9];//學(xué)號

charname[20];//姓名

charsex;//性別

structDatebirthday;

//生日

unsignedintclassno;//班級

floatscore;//成績};structStudentstu={"20020306","ZhangMing",'M',{1986,12,10},1,90};

5.1結(jié)構(gòu)體變量的賦值

廈門理工學(xué)院計算機科學(xué)與技術(shù)系10

結(jié)構(gòu)體變量初始化賦值定義結(jié)構(gòu)體類型的同時,定義結(jié)構(gòu)體變量并賦初值struct[結(jié)構(gòu)體類型名]{初值表

……}變量名={成員1的值,成員2的值,…,成員n的值};structDate

{intyear,month,day;}birthday={1986,12,10};

struct

{intyear,month,day;}birthday={1986,12,10};

或structStudent{charno[9];//學(xué)號

charname[20];//姓名

charsex;//性別

unsignedintage;//年齡

unsignedintclassno;//班級

floatgrade;//成績}stu={"20020306","ZhangMing",'M',18,1,90};

廈門理工學(xué)院計算機科學(xué)與技術(shù)系11

structStudentstu1;

strcpy(stu1.no,"20020306");strcpy(,"ZhangMing");stu1.sex='M';stu1.age=18;stu1.classno=1;stu1.grade=90;structStudentstu2;stu2=stu1;結(jié)構(gòu)體變量在程序中賦值

如果在定義結(jié)構(gòu)體變量時并未對其賦初始值,那么在程序中要對它賦值的話,就只能一個一個地對其成員逐一賦值,或者用已賦值的同類型的結(jié)構(gòu)體變量對它賦值

逐一賦值利用已賦值的結(jié)構(gòu)體變量賦值(同一結(jié)構(gòu)體的不同變量之間)strcpy(stu2.no,stu1.no);strcpy(,);stu2.sex=stu1.sex;stu2.age=stu1.age;stu2.classno=stu1.classno;stu2.grade=stu1.grade;

廈門理工學(xué)院計算機科學(xué)與技術(shù)系12

student1student1.num=1;student1.name="ZhangZiLiang";student1.sex=’M’;printf("請輸入年齡:\n");scanf("%d",&student1.age);1ZhangZiLiangM用輸入語句或賦值語句來給結(jié)構(gòu)體變量的各個成員賦值1818student2=student1;student21ZhangZiLiangM18

廈門理工學(xué)院計算機科學(xué)與技術(shù)系13

內(nèi)存student3structstudentstudent3={3,"YaoMing",'M',90.5};

3YaoMingM定義時賦值的順序應(yīng)與成員聲明時的順序一樣;允許初始化語句中的值的數(shù)目比結(jié)構(gòu)體成員數(shù)目少。student3.numstudent3.sex90.5student3.score

廈門理工學(xué)院計算機科學(xué)與技術(shù)系14

structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}student1,student2;if(student1==student2)……..(

)引用規(guī)則結(jié)構(gòu)體變量不能整體引用,只能引用變量成員引用方式:結(jié)構(gòu)體變量名.成員名//非指針型結(jié)構(gòu)體變量的引用可以將一個結(jié)構(gòu)體變量賦值給另一個結(jié)構(gòu)體變量結(jié)構(gòu)體嵌套時逐級引用成員(分量)運算符結(jié)合性:從左向右例

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”};(

)結(jié)構(gòu)體變量名.成員名.子成員名……最低級子成員名例

structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}student1,student2;student2=student1;(√)5.1結(jié)構(gòu)體變量的引用

廈門理工學(xué)院計算機科學(xué)與技術(shù)系15

引用規(guī)則可以引用結(jié)構(gòu)體成員的地址,也可以引用結(jié)構(gòu)體變量的地址scanf(“%d”,&student1.num);printf(“%d”,&student1);它們要做什么?可以對結(jié)構(gòu)體成員進(jìn)行各種有關(guān)的運算student1.age++;If(student1.age==student2.age)printf(“thetwoareasolderaseachother.\n”);結(jié)構(gòu)體變量的成員在引用時和其同類型的普通變量引用方法一致。

廈門理工學(xué)院計算機科學(xué)與技術(shù)系16

structstudent{intnum;charname[20];charsex;floatscore;}stu[30];元素為結(jié)構(gòu)體類型的數(shù)組稱為結(jié)構(gòu)體數(shù)組。在實際應(yīng)用中,經(jīng)常用結(jié)構(gòu)體數(shù)組來表示具有相同數(shù)據(jù)結(jié)構(gòu)體的一個群體。例如一個班的學(xué)員檔案,一個公司的職工檔案等。定義了一個結(jié)構(gòu)體數(shù)組stu1,共有30個元素,stu[0]~stu[29]。每個數(shù)組元素都具有structstudent的結(jié)構(gòu)體形式。5.2結(jié)構(gòu)體數(shù)組

廈門理工學(xué)院計算機科學(xué)與技術(shù)系17

175.2結(jié)構(gòu)體數(shù)組structstudent{intnum;charname[20];charsex;intage;floatscore;charaddress[50];}stu[3];structstudent{intnum;charname[20];charsex;intage;floatscore;charaddress[50];}stu;A、結(jié)構(gòu)體數(shù)組定義

廈門理工學(xué)院計算機科學(xué)與技術(shù)系18

numnamesexagescoreaddress1001LinNinF1479103BeijingRoad1002ZhangFanM158046TangshanRoad1003WangYingF148610ZhongshanRoad18結(jié)構(gòu)體數(shù)組示例5.2結(jié)構(gòu)體數(shù)組

廈門理工學(xué)院計算機科學(xué)與技術(shù)系19

B、結(jié)構(gòu)體數(shù)組初始化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

廈門理工學(xué)院計算機科學(xué)與技術(shù)系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由鍵盤輸入學(xué)生信息,并將其輸出。

廈門理工學(xué)院計算機科學(xué)與技術(shù)系21

5.5共用體學(xué)生的信息:學(xué)號姓名地址電話班級10010LiFuzhou125630722老師的信息:工號姓名地址電話職務(wù)10852WangXiamen35286prof.類別's'類別't'

廈門理工學(xué)院計算機科學(xué)與技術(shù)系22

使幾個不同的變量共占同一段內(nèi)存的結(jié)構(gòu)稱為共用體類型的結(jié)構(gòu)。定義共用體類型變量的一般形式為:union共用體名{成員表列}變量表列;structstuTeacher{ intnum; charname[20];charaddr[50]; chartel[8];chartype;

unioninfo { charclass[10]; charjob[20]; };}1.共用體類型的定義

廈門理工學(xué)院計算機科學(xué)與技術(shù)系23

例如:uniondatauniondata

{inti;{inti;charch;或charch;floatf;floatf;}a,b,c;}; uniondataa,b,c;chif思考:變量a,b,c所占內(nèi)存空間有多少?

廈門理工學(xué)院計算機科學(xué)與技術(shù)系24

對于共用體變量的定義:uniondata{ inti; charch; floatf;}a;成員的引用:a.ia.cha.f

廈門理工學(xué)院計算機科學(xué)與技術(shù)系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起作用,其余成員不起作用。共用體變量和其各成員的地址均是一樣的。對共用體變量不能初始化,不能對共用體變量名賦值。共用體和結(jié)構(gòu)體的比較

廈門理工學(xué)院計算機科學(xué)與技術(shù)系26

5.6枚舉類型如果一個變量只有幾種可能的值,可以把它定義成枚舉類型。所謂“枚舉”,顧名思義,就是把這種類型數(shù)據(jù)可取的值一一列舉出來。一個枚舉型變量取值僅限于列出值的范圍。枚舉數(shù)據(jù)類型通常的定義形式為:enum

枚舉類型名{

枚舉元素表};由多個標(biāo)識符組成,標(biāo)識符之間用逗號分開定義枚舉類型:enumweekday{sun,mon,tue,wed,thu,fri,sat};定義枚舉類型變量:enumweekday

today,nextday;enumweekday{sun,mon,tue,wed,thu,fri,sat}today,nextday;取值

廈門理工學(xué)院計算機科學(xué)與技術(shù)系27

enumweekday{sun,mon,tue,wed,thu,fri,sat}today,nextday;today=sun;nextday=mon;if(today==sat)nextday=sun;today=100;

√×

C編譯對枚舉元素實際上按整型常量處理,當(dāng)遇到枚舉元素列表時,編譯程序就把其中第一個標(biāo)識符賦0值,第二、三、…個標(biāo)識符依此賦1,2,…。enumweekday{sun,mon,tue,wed,thu,fri,sat}today,nextday;0123456today=sun;printf("today=%d",today);運行結(jié)果:today=0

廈門理工學(xué)院計算機科學(xué)與技術(shù)系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;將產(chǎn)生錯誤。定義枚舉類型的好處:

用標(biāo)識符表示數(shù)值,增加了程序的可讀性清晰不清晰

可限制變量的取值范圍

如today只能取sun~sat中的值

廈門理工學(xué)院計算機科學(xué)與技術(shù)系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);}思考:運行結(jié)果?

廈門理工學(xué)院計算機科學(xué)與技術(shù)系30

5.8程序設(shè)計舉例例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

廈門理工學(xué)院計算機科學(xué)與技術(shù)系31

monta

溫馨提示

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

評論

0/150

提交評論