資源描述:
《結(jié)構(gòu)體、共用體與枚舉類型》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫。
1、第9章結(jié)構(gòu)體、共用體與枚舉類型本章要求為什么要引入結(jié)構(gòu)體,結(jié)構(gòu)體與數(shù)組有什么本質(zhì)不同?如何定義結(jié)構(gòu)體,有幾種定義形式?結(jié)構(gòu)體變量與結(jié)構(gòu)體指針變量有何區(qū)別,它們?nèi)绾胃髯砸媒Y(jié)構(gòu)體成員?結(jié)構(gòu)體數(shù)據(jù)如何作為函數(shù)的參數(shù)?為什么要引入鏈表,如何利用鏈表對內(nèi)存進行動態(tài)管理?本章重點結(jié)構(gòu)體變量的定義和使用鏈表的概念本章難點動態(tài)鏈表的常見操作第9章結(jié)構(gòu)體、共用體與枚舉類型9.1問題的提出與示例9.2結(jié)構(gòu)體類型的說明與變量定義9.3結(jié)構(gòu)體指針變量9.4結(jié)構(gòu)體數(shù)組9.5結(jié)構(gòu)體與函數(shù)9.6鏈表與動態(tài)內(nèi)存管理9.7結(jié)構(gòu)體綜合應(yīng)用舉例9.1問題的提出與示例9.1.1結(jié)構(gòu)
2、體概述例如,描述一個學(xué)生的數(shù)據(jù)實體包含學(xué)號、姓名、性別、出生年月、課程成績、家庭住址、聯(lián)系電話等數(shù)據(jù)項。各個數(shù)據(jù)項的類型是不同的,學(xué)號可為整型或字符串形式;性別為字符型;出生年月又分為年,月,日,它們可以分別為整型表示;課程成績可以是整型或?qū)嵭停患彝プ≈窇?yīng)為字符串;電話號碼可以是整型或字符串形式。對于這樣一個實體,不能統(tǒng)一用數(shù)組來描述,因為數(shù)組中各元素的類型、長度必須一致。如果用獨立的簡單數(shù)據(jù)項或數(shù)組分別表示它們,就不能體現(xiàn)一個實體數(shù)據(jù)的整體性和相互關(guān)聯(lián)性,也難以操作。對于這種由多種不同類型的數(shù)據(jù)組成的數(shù)據(jù)實體,C語言專門用結(jié)構(gòu)體數(shù)據(jù)類型來描述
3、,結(jié)構(gòu)體中所包含的數(shù)據(jù)項稱為結(jié)構(gòu)體的成員,結(jié)構(gòu)體由用戶根據(jù)實際來定義。9.1問題的提出與示例下表是一張100個學(xué)生成績管理表,要求計算并打印出每個學(xué)生的平均成績。學(xué)號姓名性別出生年月聯(lián)系電話家庭地址數(shù)學(xué)英語C程序平均成績84773801陳云男1989.287500341浙江寧波8089769.1問題的提出與示例如果按照以前學(xué)過的數(shù)組方法,可以定義如下的多個數(shù)組并賦初值如下:intstu_id[100]={84773801,84773802,84773803,84773804,84773805,84773806};/*定義一維數(shù)組存放每個學(xué)生的學(xué)
4、號*/charstu_name[100][8]={“陳云”,“沈棟棟”,“易婷婷”,“謝浩杰”,“鄭強”};/*定義字符串數(shù)組存放每個學(xué)生的姓名*/charstu_sex[100]={‘m’,‘m’,‘f’‘m’,‘m’};/*定義字符數(shù)組存放每個學(xué)生的性別*/intstu_year[100]={1989,1989,1990,1988,1988};/*定義一維數(shù)組存放每個學(xué)生的出生年份*/……..這些數(shù)組的數(shù)據(jù)在內(nèi)存中的存儲順序是:先存儲所有學(xué)生的學(xué)號、再接著存儲所有學(xué)生的姓名、接著性別、出生年份、出生月份、聯(lián)系電話、課程成績、平均成績。也就是
5、把所有學(xué)生的同一個類別(上表中某一列)以定義某一個數(shù)組的形式單獨放在一起,相當于所有學(xué)號放在一個數(shù)組里里,所有姓名放在另一個數(shù)組里,依次類推,要處理某一個學(xué)生的信息如計算平均值并打印某個學(xué)生的信息,要分別查詢所有不同的數(shù)組,很容易出錯且效率不高。這樣為每一項內(nèi)容分別定義變量或數(shù)組的方法導(dǎo)致存儲結(jié)構(gòu)零亂,處理過程非常繁瑣,一般不采用這種方法。未了解決這個問題,C語言定義了一種可由用戶自定義的數(shù)據(jù)類型,根據(jù)實際問題,將不同數(shù)據(jù)類型集中一起,把內(nèi)在有聯(lián)系的不同類型的數(shù)據(jù)統(tǒng)一成一個整體,設(shè)計符合要求的新的數(shù)據(jù)類型,稱為結(jié)構(gòu)體類型。這樣利用結(jié)構(gòu)體的特性可
6、以把某一個學(xué)生的所有相關(guān)的不同類型的數(shù)據(jù)項都順序存儲在一起,便于一個個學(xué)生的處理。如針對上述要求,可以定義為如下的學(xué)生的結(jié)構(gòu)體:structstudent{intstu_id;/*學(xué)生的學(xué)號*/charstu_name[8];/*學(xué)生的姓名*/charstu_sex;/*學(xué)生的性別*/struct{intyear;/*學(xué)生的出生年份*/intmonth;/*學(xué)生的出生月份*/}birthday;intstu_phone;/*學(xué)生的聯(lián)系電話*/charstu_address[30];/*學(xué)生的家庭地址*/intstu_course[3];/*學(xué)生
7、的三門課成績*/floatstu_average;/*學(xué)生的平均成績*/};聲明了一種新的數(shù)據(jù)類型structstudent。這個數(shù)據(jù)類型僅相當于一種結(jié)構(gòu)模式,與int,float,char等類型具有同等地位,也就是用戶自定義了一種新的數(shù)據(jù)類型,但并沒有為structstudent分配相應(yīng)的存儲空間,就像系統(tǒng)并沒有為int分配存儲空間一樣,而是需要定義一個整型變量,為這個整型變量分配存儲空間。同樣的,也需要一個結(jié)構(gòu)體變量,為這個結(jié)構(gòu)體變量分配存儲空間?!纠?-1】按表9-1的形式從鍵盤依次輸入每個學(xué)生的學(xué)號,姓名,出生年月,三門課的成績,計算并
8、打印出每個學(xué)生的平均成績。分析:這里首先要定義一個描述學(xué)生學(xué)號,姓名,出生年月,三門課,平均成績的結(jié)構(gòu)體類型,再定義一個結(jié)構(gòu)體變量,通過循環(huán)語句對這個