C 語言程序設計(第2版)第七章_第1頁
C 語言程序設計(第2版)第七章_第2頁
C 語言程序設計(第2版)第七章_第3頁
C 語言程序設計(第2版)第七章_第4頁
C 語言程序設計(第2版)第七章_第5頁
已閱讀5頁,還剩31頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第七章結構體、共用體和枚舉

第一節一個典型的實際問題

第二節結構體數組與函數

第三節共用體數據類型

第四節枚舉數據類型第五節進階部分知識

陳孟建鄒玉金熊傳光編著電子工業出版社出版第一節一個典型的實際問題一、學生檔案數據類型1.結構體數據類型假設某一個班級的學生檔案如表7-1所示。從表7-1中可知,學生成績檔案表數據是由以下幾種類型組成的:姓名(Name):字符數組類型name[20];性別(Sex):字符型數據類型char;學號(No):數值型數據類型int;年齡(Age):數值型數據類型int;成績(score):數值型數據類型float;地址(Addr):字符數組類型sddr[30]。陳孟建鄒玉金熊傳光編著電子工業出版社出版表中的任何一行表示某學生的一條完整的信息資料,它是由姓名、性別、學號、年齡、總分成績和地址構成的。在C語言中表示這樣的一組信息資料時,可以采用結構體(Structure)數據類型來描述它,它相當于其他高級語言中的“記錄”概念。記錄是由若干個數據項構成的,每條記錄包含著一個完整的信息資源。數據項中可以由不同的數據類型構成,記錄在整張表格中是唯一的,它可以任意調換位置,但不可以有重復的記錄出現。陳孟建鄒玉金熊傳光編著電子工業出版社出版使用C語言來定義一個結構體數據類型,如下所示:

structstudent{charname[20];charsex;

intNo;

intage;floatscore;charaddr[30];};其中:(1)struct是關鍵字;(2)student是用戶自己定義的結構體類型變量名;(3)name[20]、sex、No、age、score、addr[30]是結構體類型中的數據項,具有不同類型的數據。陳孟建鄒玉金熊傳光編著電子工業出版社出版2.結構體數據模式定義格式定義一個結構體數據模式的一般格式為:struct<結構體名>{<數據項列表(或成員說明列表)>};在花括號內是該結構體中的各個數據項的具體內容,要求對該結構的所有的數據項的類型進行說明,結構數據項類型包含C語言中所有允許的變量類型,例如,int型、float型、char型、數組、指針等等,所有的數據項組成了一個結構體。陳孟建鄒玉金熊傳光編著電子工業出版社出版二、定義結構體類型變量的方法在C語言中,可以采用以下幾種方法來定義一個結構體類型變量:1.先定義結構再定義變量名上面已定義了一個學生成績檔案結構體數據類型structstudent,可以用它來定義變量。例如:

structstudentstu1,stu2;

定義了stu1和stu2為structstudent類型的變量,即它們具有structstudent類型相同的結構,如圖7-1所示。陳孟建鄒玉金熊傳光編著電子工業出版社出版變量stu1和stu2與標準類型變量定義的不同之處在于:變量stu1和stu2不僅要求指定變量為結構體類型,而且要求指定為某一個特定的結構體類型,不能只指定為“struct”型而不指定結構體名。而在定義變量為整型時,只需指定為int型即可。為了方便,在C語言中可以使用一個符號常來代表一個結構體類型。即在程序的開頭,用以下語句:

#defineSTUDENTstructstudent這樣在程序中,STUDENT與structstudent完全等效。即

STUDENT{charname[20];charsex;

intNo;

intage;floatscore;charaddr[30];};以后,可以直接使用STUDENT定義變量,例如:

STUDENTstu1,stu2;定義的結果與以前定義的相同。陳孟建鄒玉金熊傳光編著電子工業出版社出版2.在定義類型的同時定義變量在定義結構體數據類型時的同時來定義變量,其格式如下所示:

struct<結構體名>{<數據項列表>}

變量名列表;例如:

structstudent{charname[20];charsex;intNo;intage;floatscore;charaddr[30];}stu1,stu2;以上同樣定義了兩個structstudent類型的變量stu1和stu2,這樣stu1和stu2變量的類型就是結構體類型了,它可以用來賦一組數據的值,即賦一條記錄的數據。要注意的是,變量名列表中的變量,須用逗號進行分隔。陳孟建鄒玉金熊傳光編著電子工業出版社出版3.注意事項(1)結構體類型與結構體變量是不同的概念,不要混同。對結構體變量來說,在定義時一般先定義一個結構體類型,再定義結構體變量。(2)結構體變量可以用來進行運算、賦值,而結構體類型則不能進行運算,也不能對其進行賦值操作。(3)以結構體中的數據項,可以單獨使用,它的作用與地位相當于普通變量。(4)數據項本身也可以是一個結構體變量。例如:(5)數據項名可以與程序中的變量名相同,二者不代表同一對象。例如,程序中可以另定義一個變量age,它與structstudent中的age雖然是相同的名字,但意義卻是不同的。(6)結構體類型并非只能有一種,而可以有千千萬萬種,這是與基本類型所不同的。因此,結構體類型是由用戶根據需要自己設計定義的。(7)定義一個結構體類型,并不意味著系統分配一段內存單元來存放數據項成員,只有定義了變量后才有可能分配內存單元。系統沒有預先定義結構體類型,凡需使用結構體類型數據的,都必須在程序中自己定義。陳孟建鄒玉金熊傳光編著電子工業出版社出版三、結構體變量的初始化結構體變量定義后,需要將其具體的數據賦值并進行初始化工作,在編譯時就將它們賦給變量中相應的數據項成員,其格式如下:結構體變量名={表達式列表};四、結構體變量的引用1.引用結構體變量中的一個成員我們知道一個結構體變量是一個整體,要訪問它其中的一個數據項成員,必須先找到這個結構體變量,然后,再從中找出它其中的一個數據項成員。例如,要訪問stu1變量中的age,應寫成如下的形式:

stu1.age其中stu1為結構體變量名,“.”為數據項成員運算符,整個表達式表示要找查結構變量stu1中的age數據項成員的值。假設,stu1.age=18,則表示將18賦值給stu1結構體變量中的age數據項成員。陳孟建鄒玉金熊傳光編著電子工業出版社出版2.引用結構體變量中的全部成員可以將一個結構體變量作為一個整體賦給另一個具有相同類型的結構體變量。兩個結構體數據具有相同類型,即它們被同一個結構類型標識符說明或在同一個說明語句中定義。C語言允許兩個同類型的結構體變量之間進行相互賦值。在執行了“stu2=stu1”語句后,系統將stu1變量中各個數據項成員逐個賦給stu2中相應的各個數據項成員。顯然,這兩個結構體變量的類型必須相一致才行。也可以把一個結構體變量中的內嵌結構體類型數據項成員賦給另一個結構體變量的相應部分。陳孟建鄒玉金熊傳光編著電子工業出版社出版第二節結構體數組與函數一、結構體數組定義從以上幾個例子可以看出,一個結構體變量只能存放一個對象(例如,一個學生、一個職工等)的一組數據,即只能存放一條記錄的數據。在實際問題上,經常需要存放若干個組的數據,例如,一個班級有若干個學生,一個單位有若干個職工等。要解決這樣的問題,可以使用以下介紹的結構體數組。定義一個結構體數組可以有以下幾種方法:1.先定義結構再定義數組我們仍以學生成績為例:

structstudent{charname[9];

intNo;

intage;

intscore;};structstudentstu1[30]

以上定義了一個結構體數組stu1,它有30個元素,每一個元素都是structstudent類型的,這個數組在內存中占連續的一段存儲單元。如圖7-2所示。陳孟建鄒玉金熊傳光編著電子工業出版社出版2.在定義類型的同時定義數組在定義結構體數據類型時的同時來定義數組,其格式如下所示:

struct<結構體名>{<數據項列表>}

數組變量名列表;例如:

structstudent{charname[20];charsex;intNo;intage;floatscore;charaddr[30];}stu1[30],stu2[28];以上同樣定義了兩個structstudent類型的數組變量stu1和stu2,這樣stu1和stu2數組變量的類型就是結構體類型了,它可以用來賦若干個一組數據的值,即賦多條記錄的數據。要注意的是,數組變量名列表中的變量,須用逗號進行分隔。陳孟建鄒玉金熊傳光編著電子工業出版社出版二、結構體數組的初始化結構體數組變量定義后,需要將其具體的數據賦值并進行初始化工作,在編譯時就將它們賦給數組變量中相應的數據項成員,其格式如下:結構體數組變量名={表達式列表};三、結構體數組的引用1.引用結構體數組變量中的一個成員我們知道一個結構體數組變量是一個整體,要訪問它其中的一個數據項成員,必須先找到這個結構體變量,然后,再從中找出它其中的一個數據項成員。例如,要訪問stu1[i]數組變量中的score,應寫成如下的形式:

stu1[i].score其中stu1[i]為結構體數組變量名,當i的值為2時,即stu1[2].score的值是98。也就是結構體數組stu1中的第二個元素的score數據項值。陳孟建鄒玉金熊傳光編著電子工業出版社出版2.結構體數組元素賦值可以將一個結構體數組元素賦值給同一個結構體類型的數組中另一個元素,或賦給同一類型的變量。例如:

structstudent{charname[15];

intNo;

intage;

intscore[5];

inttot;}stu1[5],temp;以上程序定義了一個結構體數組stu1,它有5個元素,同時又定義了另一個結構體變量temp,則以下的幾個語句是合法的。temp=stu1[1];stu1[1]=stu1[2];stu1[1]=temp;陳孟建鄒玉金熊傳光編著電子工業出版社出版3.結構體數組元素輸入或輸出不能把結構體數組元素作為一個整體直接進行輸入或輸出操作。例如:

scanf("%d",&stu1[i]);printf(“%d”,stu1[i]);若需要輸入或輸出結構體數組元素,則須使用以下的語句:

scanf("%s%d%d",&stu1[i].name,&stu1[i].No,&stu1[i].age);

printf("%s%d%d",stu1[i].name,stu1[i].No,stu1[i].age);陳孟建鄒玉金熊傳光編著電子工業出版社出版歸結如下:(1)數組作為結構體成員,以上例子中name[3]數組便是一個成員。(2)靜態的結構體數組可以賦初值,從初值表中可以清楚地看出,給數組的12個元素賦值,每個數組元素都是一個結構體變量,實際上是對12個結構體變量賦值,每個結構體變量中有兩個成員,其中有一個成員是char型數組name[3],又用初始表給這個結構體成員數組的各個元素賦值,從而看出了結構體數組的元素與結構體成員的數組元素間的關系,它們是包含的關系。(3)結構體變量的成員作為函數的參數,在printf()函數中,其中4個參數都是以結構體變量的成員的形式出現的。(4)本例中結構體成員name[3]是字符數組,從賦值后知,它不是字符串,因此,在輸出它的內容時,沒有采用字符串的格式輸出,而是用輸出字符的格式逐一輸出。陳孟建鄒玉金熊傳光編著電子工業出版社出版四、結構體變量作函數參數結構體類型的變量可以作為函數的形參,調用時C語言直接將實參結構體變量的各個數據成員的值全部復制給形參的結構體變量,C語言要求實參結構體變量的類型與形參結構體變量的類型完全一致。陳孟建鄒玉金熊傳光編著電子工業出版社出版第三節共用體數據類型共用體數據類型與結構體數據類型一樣也是一種構造型的數據類型。共用體數據類型在定義上與結構體十分相似,但在實際應用上沒有結構體那樣普遍。在學習過程中與結構體進行類比,只要注意其區別就可以了。一、共用體的定義共用體數據類型是指將不同的數據項存放在同一段內存單元的一種構造型的數據類型,它與結構體相似,先有共用體模式,再定義具有某種模式的共用體變量,具體的格式如下所示:union<共用體名>{<共用體成員列表說明>;};陳孟建鄒玉金熊傳光編著電子工業出版社出版其中:(1)“union”是定義共用體的關鍵字;(2)“共用體名”是共用體的名稱,其規則與結構體名一樣;(3)“共用體成員列表說明”是指將共用體中的所有成員的數據類型逐一說明。例如:unionexam{inta;floatb;charc;}x;以上程序定義了一個共用體數據類型unionexam,一個共用體變量x。共用體定義的形式和結構體的形式很相似,但它們二者的概念是不同的。共用體變量中的各個成員共占內存中同一段空間如圖7-4所示。陳孟建鄒玉金熊傳光編著電子工業出版社出版二、共用體變量的定義共用體變量的定義與結構體變量的定義相似,即:1.先定義共用體再定義變量名union<共用體名>{<共用體成員列表說明>;};

union<共用體名><共用體變量名表>;例如:unionexam{inta;floatb;charc;};unionexamx,y;上面定義了x,y兩個共用體變量,它們具有inta、floatb、charc三個成員,分別為整型a、實型b和字符型c。陳孟建鄒玉金熊傳光編著電子工業出版社出版2.在定義類型的同時定義變量在定義共用體數據類型時的同時來定義變量,其格式如下所示:

union<共用體名>{<共用體成員列表說明>;

}

共用體變量名列表;例如:unionexam{inta;floatb;charc;}x,y;以上同樣定義了x,y兩個共用體數據類型的變量,這樣x和y變量的類型就是共用體類型了,它可以用來賦一組數據的值,即賦一條記錄的數據。要注意的是,變量名列表中的變量,須用逗號進行分隔。陳孟建鄒玉金熊傳光編著電子工業出版社出版3.不定義類型名而直接定義變量在定義共用體變量中,可以不定義類型名而直接定義變量名,其格式如下:

union{<共用體成員列表說明>;

}

共用體變量名列表;例如:union{inta;floatb;charc;}x,y;以上同樣也可定義x,y兩個共用體數據類型的變量。它們的功能和使用范圍與前相同。陳孟建鄒玉金熊傳光編著電子工業出版社出版三、共用體變量的引用共用體變量的成員表示方法與結構體變量成員的表示方法相同,即用“.”表示。例如:x.a,y.b,x.c等都是合法的引用方法。但要注意的是,一個共用體變量不是同時存放多個成員的值,而只能存放其中的一個值,不能用多個值賦給多個成員,這一點與結構體不同,這是因為共占內存的原因。例如:unionexam{inta;floatb;charc;}x,y;

x.a=3;

x.b=4.5;

x.c=’A';}陳孟建鄒玉金熊傳光編著電子工業出版社出版四、共用體變量的應用使用共用體數據類型變量可以有以下兩方面的作用:(1)在數據處理問題中,常用一個數據域存放不同的對象。例如,在一個學校的人員數據管理應用程序中,對“教師”則應登記“單位”,對“學生”則應登記“班級”,它們都是在同一欄目中。(2)便于不同類型間的轉換。例如,將一段內存空間中的內容拆分成幾部分使用。陳孟建鄒玉金熊傳光編著電子工業出版社出版第四節枚舉數據類型枚舉數據類型與結構體數據類型一樣也是一種構造型的數據類型。枚舉數據類型在形式上與結構體有相似之處,但在實質上卻完全不同。所謂“枚舉”數據類型,指的是這種類型的變量的值是指定的若干個名字之一。一、枚舉的定義枚舉是一個有名字的整型常量的有序集合,具有枚舉類型的變量的值只能取相應集合中的某一個值。枚舉定義的格式如下:enum<枚舉名>{<枚舉表>};其中:(1)“enum”是定義枚舉的關鍵字;(2)“枚舉名”是枚舉的名稱,其規則與結構體名一樣;(3)“枚舉表”是由若干個稱為枚舉符的元素組成的,枚舉符之間由逗號分隔。枚舉表中內容由程序設計者自己指定的,命名規則與標識符相同。陳孟建鄒玉金熊傳光編著電子工業出版社出版例如:enumweekday{sun,mon,tue,wed,thu,fri,sat};以上程序定義了一個枚舉數據類型enumweekday,在該枚舉數據類型中有以下枚舉表:sun表示星期日、mon表示星期一、tue表示星期二、wed表示星期三、thu表示星期四、fri表示星期五、sat星期六。如果我們定義一個變量為該枚舉類型,則該變量的值只能取以上數據中的某一個,即取某一星期中的某一天。陳孟建鄒玉金熊傳光編著電子工業出版社出版二、枚舉變量的定義枚舉變量的定義與結構體變量的定義相似,即:1.先定義枚舉再定義變量名enum<枚舉名>{<枚舉表>};

enum<枚舉名><枚舉變量名表>;例如:enumweekday{sun,mon,tue,wed,thu,fri,sat};enumweekdayd1,d2;上面定義了d1,d2兩個枚舉變量,它們具有sun,mon,tue,wed,thu,fri,sat

七個成員,在使用時只能取以上七個成員中的任意一個。陳孟建鄒玉金熊傳光編著電子工業出版社出版2.在定義類型的同時定義變量在定義枚舉數據類型時的同時來定義變量,其格式如下所示:

enum<枚舉名>{<枚舉表>}<枚舉變量名列表>;例如:enum

monthday

{january,february,march,april,may,june,july,august,september,october,november,december}moth1,moth2;以上同樣定義了moth1,moth2兩個枚舉數據類型的變量,這樣moth1和moth2變量的類型就是共用體類型了,它可以用來賦一個數據的值。陳孟建鄒玉金熊傳光編著電子工業出版社出版3.不定義類型名而直接定義變量在定義枚舉變量中,可以不定義類型名而直接定義變量名,其格式如下:

enum

{<枚舉表>};枚舉變量名列表;例如:enum

{red,yellow,blue,white,black}color1,color2;以上同樣也可定義color1和color2兩個枚舉數據類型的變量。它們的功能和使用范圍與前相同。陳孟建鄒玉金熊傳光編著電子工業出版社出版三、枚舉變量的引用枚舉變量定義后又可以直接引用了,例如:enum

monthday

{january=1,february,march,april,may,june,july,august,september,october,november=11,december}moth1,moth2;moth1=june;moth2=july;以上程序定義了枚舉變量moth1和moth2,并分別賦給它們june和july兩個值。這兩個值是以上枚舉列表中的一個值。陳孟建鄒玉金熊傳光編著電子工業出版社出版在使用時應注意以下幾點:(1)在定義枚舉數據類型時,枚舉表中的標識符并無固定的含義,只是一個符號。程序設計者僅僅是為了使程序可讀性提高才使用這些標識符的。這些標識符不是變量,不能改變其值。例如,以上程序中的january、february、march……不是變量,不能使用以下語句:january=13;scanf(“%s”,january);(2)它的值是一些整數,從花括號中第一個名字開始,各名字分別代表1,2,3,4,5,6,7,8,9,10,11,12。這是系統自動賦給的,例如:printf(“%d”,may);輸出的值是5。但是在定義枚舉數據類型時不能寫成:enum

monthday{1,2,3,4,5,6,7,8,9,10,11,12};必須使用符號january,february,march……,或其它的標識符。這些符號稱為枚舉常量,或稱枚舉元素。陳孟建鄒玉金熊傳光編著電子工業出版社出版(3)可以在定義枚舉數據類型時對枚舉常量進行初始化,例如:

enum

monthday{january=1,february,march,april,may,june,july,august,september,october,november=11,december};定義january=1,以后順序加1,november=11,december=12。也就是相當于定義了:january=1,february=2,march=3,april=4,may=5,june=6,july=7,august=8,september=9,october=10,november=11,december=12。(4)枚舉常量可以用來進

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論