19201cs3222電子課件結(jié)構(gòu)_第1頁
19201cs3222電子課件結(jié)構(gòu)_第2頁
19201cs3222電子課件結(jié)構(gòu)_第3頁
19201cs3222電子課件結(jié)構(gòu)_第4頁
19201cs3222電子課件結(jié)構(gòu)_第5頁
已閱讀5頁,還剩42頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

Chap

9結(jié)構(gòu)9.1輸出平均分最高的學(xué)生信息9.2學(xué)生成績排序9.3修改學(xué)生成績本章要點(diǎn)什么是結(jié)構(gòu)?結(jié)構(gòu)與數(shù)組有什么差別?有幾種結(jié)構(gòu)的定義形式,它們之間有什么不同?什么是結(jié)構(gòu)的嵌套?什么是結(jié)構(gòu)變量和結(jié)構(gòu)成員變量?如何引用結(jié)構(gòu)成員變量?結(jié)構(gòu)變量如何作為函數(shù)參數(shù)使用?什么是結(jié)構(gòu)數(shù)組?如何定義和使用結(jié)構(gòu)數(shù)組?什么是結(jié)構(gòu)指針?它如何實(shí)現(xiàn)對結(jié)構(gòu)分量的操作?結(jié)構(gòu)指針是如何作為函數(shù)的參數(shù)的?9.1輸出平均分最高的學(xué)生信息

9.1.1程序解析9.1.2結(jié)構(gòu)的概念與定義9.1.3結(jié)構(gòu)的嵌套定義9.1.4結(jié)構(gòu)變量的定義和初始化9.1.5結(jié)構(gòu)變量的使用9.1.1程序解析例9-1輸出平均分最高的學(xué)生信息

假設(shè)學(xué)生的基本信息包括學(xué)號、姓名、三門課程成績以及個(gè)人平均成績。輸入n個(gè)學(xué)生的成績信息,計(jì)算并輸出平均分最高的學(xué)生信息。9.1.1程序解析#include<stdio.h>structstudent{/*學(xué)生信息結(jié)構(gòu)定義

*/intnum;/*學(xué)號*/charname[10];/*姓名*/intcomputer,english,math;/*三門課程成績*/doubleaverage;/*個(gè)人平均成績*/};intmain(void){inti,n;structstudents1,max;/*定義結(jié)構(gòu)變量*/printf("Inputn:");scanf("%d",&n);printf("Inputthestudent’snumber,nameandcoursescores\n");for(i=1;i<=n;i++){printf("No.%d:",i);scanf("%d%s%d%d%d"puter);s1.average=(s1.math+s1.english+puter)/3.0;if(i==1)max=s1;/*結(jié)構(gòu)變量操作*/if(max.average<s1.average)max=s1;}printf("num:%d,name:%s,average:%.2lf\n",max.num,,max.average);

return0;}9.1.2結(jié)構(gòu)的概念與定義使用結(jié)構(gòu)來表示學(xué)生信息:structstudent{intnum;/*學(xué)號*/charname[10];/*姓名*/intcomputer,english,math;/*三門課程成績*/doubleaverage;/*個(gè)人平均成績*/};結(jié)構(gòu)是C語言中一種新的構(gòu)造數(shù)據(jù)類型,它能夠把有內(nèi)在聯(lián)系的不同類型的數(shù)據(jù)統(tǒng)一成一個(gè)整體,使它們相互關(guān)聯(lián)結(jié)構(gòu)又是變量的集合,可以按照對基本數(shù)據(jù)類型的操作方法單獨(dú)使用其變量成員。結(jié)構(gòu)與數(shù)組比較:都是構(gòu)造類型,是多個(gè)變量的集合數(shù)組成員類型相同,結(jié)構(gòu)成員類型不同9.1.2結(jié)構(gòu)的概念與定義結(jié)構(gòu)類型定義的一般形式為:

struct

結(jié)構(gòu)名{類型名結(jié)構(gòu)成員名1;類型名結(jié)構(gòu)成員名2;

類型名結(jié)構(gòu)成員名n;};結(jié)構(gòu)的定義以分號結(jié)束,C語言中把結(jié)構(gòu)的定義看作是一條語句

關(guān)鍵字struct和它后面的結(jié)構(gòu)名一起組成一個(gè)新的數(shù)據(jù)類型名9.1.2結(jié)構(gòu)的概念與定義例如,平面坐標(biāo)結(jié)構(gòu):

structpoint{floatx;floaty;};雖然x、y的類型相同,也可以用數(shù)組的方式表示,但采用結(jié)構(gòu)進(jìn)行描述,更貼近事物本質(zhì),從而增加了程序的可讀性,使程序更易理解結(jié)構(gòu)適合用于描述具有多個(gè)屬性的實(shí)體或?qū)ο?.1.3結(jié)構(gòu)的嵌套定義在我們的實(shí)際生活中,一個(gè)較大的實(shí)體可能由多個(gè)成員構(gòu)成,而這些成員中有些又有可能是由一些更小的成員構(gòu)成。在學(xué)生信息中可以再增加一項(xiàng):“通信地址”,它又可以再劃分為:城市、街道、門牌號、郵政編碼。學(xué)號姓名通信地址計(jì)算機(jī)英語數(shù)學(xué)平均成績城市街道門牌號郵編9.1.3結(jié)構(gòu)的嵌套定義由此,我們可以對其結(jié)構(gòu)類型進(jìn)行如下重新定義:structaddress{charcity[10];charstreet[20];intcode;intzip;};structnest_student{intnum;charname[10];

structaddress

addr;

intcomputer,english,math;doubleaverage;};

在定義嵌套的結(jié)構(gòu)類型時(shí),必須先定義成員的結(jié)構(gòu)類型,再定義主結(jié)構(gòu)類型。9.1.4結(jié)構(gòu)變量的定義和初始化在C語言中定義結(jié)構(gòu)變量的方式有三種:1.單獨(dú)定義:先定義一個(gè)結(jié)構(gòu)類型,再定義一個(gè)具有這種結(jié)構(gòu)類型的變量structstudent{intnum;/*學(xué)號*/charname[10];/*姓名*/intcomputer,english,math;/*三門課程成績*/doubleaverage;/*個(gè)人平均成績*/};structstudent

s1,s2;9.1.4結(jié)構(gòu)變量的定義和初始化2.混合定義:在定義結(jié)構(gòu)類型的同時(shí)定義結(jié)構(gòu)變量

structstudent{intnum;/*學(xué)號*/charname[10];/*姓名*/intcomputer,english,math;/*三門課程成績*/doubleaverage;/*個(gè)人平均成績*/}s1,s2;

3.無類型名定義:在定義結(jié)構(gòu)變量時(shí)省略結(jié)構(gòu)名struct{intnum;/*學(xué)號*/charname[10];/*姓名*/intcomputer,english,math;/*三門課程成績*/doubleaverage;/*個(gè)人平均成績*/}s1,s2;9.1.4結(jié)構(gòu)變量的定義和初始化結(jié)構(gòu)變量的初始化structstudents1={101,"Zhang",78,87,85};9.1.5結(jié)構(gòu)變量的使用1.結(jié)構(gòu)變量成員的引用在C語言中,使用結(jié)構(gòu)成員操作符“.”來引用結(jié)構(gòu)成員,格式為:

結(jié)構(gòu)變量名

.

結(jié)構(gòu)成員名s1.num=101;strcpy(,"Zhang");nest_s1.addr.zip=310015;9.1.5結(jié)構(gòu)變量的使用2.結(jié)構(gòu)變量的整體賦值具有相同類型的結(jié)構(gòu)變量可以直接賦值。賦值時(shí),將賦值符號右邊結(jié)構(gòu)變量的每一個(gè)成員的值都賦給了左邊結(jié)構(gòu)變量中相應(yīng)的成員。structstudents1={101,"Zhang",78,87,85},s2;s2=s1;9.1.5結(jié)構(gòu)變量的使用3.結(jié)構(gòu)變量作為函數(shù)參數(shù)如果一個(gè)C程序的規(guī)模較大,功能較多,必然需要以函數(shù)的形式進(jìn)行功能模塊的劃分和實(shí)現(xiàn)如果程序中含有結(jié)構(gòu)數(shù)據(jù),則就可能需要用結(jié)構(gòu)變量作為函數(shù)的參數(shù)或返回值,以在函數(shù)間傳遞數(shù)據(jù)。例:doublecount_average(structstudents)main:s1.average=count_average(s1);特點(diǎn):可以傳遞多個(gè)數(shù)據(jù)且參數(shù)形式較簡單缺點(diǎn):對于成員較多的大型結(jié)構(gòu),參數(shù)傳遞時(shí)所進(jìn)行的結(jié)構(gòu)數(shù)據(jù)復(fù)制使得效率較低練習(xí):P224

9-1

9-29.2學(xué)生成績排序

9.2.1程序解析9.2.2結(jié)構(gòu)數(shù)組操作9.2.1程序解析例9-2輸入n(n<50)個(gè)學(xué)生的成績信息,按照學(xué)生的個(gè)人平均成績從高到低輸出他們的信息。

structstudentstudents[50],temp;/*定義結(jié)構(gòu)數(shù)組*/

/*輸入*/…

9.2.1程序解析/*結(jié)構(gòu)數(shù)組排序,選擇排序法*/for(i=0;i<n-1;i++){index=i;for(j=i+1;j<n;j++) if(students[j].average>students[index].average)/*比較平均成績*/index=j;temp=students[index]; /*交換數(shù)組元素*/students[index]=students[i];students[i]=temp;}/*輸出排序后的信息*/printf("num\tname\taverage\n");for(i=0;i<n;i++)printf("%d\t%s\t%.2lf\n",students[i].num,students[i].name,students[i].average);一個(gè)結(jié)構(gòu)變量只能表示一個(gè)實(shí)體的信息,如果有許多相同類型的實(shí)體,就需要使用結(jié)構(gòu)數(shù)組。結(jié)構(gòu)數(shù)組是結(jié)構(gòu)與數(shù)組的結(jié)合,與普通數(shù)組的不同之處在于每個(gè)數(shù)組元素都是一個(gè)結(jié)構(gòu)類型的變量。9.2.2結(jié)構(gòu)數(shù)組操作結(jié)構(gòu)數(shù)組的定義方法與結(jié)構(gòu)變量類似

structstudentstudents[50];

結(jié)構(gòu)數(shù)組students,它有50個(gè)數(shù)組元素,從students[0]到students[49],每個(gè)數(shù)組元素都是一個(gè)結(jié)構(gòu)類型structstudent的變量9.2.2結(jié)構(gòu)數(shù)組操作9.2.2結(jié)構(gòu)數(shù)組操作結(jié)構(gòu)數(shù)組的初始化

structstudentstudents[50]={{101,"zhang",76,85,78},{102,"wang",83,92,86}};

students[0]101Zhang768578students[1]102Wang839286………………students[49]結(jié)構(gòu)數(shù)組元素的成員引用,其格式為:

結(jié)構(gòu)數(shù)組名[下標(biāo)].結(jié)構(gòu)成員名

使用方法與同類型的變量完全相同:students[i].num=101;strcpy(students[i].name,"zhang");students[i]=students[k]9.2.2結(jié)構(gòu)數(shù)組操作練習(xí):P2269-49-59.3修改學(xué)生成績

9.3.1程序解析9.3.2結(jié)構(gòu)指針的概念9.3.3結(jié)構(gòu)指針作為函數(shù)參數(shù)9.3.1程序解析例9-3輸入n(n<50)個(gè)學(xué)生的成績信息,再輸入一個(gè)學(xué)生的學(xué)號、課程以及成績,在自定義函數(shù)中修改該學(xué)生指定課程的成績。intmain(void){intcourse,i,n,num,pos,score;structstudentstudents[50];/*定義結(jié)構(gòu)數(shù)組*/…/*輸入n個(gè)學(xué)生信息*/…

/*輸入待修改學(xué)生信息*//*調(diào)用函數(shù),修改學(xué)生成績*/pos=update_score(students,n,num,course,score);…

/*輸出修改后的學(xué)生信息*/...}9.3.1程序解析/*自定義函數(shù),修改學(xué)生成績*/intupdate_score(structstudent*p,intn,intnum,intcourse,intscore){inti,pos;for(i=0;i<n;i++,p++) /*按學(xué)號查找*/if(p->num==num)break;if(i<n) /*找到,修改成績*/{switch(course){case1:p->math=score;break;case2:p->english=score;break;case3:p->computer=score;break;}pos=i; /*被修改學(xué)生在數(shù)組中的下標(biāo)*/}else/*無此學(xué)號*/pos=-1;returnpos;}9.3.2結(jié)構(gòu)指針的概念指針可以指向任何一種變量,而結(jié)構(gòu)變量也是C語言中的一種合法變量,因此,指針也可以指向結(jié)構(gòu)變量,這就是結(jié)構(gòu)指針。結(jié)構(gòu)指針就是指向結(jié)構(gòu)類型變量的指針9.3.2結(jié)構(gòu)指針的概念structstudents1={101,"zhang",78,87,85},*p;p=&s1;101zhang788785P9.3.2結(jié)構(gòu)指針的概念結(jié)構(gòu)指針的使用(1)用*p訪問結(jié)構(gòu)成員。如:(*p).num=101;(2)用指向運(yùn)算符“->”訪問指針指向的結(jié)構(gòu)成員。如:

p->num=101;當(dāng)p指向結(jié)構(gòu)變量s1時(shí),下面三條語句的效果是一樣的:s1.num=101;(*p).num=101;p->num=101;9.3.3結(jié)構(gòu)指針作為函數(shù)參數(shù)結(jié)構(gòu)指針的操作是非常靈活的,如果將結(jié)構(gòu)指針作為函數(shù)的參數(shù),可以完成比基本類型指針更為復(fù)雜的操作。例9-3main:pos=update_score(students,n,num,course,score);自定義函數(shù):intupdate_score(structstudent*p,intn,intnum,intcourse,intscore)函數(shù)update_score運(yùn)行完畢返回主函數(shù)后,主函數(shù)中的結(jié)構(gòu)數(shù)組students中的值已被修改

9.3.3結(jié)構(gòu)指針作為函數(shù)參數(shù)與結(jié)構(gòu)變量作為函數(shù)參數(shù)相比,用結(jié)構(gòu)指針作為函數(shù)參數(shù)的效率更高。就例9-3而言,在函數(shù)update_score()中需要修改主函數(shù)中結(jié)構(gòu)數(shù)組students的數(shù)據(jù),根據(jù)第8章介紹的知識(shí),在此處也只能使用指針作為函數(shù)參數(shù)的方式才能通過間接訪問操作來實(shí)現(xiàn)程序功能。練習(xí):P2309-69-7本章總結(jié)結(jié)構(gòu)的概念與定義(含嵌套結(jié)構(gòu))結(jié)構(gòu)變量定義初始化使用(成員引用、相互賦值、作為函數(shù)參數(shù))結(jié)構(gòu)數(shù)組定義、初始化、結(jié)構(gòu)數(shù)組成員引用結(jié)構(gòu)指針概念結(jié)構(gòu)指針操作結(jié)構(gòu)指針作為函數(shù)參數(shù)能夠根據(jù)實(shí)際情況合理定義結(jié)構(gòu)能夠使用結(jié)構(gòu)變量與結(jié)構(gòu)數(shù)組進(jìn)行熟練編程掌握結(jié)構(gòu)指針的操作,并應(yīng)用于函數(shù)參數(shù)傳遞結(jié)構(gòu)體(Struct)把關(guān)系緊密且邏輯相關(guān)的多種不同類型的變量,組織到統(tǒng)一的名字之下占用相鄰的一段內(nèi)存單元共用體,也稱聯(lián)合(Union)把情形互斥但邏輯相關(guān)的多種不同類型的變量,組織到統(tǒng)一的名字之下占用同一段內(nèi)存單元,每一時(shí)刻只有一個(gè)數(shù)據(jù)起作用Unionsunionu_tag{intival;floatfval;char*sval;}u;u可能是int、float或字符指針union-asinglevariablethatcanlegitimatelyholdanyofoneofseveraltypes.變量u必須足夠大,以保存這3種類型中最大的一種。讀取的類型是最近一次存入的類型structsample{

shorti;

charch;

floatf;};0x0037b00unionsample{

shorti;

charch;

floatf;};printf("%d\n",sizeof(structsample));8

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(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ǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論