




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、(中職)c語(yǔ)言技能教程第10章ppt課件第10章 類型 DIY結(jié)構(gòu)體和共用體第10章10.1技能1:在程序中使用結(jié)構(gòu)體類型10.2技能2:在程序中使用共用體類型 【概要】 在程序設(shè)計(jì)中,把一些關(guān)系密切而數(shù)據(jù)類型不同的數(shù)據(jù)組織在一起,并為其命名一個(gè)名字,這類數(shù)據(jù)稱為結(jié)構(gòu)體。共用體是一種類似于結(jié)構(gòu)體的構(gòu)造型數(shù)據(jù)類型,它準(zhǔn)許不同類型和不同長(zhǎng)度的數(shù)據(jù)共享同一塊存儲(chǔ)空間。 它們都是“構(gòu)造”而成的數(shù)據(jù)類型,在說(shuō)明和使用之前必須先定義,也就是類型 DIY。第10章 類型 DIY結(jié)構(gòu)體和共用體10.1 技能110.1.1 結(jié)構(gòu)體(即“結(jié)構(gòu)”)的概念 在日常生活中,常會(huì)遇到一些需要填寫(xiě)的登記表,如住宿表、成績(jī)表
2、、通訊地址等。在這些表中,填寫(xiě)的數(shù)據(jù)是不能用同一種數(shù)據(jù)類型描述的,在住宿表中通常會(huì)登記上姓名、性別、身份證號(hào)碼等項(xiàng)目;在通訊地址表中我們會(huì)寫(xiě)下姓名、郵編、郵箱地址、電話號(hào)碼、E - mail等項(xiàng)目。這些表中集合了各種數(shù)據(jù),無(wú)法用前面學(xué)過(guò)的任一種數(shù)據(jù)類型完全描述,因此C引入一種能集中不同數(shù)據(jù)類型于一體的數(shù)據(jù)類型結(jié)構(gòu)體類型。結(jié)構(gòu)體類型的變量可以擁有不同數(shù)據(jù)類型的成員,是不同數(shù)據(jù)類型成員的集合。 結(jié)構(gòu)體:是將若干個(gè)類型相同或不同的數(shù)據(jù)組合成一個(gè)有機(jī)的集合。“結(jié)構(gòu)體”是一種構(gòu)造類型,它是由若干“成員”組成的。每一個(gè)成員可以是一個(gè)基本數(shù)據(jù)類型或者又是一個(gè)構(gòu)造類型。結(jié)構(gòu)體既是一種“構(gòu)造”而成的數(shù)據(jù)類型,那
3、么在說(shuō)明和使用之前必須先定義它,也就是構(gòu)造它。如同在說(shuō)明和調(diào)用函數(shù)之前要先定義函數(shù)一樣。10.1.2 結(jié)構(gòu)體類型的定義【引例】 住宿表、成績(jī)表、通訊地址表用C提供的結(jié)構(gòu)體類型描述如下: 成績(jī)表: struct score char grade20; /* 班級(jí)*/ long number; /* 學(xué)號(hào)*/ char name20; /*姓名*/ float os; /*操作系統(tǒng)*/ float datastru; /* 數(shù)據(jù)結(jié)構(gòu)*/ float compnet; /* 計(jì)算機(jī)網(wǎng)絡(luò)*/ ; 這一系列對(duì)不同登記表的數(shù)據(jù)結(jié)構(gòu)的描述類型稱為結(jié)構(gòu)體類型。由于不同的問(wèn)題有不同的數(shù)據(jù)成員,也就是說(shuō)有不同描述
4、的結(jié)構(gòu)體類型。也可以理解為結(jié)構(gòu)體類型根據(jù)所針對(duì)的問(wèn)題其成員是不同的,可以有任意多的結(jié)構(gòu)體類型描述。【知識(shí)點(diǎn)】1. 定義結(jié)構(gòu)體類型的一般格式為: struct 結(jié)構(gòu)體名類型 結(jié)構(gòu)成員名類型 結(jié)構(gòu)成員名;【知識(shí)點(diǎn)】2.結(jié)構(gòu)體名:由用戶命名,是類型的標(biāo)識(shí)符而不是變量 名。也可以省略結(jié)構(gòu)體名。 3. 結(jié)構(gòu)體成員:構(gòu)成結(jié)構(gòu)體的每一個(gè)類型變量稱為結(jié)構(gòu)體成員。 它象數(shù)組的元素一樣, 但數(shù)組中元素是以下標(biāo)來(lái)訪問(wèn)的, 而結(jié)構(gòu) 體是按變量名字來(lái)訪問(wèn)成員的。4. 結(jié)構(gòu)體成員名的命名規(guī)則與變量相同,并且允許與變量或其他結(jié)構(gòu)體中的成員重名。5. 結(jié)構(gòu)體成員可以是簡(jiǎn)單類型、數(shù)組、指針或已說(shuō)明過(guò)的結(jié)構(gòu)體等。6. 大括號(hào)外邊
5、的分號(hào)不可省略。【典型例題】例10.1 定義一個(gè)反映學(xué)生基本情況的的結(jié)構(gòu)類型,用以存儲(chǔ)學(xué)生的學(xué)號(hào)、姓名、性別、成績(jī)。struct stuint num; char name20;char sex; float score; ;10.1.3 結(jié)構(gòu)體變量的定義、初始化和引用一、 結(jié)構(gòu)體類型變量的定義結(jié)構(gòu)體類型變量的定義與其它類型的變量的定義是一樣的,但由于結(jié)構(gòu)體類型需要針對(duì)問(wèn)題事先自行定義,所以結(jié)構(gòu)體類型變量的定義形式就增加了靈活性,共有三種形式。 【知識(shí)點(diǎn)】定義結(jié)構(gòu)體變量的三種方法。1. 先定義結(jié)構(gòu)體類型,再定義結(jié)構(gòu)體變量。2. 在定義結(jié)構(gòu)體類型的同時(shí)定義結(jié)構(gòu)體變量。3. 直接定義結(jié)構(gòu)體變量。
6、【典型例題】例10.2 結(jié)構(gòu)體變量的定義方法。 (1)先定義結(jié)構(gòu)體類型,再定義結(jié)構(gòu)體類型變量:struct stu /*定義結(jié)構(gòu)體類型*/int num;char name20;char sex;float score;struct stu b1,b2;/*定義結(jié)構(gòu)體變量*/【典型例題】例10.2 結(jié)構(gòu)體變量的定義方法。 (2)定義結(jié)構(gòu)體類型同時(shí)定義結(jié)構(gòu)體類型變量:struct stuint num;char name20;char sex;float score;b1,b2; /*b1,b2為結(jié)構(gòu)體變量*/定義stu為結(jié)構(gòu)體類型的同時(shí)定義了兩個(gè)結(jié)構(gòu)體變量b1,b2。【典型例題】例10.2 結(jié)
7、構(gòu)體變量的定義方法。(3)直接定義結(jié)構(gòu)體類型變量:structint num;char name20;char sex;float score;b1,b2; 該法由于無(wú)法記錄該結(jié)構(gòu)體類型,所以除直接定義外,不能再定義該結(jié)構(gòu)體類型變量。第(3)種方法與第(2)種方法的區(qū)別在于第三種方法中省去了結(jié)構(gòu)體名,直接給出結(jié)構(gòu)體變量。三種方法中說(shuō)明的b1,b2變量都具相同的結(jié)構(gòu)。說(shuō)明了b1,b2變量為stu類型后,即可向這兩個(gè)變量中的各個(gè)成員賦值。在上述stu結(jié)構(gòu)定義中,所有的成員都是基本數(shù)據(jù)類型或數(shù)組類型。(4)成員也可以又是一個(gè)結(jié)構(gòu)體類型,即構(gòu)成了嵌套的結(jié)構(gòu)。如: struct dateint mont
8、h;int day;int year;struct int num;char name20;char sex;struct date birthday;float score;b1,b2;首先定義一個(gè)結(jié)構(gòu)類型date,由month(月)、day(日)、year(年) 三個(gè)成員組成。 在定義并說(shuō)明變量 b1 和 b2 時(shí),其中的成員birthday被說(shuō)明為date結(jié)構(gòu)類型。成員名可與程序中其它變量同名,互不干擾。結(jié)構(gòu)變量成員的表示方法在程序中使用結(jié)構(gòu)變量時(shí),往往不把它作為一個(gè)整體來(lái)使用。二、 結(jié)構(gòu)體類型變量的賦值(初始化) 結(jié)構(gòu)體變量的賦值就是給各成員賦值。可用輸入語(yǔ)句或賦值語(yǔ)句來(lái)完成。 上述對(duì)
9、結(jié)構(gòu)體類型變量的三種定義形式均可在定義時(shí)初始化?!疽?結(jié)構(gòu)體類型變量的初始化。struct stu / *定義學(xué)生結(jié)構(gòu)體類型* /char name20; / * 學(xué)生姓名* /char sex; / * 性別* /long num; / *學(xué)號(hào)* /float score3; / * 三科考試成績(jī)* /;struct stu student=wang li,f,050641,88.5,87.4,85;結(jié)構(gòu)體類型變量完成初始化后,即各成員的值分別為: = wang li、student.sex = f、student.num = 050641、student.sc
10、o re0 = 88.5、student.score1 = 87.4、student.score2 = 85?!局R(shí)點(diǎn)】與數(shù)組的初始化類似,結(jié)構(gòu)體變量只能對(duì)外部和靜態(tài)結(jié)構(gòu)體變量初始化。初始化數(shù)據(jù)之間要用“,”逗號(hào)隔開(kāi),不進(jìn)行初始化的成員項(xiàng)要用“,”逗號(hào)跳過(guò)?!镜湫屠}】struct stu / *定義學(xué)生結(jié)構(gòu)體類型* /char name20; / * 學(xué)生姓名* /char sex; / * 性別* /long num; / *學(xué)號(hào)* /float score3; / * 三科考試成績(jī)* /;struct stu student=wang li,f, ,88.5,87.4,85;/*學(xué)號(hào)不進(jìn)
11、行初始化用逗號(hào)跳過(guò)*/例10.3 定義結(jié)構(gòu)體變量并給成員賦值。在變量定義之后,如果再想將數(shù)據(jù)裝入變量,只能采用給各成員賦值的辦法,延用初始化時(shí)的作法是錯(cuò)誤的:struct stu student;student=wang li,f,050641,88.5,87.4,85;/*錯(cuò)誤的用法*/對(duì)上述的結(jié)構(gòu)體類型變量成員輸入采用的一般形式:student.num =long atol(temp); /* 轉(zhuǎn)換為長(zhǎng)整型*/for( i = 0; i 結(jié)構(gòu)體成員 其中“-”是兩個(gè)符號(hào)“-”和“”的組合, 好象一個(gè)箭頭指向結(jié)構(gòu)體成員。例如要給上面定義的結(jié)構(gòu)體中name和age賦值, 可以用下面語(yǔ)句: st
12、rcpy(student-name,Lu ying); student-age=19; 實(shí)際上, student-name就是(*student).name的縮寫(xiě)形式。 10.1.6 讀懂含有結(jié)構(gòu)體變量的程序【典型例題】例10.5 給結(jié)構(gòu)體變量賦值并輸出其值。main( ) struct stu int num; char *name; char sex; float score; b1,b2;b1.num=102;=Zhang ping;printf(input sex and scoren);scanf(%c %f,&b1.sex,&b1.score);b2=b1; prin
13、tf(Number=%dnName=%sn,b2.num,);printf(Sex=%cnScore=%fn,b2.sex,b2.score);程序分析:本程序中用賦值語(yǔ)句給num和name兩個(gè)成員賦值,name是一個(gè)字符串指針變量。用scanf函數(shù)動(dòng)態(tài)地輸入sex和score成員值,然后把b1的所有成員的值整體賦予b2,最后分別輸出b2 的各個(gè)成員值。本例說(shuō)明了結(jié)構(gòu)體變量的賦值、輸入和輸出的方法。對(duì)于結(jié)構(gòu)體變量的初始化,如果結(jié)構(gòu)體變量是全局變量或?yàn)殪o態(tài)變量,則可對(duì)它作初始化賦值;對(duì)局部或自動(dòng)結(jié)構(gòu)變量不能作初始化賦值。 例10.6 定義一個(gè)結(jié)構(gòu)體變量, 其中每個(gè)成員都從鍵盤接收數(shù)
14、據(jù), 然后對(duì)結(jié)構(gòu)體中的浮點(diǎn)數(shù)求和, 并顯示運(yùn)算結(jié)果。 請(qǐng)注意這個(gè)例子中不同結(jié)構(gòu)體成員的訪問(wèn)。 #include main() struct /*定義一個(gè)結(jié)構(gòu)體變量*/ char name8; int age; char sex2; float wage1, wage2, wage3, wage4, wage5; a; float wage; char c=Y; while(c=Y|c=y) /*判斷是否繼續(xù)循環(huán)*/ printf(nName:); scanf(%s,&); /*輸入姓名*/ printf(nAge:); scanf(%d, &a.age); /*輸入年齡*/ pri
15、ntf(nSex:); scanf(%s, &a.sex); printf(Wage1:); scanf(%f, &a.wage1); /*輸入工資*/ printf(Wage2:); scanf(%f, &a.wage2); printf(Wage3:); scanf(%f, &a.wage3); printf(Wage4:); scan scanf(%f, &a.wage4); printf(Wage5:); scanf(%f, &a.wage5); wage=a.wage1+a.wage2+a.wage3+a.wage4+a.wage5; pr printf(The sum of wag
16、e is %6.2fn, wage);/*顯示結(jié)果*/ while(1) printf(Continue?); c=getche(); if(c=Y|c=y|c=N|c=n) break; 10.2 技能2:在程序中使用共用體類型10.2.1 共用體的定義【引例】 如果在一個(gè)函數(shù)的三個(gè)不同的程序段中分別使用了整型變量i、字符變量ch和單精度變量f, 可以將它們定義為同一類型變量data,此時(shí)給三個(gè)成員一共分配四個(gè)內(nèi)存單元 。成員ch占用一個(gè)內(nèi)存單元;成員i占用兩個(gè)內(nèi)存單元;成員f占用四個(gè)內(nèi)存單元。data 變量中的三個(gè)成員,雖說(shuō)各占的字節(jié)數(shù)不同,但都放在由同一個(gè)地址開(kāi)始的內(nèi)存單元中,幾個(gè)變量互
17、相覆蓋。這種使幾個(gè)不同的變量共占用同一段內(nèi)存的結(jié)構(gòu),即另一種數(shù)據(jù)類型的結(jié)構(gòu)共用體。共用體也是一種新的數(shù)據(jù)類型, 共用體類型說(shuō)明和共用體變量定義與結(jié)構(gòu)體十分相似?!局R(shí)點(diǎn)】1共用體:將不同名稱、不同類型的一組數(shù)據(jù)組織為一個(gè)整體,共享同一存儲(chǔ)單元,該單元的實(shí)際大小由其中的最長(zhǎng)類型的數(shù)據(jù)確定。共用體也叫聯(lián)合體。2共用體的定義形式:union 共用體名 數(shù)據(jù)類型 成員名; 數(shù)據(jù)類型 成員名; . 共用體變量名; 3 共用體表示幾個(gè)變量共用一個(gè)內(nèi)存位置, 在不同的時(shí)間保存不同的數(shù)據(jù)類型和不同長(zhǎng)度的變量。 4. 共用體和結(jié)構(gòu)體有下列區(qū)別: (1) 結(jié)構(gòu)體和共用體都是由多個(gè)不同的數(shù)據(jù)類型成員組成, 但在任何
18、同一時(shí)刻, 共用體中只存放了一個(gè)被選中的成員, 而結(jié)構(gòu)體的所有成員都存在。 (2) 對(duì)于共用體的不同成員賦值, 將會(huì)對(duì)其它成員重寫(xiě), 原來(lái)成員的值就不存在了, 而對(duì)于結(jié)構(gòu)體的不同成員賦值是互不影響的。 下例表示說(shuō)明一個(gè)共用體data: union data int i; char ch; float f; 10.2.2 共用體變量的引用用已說(shuō)明的共用體可定義共用體變量。 union data lgc; 例如:用上面說(shuō)明的共用體data定義一個(gè)名為lgc的共用體變量, 可寫(xiě)成:在共用體變量lgc中, 整型量i和字符ch單精度f(wàn)共用同一內(nèi)存位置。 又如:union ata int a ; floa
19、t b; double c; char d; obj;該形式定義了一個(gè)共用體數(shù)據(jù)類型union ata,定義了共用體數(shù)據(jù)類型變量obj?!镜湫屠}】例10.7 共用體類型與結(jié)構(gòu)體類型實(shí)際占用存儲(chǔ)空間比較。union data /*共用體*/ int a;float b;double c;char d;mm;struct stud /*結(jié)構(gòu)體*/ int a;float b;double c;char d;main( )struct stud student;printf(%d,%d,sizeof(struct stud),sizeof(union data);運(yùn)行結(jié)果如下: 15,8程序的輸出
20、說(shuō)明結(jié)構(gòu)體類型所占的內(nèi)存空間為其各成員所占存儲(chǔ)空間之和(2+4+8+1=15)。而形同結(jié)構(gòu)體的共用體類型實(shí)際占用存儲(chǔ)空間為其最長(zhǎng)的成員所占的存儲(chǔ)空間(8)。使用時(shí),根據(jù)需要使用其中的某一個(gè)成員。方便程序設(shè)計(jì)人員在同一內(nèi)存區(qū)對(duì)不同數(shù)據(jù)類型的交替使用,增加靈活性,節(jié)省內(nèi)存。當(dāng)一個(gè)共用體被說(shuō)明時(shí), 編譯程序自動(dòng)地產(chǎn)生一個(gè)變量,其長(zhǎng)度為共用體中最大的變量長(zhǎng)度。 例10.8 共用體變量成員的引用情況。 main() union /*定義一個(gè)共用體*/ int i; /*共同體的成員i*/struct /*在共用體中定義一個(gè)結(jié)構(gòu)體*/ char first; /*結(jié)構(gòu)體成員first*/char seco
21、nd; /*結(jié)構(gòu)體成員second*/half; /*結(jié)構(gòu)體變量half*/number; /*共同體變量number*/number.i=0 x4241; /*共用體成員賦值*/ printf(%c%cn, number.half.first, number.half.second); number.half.first=d; /*共用體中結(jié)構(gòu)體成員賦值*/ number.half.second=e; printf(%xn, number.i); getch(); 輸出結(jié)果為:DE 6564 從上例結(jié)果可以看出: 當(dāng)給i賦值后, 其低八位也就是first和second的值;當(dāng)給first和s
22、econd賦字符后, 這兩個(gè) 字符的ASCII碼也將作為i 的低8位和高8位。共用體訪問(wèn)其成員的方法與結(jié)構(gòu)體相同。若定義共用體類型為:union data /*共用體*/ int a; float b; double c; char d;mm;其成員引用為:mm.a,mm.b,mm.c,mm.d。【點(diǎn)撥】1不能同時(shí)引用共用體的成員。在某一時(shí)刻,只能使用其中之一。2共用體變量也可以定義成數(shù)組或指針,但定義為指針時(shí), 也要用“-”符號(hào), 此時(shí)共用體訪問(wèn)成員可表示成: 共用體名-成員名 3共用體可以出現(xiàn)在結(jié)構(gòu)體內(nèi), 它的成員也可以是結(jié)構(gòu)體。 例如: 若要訪問(wèn)結(jié)構(gòu)體變量y1中共用體x的成員i,可以寫(xiě)成: y1.x.i; 若要訪問(wèn)結(jié)構(gòu)體變量y2中共用體x的字符串指針ch的第一個(gè)字符可寫(xiě)成: *y2.x.ch; 若寫(xiě)成“y2.x.*ch;”是錯(cuò)誤的。struct int age; char *addr; uni
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 28 面團(tuán)長(zhǎng)大了(教學(xué)設(shè)計(jì))-三年級(jí)科學(xué)上冊(cè)青島版(五四制)
- 寧夏民族職業(yè)技術(shù)學(xué)院《德育論》2023-2024學(xué)年第二學(xué)期期末試卷
- 浙江農(nóng)業(yè)商貿(mào)職業(yè)學(xué)院《Oracle數(shù)據(jù)庫(kù)應(yīng)用》2023-2024學(xué)年第二學(xué)期期末試卷
- 青島飛洋職業(yè)技術(shù)學(xué)院《運(yùn)動(dòng)(二)》2023-2024學(xué)年第二學(xué)期期末試卷
- 中國(guó)石油大學(xué)(北京)《文化人類學(xué)》2023-2024學(xué)年第二學(xué)期期末試卷
- 益陽(yáng)職業(yè)技術(shù)學(xué)院《數(shù)字多媒體作品創(chuàng)作》2023-2024學(xué)年第二學(xué)期期末試卷
- 廣東潮州衛(wèi)生健康職業(yè)學(xué)院《土地測(cè)量學(xué)實(shí)驗(yàn)》2023-2024學(xué)年第二學(xué)期期末試卷
- 集寧師范學(xué)院《數(shù)控加工工藝及編程》2023-2024學(xué)年第二學(xué)期期末試卷
- 泰州2024年江蘇泰州靖江市公安局補(bǔ)錄招聘警務(wù)輔助人員18人筆試歷年參考題庫(kù)附帶答案詳解
- 煙臺(tái)工程職業(yè)技術(shù)學(xué)院《財(cái)務(wù)共享理論與實(shí)務(wù)》2023-2024學(xué)年第二學(xué)期期末試卷
- 數(shù)據(jù)結(jié)構(gòu)英文教學(xué)課件:chapter10 Hashing
- 藍(lán)色卡通風(fēng)學(xué)生班干部競(jìng)選介紹PPT模板課件
- 人教新目標(biāo)英語(yǔ)九年級(jí)上冊(cè)單詞中文Units
- 機(jī)動(dòng)車牌證申請(qǐng)表格模板(完整版)
- 部編版小學(xué)語(yǔ)文三年級(jí)(下冊(cè))學(xué)期課程綱要
- 道路交通事故責(zé)任認(rèn)定行政復(fù)議申請(qǐng)書(shū)范例
- 高效液相含量測(cè)定計(jì)算公式
- 六宮格數(shù)獨(dú)解題技巧
- 公安機(jī)關(guān)通用告知書(shū)模板
- 工程款支付審批流程圖
- 人教版七年級(jí)歷史下冊(cè)第一單元填空題
評(píng)論
0/150
提交評(píng)論