




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第十四講結構體相關數據的集合。數據的類型可以不相同。用來定義保存在文件中的記錄。與指針一起創建動態的數據結構:鏈表隊列棧樹C語言程序設計1第十四講結構體結構體的概念結構體類型的定義結構體變量定義和聲明初始化使用結構體數組C語言程序設計本講是教材第11章,但我們由于課時和全國C的大綱關系,第四至10節不講,有興趣者,自己學習.本課件后面還有一些有趣的例子,如冼牌,選舉計票程序,有興趣者也可以自學.結構體是派生的數據類型使用其他類型的對象來構造結構體。11.1定義結構體2結構體結構體數組是由相同類型的數據構成,而現實生活中由一些不相同類型的數據構成的一組數據是相當多的,例如學號、姓名和學生成績。C語言提供了這種數據結構稱為結構體,它是一種較為復雜而又非常靈活的構造型的數據類型。一個結構體類型可以由若干個成員(或域)的成分組成,不同的結構體類型其成員不同。對于一個具體的結構體而言其成員的數量是固定的(同數組),各成員的數據類型可以不同,這是結構體與數組的重要相同和不同點。3結構體類型定義的一般形式為:struct結構體名{類型名1成員名1;類型名2成員名2;……類型名n成員名n;};結構體其中,struct是關鍵字,是結構體類型的標志。結構體名是由用戶定義的標識符,它規定了所定義的結構體類型的名稱。結構體類型的組成成分稱為成員,成員名的命名規則與變量名相同。如果成員的類型相同,則可以同變量一樣在一個類型名后寫出幾個成員名,他們之間用逗號分隔。structstudent{longintxuhao;charname[8];inteng,coup,sum;floatave;};4structdate{intyear;intmonth;intday;};也可以寫成:structdate{intyear,month,day;};structstudent{intnum;charname[8],sex;floatscore[4];};struct:引入結構體定義。date:結構體的名稱,必須與struct一起使用。structdate結構體包含3個int*類型的成員:yearMonthday例如A:這里structstudent結構體包含有:Int型num(學號)charname[8](姓名),sex(性別)Floatscore[4](成績數組)例如B:5結構體類型的定義結構體定義說明同一個結構體內不可以有同名的成員。不同結構體的成員名可以相同,不互相沖突。結構體structdate{intyear,month,day;};structBook{
chartitle[50],writer[20],publisher[50];
intyear,month;};intyear,month,day;6結構體類型的定義結構體定義說明結構體的成員可以是基本類型和構造類型(數組和其他結構體)。結構體structdate{intyear,month,day;}birthday;structStuRec{intnum;charname[20]; //這里包含了數組
structdatebirthday; //這里包含了上面的結構體,稱結構體的嵌套};結構體的成員不可以包含自身但可以包含自身的指針structstudent{charname[20];chargender;floatscores[4];
structstudentnext;/*error*/
structstudent*nextPtr;/*correct*/};7結構體定義說明只是創建了新的數據類型,并不能保留內存空間。必須定義結構體變量來獲得內存空間。定義(聲明)結構體變量有三種方法:定義結構體類型后,像聲明普通變量一樣聲明結構體變量。結構體structdate{intyear,month,day;};structdatebirth;yearmonthdayFF00FF04FF08birthbirth的存儲形式TC中與VC中的不同11.2定義和使用結構體變量8結構體變量定義聲明結構體變量2.在定義結構體類型的同時,聲明結構體變量結構體structdate{intyear,month,day;}birth,days[4],*bPtr;struct{intyear,month,day;}birth,days[4],*bPtr;沒有結構體名,無法再次使用。3.直接(只)聲明結構體變量省略類型名。⑴類型與變量是不同的概念,注意區分。系統能對變量賦值、存取、運算,而類型則不能,編譯時,系統只對變量分配存儲空間,而類型則不分配。⑵結構體中的成員也可以是一個結構體變量,即結構體的嵌套。9structstudent
/*student是結構體名,結構體成員有num,name,sex,date,scre[4]*/
{int
num;
char
name[8],sex;
struct
date
/*date是結構體名,其結構體變量表是birthday,成員包括年月日*/
{int
year,month,day;}birthday;
floatscore[4];
/*score[4]是數組,數組成員類型浮點型*/
}xuesh;⑶結構體中的成員名可以和程序中的變量同名;不同結構體中的成員名也可以同名。11.4結構體的嵌套10結構體的操作結構體變量可以執行的操作將結構體變量賦給相同類型的結構體變量。得到結構體變量的地址。訪問結構體變量的成員。使用sizeof確(測)定結構體變量的大小。結構體11結構體變量的初始化給全部成員賦初值結構體structstudent{intnum;
charname[8],sex;structdate{intyear,month,day;}birthday;
floatsco[4];}xuesh={101,“王小寧”,‘F’,1975,5,21,83.6,88,75.5,90};將結構體變量各成員的初值順序地放在一對大括號中,并用逗號分隔。對結構體類型變量賦初值時,按每個成員在結構體中的順序一一對應賦值。同變量一樣結構體變量在定義時也可以進行初始化。12結構體變量的初始化初始化結構體變量給部分成員賦初值。結構體structStuRec{
intnum;
charname[20];
structdate{intyear,month,day;}birthday;
floatscore;}student={101,“王小寧”};num(2B)name(20B)birthday(6B)score(4B)yearmonthday101王小寧0000.013訪問結構體成員的兩種方式結構體成員運算符:.用于結構體變量結構體指針運算符:->用于指向結構體的指針等價于(*cardPtr).face結構體structcardmyCard;printf(“%s”,myCard.face);structcard*cardPtr;printf(“%s”,cardPtr->face);structcard{char*face;char*suit;}myCard.face;11.5結構體指針14案例分析:結構體變量的成員問題:訪問結構體變量的成員。(cw1301.c)結構體#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);}與數組的不同:結構變量名不是指針AceofSpadesAceofSpadesAceofSpades注意:結構不能作為整體輸入輸出。必須逐個成員輸入輸出。15問題:編寫函數實現結構體的復制。結構體#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);//結構體變量作實參,值傳遞
d2=d1;show("d2",d2);實現(cw1302.c)11.6結構體與函數16案例分析:結構體作為函數的參數結構體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中運行的結果不一樣-858993460-858993460-858993460d4:2004-5-1用指針作形參用地址作實參傳遞//結構體變量作實參,值傳遞,d3未賦值作實參值不確定空返回,無值返回(cw1302.c)續17一、結構體數組的定義定義結構體數組的方法和定義結構體變量的方法一樣,只是必須說明其為數組。定義結構體變量的三種方法都可以用來定義結構體數組。二、結構體數組的初始化和一般數組一樣,結構體數組也可以進行初始化。數組每個元素的初值都放在一對大括號中,括號中依次排列元素各成員的初始值三、結構體數組的引用對結構體數組的引用一般是對數組元素的成員進行引用。引用只要遵循對數組元素的引用規則和對結構體變量成員的引用規則即可。11.3定義結構體數組18結構體數組結構體數組數組的元素是結構體變量。常用結構體來表示記錄,那么結構體數組就可以表示一組記錄。案例分析全班N個學生,每個學生有學號、姓名、四門課的成績。結構體學號姓名成績1成績2成績3成績4101WangHai80787681102ZhaoFei68667175………………………………130LiRui8276818419結構體數組結構體數組案例分析那么,可以定義結構體數組來保存N個學生的數據。這樣,每個學生的數據就對應一個結構體變量(一條記錄),便于編程處理。結構體structstudent{
intnum;
charname[20];
floatscores[4];};structstudentstudents[30];20程序舉例設某班有N名學生,每個學生數據包括學號,姓名,性別,年齡,平均成績。要求輸入任意一個學號,輸出該學生的所有數據。分析:從一組數據中查找所需要的具有某特征的內容,最簡單的是順序查找。直到找到或找完為止。/*Cw1303.c教材P171L11-1*/#include<stdio.h>#defineN2structstudent
//定義結構體{longintnum;
//學號
charname[7];
//姓名
charsex[3];
//性別
intage,score;
//成績}stu[N];
//定義結構體數組main(){inti,t=-1;
//t=-1為未查找到時的標志
longintxuehao;
//查找學號變量
structstudentstu[N];
//定義結構體類型數組(cw1303.c)案例分析:結構體數組21printf("請按下列順序輸入%d個學生的信息:\n",N);//為結構體變量賦值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)/*以下輸出檢索結果*/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)續22案例分析:結構體數組檢索問題:某班有n個學生,每個學生的數據包括學號、姓名、年齡和性別。要求給定任意一個學號,程序能輸出檢索的結果,并顯示對應的學生的數據。分析定義結構體表示學生用結構體數組保存學生數據采用順序查找法結構體輸入學生信息輸入查詢條件查找學生信息,報告結果23案例分析:結構體數組檢索實現(cw1304.c)結構體#include<stdio.h>#defineMAX20intmain(){structStuRec{ intnum; charname[20]; chargender; intage;}
student[MAX];inti,N,num;24案例分析:結構體數組檢索實現結構體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)續25案例分析:結構體數組檢索實現結構體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)續26案例分析:結構體數組檢索問題:可以多次查找。結構體輸入學生信息輸入查詢條件查找學生信息,報告結果是否繼續查詢YN人機交互27案例分析:結構體數組檢索實現(cw1304m.c)部分代碼結構體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)續28小結:知識要點結構體是由若干個不同類型數據項構成的集合。結構體類型的定義:1.結構體類型定義的一般形式 2.結構體類型定義中的注意事項結構體類型變量:結構體數組:1.結構體數組定義的三種方法2.結構體數組的初始化3.對結構體數組元素的成員進行引用1.結構體類型變量定義的三種方法2.結構體類型變量的初始化3.對結構體變量中成員的引用4.對整個結構體變量的引用29#include<stdio.h> //預處理調用輸入輸出頭文件#include<stdlib.h>//#defineN10 //定義符號常量structstu //定義結構體{ longintsno; //學號長整型
intscore[4]; //成績浮點數一維數組三元素}stud[N]; //定義結構體數組voidsort(structstuarr[]) //定義結構體數組成績排序{ inti,j; //定義循環變量
structstutemp; //定義結構體臨時變量
for(i=0;i<N;i++
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 七下考試卷真題及答案
- 重癥監護室護理工作流程
- 2025版高考數學一輪復習第10章計數原理概率隨機變量及其分布第3節隨機事件的概率古典概型與幾何概型教學案理含解析新人教A版
- 和鄰居的房屋改造協議書10篇
- 站內暖通施工方案范本
- 網站設計合同書6篇
- 波形鋼板施工方案
- 濰坊市奎文區招聘師范類畢業生筆試真題2024
- 吉林公務員真題試卷2024
- 2025年度4月份科研項目成果轉化擔保借款協議收益分成細則
- 工程經濟學(第6版)全套教學課件
- 2024年腐植酸尿素行業分析報告及未來發展趨勢
- 高中單詞速記3500表打印
- 反派研究報告by紙上譜
- 五年級下冊數學北師大版教材習題參考答案
- 五年級下冊科學全冊知識點總結與梳理(新改版蘇教版)
- 能源管理體系培訓課件(2023年EnMS)
- 【獲獎】英語跨學科項目式作業設計
- 2022年江蘇省南京市中考語文真題(解析版)
- 山西省繁峙縣鑫秀礦山有限責任公司香臺-康家溝鐵礦礦產資源開發利用和礦山環境保護與土地復墾方案
- 國家開放大學《成本管理》形考任務(1-4)試題答案解析
評論
0/150
提交評論