




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、第十一章 結(jié)構(gòu)體結(jié)構(gòu)體結(jié)構(gòu)體與函數(shù)本章小結(jié)作業(yè)第十一章 結(jié)構(gòu)體結(jié)構(gòu)體考慮這樣一類數(shù)據(jù):一個(gè)數(shù)據(jù)項(xiàng)由多個(gè)子數(shù)據(jù)項(xiàng)組成,而且每個(gè)子數(shù)據(jù)項(xiàng)的類型可能不一樣。在人事檔案管理中,每個(gè)人的自然情況表可能包含:名字(字符串型)年齡(整型)出生時(shí)間(三個(gè)整型)性別(枚舉)等等。研究人造衛(wèi)星,每個(gè)人造衛(wèi)星的信息可能包括:名字(字符型)發(fā)射時(shí)間(三個(gè)整數(shù))重量(實(shí)型)直徑(實(shí)型)軌道半徑(實(shí)型)赤道夾角(實(shí)型)等等??紤]這樣一類數(shù)據(jù):一個(gè)數(shù)據(jù)項(xiàng)由多個(gè)子數(shù)據(jù)項(xiàng)組成,而且每個(gè)子數(shù)數(shù)組可描述由同類型子數(shù)據(jù)項(xiàng)組成的數(shù)據(jù)。結(jié)構(gòu)體可描述由不同類型子數(shù)據(jù)項(xiàng)組成的數(shù)據(jù)名字年齡出生時(shí)間 年 月 日性別名字發(fā)射時(shí)間 年 月 日重量直
2、徑軌道半徑與赤道夾角數(shù)組可描述由同類型子數(shù)據(jù)項(xiàng)組成的數(shù)據(jù)。名字年齡出生時(shí)間 結(jié)構(gòu)體結(jié)構(gòu)體類型結(jié)構(gòu)體類型是分量的集合分量也稱成員、成分、域結(jié)構(gòu)體類型定義形式A結(jié)構(gòu)體類型定義形式Bstruct t id,. ,id ; . t id,. ,id ;struct sid t id,. ,id ; . t id,. ,id ;結(jié)構(gòu)體結(jié)構(gòu)體類型結(jié)構(gòu)體類型定義形式A結(jié)構(gòu)體類型定義形式Bst 例11-1 一個(gè)人的自然情況表 衛(wèi)星數(shù)據(jù)類型enum sext male , female ;struct date int year ,month ,day ;struct preson char name10 ;
3、int age ; enum sext sex ; struct date birthdate ; struct mansatellite char name10 ; struct date lounchdate ; float weight, diameter, orbitrad, angle ; ; 例11-1 一個(gè)人的自然情況表 year:month:day:date是一個(gè)結(jié)構(gòu)體類型,包含三個(gè)成分成分year為int類型成分month為int類型成分day為int類型year:month:day:date是一個(gè)結(jié)構(gòu)體類型,包含preson是一個(gè)結(jié)構(gòu)體類型,包含四個(gè)成分成分name為數(shù)組類
4、型成分age為int類型成分sex為枚舉類型成分birthdate仍為一個(gè)結(jié)構(gòu)體類型name:age:sex:year:birthdate:month:day:preson是一個(gè)結(jié)構(gòu)體類型,包含四個(gè)成分name:age:mansatellite是一個(gè)結(jié)構(gòu)體類型,包含六個(gè)成分name:year:lounchdate:month:day:weight:diameter:orbitrad:angle:mansatellite是一個(gè)結(jié)構(gòu)體類型,包含六個(gè)成分nam結(jié)構(gòu)體類型引用 在struct后跟以結(jié)構(gòu)體標(biāo)簽,稱為“結(jié)構(gòu)體類型引用”。在例11-1的結(jié)構(gòu)體類型定義的意義下: struct date str
5、uct preson struct mansatellite 都是結(jié)構(gòu)體類型引用,使用它們將分別標(biāo)記相應(yīng)結(jié)構(gòu)體定義。結(jié)構(gòu)體類型引用結(jié)構(gòu)體類型說明符:結(jié)構(gòu)體類型定義和結(jié)構(gòu)體類型引用統(tǒng)稱“結(jié)構(gòu)體類型說明符”使用結(jié)構(gòu)體類型說明符可以定義結(jié)構(gòu)體類型的類型名聲明結(jié)構(gòu)體類型變量結(jié)構(gòu)體類型說明符:結(jié)構(gòu)體類型定義和結(jié)構(gòu)體類型引用統(tǒng)稱“結(jié)構(gòu)結(jié)構(gòu)體類型名使用 typedef 可以定義結(jié)構(gòu)體 類型名typedef 結(jié)構(gòu)體類型說明符 標(biāo)識(shí)符例子typedef struct int y,m,d datetype;struct date int y,m,d ;typedef struct date datetype;結(jié)構(gòu)
6、體類型名使用 typedef 可以定義結(jié)構(gòu)體 類型名t例11-2 定義結(jié)構(gòu)體類型名typedef struct date int year,month,day ; datetype ;typedef char tstring1010;typedef struct tstring10 name ; int age ; enum sext sex ; struct date birthdate ; presontype ; typedef struct mansatellite mansatellitetype datetype birthdate; 例11-2 定義結(jié)構(gòu)體類型名typedef s
7、truct結(jié)構(gòu)體變量結(jié)構(gòu)體類型變量聲明可以采取如下三種形式之一使用結(jié)構(gòu)體類型引用直接使用結(jié)構(gòu)體類型定義使用typedef定義的結(jié)構(gòu)體類型名結(jié)構(gòu)體變量結(jié)構(gòu)體類型變量聲明可以采取如下三種形式之一例11-3 結(jié)構(gòu)體變量聲明struct preson zhang ;struct date int year,month,day ; dateofbirth;struct char author10 ;datetype publish_date ;int page_number ; programming ;mansatellitetype first_east ;變量zhang用結(jié)構(gòu)體類型引用聲明是str
8、uct preson類型,具有如圖結(jié)構(gòu)name:age:sex:year:birthdate:month:day:例11-3 結(jié)構(gòu)體變量聲明struct preson 例11-3 結(jié)構(gòu)體變量聲明struct preson zhang ;struct date int year,month,day ; dateofbirth;struct char author10 ;datetype publish_date ;int page_number ; programming ;mansatellitetype first_east ;變量programming使用不帶結(jié)構(gòu)體標(biāo)簽的結(jié)構(gòu)體類型定義聲明
9、,包含3個(gè)成分,分別為字符數(shù)組類型的author、datetype類型的publish_date、int類型的page_number,結(jié)構(gòu)如圖所示;author:year:publish_date:month:day:page_number:例11-3 結(jié)構(gòu)體變量聲明struct preson 例11-3 結(jié)構(gòu)體變量聲明struct preson zhang ;struct date int year,month,day ; dateofbirth;struct char author10 ;datetype publish_date ;int page_number ; programmin
10、g ;mansatellitetype first_east ;變量first_east使用typedef定義的類型標(biāo)識(shí)符mansatellitetype聲明,具有如圖結(jié)構(gòu)name:year:lounchdate:month:day:weight:diameter:orbitrad:angle:例11-3 結(jié)構(gòu)體變量聲明struct preson 類型定義不分配存儲(chǔ)空間,只說明一個(gè)數(shù)據(jù)類型的框架結(jié)構(gòu)。變量聲明時(shí)才給變量分配存儲(chǔ)空間,并且使得被聲明的變量具有相應(yīng)類型的結(jié)構(gòu)。到目前為止聲明的四個(gè)變量zhang、dateofbirth、programming、first_east具有實(shí)體,被分配存儲(chǔ)
11、空間。類型標(biāo)識(shí)符datetype、 mansatellitetype只是定義了一個(gè)數(shù)據(jù)類型的框架,不占用存儲(chǔ)空間,只給相應(yīng)類型起一個(gè)名字。類型定義不分配存儲(chǔ)空間,只說明一個(gè)數(shù)據(jù)類型的框架結(jié)構(gòu)。指向結(jié)構(gòu)體變量的指針C可以定義指向任何類型的指針類型,并聲明相應(yīng)指針類型的變量,結(jié)構(gòu)體類型當(dāng)然不例外。指向結(jié)構(gòu)體變量的指針C可以定義指向任何類型的指針類型,并聲明struct preson *pointer_preson ; struct date int year,month,day ; *dateofpointer ; struct char author10 ; datetype publish_d
12、ate ; int page_number ; *p ; mansatellitetype *p_east例11-4 指向結(jié)構(gòu)體類型變量的指針變量變量pointer_preson為指向標(biāo)簽為preson的結(jié)構(gòu)體類型變量的指針變量。 pointer_preson可以指向相應(yīng)結(jié)構(gòu)體類型的變量。比如 pointer_preson = &zhang ;變量p為指向無標(biāo)簽結(jié)構(gòu)體類型變量的指針變量。 P 可以指向相應(yīng)結(jié)構(gòu)體類型的變量。比如 p = &programming ;變量p_east為指向結(jié)構(gòu)體類型mansatellitetype變量的指針變量。 p_east 可以指向相應(yīng)結(jié)構(gòu)體類型的變量。比如
13、p_east = &first_east ;struct preson *pointer_preso結(jié)構(gòu)體變量的成分訪問結(jié)構(gòu)體變量的一個(gè)成分,使用成員選擇表達(dá)式成員選擇表達(dá)式 直接成員選擇 間接成員選擇直接成員選擇 后綴表達(dá)式 . 標(biāo)識(shí)符間接成員選擇 后綴表達(dá)式 - 標(biāo)識(shí)符 結(jié)構(gòu)體變量的成分訪問結(jié)構(gòu)體變量的一個(gè)成分,使用成員選擇表達(dá)式直接成員選擇直接成員選擇表達(dá)式針對(duì)一般的結(jié)構(gòu)體變量。 形式是: r . w r 是后綴表達(dá)式,最終計(jì)算出一個(gè)結(jié)構(gòu)體變量;w是 r 所屬結(jié)構(gòu)體類型中的一個(gè)成員名字下述成員選擇表達(dá)式是合法的: programming_pascal.author直
14、接成員選擇間接成員選擇間接成員選擇表達(dá)式針對(duì)指向結(jié)構(gòu)體變量的指針變量形式是 p-w p 是后綴表達(dá)式,最終計(jì)算出一個(gè)指向結(jié)構(gòu)體變量的指針變量;w 是p所指向結(jié)構(gòu)體變量所屬類型中的一個(gè)成員名字下述成員選擇表達(dá)式是合法的: pointer_preson - name p_east - weight p_east - lounchdate間接成員選擇也可首先對(duì)指針變量進(jìn)行求地址運(yùn)算然后使用直接成員選擇比如上述三個(gè)選擇表達(dá)式還可以寫成如下形式。由于優(yōu)先級(jí)的原因,這里的括號(hào)是必須的(*pointer_preson).name(*p_east).weight (*p_east).lounchdate也可首
15、先對(duì)指針變量進(jìn)行求地址運(yùn)算由于成員選擇表達(dá)式本身也是一個(gè)變量訪問,它是相應(yīng)成分類型的一個(gè)變量,它與成分類型的其它變量一樣凡是可以使用那些變量的地方都可以使用成員選擇表達(dá)式。對(duì)于嵌套結(jié)構(gòu)體,可以認(rèn)為“成員選擇表達(dá)式”仍然是一個(gè)“后綴表達(dá)式”,所以可以繼續(xù)應(yīng)用“成員選擇表達(dá)式”的規(guī)則訪問里層的成分。zhang.birthdate.monthp_east - lounchdate.year由于成員選擇表達(dá)式本身也是一個(gè)變量訪問,它是相應(yīng)成分類型的一例11-5 設(shè)計(jì)表示復(fù)數(shù)的結(jié)構(gòu)體類型, 給出復(fù)數(shù)加法和乘法函數(shù)解: /* 復(fù)數(shù)類型 */ typedef struct complex float rea
16、l_part,imaginary_part ; complex_type例11-5 設(shè)計(jì)表示復(fù)數(shù)的結(jié)構(gòu)體類型, /* 復(fù)數(shù)加法 */complex_type complex_add(complex_type x, complex_type y) complex_type add; add.real_part=x.real_part+y.real_part; add.imaginary_part=x.imaginary_part+y.imaginary_part; return add;/* 復(fù)數(shù)加法 */* 復(fù)數(shù)乘法 */ complex_type complex_mul ( complex_
17、type x, complex_type y ) complex_type product ; product.real_part = x.real_part * y.real_part + x.imaginary_part * y.imaginaty_part ; product.imaginary_part = x.real_part * y.imaginary_part + x.imaginaty_part * y.real_part ; return product ; /* 復(fù)數(shù)乘法 */【例11-6】已知圖書檢索卡的結(jié)構(gòu)如圖所示,建立該卡片的數(shù)據(jù)結(jié)構(gòu),并編出根據(jù)書號(hào)檢索相應(yīng)書名、作
18、者名、語種、摘要的函數(shù)。書名:作者:語種 出版日期: 年 月 日書號(hào):類號(hào)序號(hào)摘要:解: 顯然應(yīng)該用結(jié)構(gòu)體類型來描述該卡片。設(shè)每個(gè)結(jié)構(gòu)體變量為一張卡片, 全部卡片存放在文件 card.dat 中。函數(shù)先讀入書號(hào);對(duì)欲檢索的書號(hào)采用順序檢索方式檢索; 檢索到后輸出書名、作者名、語種、摘要;最后輸出提示信息“search end!”?!纠?1-6】已知圖書檢索卡的結(jié)構(gòu)如圖所示,建立該卡片的數(shù)據(jù)假設(shè)主程序中有下述一系列聲明FILE * cardpointer ; /* 文件指針 */struct bookno / 書號(hào)結(jié)構(gòu)體 char catalogue ; char order8 ; ;struc
19、t date / 日期結(jié)構(gòu)體 int year,month,day ; ;struct bookcard / 檢索卡結(jié)構(gòu)體 char name32,author16,languge16 ; struct date publishingdate ; struct bookno no ; char abstract256; ;假設(shè)主程序中有下述一系列聲明并且在主函數(shù)中已經(jīng)用cardpointer=fopen(card.dat,r );打開了文件card.dat ,則 檢索函數(shù) searchbook 輸出檢索結(jié)果的函數(shù)out_anser如下:并且在主函數(shù)中已經(jīng)用/* 輸出檢索結(jié)果函數(shù) */void
20、out_anser(struct bookcard card ) int i , j , k ; printf( “NAME:%sn”, ); printf( “AUTHOR:%sn”, card.author); printf( “LANGUGE:%sn”, card.languge ); printf(Publish date:%d-%d-%d ,card.publishdate.year ,card.publishdate.month ,card.publishdate.day); printf( “ABSTRACT:n” ) ; for ( i=0; i3; i+
21、) printf( “ ” ) ; for ( k=1; k=64; k+ ) printf( “%c”,card.abstract64*i+j) ; printf(“n”); /* 輸出檢索結(jié)果函數(shù) */ /* 檢索函數(shù) */ void searchbook( void ) char catalogue0 ; char order08 ; struct bookcard card; /* 輸入欲檢索的類別, 書號(hào) */ printf ( pleace input catalogue , order : ) ; scanf( “%c” , &catalogue0 ) ; scanf( “%s”
22、 , order0 ); /* 檢索*/ rewind(cardpointer); while ( !feof(cardpointer) ) fread( &card , sizeof(struct bookcard) ,1, cardpointer); if ( ( card.no.catalogue = catalogue0 ) & ( card.no.order = order0 ) ) out_anser(card) ; printf(“search end!n”); /* 檢索函數(shù) */結(jié)構(gòu)體與函數(shù)結(jié)構(gòu)體與函數(shù)的關(guān)系返回結(jié)構(gòu)體值的函數(shù)函數(shù)的結(jié)構(gòu)體參數(shù)在C中允許函數(shù)類型為結(jié)構(gòu)體類型,即
23、函數(shù)可以返回一個(gè)結(jié)構(gòu)體值;還允許結(jié)構(gòu)體作為函數(shù)的參數(shù),用參數(shù)的方式向函數(shù)傳遞結(jié)構(gòu)體類型的值。結(jié)構(gòu)體與函數(shù)結(jié)構(gòu)體與函數(shù)的關(guān)系返回結(jié)構(gòu)體值的函數(shù)函數(shù)的計(jì)算結(jié)果可能是一個(gè)結(jié)構(gòu)體值。在C中,有兩種途徑能夠把該結(jié)構(gòu)體值通過函數(shù)調(diào)用帶回調(diào)用函數(shù)的主程序。使用指針函數(shù)的結(jié)果類型是指向結(jié)構(gòu)體類型變量的指針類型直接使用結(jié)構(gòu)體類型函數(shù)的結(jié)果類型是結(jié)構(gòu)體類型,直接把一個(gè)結(jié)構(gòu)體值帶回調(diào)用函數(shù)的主程序返回結(jié)構(gòu)體值的函數(shù)函數(shù)的計(jì)算結(jié)果可能是一個(gè)結(jié)構(gòu)體值。在C中,第一種方式就是返回指針的函數(shù),只不過相應(yīng)指針是指向結(jié)構(gòu)體類型變量的指針。與其它類型返回指針的函數(shù)沒有任何區(qū)別,本書在第八章8.2節(jié)已經(jīng)介紹過,此處不再贅述。本章的
24、例11-5已經(jīng)使用了第二種方式,下邊再舉例介紹這種方式。第一種方式就是返回指針的函數(shù),只不過相應(yīng)指針是指向結(jié)構(gòu)體類型例11-9一個(gè)人事檔案管理系統(tǒng)中,職工登記卡包含姓名、性別、出生時(shí)間等信息。為該人事檔案管理系統(tǒng)編寫輸入一個(gè)職工卡片的函數(shù),供主管理系統(tǒng)使用。例11-9一個(gè)人事檔案管理系統(tǒng)中,職工登記卡包含姓名、性別、解:職工登記卡的類型定義如下。 typedef enum male , female sextype ; typedef struct int year,month,day ; datetype; typedef struct cardperson char name8 ; /*
25、姓名 */ datetype birthdate ; /* 出生時(shí)間 */ sextype sex; /* 性別 */ typecardperson ; 解:職工登記卡的類型定義如下。typecardperson readcard(void)typecardperson card; / 說明一個(gè)卡片類型變量int sex_tag;printf( pleace input name:);/ 以下開始輸入scanf(%s,); / 姓名printf( please input birthdate:year、month、day);scanf(“%d %d %d”, &(card.b
26、irthdate.year), &(card.birthdate.month), &(card.birthdate.day) );/出生時(shí)間 printf( pleace input sex(0:male , 1:female);scanf(%d, &sex_tag);/ 性別if ( sex_tag=0 ) card.sex = male ;else card.sex = female ;return card; / 帶著一張卡片card值返回typecardperson readcard(void)在主程序中,將使用函數(shù)readcard帶回的card值。比如主程序中具有功能:輸入所有職工卡
27、片、填加一張職工卡片等,這些功能的實(shí)現(xiàn)都將調(diào)用該函數(shù)。如果用數(shù)組保存所有卡片并且設(shè)不超過100個(gè)職工,并有聲明: #define n 100 int v,flag; typecardperson card_arrn;在主程序中,將使用函數(shù)readcard帶回的card值。比如可以設(shè)計(jì)實(shí)現(xiàn)輸入功能的程序片段如下: v=0; flag=1; while (flag) card_arrv = read_card();v+;printf( please choose 0_end 1_continue :); scanf(%d, &flag); 其中語句“card_arrv = read_card();”調(diào)用函數(shù)read_card 函數(shù)帶回的值是結(jié)構(gòu)體值,直接送入數(shù)組成分變量card_arrv中可以設(shè)計(jì)實(shí)現(xiàn)輸入功能的程序片段如下:結(jié)構(gòu)體作函數(shù)參數(shù)在函數(shù)之間,通過參數(shù)傳送結(jié)構(gòu)體值也有兩種方法用指向結(jié)構(gòu)體變量的指針作函數(shù)參數(shù)直接用結(jié)構(gòu)體變量作函數(shù)參數(shù)第一種方式就是指針作函數(shù)參數(shù),只不過相應(yīng)指針是指向結(jié)構(gòu)體類型變量的指針。與指向其它類型變量的指針沒有任何區(qū)別。本章的例11-6已經(jīng)使用了第二種方式,下邊再舉例介紹這種方式。結(jié)構(gòu)體作函數(shù)參數(shù)在函數(shù)之間,通過參數(shù)傳送結(jié)構(gòu)體值也有兩種方法例11-10人事檔案管理問題。為該人事檔案管理系統(tǒng)編一個(gè)查詢函數(shù),供主管理系統(tǒng)使用。該函數(shù)帶入被檢索人員的全部信息,
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 提供材料合同范本
- 租賃合同范本押金
- 5風(fēng)兒輕輕吹(教學(xué)設(shè)計(jì))-2023-2024學(xué)年道德與法治一年級(jí)下冊(cè)統(tǒng)編版
- 6 綜合與實(shí)踐(教學(xué)設(shè)計(jì))-2024-2025學(xué)年一年級(jí)上冊(cè)數(shù)學(xué)北師大版
- 煤炭訂貨合同范本
- 2024-2025學(xué)年高中英語選修課趣味英語教學(xué)設(shè)計(jì)
- 3《我們班 他們班》第二課時(shí)(教學(xué)設(shè)計(jì))-部編版道德與法治四年級(jí)上冊(cè)
- 9 這些是大家的(教學(xué)設(shè)計(jì))-2024-2025學(xué)年統(tǒng)編版道德與法治二年級(jí)上冊(cè)
- 噴泉采購合同范本
- 擔(dān)保公司融資合同范本
- 部編版版語文三年級(jí)下冊(cè)全冊(cè)教案
- 山東省2023-2024學(xué)年高一下學(xué)期3月月考物理試題(A卷)(解析版)
- 2024-2034年中國形體矯正鞋行業(yè)市場(chǎng)現(xiàn)狀分析及競(jìng)爭格局與投資發(fā)展研究報(bào)告
- 項(xiàng)目保密工作實(shí)施方案
- 電競(jìng)產(chǎn)業(yè)園方案
- 高甘油三酯血癥性急性胰腺炎診治急診專家共識(shí)2021解讀
- 精密測(cè)量課程中的思政案例弘揚(yáng)工匠精神助力科技強(qiáng)國
- 殘疾人就業(yè)服務(wù)
- 傳統(tǒng)的中國紋樣與飾品設(shè)計(jì)
- 工業(yè)園區(qū)消防培訓(xùn)課件
- 供水管網(wǎng)項(xiàng)目背景
評(píng)論
0/150
提交評(píng)論