




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第8章結(jié)構(gòu)、聯(lián)合及枚舉類型*重點(diǎn)與難點(diǎn)8.1結(jié)構(gòu)體類型和結(jié)構(gòu)變量的定義8.2結(jié)構(gòu)體變量的引用和初始化8.3結(jié)構(gòu)體數(shù)組8.4結(jié)構(gòu)體類型的指針變量8.5結(jié)構(gòu)體與函數(shù)8.6用typedef定義類型8.7用指針處理鏈表8.8共用體8.9枚舉類型*本章小結(jié)*作業(yè)重點(diǎn)與難點(diǎn)重點(diǎn):結(jié)構(gòu)體、共用體和枚舉類型。難點(diǎn):鏈表的操作。二維表(關(guān)系)學(xué)號(hào)姓名性別年齡成績(jī)地址10001ZhangXinM1990.5Shanghai10002WangLiF2098Beijing10010LiFunM1887.5Guangzhou8.1結(jié)構(gòu)體類型和結(jié)構(gòu)體變量的定義8.1.1結(jié)構(gòu)體類型的定義8.1.2結(jié)構(gòu)體變量的定義8.1.1結(jié)構(gòu)體類型的定義struct結(jié)構(gòu)體名{
數(shù)據(jù)類型成員名1;數(shù)據(jù)類型成員名2;
……
數(shù)據(jù)類型成員名n;};點(diǎn)坐標(biāo)yx.(x,y)二維坐標(biāo)的點(diǎn)structpoint{floatx;floaty;};
點(diǎn)的結(jié)構(gòu)體類型圓的結(jié)構(gòu)體r(x,y)structcircle{structpoint{floatx;floaty;}dot;floatr;}structpointdot;8.1.2結(jié)構(gòu)體變量的定義1、先定義結(jié)構(gòu)體類型,再定義結(jié)構(gòu)體變量2、定義結(jié)構(gòu)體類型的同時(shí)定義結(jié)構(gòu)體變量3、直接定義結(jié)構(gòu)體類型變量1、先定義結(jié)構(gòu)體類型,再定義結(jié)構(gòu)體變量structcircle{structpointdot;floatr;};structcirclegraph1,graph2;2、定義結(jié)構(gòu)體類型的同時(shí)定義結(jié)構(gòu)體變量structstudent{intnum;charname[20];charsex;intagefloatscore;charaddr[30];}stu1,stu2;3、直接定義結(jié)構(gòu)體類型變量struct{intmonth;intday;intyear;}date1,date2;8.2結(jié)構(gòu)體變量引用和初始化1、結(jié)構(gòu)體變量的引用2、結(jié)構(gòu)體變量的初始化1、結(jié)構(gòu)體變量的引用在ANSI中除了允許具有相同類型的結(jié)構(gòu)體變量相互賦值外,一般對(duì)結(jié)構(gòu)體變量的引用是通過其成員來實(shí)現(xiàn)。成員引用形式:結(jié)構(gòu)體變量名.成員名舉例:
graph1.rgraph1.dot.x例8.1求兩個(gè)同心圓的面積差main(){structpoint{floatx;floaty;};structcircle{structpointdot;floatr;};structcirclegraph1,graph2;floatarea;
graph1.dot.x=2;graph1.dot.y=3;graph1.r=4;
graph2.dot=graph1.dot;printf("Graph2.r=");scanf("%f",&graph2.r);area=3.14*(graph2.r*graph2.r-graph1.r*graph1.r);printf("Dotis(%-4.1f,%-4.1f)\n",graph1.dot.x,graph1.dot.y);printf("Radiusis%-4.1fand%-4.1f\n",graph1.r,graph2.r);printf("Area(r2-r1)=%-6.1f\n",area);}2、結(jié)構(gòu)體變量的初始化初始化形式
結(jié)構(gòu)體類型結(jié)構(gòu)體變量={初始化數(shù)據(jù)};舉例
structcirclegraph1={{2,3},4};
即x=2,y=3,r=4;其中內(nèi)層{}可省。8.3結(jié)構(gòu)體數(shù)組structcirclecir[3];structcredit{intnum;char*name;charsex;floatscore[3]}stu[5];結(jié)構(gòu)體數(shù)組舉例structcredit{intnum;char*name;charsex;floatscore[3];}stu[5]={{101,"ZhaoHua",'M',45,80,78},{102,"XianJiang",'M',62.5,76,80},{103,"SunJun",'F',92.5,92,89},{104,"LiWei",'F',87,88,91},{105,"ZhouLi",'M',58,60,77}};例8.2計(jì)算學(xué)生的總分,按總分排名次及輸出名次表stu[i].total+=stu[i].score[j];排序:選擇法for(i=0;i<N-1;i++){k=i;for(j=i+1;j<N;j++)if(stu[j].total>stu[k].total)k=j;if(k!=i){temp=stu[i];stu[i]=stu[k];stu[k]=temp;}}8.4結(jié)構(gòu)體類型的指針變量結(jié)構(gòu)體變量可以由不同類型的成員構(gòu)成,各個(gè)成員所占空間字節(jié)數(shù)之和是結(jié)構(gòu)體變量所占的內(nèi)存空間。結(jié)構(gòu)體的指針是結(jié)構(gòu)體變量在內(nèi)存中得首地址。結(jié)構(gòu)體類型的指針變量可以存放結(jié)構(gòu)體的首地址。成員引用方法一般方法
graph1.dot.x指針方法已知p=&graph1;
(*p).r
(*p).dot.x
或p->r
p->dot.x
其中:“結(jié)構(gòu)體指針變量名->成員名”方法直觀。舉例:成員的指針引用方式structcredit*p=&pupil;printf("%-3d%-20s%-3c",(*p).num,(*p).name,(*p).sex);printf("%-3d%-20s%-3c",p->num,p->name,p->sex);索引表結(jié)構(gòu)structindex{intnum;structcredit*link;}index_id[5]structcredit{intnum;char*name;charsex;floatscore[3];floattotal;}stu[5];索引圖示101102103104105103SunJunF92.592.089.0273.5104LiWeiF87.088.091.0266.0102QianJiangM62.576.080.0218.5101ZhaoHuaM45.080.078.0203.0105ZhouLiM58.060.077.0195.08.5結(jié)構(gòu)體與函數(shù)結(jié)構(gòu)體成員可以像簡(jiǎn)單變量一樣作為函數(shù)的參數(shù)。結(jié)構(gòu)體變量也可以作為函數(shù)的參數(shù)。它的傳遞方式是值傳遞。由于在值傳遞時(shí),實(shí)參拷貝到形參變量,如果結(jié)構(gòu)體變量的成員較多、數(shù)據(jù)量較大時(shí),傳遞效率會(huì)很低。一般采用結(jié)構(gòu)體指針變量作為函數(shù)的參數(shù)。這樣,在參數(shù)傳遞時(shí)僅需要拷貝一個(gè)地址而已。例8.4結(jié)構(gòu)體與函數(shù)voidcaltotal(structcreditstu[],intn){inti,j;for(i=0;i<n;i++)stu[i].total=0;for(j=0;j<3;j++)stu[i].total+=stu[i].score[j];}形參也可以為:structcredit*p,intn8.6用typedef定義類型typedef聲明新的類型名來代替已有的類型名。注意:typedef并不是創(chuàng)造新的類型。舉例:typedefstructdate{intmonth;intday;intyear;}DATE;DATEbirthday;聲明一個(gè)新的類型名的步驟1、先按定義變量的方法寫出定義體
inti;2、將變量名換成新類型名
將i換成COUNT3、在最前面加typedef
typedefintCOUNT4、然后可以用新類型名去定義變量
COUNTi,j;舉例typedefintNUM[100];NUMn;typedefstructstudent{intnum;charname[20];}STU;STUst1;說明typedef與#define#define是在預(yù)編譯時(shí)處理的,它只作簡(jiǎn)單的字符串替換;typedef是在編譯時(shí)處理的,并不是作簡(jiǎn)單的字符串替換。typedef的作用有利于程序的通用與移植。譬如:
typedefintINTEGER;
課堂訓(xùn)練
1、已知5個(gè)學(xué)生的數(shù)據(jù)存儲(chǔ)在一個(gè)數(shù)組中,每個(gè)學(xué)生包括學(xué)號(hào)、姓名、3門課程的成績(jī)和平均成績(jī)。編寫輸入、輸出函數(shù):(1)輸入函數(shù):輸入5個(gè)學(xué)生數(shù)據(jù),計(jì)算平均分;(2)輸出函數(shù):在屏幕上輸出5個(gè)學(xué)生的數(shù)據(jù)。8.7用指針處理鏈表1、鏈表概述2、簡(jiǎn)單鏈表3、處理動(dòng)態(tài)鏈表所需的函數(shù)4、建立動(dòng)態(tài)鏈表5、輸出鏈表6、對(duì)鏈表的刪除操作7、對(duì)鏈表的插入操作8、對(duì)鏈表的綜合操作1、鏈表概述1249headA13561249B14571356C10211475DNULL1021structnode{charch;structnode*next;};structnode*node1,*node2;表尾typedefstructnode{charch;structnode*next;}*NODE;NODEnode1,node2;2、簡(jiǎn)單鏈表(舉例)#defineNULL0structstudent{longnum;floatscore;structstudent*next;};main(){structstudenta,b,c,*head,*p;a.num=99101;a.score=89.5;b.num=99103;b.score=90;c.num=99107;c.score=85;head=&a;a.next=&b;b.next=&c;c.next=NULL;
p=head;do{printf("\n%ld,%g",p->num,p-score);p=p->next;}while(p!=NULL);
}指向下一個(gè)結(jié)點(diǎn)3、處理動(dòng)態(tài)鏈表所需的函數(shù)函數(shù)原型功能void*malloc(unsignedintsize)在內(nèi)存中分配長(zhǎng)度為size的連續(xù)空間void*calloc(unsignedn,unsignedintsize)在內(nèi)存中分配n個(gè)長(zhǎng)度為size的連續(xù)空間void*free(void*p)釋放p所指的內(nèi)存空間4、建立動(dòng)態(tài)鏈表建立動(dòng)態(tài)鏈表是指在程序執(zhí)行過程中從無到有地建立起一個(gè)鏈表,即一個(gè)一個(gè)地開辟結(jié)點(diǎn)和輸入各結(jié)點(diǎn)數(shù)據(jù),并建立起前后相鏈的關(guān)系。建立過程圖示head9910189.599103909910585表尾,鏈表建立完畢9910788^創(chuàng)建鏈表函數(shù)structstudent*creat(void){structstudent*head,*p1,*p2;intn=0;head=NULL;p2=head;while(1){p1=p2=(structstudent*)malloc(sizeof(structstudent));scanf("%ld,%f",&p1->num,&p1->score);if(p1->num1==0)break;n++;if(n==1)head=p1;elsep2->next=p1;p2=p1;}
p2->next=NULL;return(head);}head指向表頭p2指向表尾p1指向新結(jié)點(diǎn)5、輸出鏈表輸出鏈表:首先要得到鏈表第一個(gè)結(jié)點(diǎn)的地址,即head的值,然后設(shè)一個(gè)指針變量p,先指向第一個(gè)結(jié)點(diǎn),輸出p所指的結(jié)點(diǎn),然后使p后移一個(gè)結(jié)點(diǎn),再輸出,直到鏈表的尾結(jié)點(diǎn)。編寫一個(gè)輸出鏈表的函數(shù)voidprint(structstudent*head){structstudent*p;
p=head;if(head!=NULL)do{printf("\n%ld%5.1f",p->num,p->score);
p=p->next;}while(p!=NULL);elseprintf("\nlinktableisempty!");}輸出鏈表圖示head9910189.5991039099105859910788^p6、對(duì)鏈表的刪除操作從動(dòng)態(tài)鏈表中刪除結(jié)點(diǎn)是將某個(gè)結(jié)點(diǎn)的前驅(qū)結(jié)點(diǎn)和它的后續(xù)結(jié)點(diǎn)鏈結(jié)起來。并將該結(jié)點(diǎn)所占的內(nèi)存釋放。刪除結(jié)點(diǎn)圖示head9910189.5991039099105859910988^p19910765p2p2head9910189.5991039099105859910988^9910765p1刪除結(jié)點(diǎn)程序while(num!=p1->num&&p1->next!=NULL){p2=p1;p1=p1->next;}/*查找將被刪除的結(jié)點(diǎn)*/if(num==p1->num){if(p1==head)head=p1->next;elsep2->next=p1->next;}7、對(duì)鏈表的插入操作對(duì)鏈表的插入:是將一個(gè)結(jié)點(diǎn)插入到一個(gè)已有的鏈表中。p2head9910189.5991039099105859910988^9910765p1p0插入操作if(head==NULL){head=p0;p0->next=NULL;}else{while((p0->num>p1->num)&&(p1->next!=NULL)){p2=p1;p1=p1->next;}if(p0->num<=p1->num){if(head==p1)head=p0;elsep2->next=p0;p0->next=p1;}else{p1->next=p0;p0->next=NULL;}}鏈到表頭鏈到表尾鏈到表中8、對(duì)鏈表的綜合操作鏈表的綜合操作包括鏈表的建立、插入結(jié)點(diǎn)、刪除結(jié)點(diǎn)和輸出鏈表的結(jié)點(diǎn)數(shù)據(jù)等操作。其中,建立鏈表的操作可以由插入操作完成,插入操作可以控制鏈表的建立是有序的。8.8共用體1、共用體的概念2、共用體變量的引用方式3、共用體類型數(shù)據(jù)的特點(diǎn)1、共用體的概念共用體:實(shí)現(xiàn)不同類型的變量存放在同一內(nèi)存單元中,使用覆蓋技術(shù),幾個(gè)變量相互覆蓋。1000地址整型變量i整型變量i字符變量ch實(shí)型變量f實(shí)型變量f實(shí)型變量f實(shí)型變量f共用體類型定義一般形式
union共用體名{
成員表列}變量表列;舉例:uniondata{inti;charch;floatf;}a,b,c;2、共用體變量的引用方式引用方式:不能引用共用體變量,而只能共用變量中的成員。舉例:uniondata{inti;charch;floatf;}a,b,c;成員引用:a.ia.cha.f共用體與結(jié)構(gòu)體比較項(xiàng)目結(jié)構(gòu)體共用體所占內(nèi)存各成員所占內(nèi)存之和由占內(nèi)存最多成員決定成員存在各個(gè)成員都在內(nèi)存中存在只有最后使用的成員存在成員地址各個(gè)成員都有不同的地址所有成員都是一樣的地址,與共用體變量地址一樣例8.7驗(yàn)證共用體變量的存儲(chǔ)形式main(){unionuarea{charc_data;inti_data;floatf_data;}udata;printf("&udatais%u\n",&udata);udata.c_data='A';printf("&udata.c_datais%u,valueis%c\n",&udata.c_data,udata.c_data);udata.i_data=114;printf("&udata.i_datais%u,valueis%i\n",&udata.i_data,udata.i_data);udata.f_data=118.0;printf("&udata.f_datais%u,valueis%e\n",&udata.f_data,udata.f_data);printf("&udata.i_datais%u,valueis%i\n",&udata.i_data,udata.i_data);}3、共用體類型數(shù)據(jù)的特點(diǎn)1、每一瞬時(shí)只有一個(gè)成員起作用,其他的成員不起作用,即不是同時(shí)都存在和起作用。2、新存入的成員值覆蓋原來成員的值,只有最近一次存放的成員起作用。3、共用體變量的地址與各個(gè)成員地址相同。4、由于只有一個(gè)成員起作用,故不能使用定義共用體變量時(shí)對(duì)它初始化。同樣地,不能把共用體作為函數(shù)參數(shù),也不能使函數(shù)返回值為共用體變量。程序輸出程序運(yùn)行情況:&udatais65498&udata.c_datais65498,valueisA&udata.i_datais65498,valueis114&udata.f_datais65498,valueis1.18000e+02&udata.i_datais65498,valueis0共用體應(yīng)用舉例
設(shè)有若干個(gè)人員的數(shù)據(jù),其中有學(xué)生和教師。學(xué)生的數(shù)據(jù)中包括:姓名、號(hào)碼、性別、職業(yè)、職務(wù)。根據(jù)職業(yè)(教師或?qū)W生)的不同,職務(wù)成員存放的值可以為職稱(教師)或班級(jí)(學(xué)生)。從中可知,“職務(wù)”成員應(yīng)該是共用體數(shù)據(jù)定義struct{intnum;charname[10];charsex;charjob;
union{intclass;charposition[10];}category;}person[2];共用體變量8.9枚舉類型枚舉:是指將變量的值一一列舉出來,變量的值只限于列舉出來值的范圍內(nèi)。舉例
enum
weekday{sun,mon,tue,wed,thu,fri,sat};
其中:sun,mon...是枚舉常量
enum
weekdayworkday,week_end;
其中:workday,...是枚舉變量枚舉常量不能對(duì)它賦值;枚舉常量按定義時(shí)的順序確定它們的值為:0,1,2,...可以改變枚舉元素的值:enum
weekday{sun=7,mon=1,tue,wed,thu,fri,sat};應(yīng)用舉例
口袋中有紅、黃、藍(lán)、白、黑5種顏色的球若干個(gè)。每次從口袋中取出3個(gè)球,問得到3中不同色的球可能取法,打印出每種組合的3種顏色。
分析:可以使用簡(jiǎn)單類型(1、2、...),使用枚舉類型更直觀。枚舉變量
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 7-9 數(shù)字系統(tǒng)設(shè)計(jì)實(shí)例3-數(shù)字乘法器處理器設(shè)計(jì)
- 二年級(jí)數(shù)學(xué)表內(nèi)乘法口算練習(xí)共800道
- 四川建筑職業(yè)技術(shù)學(xué)院《工程圖學(xué)(二)》2023-2024學(xué)年第二學(xué)期期末試卷
- 四川省達(dá)州市開江縣2025屆初三下學(xué)期第四次周練英語試題含答案
- 山東省寧陽一中2025屆學(xué)業(yè)水平考試歷史試題含解析
- 南京視覺藝術(shù)職業(yè)學(xué)院《病原微生物免疫與健康》2023-2024學(xué)年第二學(xué)期期末試卷
- 四川省成都市溫江區(qū)2025年高中畢業(yè)班第二次質(zhì)量檢測(cè)試題生物試題含解析
- 新疆昌吉市教育共同體2025年初三第二次調(diào)研考試(英語試題文)試卷含答案
- 焦作新材料職業(yè)學(xué)院《日語學(xué)術(shù)寫作與研究方法》2023-2024學(xué)年第一學(xué)期期末試卷
- 九江市湖口縣2025屆五下數(shù)學(xué)期末監(jiān)測(cè)模擬試題含答案
- FZ/T 64014-2009膜結(jié)構(gòu)用涂層織物
- C語言期末考試試題南昌航空大學(xué)
- 取消訂單協(xié)議模板(5篇)
- 東風(fēng)天錦5180勾臂式垃圾車的改裝設(shè)計(jì)
- 浦發(fā)銀行個(gè)人信用報(bào)告異議申請(qǐng)表
- 高考試卷命題設(shè)計(jì)的技巧 課件24張
- 施工進(jìn)度計(jì)劃網(wǎng)絡(luò)圖-練習(xí)題知識(shí)講解
- 防孤島測(cè)試報(bào)告
- 按摩常用英語
- 食品公司規(guī)章制度
- midas NFX使用指南(八)
評(píng)論
0/150
提交評(píng)論