結(jié)構(gòu)體共用體(人民郵電管銀枝主篇).ppt
《結(jié)構(gòu)體共用體(人民郵電管銀枝主篇).ppt》由會員分享,可在線閱讀,更多相關(guān)《結(jié)構(gòu)體共用體(人民郵電管銀枝主篇).ppt(81頁珍藏版)》請?jiān)谘b配圖網(wǎng)上搜索。
1、第八章結(jié)構(gòu)體、共用體,,本章內(nèi)容,8.1結(jié)構(gòu)體類型8.2結(jié)構(gòu)體變量8.3結(jié)構(gòu)體數(shù)組8.4共用體8.5枚舉類型8.6用typedef定義類型8.7本章小結(jié),8.1結(jié)構(gòu)體類型,任務(wù)提出:學(xué)生信息管理系統(tǒng)數(shù)據(jù)庫中,學(xué)生的信息包括學(xué)號、姓名、性別、出生日期、五門課程的成績及平均成績,如何定義一個數(shù)據(jù)類型。任務(wù)分析:在此例中,學(xué)生的學(xué)號、姓名、性別、出生日期、課程的成績他們的數(shù)據(jù)類型并不一致,其中的學(xué)號、姓名為字符型數(shù)組,性別為單個的字符型數(shù)據(jù),成績?yōu)閷?shí)型數(shù)據(jù),而出生日期又包括年月日三項(xiàng)。一個學(xué)生的學(xué)號、姓名、性別、出生年月日、成績等項(xiàng),這些項(xiàng)都與某一學(xué)生相聯(lián)系。如果將它們分別定義成互相獨(dú)立的簡單變量,
2、難以反映它們之間的內(nèi)在聯(lián)系。但如果把它們組織成一個組合項(xiàng),定義為另一種如下表所示的結(jié)構(gòu)體類型的數(shù)據(jù):,,結(jié)構(gòu)體類型的定義如下:structbirthday{intyear;intmonth;intday;};structstudent{charnum[7]charname[20];charsex;structbirthdaybir;floatscore[5];floataverage;};,8.1.1結(jié)構(gòu)體定義格式,struct結(jié)構(gòu)體名{數(shù)據(jù)類型1成員名1;數(shù)據(jù)類型2成員名2;......數(shù)據(jù)類型n成員名n;};如:structstudent{charnum[7];charname[20];c
3、harsex;floatscore;};,在以上定義中:,(1)“結(jié)構(gòu)體名”是用戶取的標(biāo)識符,是結(jié)構(gòu)體類型的標(biāo)志。如上例中的結(jié)構(gòu)體定義中student就是一個結(jié)構(gòu)體名。(2)大括弧內(nèi)是結(jié)構(gòu)體中的各個成員,由它們組成一個結(jié)構(gòu)體。如上例中的num、name、sex、score等都是成員名。(3)對每個成員必須作類型說明。數(shù)據(jù)類型可以是基本數(shù)據(jù)類型說明符,也可以是用戶已經(jīng)定義過的結(jié)構(gòu)體名,還可以是后面將要介紹的其它數(shù)據(jù)類型的類型說明符。類型說明的格式是:數(shù)據(jù)類型名成員名(4)成員名是用戶取的標(biāo)識符,是用來標(biāo)識所包含的成員名稱。成員名的命名規(guī)則與變量名相同。成員也稱為“域”,每一個成員也稱為結(jié)構(gòu)體中的
4、一個域。如在上例中的結(jié)構(gòu)體定義中,定義了一個名為student的結(jié)構(gòu)體,該結(jié)構(gòu)共有4個成員組成。第一個成員為num,整型變量;第二個成員為name,字符數(shù)組;第三個成員為sex,字符變量;第四個成員為score,實(shí)型變量。應(yīng)注意括號外面的分號“;”不能少。(5)結(jié)構(gòu)體定義可以嵌套,即某個結(jié)構(gòu)體成員的數(shù)據(jù)類型可以說明為另一個已定義過的結(jié)構(gòu)體型。,例:定義一個結(jié)構(gòu)體類型用來表示學(xué)生的基本情況,其中的每個學(xué)生的數(shù)據(jù)包括:學(xué)號、姓名、性別、年齡、成績、家庭地址等。,分析:該結(jié)構(gòu)體中,可將學(xué)號、姓名、家庭地址定義成字符型數(shù)組,性別定義成字符型數(shù)據(jù),年齡、成績定義實(shí)型數(shù)據(jù)。結(jié)構(gòu)體名取為“student”,
5、它包括num、name、sex、age、score、addr等不同類型的數(shù)據(jù)項(xiàng)。結(jié)構(gòu)體類型定義如下:structstudent{charnum[7];charname[20];charsex;intage;floatscore;charaddr[30];};,例:定義一個結(jié)構(gòu)體類型用來表示一個單位的職工檔案,職工檔案中包括:職工姓名、性別、年齡、工資等。,分析:該結(jié)構(gòu)體中,可將職工檔案中的職工姓名定義成字符型數(shù)組,性別定義成字符型數(shù)據(jù),年齡定義成整型數(shù)據(jù),工資定義實(shí)型數(shù)據(jù)。結(jié)構(gòu)體名取為“person”,它包括name、sex、age、wage等不同類型的數(shù)據(jù)項(xiàng)。結(jié)構(gòu)體類型定義如下:可定義如下的
6、結(jié)構(gòu)體:structperson{charname[20];charsex;intage;floatwage;};,8.1.2嵌套的結(jié)構(gòu)體類型定義方法,例:定義一個結(jié)構(gòu)體類型用來表示職工檔案,職工檔案中除和上例一樣包括職工姓名、性別、工資外,職工的出生日期要能體現(xiàn)年月日。分析:假設(shè)此結(jié)構(gòu)體類型名person1,其成員有職工姓名name、性別sex、出生日期bir、工資wage等五個成員。其中的職工姓名、性別、工資等成員的定義方法同上例一樣。而對于出生日期bir又包括三個部分year、month、day(分別對應(yīng)年、月、日),則要用嵌套的結(jié)構(gòu)體類型定義方法來定義。,,嵌套的結(jié)構(gòu)體類型定義如下:s
7、tructbirthday{intyear;intmonth;intday;};structperson1{charname[20];charsex;structbirthdaybir;floatwage;};這里,在定義結(jié)構(gòu)體類型person1時用到了基本數(shù)據(jù)類型外的結(jié)構(gòu)體類型birthday,此時結(jié)構(gòu)體類型birthday的定義必須出現(xiàn)在前面,否則就會出現(xiàn)“結(jié)構(gòu)體未定義”的錯誤。,8.1.3結(jié)構(gòu)體類型使用說明,1.當(dāng)用戶需要將一些不同類型但又相互聯(lián)系的數(shù)據(jù)放在一起時,就可以將它們定義成結(jié)構(gòu)體類型,以便于反映它們之間的相互聯(lián)系。2.結(jié)構(gòu)體定義中的花括號里面的每一個定義語句后面均要用分號“;”
8、作為語句結(jié)束標(biāo)記,花括號外也有一個分號“;”作為結(jié)構(gòu)體定義語句的結(jié)束標(biāo)記。3.結(jié)構(gòu)體是一種數(shù)據(jù)類型,其中的成員不是變量,系統(tǒng)也不會給成員分配內(nèi)存。4.已經(jīng)定義的某種結(jié)構(gòu)體可以作為一種數(shù)據(jù)類型,用來定義變量、數(shù)組、指針等。這時才會給定義的變量、數(shù)組、指針分配內(nèi)存。5.如在定義結(jié)構(gòu)體成員類型時要用到基本數(shù)據(jù)類型外的結(jié)構(gòu)體類型,即需嵌套定義時,一定要注意引用的結(jié)構(gòu)體類型名必須是已經(jīng)定義過的,否則就會出現(xiàn)“結(jié)構(gòu)體未定義”的錯誤。如上面例11.3,名為“birthday”的定義必須在結(jié)構(gòu)體“person1”的定義之前,否則就會出錯。,8.2結(jié)構(gòu)體變量,任務(wù)提出:學(xué)生信息管理系統(tǒng)數(shù)據(jù)庫中,學(xué)生信息包括學(xué)號
9、、姓名、性別、出生日期、五門課程的成績、平均成績等數(shù)據(jù),從鍵盤中輸入某學(xué)生的數(shù)據(jù)信息,并輸出該學(xué)生的所有信息。任務(wù)分析:前面已定義了一個名為student的結(jié)構(gòu)體,但只是指定了一個結(jié)構(gòu)體類型,它相當(dāng)于一個模型,其中并沒有具體的數(shù)據(jù),系統(tǒng)也不給它分配內(nèi)存單元。為了能在程序中使用結(jié)構(gòu)體類型的數(shù)據(jù),還應(yīng)當(dāng)定義結(jié)構(gòu)體類型的變量,并在其中存放具體的數(shù)據(jù)。如果在程序中已經(jīng)定義了某個結(jié)構(gòu)體,則在此后就可使用這種用戶自定義的數(shù)據(jù)類型來定義變量。上述問題的所需的類型變量的定義如下:structstudentstu;,,#include"stdio.h"#defineMAX25structbirthday{int
10、year;intmonth;intday;};structstudent{charnum[7];charname[20];charsex;structbirthdaybir;intscore[MAX2];floataverage;};,,main(){inti;structstudentstu;stu.average=0.0;scanf("%c",},,程序運(yùn)行情況如下:F↙1991,11,16↙6878887669↙100001李平↙則輸出結(jié)果為:學(xué)號:100001姓名:李平性別:F出生年月日:1991年11月16日五門課程的成績?yōu)椋?878887669平均成績?yōu)椋?5.80,8.2.1結(jié)構(gòu)
11、體變量的定義與初始化,結(jié)構(gòu)體變量的定義有以下三種方法:1、用結(jié)構(gòu)體類型名定義變量用結(jié)構(gòu)體類型名定義變量的一般格式:結(jié)構(gòu)體類型名變量名1,變量名2,…,變量名n其中結(jié)構(gòu)體類型名是已經(jīng)定義過的結(jié)構(gòu)體名,后面的各結(jié)構(gòu)體變量名之間用逗號分隔。這種方法也就是先定義結(jié)構(gòu)體類型再定義變量名。例如:structstudent{charnum[7];charname[20];charsex;intage;floatscore;charaddr[30];};,,也可以用宏定義使用一個符號常量來表示一個結(jié)構(gòu)體類型名。例如,在程序的前面有宏定義:#defineSTUstructstudent則以上的結(jié)構(gòu)體及變量定義可
12、修改為:structstudent{charnum[7];charname[20];charsex;intage;floatscore;charaddr[30];};STUstudent1,student2;,,在定義變量的同時,可以對變量賦初值,例如上面的變量定義語句可以改為如下語句:structstudentstudent1={"10001","ZhangXin",M,19,90.5,"Shanghai"},student2={10002,"WangLi",F,20,98,"Beijing"};定義結(jié)果如下表所示:在定義了結(jié)構(gòu)體變量后,系統(tǒng)會為之分配內(nèi)存單元。例如student1和stud
13、ent2在內(nèi)存中各占64個字節(jié)(7+20+1+2+4+30=64)。應(yīng)當(dāng)注意,將一個變量定義為基本數(shù)據(jù)類型與將一個變量定義成結(jié)構(gòu)體類型的方法是不同的,后者不僅要求指定結(jié)構(gòu)體類型,而且要求指定為某一特定的結(jié)構(gòu)體類型。,,2、定義結(jié)構(gòu)體類型的同時定義變量這種定義的一般格式為:struct結(jié)構(gòu)體名{數(shù)據(jù)類型1成員名1;數(shù)據(jù)類型2成員名2;..數(shù)據(jù)類型n成員名n;}變量名表列;例如,為兩個學(xué)生信息定義2個變量,程序段如下structstudent{charnum[7];charname[20];charsex;intage;floatscore;charaddr[30];}student1,stude
14、nt2;,,3、定義無名結(jié)構(gòu)體類型的同時定義變量這種定義的一般格式為:struct{數(shù)據(jù)類型1成員名1;數(shù)據(jù)類型2成員名2;..數(shù)據(jù)類型n成員名n;}變量名表列;例如:struct{charnum[7];charname[20];charsex;intage;floatscore;charaddr[30];}student1,student2;,,或直接為:struct{charnum[7];charname[20];charsex;intage;floatscore;charaddr[30];}student1={"10001","ZhangXin",M,19,90.5,"Shanghai"
15、},student2={10001,"WangLi",F,20,98,"Beijing"};即定義的同時給變量賦初值。這種方法是將類型定義和變量定義同時進(jìn)行,但是結(jié)構(gòu)體類型的名稱省略了,以后將無法使用這種結(jié)構(gòu)體來定義其它的變量。,關(guān)于結(jié)構(gòu)體類型,有幾點(diǎn)說明:,(1)類型和變量是兩個不同的概念。只能對變量賦初值、存取或運(yùn)算,而不能對一個類型賦值、存取或運(yùn)算。對類型不分配內(nèi)存空間,對變量卻要分配內(nèi)存空間。(2)對結(jié)構(gòu)體中的變量成員(即“域”),可以單獨(dú)使用,其作用與地位相當(dāng)于普通變量。(3)成員也可以是一個結(jié)構(gòu)體變量。此時即構(gòu)成了嵌套的結(jié)構(gòu)。例如:structdate{intmomth;intda
16、y;intyear;};structstudent{charnum[7];charname[20];charsex;intage;structdatebirthday;/*birthday是structdate類型*/charaddr[30];}student1,student2;(4)成員名可以與程序中的變量名同,二者不代表同一對象。例如,程序中可以另定義一個變量num,它與structstudent中的num是兩回事,互不干擾。但初學(xué)者應(yīng)盡量不要這樣使用,以防使用不小心時相混。,8.2.2結(jié)構(gòu)體成員的引用,1、結(jié)構(gòu)體變量成員的引用格式為:結(jié)構(gòu)體變量名.成員名其中的“.”稱為成員運(yùn)算符,其運(yùn)
17、算的優(yōu)先級別是最高的,和圓括號“()”、下標(biāo)運(yùn)算符“[]”是同一級別的,運(yùn)算順序是自左向右。如:student1.num表示student1中的num(學(xué)號)項(xiàng)。由于該成員是一字符型數(shù)組類型的,不能用賦值方法給此成員賦值,例如:student1.num="10001";是不合法。正確的方法是把“student1.num”看作一個整體,用字符串復(fù)制的方法,如:strcpy(student1.num,"10001");,,2、引用結(jié)構(gòu)體變量應(yīng)遵循的規(guī)則(1)不能將一個結(jié)構(gòu)體變量作為一個整體變量進(jìn)行輸入輸出,只能對結(jié)構(gòu)體變量中的各個成員分別進(jìn)行輸入輸出。例如,前面已定義了student1和stude
18、nt2為結(jié)構(gòu)體變量并且它們也已有了初值。不能這樣引用:printf("%s,%s,%c,%d,%f,%s\n",student1);(2)如果某個結(jié)構(gòu)體類型的變量成員的數(shù)據(jù)類型又是一個結(jié)構(gòu)體類型,則只能對最低級的成員進(jìn)行賦值、輸入輸出以及運(yùn)算。外層結(jié)構(gòu)體類型的變量成員是不能單獨(dú)引用的。這種嵌套的結(jié)構(gòu)體變量成員的引用方法是逐級找到最低級的成員才能使用。例如對具有兩層的結(jié)構(gòu)體變量名的引用為:外層結(jié)構(gòu)體類型變量名.外層成員名.內(nèi)層成員名如上節(jié)已定義過的結(jié)構(gòu)體變量student1,可以這樣訪問各成員:student1.numstudent1.birthday.month,,(3)結(jié)構(gòu)體變量的成員可以像
19、普通變量一樣進(jìn)行各種運(yùn)算(參與運(yùn)算時注意其類型)。如:student1.score=student2.score+10;sum=student1.score+student2.score;student1.age++;++student2.age;(4)可以引用結(jié)構(gòu)體變量成員的地址,其引用格式為:charname[20];charsex;floatscore[3];}x={"10001","ZhangXin",M,68,89,78};printf("學(xué)號:%s\n姓名:%s\n性別:%c\n",x.num,x.name,x.sex);printf("成績:%.2f、%.2f、%.2f、\n",
20、x.score[0],x.score[1],x.score[2]);getch();},用賦值語句等給結(jié)構(gòu)體變量成員賦值:,#includemain(){/*定義一結(jié)構(gòu)體類型*/……/*定義一結(jié)構(gòu)體類型的變量*/structstudentx;/*給結(jié)構(gòu)體類型的變量x賦值*/strcpy(x.num,"100001");strcpy(x.name,"ZhangXin");x.sex=M;x.score[0]=68;x.score[1]=89;x.score[2]=78;/*輸出結(jié)果*/……getch();},例:嵌套的結(jié)構(gòu)體變量成員的引用舉例,#include#includestructbirt
21、hday{intyear;intmomth;intday;};structperson{charname[20];charsex;structbirthdaybir;floatwage;}x;,,main(){strcpy(x.name,"gu");x.sex=F;x.bir.year=1972;x.bir.month=10;x.bir.day=3;x.wage=2880.0;printf("姓名:%s,性別:%c,工資:%f\n",x.name,x.sex,x.wage);printf("出生年、月、日%4d.%2d.%2d\n",x.bir.year,x.bir.month,x.bir.d
22、ay);getch();},8.2.3結(jié)構(gòu)體與函數(shù),可以將一個結(jié)構(gòu)體變量的值傳遞給另一個函數(shù),在函數(shù)間傳遞結(jié)構(gòu)體型的數(shù)據(jù)和傳遞其它類型數(shù)據(jù)的方法完全相同,可以使用全局外部變量、返回值、形式參數(shù)與實(shí)際參數(shù)結(jié)合方式(參數(shù)傳遞方式又分為值傳遞和地址傳遞兩種)。將一個結(jié)構(gòu)體變量的值傳給另一個函數(shù)的具體用法如下:1、使用返回值方式傳遞結(jié)構(gòu)體數(shù)據(jù)函數(shù)的返回值必須是某種已定義過的結(jié)構(gòu)體指針(即指向結(jié)構(gòu)體變量的指針),利用“return(表達(dá)式);”語句返回的表達(dá)式值也必須是同種結(jié)構(gòu)體型的指針,該指針指向的數(shù)據(jù)則是同一種結(jié)構(gòu)體型的數(shù)據(jù);而接受返回值的變量也必須是這種結(jié)構(gòu)體型的指針變量。,,2、使用形式參數(shù)和實(shí)
23、際參數(shù)結(jié)合方式傳遞結(jié)構(gòu)體型數(shù)據(jù)要注意是單向的值傳遞還是雙向的地址傳遞。使用單向的值傳遞方式,通常形式參數(shù)要說明成某種結(jié)構(gòu)體型,而對應(yīng)的實(shí)際參數(shù)必須是同一種結(jié)構(gòu)體型。如果使用雙向的地址傳遞方式,要區(qū)分不同的情況,如果形式參數(shù)被說明成某種結(jié)構(gòu)體型的指針變量,則實(shí)際參數(shù)必須是同一種結(jié)構(gòu)體型的變量地址、數(shù)組名或已賦值的指針變量等;如果形式參數(shù)是某種結(jié)構(gòu)體型數(shù)組,則對應(yīng)的實(shí)際參數(shù)必須是同一種結(jié)構(gòu)體型的數(shù)組或指針變量。(關(guān)于指針部分內(nèi)容將在后面講解),用結(jié)構(gòu)體變量的成員作參數(shù)。例如,用student1.num或student1.name作函數(shù)的實(shí)參,將實(shí)參值傳給形參。其用法和普通變量作實(shí)參的用法一樣,屬于
24、“值傳遞”方式。只是要注意實(shí)參和形參的類型保持一致。用結(jié)構(gòu)體變量作實(shí)參。采用的是“值傳遞”的方式,將結(jié)構(gòu)體變量所占的內(nèi)存單元的內(nèi)容全部順序傳遞給形參。形參也必須是同類型的結(jié)構(gòu)體變量。在函數(shù)的調(diào)用期間形參也要占用內(nèi)存單元。此外由于采用的是值傳遞方式,如果在調(diào)用過程中改變了形參的值,則該值不能返回主調(diào)函數(shù),這是很不方便的。因此這種方法一般很少用。,,【例8-6】用結(jié)構(gòu)體變量作函數(shù)參數(shù)#include#includestructstudent{charnum[7];charname[20];charsex;floatscore[3];};voidprint(structstudentx){print
25、f("學(xué)號:%s\n姓名:%s\n性別:\n",x.num,x.name,x.sex);printf("成績1:%f\n",x.score[0]);printf("成績2:%f\n",x.score[1]);printf("成績3:%f\n",x.score[2]);},,main(){voidprint(structstudent);structstudentx;strcpy(x.num,"10002");strcpy(x.name,"zhangshang");x.sex=F;x.score[0]=85;x.score[1]=74;x.score[2]=90;print(x);getch()
26、;},【例8-7】用全局外部變量方式傳遞數(shù)據(jù),structstudent3/*定義一個結(jié)構(gòu)體student3*/{charnum[7];charname[20];intage;}x;/*定義結(jié)構(gòu)體型的外部變量x*/voidprintin()/*無參無返回值的函數(shù)*/{scanf("%s",x.num);scanf("%s",x.name);scanf("%d",},【例8-8】學(xué)院圖書館要購進(jìn)一批書籍,共4種。編寫程序,從鍵盤輸入書名、購書數(shù)量、書的單價,請編寫程序,計(jì)算每一種書的總金額,和所有要購書籍的總金額,輸出購書清單,,輸出的購書清單的格式如下:購書清單:書名數(shù)量單價合計(jì)…………………
27、………………………………購書金額總計(jì):……#include#include#includestructBookLib{charname[12];intnum;floatprice;floatSumMoney;};voidlist(structBookLibStuBook);,,main(){structBookLibBook[4];inti;floatTotal=0;printf("請輸入4本要購進(jìn)的書籍信息:書名數(shù)量單價\n");for(i=0;i<4;i++){scanf("%s",Book[i].name);/*輸入書名*/scanf("%d%f",},,運(yùn)行結(jié)果如下:請輸入4本要購進(jìn)的
28、書籍信息:書名數(shù)量單價:計(jì)算機(jī)基礎(chǔ)1018.5數(shù)學(xué)1015C語言1516英語2017購書清單:書名數(shù)量單價合計(jì)計(jì)算機(jī)基礎(chǔ)1018.5185.00數(shù)學(xué)1015.00150.00C語言1516.00160.00英語2017.00340.00購書金額總計(jì):915.00,8.3結(jié)構(gòu)體數(shù)組,任務(wù)提出:假設(shè)一個班有50個學(xué)生,每個學(xué)生信息包括學(xué)號、姓名、性別、出生日期、五門課程的成績及平均成績等數(shù)據(jù),從鍵盤中輸入50個學(xué)生的數(shù)據(jù)信息,按平均成績排序后輸出所有學(xué)生的信息表。任務(wù)分析:前面已定義了一個名為student的結(jié)構(gòu)體,還定義了結(jié)構(gòu)體類型的變量,并可在其中存放具體的數(shù)據(jù)。用此方法處理單個或幾個學(xué)生數(shù)據(jù)
29、時時是可行的,但若學(xué)生數(shù)較多,用前面單個定義結(jié)構(gòu)體變量來存放數(shù)據(jù)是很不方便的。將學(xué)生數(shù)定義成符號常量:#defineMAX150則可定義如下的結(jié)構(gòu)體數(shù)組:structstudentstu[MAX1];,,#defineMAX150#defineMAX25structbirthday{intyear;intmonth;intday;};structstudent{charnum[7];charname[20];charsex;structbirthdaybir;floatscore[MAX2];floataverage;};,,main(){inti,j,k;chartnum[7],tname[
30、20],tsex;inttbir;floattscore;structstudentstu[MAX1];for(i=0;i 31、,tnum);strcpy(tname,stu[i].name);strcpy(stu[i].name,stu[i+1].name);strcpy(stu[i+1].name,tname);tsex=stu[i].sex;stu[i].sex=stu[i+1].sex;stu[i+1].sex=tsex;tbir=stu[i].bir.year;stu[i].bir.year=stu[i+1].bir.year;stu[i+1].bir.year=tbir;tbir=stu[i].bir.month;stu[i].bir.month=stu[i+1].bir.month;stu[i+1].bi 32、r.month=tbir;tbir=stu[i].bir.day;stu[i].bir.day=stu[i+1].bir.day;stu[i+1].bir.day=tbir;for(k=0;k 33、d/%d/%d",stu[i].bir.year,stu[i].bir.month,stu[i].bir.day);for(j=0;j 34、8,60}},{"200003","徐強(qiáng)",M,{85,76,69}}};,,2、定義結(jié)構(gòu)體的同時定義結(jié)構(gòu)體數(shù)組并賦初值如:structstudent{charnum[7];charname[20];charsex;floatscore[3];}s[3]={{"200001","錢企",‘M’,{65,87,90}},{"200002","李小艷",‘F’,{75,98,60}},{"200003","徐強(qiáng)",‘M’,{85,76,69}}};,,3、定義無名結(jié)構(gòu)體的同時定義結(jié)構(gòu)體數(shù)組并賦初值如:struct{charnum[7];charname[20];charsex;floatscore 35、[3];}s[3]={{"200001","錢企",‘M’,{65,87,90}},{"200002","李小艷",‘F’,{75,98,60}},{"200003","徐強(qiáng)",‘M’,{85,76,69}}};,,定義了一個結(jié)構(gòu)體數(shù)組,就可以使用這個數(shù)組中的元素。對結(jié)構(gòu)體數(shù)組,可以引用其成員,引用方法和普通變量一樣。也可以引用結(jié)構(gòu)體數(shù)組元素的地址。結(jié)構(gòu)體數(shù)組元素的引用格式如下:結(jié)構(gòu)體數(shù)組名[下標(biāo)].成員名,例:設(shè)有三個候選人,每次輸入一個候選人的名字,最后輸出各人的得票結(jié)果。,分析:該問題要求編一程序,實(shí)現(xiàn)候選人得票的統(tǒng)計(jì)。程序中涉及到兩種數(shù)據(jù):候選人的姓名及候選人的得票數(shù)。定義一個結(jié)構(gòu)體數(shù) 36、組用來存放此數(shù)據(jù):structperson{charname[20];intcount;}leader[3]={"ZhangXin",0,"LiShan",0,"Wanpin",0};此結(jié)構(gòu)體數(shù)組有三個元素,每個元素包含兩個成員name(姓名)、count(票數(shù))。在定義時使之初始化,使三位候選人的票數(shù)都先設(shè)為零。為方便起見,假設(shè)參加選舉的代表共有10人,用符號常量定義:#definenumber10,,#include#definenumber10structperson{charname[20];intcount;}leader[3]={"ZhangXin",0,"LiShan",0,"W 37、anpin",0};main(){inti,j;charleader_name[11];for(i=0;i 38、名、號碼、性別、職業(yè)、班級。教師的數(shù)據(jù)中包括:姓名、號碼、性別、職業(yè)、職務(wù)。要求:當(dāng)輸入人員的數(shù)據(jù)時能打印出他們的資料,并把資料放在同一表格中。任務(wù)分析:為簡化程序,這里只給出兩個人員的數(shù)據(jù),假設(shè)兩人的數(shù)據(jù)如下:其中:“sex”項(xiàng)中,“F”表示“女”,“M”表示“男”;“job”項(xiàng)中,“S”表示“學(xué)生”,“T”表示“教師”;第五項(xiàng)中,若前面是學(xué)生,則表示“班級”,若是教師,則表示“職務(wù)”。,,struct/*定義一個無名結(jié)構(gòu)體*/{charnum[7];charname[20];charsex;charjob;union/*定義一個無名共用體*{charclas[10];charpositio 39、n[10];}pos;/*定義一共用體變量pos,它同時又是結(jié)構(gòu)體中的一成員*/}person[2];/*定義一外部結(jié)構(gòu)體數(shù)組,內(nèi)含兩個數(shù)組元素*/main(){intn,i;for(i=0;i<2;i++){scanf("%c%c%s%s",,,if(person[i].job==S)scanf("%s",person[i].pos.clas);elseif(person[i].job==T)scanf("%s",person[i].pos.position);elseprintf("inputerror!");}printf("編號:姓名性別職業(yè)班級/職務(wù)\n");for(i=0;i<2; 40、i++){if(person[i].job==S)printf("%-10s,%-25s,%-6c,%-12s\n",person[i].num,person[i].name,person[i].sex,person[i].job,person[i].pos.clas);elseif(person[i].job==T)printf("%-10s,%-25s,%-6c,%-12s\n",person[i].num,person[i].name,person[i].sex,person[i].job,person[i].pos.position);}getch();},8.4.1共用體的定義,共用 41、體定義的一般格式如下:union共用體名{數(shù)據(jù)類型1成員名1;數(shù)據(jù)類型2成員名2;..數(shù)據(jù)類型n成員名n;};其中:(1)共用體名是用戶自己取的標(biāo)識符;(2)數(shù)據(jù)類型可以是基本數(shù)據(jù)類型,也可以是已定義過的結(jié)構(gòu)體、共用體等其它數(shù)據(jù)類型;(3)成員名是用戶自己取的標(biāo)識符,用來標(biāo)識所包含的成員名稱;例如:uniondata{inti;charc;floatf;};,注意幾點(diǎn):,(1)右花括號后面的分號“;”不能少,它是共用體定義語句的結(jié)束標(biāo)志;(2)共用體中的每個成員所占的內(nèi)存單元都是連續(xù)的,而且都是從分配的連續(xù)內(nèi)存單元的第一個內(nèi)存單元開始存放。因此,一共用體數(shù)據(jù)的所有成員的首地址都是相同的。(3) 42、共用體所占的內(nèi)存單元等于最長的成員的長度,這一點(diǎn)和結(jié)構(gòu)體是不同的。結(jié)構(gòu)體所占的內(nèi)存單元是各成員所占的內(nèi)存長度之和,每個成員分別占有自己的內(nèi)存單元。,8.4.2共用體變量的定義,在定義了某個共用體類型后,就可以使用它來定義相應(yīng)的變量、數(shù)組和指針等。共用體變量的定義方法和結(jié)構(gòu)體相同,也有三種方法:一是先定義共用體,再定義共用體類型的變量;二是定義的同時定義共用體和變量;三是定義無名共用體的同時定義變量。例如:uniondata{inti;charc;floatf;};uniondataa,b,c;或是:uniondata{inti;charc;floatf;}a,b,c;或是:union{inti 43、;charc;floatf;}a,b,c;,8.4.3共用體變量的引用,共用體變量成員引用的一般格式如下:共用體變量名.成員名其中的“.”和結(jié)構(gòu)體中的成員運(yùn)算符“.”相同。如前面定義了a,b,c為共用體變量,則在程序中可以這樣引用:a.i=12;scanf("%c\n",共用體成員的地址也可以引用,其引用格式為:intn;charc;};main(){unionmembtag;tag.n=18;tag.c=T;tag.v=36.7;printf("tag.v=%6.2f\ntag.n=%4d\ntag.c=%c\n",tag.v,tag.n,tag.c);},例:定義自定義類型structVA 44、RIANT,從鍵盤輸入數(shù)據(jù)類型(1-整數(shù),2-單精度浮點(diǎn)數(shù),3-雙精度浮點(diǎn)數(shù)),然后從鍵盤輸入該類型的數(shù)據(jù)存儲到共用體成員變量中。,structVARIANT{intvt;/*當(dāng)前的結(jié)構(gòu)體存儲的數(shù)據(jù)類型*/union{unsignedintiVal;/*int型數(shù)據(jù)*/floatfVal;/*float型數(shù)據(jù)*/doubledVal;/*double型數(shù)據(jù)*/}u;/*共用體類型成員變量u,存儲當(dāng)前的數(shù)據(jù)信息共用體定義*/};,,voidmain(){structVARIANTvarValue;printf("請輸入數(shù)據(jù)類型,然后輸入此數(shù)據(jù)(1-整數(shù),2-單精度浮點(diǎn)數(shù),3-雙精度浮點(diǎn)數(shù))"); 45、scanf("%d",},8.5枚舉類型,任務(wù)提出:口袋中有紅、黃、藍(lán)、白、黑5種顏色的球若干。從口袋中取出3個球,問得到3種不同顏色的球的可能取法,打印出每種組合的3種顏色。任務(wù)分析:設(shè)取出球?yàn)閕、j、k。它分別是5種色球之一,并要求i≠j≠k。用n累計(jì)得到不同色球的次數(shù)。用三重循環(huán)來實(shí)現(xiàn):外循環(huán)使第一個球i從red變到black,第二層循環(huán)使第二個球j從red變到black,若i和j同色則不可取,只有i和j不同色(i≠j)時才需要繼續(xù)找第三個球,此時內(nèi)循環(huán)使第三個球k從red變到black,但也要求第三個球既不能和第一個球同色,也不能和第二個球同色,即k≠i且k≠j。如果滿足以上條件就輸出 46、這種3色的組合方案,同時n加1。外循環(huán)執(zhí)行完畢,全部方案也就輸出完畢。最后輸出總數(shù)n。,,main(){enumcolor/*定義一種枚舉類型*/{red,yellow,blue,white,black}i,j,k,pri;intn=0,loop;for(i=red;i<=black;i++)for(j=red;j<=black;j++)if(i!=j)for(k=red;ksun)…枚舉值的比較規(guī)則是按其在定義時的值進(jìn)行比較。,,3、在循環(huán)中用枚舉變量或數(shù)組元素控制循環(huán)如:enumcolor{red,yellow,blue,white,black}i;intj=0;for(i=red;i<= 47、black;i++)j++;printf("j=%d\n",j);則此程序段的結(jié)果為:j=5。,例:使用枚舉定義一年中的12個月,在輸入月份數(shù)時顯示對應(yīng)月份的天數(shù)。(為方便起見,這里假設(shè)該年不是閆年),#includeenummonths{Jan=1,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec};main(){enummonthsmonth;intn;printf("請輸入月份數(shù):\n");scanf("%d",},例:輸入兩個整數(shù),依次求出它們的和、差、積并輸出結(jié)果。要求用枚舉類型數(shù)據(jù)來處理和、差、積的判斷。,分析:三種運(yùn)算定義成枚舉成員,定義方式 48、如下:enum{plus,minus,times}i;在此基礎(chǔ)上再定義兩個整數(shù),用x、y表示,從鍵盤中輸入兩個整數(shù)后,進(jìn)行和、差、積運(yùn)算。完整的程序清單如下:,,main(){enum{plus,minus,times}i;intx,y;scanf("%d,%d",},8.6用typedef定義類型,在現(xiàn)實(shí)生活中,信息的概念可能是長度,數(shù)量和面積等。在C語言中,信息被抽象為int、float和double等基本數(shù)據(jù)類型。從基本數(shù)據(jù)類型名稱上,不能夠看出其所代表的物理屬性,并且int、float和double為系統(tǒng)關(guān)鍵字,不可以修改。為了解決用戶自定義數(shù)據(jù)類型名稱的需求,C語言中引入類型重定義語 49、句typedef,可以為數(shù)據(jù)類型定義新的類型名稱,從而豐富數(shù)據(jù)類型所包含的屬性信息。,8.6.1用typedef定義類型的格式,用typedef定義類型的格式typedef原類型名用戶自定義類型名;其中,typedef為系統(tǒng)保留字,“原類型名”為已知數(shù)據(jù)類型名稱,包括基本數(shù)據(jù)類型和用戶自定義數(shù)據(jù)類型,“用戶自定義類型名”是一標(biāo)識符,為新的類型名稱。例如:typedefdoubleLENGTH;typedefunsignedintCOUNT;定義新的類型名稱之后,可像基本數(shù)據(jù)類型那樣定義變量。例如:typedefunsignedintCOUNT;unsignedintb;COUNTc;,8.6. 50、2用typedef定義類型的應(yīng)用,typedef的主要應(yīng)用有如下的幾種形式:1、將基本數(shù)據(jù)類型定義新的類型名例如:typedefunsignedintCOUNT;typedefdoubleAREA;此種應(yīng)用的主要目的,首先是豐富數(shù)據(jù)類型中包含的屬性信息,其次是為了系統(tǒng)移植的需要,稍后詳細(xì)描述。2、數(shù)組類型自定義例如:typedeffloatArray[10];/*將數(shù)組類型與數(shù)組變量分離開來*/Arraya,b;/*等同于定義:floata[10],b[10];*/inti;for(i=0;i”運(yùn)算符來表示。4、結(jié)構(gòu)體類型的變量可以作為函數(shù)參數(shù),函數(shù)也可返回指向結(jié)構(gòu)體的指針變量。而共用體變量不能作為函數(shù)參數(shù),函數(shù)也不能返回指向共用體類型的指針變量。但可以使用指向共用體變量的指針。5、結(jié)構(gòu)體和共用體的定義允許嵌套,結(jié)構(gòu)體中可以用共用體作為成員,共用體中也可以用結(jié)構(gòu)體作為成員,形成結(jié)構(gòu)體和共用體的嵌套。6、枚舉類型是一種用戶自定義的基本數(shù)據(jù)類型。枚舉變量的取值是有限的,枚舉元素是常量,不是變量。7.枚舉變量通常由賦值語句賦值,而不是動態(tài)輸入賦值。枚舉元素雖可由系統(tǒng)或用戶定義一個順序值,但枚舉元素和整數(shù)并不相同,它們屬于不同的類型。因此,也不能用printf語句來輸出元素值(可輸出順序值)。8、使用typedef進(jìn)行自定義類型說明,其目的是使程序書寫簡單,提高可讀性。,,,
- 溫馨提示:
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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 川渝旅游日記成都重慶城市介紹推薦景點(diǎn)美食推薦
- XX國有企業(yè)黨委書記個人述責(zé)述廉報(bào)告及2025年重點(diǎn)工作計(jì)劃
- 世界濕地日濕地的含義及價值
- 20XX年春節(jié)節(jié)后復(fù)工安全生產(chǎn)培訓(xùn)人到場心到崗
- 大唐女子圖鑒唐朝服飾之美器物之美繪畫之美生活之美
- 節(jié)后開工第一課輕松掌握各要點(diǎn)節(jié)后常見的八大危險(xiǎn)
- 廈門城市旅游介紹廈門景點(diǎn)介紹廈門美食展示
- 節(jié)后開工第一課復(fù)工復(fù)產(chǎn)十注意節(jié)后復(fù)工十檢查
- 傳統(tǒng)文化百善孝為先孝道培訓(xùn)
- 深圳城市旅游介紹景點(diǎn)推薦美食探索
- 節(jié)后復(fù)工安全生產(chǎn)培訓(xùn)勿忘安全本心人人講安全個個會應(yīng)急
- 預(yù)防性維修管理
- 常見閥門類型及特點(diǎn)
- 設(shè)備預(yù)防性維修
- 2.乳化液泵工理論考試試題含答案