分校C課件第14講結(jié)構(gòu)體32-1-3節(jié)_第1頁
分校C課件第14講結(jié)構(gòu)體32-1-3節(jié)_第2頁
分校C課件第14講結(jié)構(gòu)體32-1-3節(jié)_第3頁
分校C課件第14講結(jié)構(gòu)體32-1-3節(jié)_第4頁
分校C課件第14講結(jié)構(gòu)體32-1-3節(jié)_第5頁
已閱讀5頁,還剩24頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第十四講結(jié)構(gòu)體相關數(shù)據(jù)的集合。數(shù)據(jù)的類型可以不相同。用來定義保存在文件中的記錄。與指針一起創(chuàng)建動態(tài)的數(shù)據(jù)結(jié)構(gòu):鏈表隊列棧樹C語言程序設計1第十四講結(jié)構(gòu)體結(jié)構(gòu)體的概念結(jié)構(gòu)體類型的定義結(jié)構(gòu)體變量定義和聲明初始化使用結(jié)構(gòu)體數(shù)組C語言程序設計本講是教材第11章,但我們由于課時和全國C的大綱關系,第四至10節(jié)不講,有興趣者,自己學習.本課件后面還有一些有趣的例子,如冼牌,選舉計票程序,有興趣者也可以自學.結(jié)構(gòu)體是派生的數(shù)據(jù)類型使用其他類型的對象來構(gòu)造結(jié)構(gòu)體。11.1定義結(jié)構(gòu)體2結(jié)構(gòu)體結(jié)構(gòu)體數(shù)組是由相同類型的數(shù)據(jù)構(gòu)成,而現(xiàn)實生活中由一些不相同類型的數(shù)據(jù)構(gòu)成的一組數(shù)據(jù)是相當多的,例如學號、姓名和學生成績。C語言提供了這種數(shù)據(jù)結(jié)構(gòu)稱為結(jié)構(gòu)體,它是一種較為復雜而又非常靈活的構(gòu)造型的數(shù)據(jù)類型。一個結(jié)構(gòu)體類型可以由若干個成員(或域)的成分組成,不同的結(jié)構(gòu)體類型其成員不同。對于一個具體的結(jié)構(gòu)體而言其成員的數(shù)量是固定的(同數(shù)組),各成員的數(shù)據(jù)類型可以不同,這是結(jié)構(gòu)體與數(shù)組的重要相同和不同點。3結(jié)構(gòu)體類型定義的一般形式為:struct結(jié)構(gòu)體名{類型名1成員名1;類型名2成員名2;……類型名n成員名n;};結(jié)構(gòu)體其中,struct是關鍵字,是結(jié)構(gòu)體類型的標志。結(jié)構(gòu)體名是由用戶定義的標識符,它規(guī)定了所定義的結(jié)構(gòu)體類型的名稱。結(jié)構(gòu)體類型的組成成分稱為成員,成員名的命名規(guī)則與變量名相同。如果成員的類型相同,則可以同變量一樣在一個類型名后寫出幾個成員名,他們之間用逗號分隔。structstudent{longintxuhao;charname[8];inteng,coup,sum;floatave;};4structdate{intyear;intmonth;intday;};也可以寫成:structdate{intyear,month,day;};structstudent{intnum;charname[8],sex;floatscore[4];};struct:引入結(jié)構(gòu)體定義。date:結(jié)構(gòu)體的名稱,必須與struct一起使用。structdate結(jié)構(gòu)體包含3個int*類型的成員:yearMonthday例如A:這里structstudent結(jié)構(gòu)體包含有:Int型num(學號)charname[8](姓名),sex(性別)Floatscore[4](成績數(shù)組)例如B:5結(jié)構(gòu)體類型的定義結(jié)構(gòu)體定義說明同一個結(jié)構(gòu)體內(nèi)不可以有同名的成員。不同結(jié)構(gòu)體的成員名可以相同,不互相沖突。結(jié)構(gòu)體structdate{intyear,month,day;};structBook{

chartitle[50],writer[20],publisher[50];

intyear,month;};intyear,month,day;6結(jié)構(gòu)體類型的定義結(jié)構(gòu)體定義說明結(jié)構(gòu)體的成員可以是基本類型和構(gòu)造類型(數(shù)組和其他結(jié)構(gòu)體)。結(jié)構(gòu)體structdate{intyear,month,day;}birthday;structStuRec{intnum;charname[20]; //這里包含了數(shù)組

structdatebirthday; //這里包含了上面的結(jié)構(gòu)體,稱結(jié)構(gòu)體的嵌套};結(jié)構(gòu)體的成員不可以包含自身但可以包含自身的指針structstudent{charname[20];chargender;floatscores[4];

structstudentnext;/*error*/

structstudent*nextPtr;/*correct*/};7結(jié)構(gòu)體定義說明只是創(chuàng)建了新的數(shù)據(jù)類型,并不能保留內(nèi)存空間。必須定義結(jié)構(gòu)體變量來獲得內(nèi)存空間。定義(聲明)結(jié)構(gòu)體變量有三種方法:定義結(jié)構(gòu)體類型后,像聲明普通變量一樣聲明結(jié)構(gòu)體變量。結(jié)構(gòu)體structdate{intyear,month,day;};structdatebirth;yearmonthdayFF00FF04FF08birthbirth的存儲形式TC中與VC中的不同11.2定義和使用結(jié)構(gòu)體變量8結(jié)構(gòu)體變量定義聲明結(jié)構(gòu)體變量2.在定義結(jié)構(gòu)體類型的同時,聲明結(jié)構(gòu)體變量結(jié)構(gòu)體structdate{intyear,month,day;}birth,days[4],*bPtr;struct{intyear,month,day;}birth,days[4],*bPtr;沒有結(jié)構(gòu)體名,無法再次使用。3.直接(只)聲明結(jié)構(gòu)體變量省略類型名。⑴類型與變量是不同的概念,注意區(qū)分。系統(tǒng)能對變量賦值、存取、運算,而類型則不能,編譯時,系統(tǒng)只對變量分配存儲空間,而類型則不分配。⑵結(jié)構(gòu)體中的成員也可以是一個結(jié)構(gòu)體變量,即結(jié)構(gòu)體的嵌套。9structstudent

/*student是結(jié)構(gòu)體名,結(jié)構(gòu)體成員有num,name,sex,date,scre[4]*/

{int

num;

char

name[8],sex;

struct

date

/*date是結(jié)構(gòu)體名,其結(jié)構(gòu)體變量表是birthday,成員包括年月日*/

{int

year,month,day;}birthday;

floatscore[4];

/*score[4]是數(shù)組,數(shù)組成員類型浮點型*/

}xuesh;⑶結(jié)構(gòu)體中的成員名可以和程序中的變量同名;不同結(jié)構(gòu)體中的成員名也可以同名。11.4結(jié)構(gòu)體的嵌套10結(jié)構(gòu)體的操作結(jié)構(gòu)體變量可以執(zhí)行的操作將結(jié)構(gòu)體變量賦給相同類型的結(jié)構(gòu)體變量。得到結(jié)構(gòu)體變量的地址。訪問結(jié)構(gòu)體變量的成員。使用sizeof確(測)定結(jié)構(gòu)體變量的大小。結(jié)構(gòu)體11結(jié)構(gòu)體變量的初始化給全部成員賦初值結(jié)構(gòu)體structstudent{intnum;

charname[8],sex;structdate{intyear,month,day;}birthday;

floatsco[4];}xuesh={101,“王小寧”,‘F’,1975,5,21,83.6,88,75.5,90};將結(jié)構(gòu)體變量各成員的初值順序地放在一對大括號中,并用逗號分隔。對結(jié)構(gòu)體類型變量賦初值時,按每個成員在結(jié)構(gòu)體中的順序一一對應賦值。同變量一樣結(jié)構(gòu)體變量在定義時也可以進行初始化。12結(jié)構(gòu)體變量的初始化初始化結(jié)構(gòu)體變量給部分成員賦初值。結(jié)構(gòu)體structStuRec{

intnum;

charname[20];

structdate{intyear,month,day;}birthday;

floatscore;}student={101,“王小寧”};num(2B)name(20B)birthday(6B)score(4B)yearmonthday101王小寧0000.013訪問結(jié)構(gòu)體成員的兩種方式結(jié)構(gòu)體成員運算符:.用于結(jié)構(gòu)體變量結(jié)構(gòu)體指針運算符:->用于指向結(jié)構(gòu)體的指針等價于(*cardPtr).face結(jié)構(gòu)體structcardmyCard;printf(“%s”,myCard.face);structcard*cardPtr;printf(“%s”,cardPtr->face);structcard{char*face;char*suit;}myCard.face;11.5結(jié)構(gòu)體指針14案例分析:結(jié)構(gòu)體變量的成員問題:訪問結(jié)構(gòu)體變量的成員。(cw1301.c)結(jié)構(gòu)體#include<stdio.h>structcard{

char*face;

char*suit;}a;Intmain(){

structcarda,*aPtr;a.face="Ace";a.suit="Spades";

aPtr=&a;printf("%s%s%s\n%s%s%s\n%s%s%s\n", a.face,"of",a.suit, aPtr->face,"of",aPtr->suit, (*aPtr).face,"of",(*aPtr).suit);}與數(shù)組的不同:結(jié)構(gòu)變量名不是指針AceofSpadesAceofSpadesAceofSpades注意:結(jié)構(gòu)不能作為整體輸入輸出。必須逐個成員輸入輸出。15問題:編寫函數(shù)實現(xiàn)結(jié)構(gòu)體的復制。結(jié)構(gòu)體#include<stdio.h>structdate

{intyear,month,day;};voidshow(char*,structdate);voidcopy(structdate,structdate);voidclone(structdate,structdate*);intmain(){

structdated1,d2,d3,d4;d1.year=2004;d1.month=5;d1.day=1;show(“d1”,d1);//結(jié)構(gòu)體變量作實參,值傳遞

d2=d1;show("d2",d2);實現(xiàn)(cw1302.c)11.6結(jié)構(gòu)體與函數(shù)16案例分析:結(jié)構(gòu)體作為函數(shù)的參數(shù)結(jié)構(gòu)體copy(d1,d3);show("d3",d3);clone(d1,&d4);show("d4",d4);}voidshow(char*name,structdated){printf("%s:%d-%d-%d\n",name,d.year,d.month,d.day);}voidcopy(structdates,structdated){d=s;}voidclone(structdates,structdate*dPtr){*dPtr=s;}d1:2004-5-1d2:2004-5-1d3:0-0-24(TC)在VC中運行的結(jié)果不一樣-858993460-858993460-858993460d4:2004-5-1用指針作形參用地址作實參傳遞//結(jié)構(gòu)體變量作實參,值傳遞,d3未賦值作實參值不確定空返回,無值返回(cw1302.c)續(xù)17一、結(jié)構(gòu)體數(shù)組的定義定義結(jié)構(gòu)體數(shù)組的方法和定義結(jié)構(gòu)體變量的方法一樣,只是必須說明其為數(shù)組。定義結(jié)構(gòu)體變量的三種方法都可以用來定義結(jié)構(gòu)體數(shù)組。二、結(jié)構(gòu)體數(shù)組的初始化和一般數(shù)組一樣,結(jié)構(gòu)體數(shù)組也可以進行初始化。數(shù)組每個元素的初值都放在一對大括號中,括號中依次排列元素各成員的初始值三、結(jié)構(gòu)體數(shù)組的引用對結(jié)構(gòu)體數(shù)組的引用一般是對數(shù)組元素的成員進行引用。引用只要遵循對數(shù)組元素的引用規(guī)則和對結(jié)構(gòu)體變量成員的引用規(guī)則即可。11.3定義結(jié)構(gòu)體數(shù)組18結(jié)構(gòu)體數(shù)組結(jié)構(gòu)體數(shù)組數(shù)組的元素是結(jié)構(gòu)體變量。常用結(jié)構(gòu)體來表示記錄,那么結(jié)構(gòu)體數(shù)組就可以表示一組記錄。案例分析全班N個學生,每個學生有學號、姓名、四門課的成績。結(jié)構(gòu)體學號姓名成績1成績2成績3成績4101WangHai80787681102ZhaoFei68667175………………………………130LiRui8276818419結(jié)構(gòu)體數(shù)組結(jié)構(gòu)體數(shù)組案例分析那么,可以定義結(jié)構(gòu)體數(shù)組來保存N個學生的數(shù)據(jù)。這樣,每個學生的數(shù)據(jù)就對應一個結(jié)構(gòu)體變量(一條記錄),便于編程處理。結(jié)構(gòu)體structstudent{

intnum;

charname[20];

floatscores[4];};structstudentstudents[30];20程序舉例設某班有N名學生,每個學生數(shù)據(jù)包括學號,姓名,性別,年齡,平均成績。要求輸入任意一個學號,輸出該學生的所有數(shù)據(jù)。分析:從一組數(shù)據(jù)中查找所需要的具有某特征的內(nèi)容,最簡單的是順序查找。直到找到或找完為止。/*Cw1303.c教材P171L11-1*/#include<stdio.h>#defineN2structstudent

//定義結(jié)構(gòu)體{longintnum;

//學號

charname[7];

//姓名

charsex[3];

//性別

intage,score;

//成績}stu[N];

//定義結(jié)構(gòu)體數(shù)組main(){inti,t=-1;

//t=-1為未查找到時的標志

longintxuehao;

//查找學號變量

structstudentstu[N];

//定義結(jié)構(gòu)體類型數(shù)組(cw1303.c)案例分析:結(jié)構(gòu)體數(shù)組21printf("請按下列順序輸入%d個學生的信息:\n",N);//為結(jié)構(gòu)體變量賦值printf("\t學號姓名性別年齡平均\n");for(i=0;i<N;i++){printf("NO%d:\t",i+1);scanf("%ld%s%s%d%d",&stu[i].num,&stu[i].name,&stu[i].sex,&stu[i].age,&stu[i].score);}printf("請輸入需查找學生的學號:");scanf("%ld",&xuehao);for(i=0;i<N;i++){if(xuehao==stu[i].num){t=i;break;}}if(t!=-1)/*以下輸出檢索結(jié)果*/printf("%ld%8s%4s%4d%4d\n",stu[t].num,stu[t].name,stu[t].sex,stu[t].age,stu[t].score);elseprintf("查無此人!\n");}(cw1303.c)續(xù)22案例分析:結(jié)構(gòu)體數(shù)組檢索問題:某班有n個學生,每個學生的數(shù)據(jù)包括學號、姓名、年齡和性別。要求給定任意一個學號,程序能輸出檢索的結(jié)果,并顯示對應的學生的數(shù)據(jù)。分析定義結(jié)構(gòu)體表示學生用結(jié)構(gòu)體數(shù)組保存學生數(shù)據(jù)采用順序查找法結(jié)構(gòu)體輸入學生信息輸入查詢條件查找學生信息,報告結(jié)果23案例分析:結(jié)構(gòu)體數(shù)組檢索實現(xiàn)(cw1304.c)結(jié)構(gòu)體#include<stdio.h>#defineMAX20intmain(){structStuRec{ intnum; charname[20]; chargender; intage;}

student[MAX];inti,N,num;24案例分析:結(jié)構(gòu)體數(shù)組檢索實現(xiàn)結(jié)構(gòu)體printf("\tInputaintegerasthenumberofstudents:");scanf("%d",&N);printf("\tInput%dstudents'information:\n",N);printf("\n\tNo.\tName\tGender\tAge\n");for(i=0;i<N;i++){printf("student%d:\n\t",i+1);scanf("%d%s%c%d",&student[i].num,student[i].name,&student[i].gender,&student[i].age);}(cw1304.c)續(xù)25案例分析:結(jié)構(gòu)體數(shù)組檢索實現(xiàn)結(jié)構(gòu)體printf("\n\tInputanumber:");scanf("%d",&num);printf("\n\tPleasewait.Searching...\n");

for(i=0;i<N;i++)if(num==student[i].num)break;

if(i<N){printf("\n\tNo.:%d\n\tName:%s\n\tGender:%c\n\tAge:%d\n",student[i].num, student[i].name, student[i].gender, student[i].age);}

elseprintf("\n\tNotfound!\n");}輸入查找條件查找(cw1304.c)續(xù)26案例分析:結(jié)構(gòu)體數(shù)組檢索問題:可以多次查找。結(jié)構(gòu)體輸入學生信息輸入查詢條件查找學生信息,報告結(jié)果是否繼續(xù)查詢YN人機交互27案例分析:結(jié)構(gòu)體數(shù)組檢索實現(xiàn)(cw1304m.c)部分代碼結(jié)構(gòu)體do{scanf("%d",&num);

for(i=0;i<N;i++)if(num==student[i].num) break;

if(i<N) {/*Found!*/}

else

printf("\n\tNotfound!\n");printf("\n\tContinue?(y/n)");c=getchar();}while(c=='y'||c=='Y');1001<Enter>y<Enter>(cw1304.c)續(xù)28小結(jié):知識要點結(jié)構(gòu)體是由若干個不同類型數(shù)據(jù)項構(gòu)成的集合。結(jié)構(gòu)體類型的定義:1.結(jié)構(gòu)體類型定義的一般形式 2.結(jié)構(gòu)體類型定義中的注意事項結(jié)構(gòu)體類型變量:結(jié)構(gòu)體數(shù)組:1.結(jié)構(gòu)體數(shù)組定義的三種方法2.結(jié)構(gòu)體數(shù)組的初始化3.對結(jié)構(gòu)體數(shù)組元素的成員進行引用1.結(jié)構(gòu)體類型變量定義的三種方法2.結(jié)構(gòu)體類型變量的初始化3.對結(jié)構(gòu)體變量中成員的引用4.對整個結(jié)構(gòu)體變量的引用29#include<stdio.h> //預處理調(diào)用輸入輸出頭文件#include<stdlib.h>//#defineN10 //定義符號常量structstu //定義結(jié)構(gòu)體{ longintsno; //學號長整型

intscore[4]; //成績浮點數(shù)一維數(shù)組三元素}stud[N]; //定義結(jié)構(gòu)體數(shù)組voidsort(structstuarr[]) //定義結(jié)構(gòu)體數(shù)組成績排序{ inti,j; //定義循環(huán)變量

structstutemp; //定義結(jié)構(gòu)體臨時變量

for(i=0;i<N;i++

溫馨提示

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

評論

0/150

提交評論