C程序設計第11章課件_第1頁
C程序設計第11章課件_第2頁
C程序設計第11章課件_第3頁
C程序設計第11章課件_第4頁
C程序設計第11章課件_第5頁
已閱讀5頁,還剩40頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

1、考慮這樣一類數據:一個數據項由多個子數據項組成,而且每個子數據項的類型可能不一樣。在人事檔案管理中,每個人的自然情況表可能包含:名字(字符串型)年齡(整型)出生時間(三個整型)性別(枚舉)等等。研究人造衛星,每個人造衛星的信息可能包括:名字(字符型)發射時間(三個整數)重量(實型)直徑(實型)軌道半徑(實型)赤道夾角(實型)等等。第1頁,共45頁。數組可描述由同類型子數據項組成的數據。結構體可描述由不同類型子數據項組成的數據名字年齡出生時間 年 月 日性別名字發射時間 年 月 日重量直徑軌道半徑與赤道夾角第2頁,共45頁。結構體結構體類型結構體類型是分量的集合分量也稱成員、成分、域結構體類型定

2、義形式A結構體類型定義形式Bstruct t id,. ,id ; . t id,. ,id ;struct sid t id,. ,id ; . t id,. ,id ;第3頁,共45頁。 例11-1 一個人的自然情況表 衛星數據類型enum sext male , female ;struct date int year ,month ,day ;struct preson char name10 ; int age ; enum sext sex ; struct date birthdate ; struct mansatellite char name10 ; struct date

3、 lounchdate ; float weight, diameter, orbitrad, angle ; ;第4頁,共45頁。year:month:day:date是一個結構體類型,包含三個成分成分year為int類型成分month為int類型成分day為int類型第5頁,共45頁。preson是一個結構體類型,包含四個成分成分name為數組類型成分age為int類型成分sex為枚舉類型成分birthdate仍為一個結構體類型name:age:sex:year:birthdate:month:day:第6頁,共45頁。mansatellite是一個結構體類型,包含六個成分name:yea

4、r:lounchdate:month:day:weight:diameter:orbitrad:angle:第7頁,共45頁。結構體類型引用 在struct后跟以結構體標簽,稱為“結構體類型引用”。在例11-1的結構體類型定義的意義下: struct date struct preson struct mansatellite 都是結構體類型引用,使用它們將分別標記相應結構體定義。第8頁,共45頁。結構體類型說明符:結構體類型定義和結構體類型引用統稱“結構體類型說明符”使用結構體類型說明符可以定義結構體類型的類型名聲明結構體類型變量第9頁,共45頁。結構體類型名使用 typedef 可以定義結

5、構體 類型名typedef 結構體類型說明符 標識符例子typedef struct int y,m,d datetype;struct date int y,m,d ;typedef struct date datetype;第10頁,共45頁。例11-2 定義結構體類型名typedef struct date int year,month,day ; datetype ;typedef char tstring1010;typedef struct tstring10 name ; int age ; enum sext sex ; struct date birthdate ; pres

6、ontype ; typedef struct mansatellite mansatellitetype datetype birthdate; 第11頁,共45頁。結構體變量結構體類型變量聲明可以采取如下三種形式之一使用結構體類型引用直接使用結構體類型定義使用typedef定義的結構體類型名第12頁,共45頁。例11-3 結構體變量聲明struct preson zhang ;struct date int year,month,day ; dateofbirth;struct char author10 ;datetype publish_date ;int page_number ;

7、programming ;mansatellitetype first_east ;變量zhang用結構體類型引用聲明是struct preson類型,具有如圖結構name:age:sex:year:birthdate:month:day:第13頁,共45頁。例11-3 結構體變量聲明struct preson zhang ;struct date int year,month,day ; dateofbirth;struct char author10 ;datetype publish_date ;int page_number ; programming ;mansatellitetyp

8、e first_east ;變量programming使用不帶結構體標簽的結構體類型定義聲明,包含3個成分,分別為字符數組類型的author、datetype類型的publish_date、int類型的page_number,結構如圖所示;author:year:publish_date:month:day:page_number:第14頁,共45頁。例11-3 結構體變量聲明struct preson zhang ;struct date int year,month,day ; dateofbirth;struct char author10 ;datetype publish_date

9、;int page_number ; programming ;mansatellitetype first_east ;變量first_east使用typedef定義的類型標識符mansatellitetype聲明,具有如圖結構name:year:lounchdate:month:day:weight:diameter:orbitrad:angle:第15頁,共45頁。類型定義不分配存儲空間,只說明一個數據類型的框架結構。變量聲明時才給變量分配存儲空間,并且使得被聲明的變量具有相應類型的結構。到目前為止聲明的四個變量zhang、dateofbirth、programming、first_ea

10、st具有實體,被分配存儲空間。類型標識符datetype、 mansatellitetype只是定義了一個數據類型的框架,不占用存儲空間,只給相應類型起一個名字。第16頁,共45頁。指向結構體變量的指針C可以定義指向任何類型的指針類型,并聲明相應指針類型的變量,結構體類型當然不例外。第17頁,共45頁。struct preson *pointer_preson ; struct date int year,month,day ; *dateofpointer ; struct char author10 ; datetype publish_date ; int page_number ; *

11、p ; mansatellitetype *p_east例11-4 指向結構體類型變量的指針變量變量pointer_preson為指向標簽為preson的結構體類型變量的指針變量。 pointer_preson可以指向相應結構體類型的變量。比如 pointer_preson = &zhang ;變量p為指向無標簽結構體類型變量的指針變量。 P 可以指向相應結構體類型的變量。比如 p = &programming ;變量p_east為指向結構體類型mansatellitetype變量的指針變量。 p_east 可以指向相應結構體類型的變量。比如 p_east = &first_east ;第18

12、頁,共45頁。結構體變量的成分訪問結構體變量的一個成分,使用成員選擇表達式成員選擇表達式 直接成員選擇 間接成員選擇直接成員選擇 后綴表達式 . 標識符間接成員選擇 后綴表達式 - 標識符 第19頁,共45頁。直接成員選擇直接成員選擇表達式針對一般的結構體變量。 形式是: r . w r 是后綴表達式,最終計算出一個結構體變量;w是 r 所屬結構體類型中的一個成員名字下述成員選擇表達式是合法的: programming_pascal.author第20頁,共45頁。間接成員選擇間接成員選擇表達式針對指向結構體變量的指針變量形式是 p-w p 是后綴表達式,最終計算出一個指

13、向結構體變量的指針變量;w 是p所指向結構體變量所屬類型中的一個成員名字下述成員選擇表達式是合法的: pointer_preson - name p_east - weight p_east - lounchdate第21頁,共45頁。也可首先對指針變量進行求地址運算然后使用直接成員選擇比如上述三個選擇表達式還可以寫成如下形式。由于優先級的原因,這里的括號是必須的(*pointer_preson).name(*p_east).weight (*p_east).lounchdate第22頁,共45頁。由于成員選擇表達式本身也是一個變量訪問,它是相應成分類型的一個變量,它與成分類型的其它變量一樣凡

14、是可以使用那些變量的地方都可以使用成員選擇表達式。對于嵌套結構體,可以認為“成員選擇表達式”仍然是一個“后綴表達式”,所以可以繼續應用“成員選擇表達式”的規則訪問里層的成分。zhang.birthdate.monthp_east - lounchdate.year第23頁,共45頁。例11-5 設計表示復數的結構體類型, 給出復數加法和乘法函數解: /* 復數類型 */ typedef struct complex float real_part,imaginary_part ; complex_type第24頁,共45頁。/* 復數加法 */complex_type complex_add(

15、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;第25頁,共45頁。/* 復數乘法 */ complex_type complex_mul ( complex_type x, complex_type y ) complex_type product ; product.real_part = x.real_part * y.real_p

16、art + x.imaginary_part * y.imaginaty_part ; product.imaginary_part = x.real_part * y.imaginary_part + x.imaginaty_part * y.real_part ; return product ; 第26頁,共45頁。【例11-6】已知圖書檢索卡的結構如圖所示,建立該卡片的數據結構,并編出根據書號檢索相應書名、作者名、語種、摘要的函數。書名:作者:語種 出版日期: 年 月 日書號:類號序號摘要:解: 顯然應該用結構體類型來描述該卡片。設每個結構體變量為一張卡片, 全部卡片存放在文件 car

17、d.dat 中。函數先讀入書號;對欲檢索的書號采用順序檢索方式檢索; 檢索到后輸出書名、作者名、語種、摘要;最后輸出提示信息“search end!”。第27頁,共45頁。假設主程序中有下述一系列聲明FILE * cardpointer ; /* 文件指針 */struct bookno / 書號結構體 char catalogue ; char order8 ; ;struct date / 日期結構體 int year,month,day ; ;struct bookcard / 檢索卡結構體 char name32,author16,languge16 ; struct date pub

18、lishingdate ; struct bookno no ; char abstract256; ;第28頁,共45頁。并且在主函數中已經用cardpointer=fopen(card.dat,r );打開了文件card.dat ,則 檢索函數 searchbook 輸出檢索結果的函數out_anser如下:第29頁,共45頁。/* 輸出檢索結果函數 */void out_anser(struct bookcard card ) int i , j , k ; printf( “NAME:%sn”, ); printf( “AUTHOR:%sn”, card.autho

19、r); 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+ ) printf( “ ” ) ; for ( k=1; k=64; k+ ) printf( “%c”,card.abstract64*i+j) ; printf(“n”); 第30頁,共45頁。 /* 檢索函數 */ voi

20、d searchbook( void ) char catalogue0 ; char order08 ; struct bookcard card; /* 輸入欲檢索的類別, 書號 */ printf ( pleace input catalogue , order : ) ; scanf( “%c” , &catalogue0 ) ; scanf( “%s” , order0 ); /* 檢索*/ rewind(cardpointer); while ( !feof(cardpointer) ) fread( &card , sizeof(struct bookcard) ,1, card

21、pointer); if ( ( card.no.catalogue = catalogue0 ) & ( card.no.order = order0 ) ) out_anser(card) ; printf(“search end!n”);第31頁,共45頁。結構體與函數結構體與函數的關系返回結構體值的函數函數的結構體參數在C中允許函數類型為結構體類型,即函數可以返回一個結構體值;還允許結構體作為函數的參數,用參數的方式向函數傳遞結構體類型的值。第32頁,共45頁。返回結構體值的函數函數的計算結果可能是一個結構體值。在C中,有兩種途徑能夠把該結構體值通過函數調用帶回調用函數的主程序。使用指

22、針函數的結果類型是指向結構體類型變量的指針類型直接使用結構體類型函數的結果類型是結構體類型,直接把一個結構體值帶回調用函數的主程序第33頁,共45頁。第一種方式就是返回指針的函數,只不過相應指針是指向結構體類型變量的指針。與其它類型返回指針的函數沒有任何區別,本書在第八章8.2節已經介紹過,此處不再贅述。本章的例11-5已經使用了第二種方式,下邊再舉例介紹這種方式。第34頁,共45頁。例11-9一個人事檔案管理系統中,職工登記卡包含姓名、性別、出生時間等信息。為該人事檔案管理系統編寫輸入一個職工卡片的函數,供主管理系統使用。第35頁,共45頁。解:職工登記卡的類型定義如下。 typedef e

23、num male , female sextype ; typedef struct int year,month,day ; datetype; typedef struct cardperson char name8 ; /* 姓名 */ datetype birthdate ; /* 出生時間 */ sextype sex; /* 性別 */ typecardperson ; 第36頁,共45頁。typecardperson readcard(void)typecardperson card; / 說明一個卡片類型變量int sex_tag;printf( pleace input na

24、me:);/ 以下開始輸入scanf(%s,); / 姓名printf( please input birthdate:year、month、day);scanf(“%d %d %d”, &(card.birthdate.year), &(card.birthdate.month), &(card.birthdate.day) );/出生時間 printf( pleace input sex(0:male , 1:female);scanf(%d, &sex_tag);/ 性別if ( sex_tag=0 ) card.sex = male ;else card.sex =

25、female ;return card; / 帶著一張卡片card值返回第37頁,共45頁。在主程序中,將使用函數readcard帶回的card值。比如主程序中具有功能:輸入所有職工卡片、填加一張職工卡片等,這些功能的實現都將調用該函數。如果用數組保存所有卡片并且設不超過100個職工,并有聲明: #define n 100 int v,flag; typecardperson card_arrn;第38頁,共45頁。可以設計實現輸入功能的程序片段如下: v=0; flag=1; while (flag) card_arrv = read_card();v+;printf( please cho

26、ose 0_end 1_continue :); scanf(%d, &flag); 其中語句“card_arrv = read_card();”調用函數read_card 函數帶回的值是結構體值,直接送入數組成分變量card_arrv中第39頁,共45頁。結構體作函數參數在函數之間,通過參數傳送結構體值也有兩種方法用指向結構體變量的指針作函數參數直接用結構體變量作函數參數第一種方式就是指針作函數參數,只不過相應指針是指向結構體類型變量的指針。與指向其它類型變量的指針沒有任何區別。本章的例11-6已經使用了第二種方式,下邊再舉例介紹這種方式。第40頁,共45頁。例11-10人事檔案管理問題。為該人事檔案管理系統編一個查詢函數,供主管理系統使用。該函數帶入被檢索人員的全部信息,在檔案庫中檢索,若找到返回相應卡

溫馨提示

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

最新文檔

評論

0/150

提交評論