c語言第8章結構和聯(lián)合_第1頁
c語言第8章結構和聯(lián)合_第2頁
c語言第8章結構和聯(lián)合_第3頁
c語言第8章結構和聯(lián)合_第4頁
c語言第8章結構和聯(lián)合_第5頁
已閱讀5頁,還剩42頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第8章 結構和聯(lián)合8.1 結構的定義以及結構變量的定義和使用8.2 結構數(shù)組與結構指針8.3 結構在函數(shù)間的傳遞8.8 綜合舉例8.1 結構的定義以及結構變量的定義和使用 8.1.1 結構的定義 結構是由不同數(shù)據(jù)類型的數(shù)據(jù)組成的。組成結構的每個數(shù)據(jù)稱為該結構的成員項,簡稱成員。在程序中使用結構時,首先要對結構的組成進行描述,這稱為結構的定義。結構定義的一般形式如下: struct 結構名 數(shù)據(jù)類型 成員名1; 數(shù)據(jù)類型 成員名2; . 數(shù)據(jù)類型 成員名n; ;例如,為了處理雇員的數(shù)據(jù),在程序中可以定義如下的結構:struct Employee char name20; char sex; in

2、t old; int wage;該結構名字是Employee,它由四個成員項組成。第一個成員項是字符型數(shù)據(jù)name ,它用于保存姓名字符串;第二個成員項是字符型數(shù)據(jù)sex,它用于保存性別字符;第三個成員項是int型整數(shù)old,它用于保存年齡數(shù)據(jù);最后一個成員項是int型整數(shù)wage,它用于工資數(shù)據(jù)。(1) 結構的定義以關鍵字struct作為標識符,其后是定義的結構名,它們兩者形成了特定結構的類型標識符。結構名由用戶命名,命名原則與變量名等相同。結構名是這一組數(shù)據(jù)集合體的名字,可以像基本數(shù)據(jù)類型名一樣,用來說明具體的結構變量。(2) 在結構名下面的一對大括號中包圍的是組成該結構的各個成員項。每個

3、成員項由其數(shù)據(jù)類型和成員名組成。每個成員項后用分號“;”作為結束符。整個結構的定義也用分號作為結束符,注意不要忘記這個分號。(3)結構的定義明確地描述了該結構的組織形式。在程序執(zhí)行時,結構的定義并不引起系統(tǒng)為該結構分配內存空間。結構的定義僅僅是定義了一種特定的數(shù)據(jù)構造類型,它指定了這種構造使用內存的模式。在定義時沒有指明使用這種構造具體對象(在結構的說明時將指明這點)。如上述結構Employee的定義,僅僅指定了在使用這種結構時應該按下圖所示的配置情況占用內存,但這時并沒有實際占用內存空間。圖 結構變量的定義 程序一旦定義了一個結構體,就相當于定義了一個新的結構類型,那么就可

4、以把結構名當作像int、double等關鍵字一樣使用,用說明語句定義該形式結構體的具體結構變量,其格式為: struct 結構名 結構變量名; 結構變量的定義在程序的數(shù)據(jù)說明部分給出。例如,下列說明: struct Employee wang;這個說明指出了結構變量wang使用Employee結構,也就是說,結構變量wang是由前述的Employee的四個成員項組成,每個成員項的類型和名字都與Employee結構定義中給出的相同。(1) 結構變量的定義將引起系統(tǒng)按照結構定義時制定的內存模式,為被定義的結構變量分配一定的內存空間。例如,上述結構變量wang在內存中將占據(jù)與圖8.1所示配置相同的內

5、存空間。 當多個結構變量使用結構時,它們可以在一起定義。例如:struct Employee wang, li,zhang;被定義的三個結構變量wang、li和zhang都具有Employee定義的結構。 (2)結構變量使用內存空間,所以它們也具有一定的存儲類型。結構變量的存儲類型概念、它的壽命、可見性及使用范圍與普通變量、數(shù)組完全一致。(3) 在程序中,結構變量的定義在該結構的定義之后,對于尚未定義的結構,不能用它對任何結構進行說明。(4)在一些簡單的程序設計中,結構的定義和結構變量的定義也可以同時進行,在這種情況下,有時省略結構名。這時,被定義的結構變量直接在結構定義的大括號后給出,例如:

6、struct Employee char name20; char sex; int old; int wage;wang ,song ,zhou;這種形式與前面給出的結構定義和結構說明分開進行時功能相同。 (5)一個結構變量占用內存的實際大小,可以利用sizeof運算求出。sizeof運算的功能是計算出給定的運算量占用內存空間的字節(jié)數(shù),它的運算表達式一般形式如下: sizeof(運算量)其中運算量可以是變量、數(shù)組或結構變量,也可以是數(shù)據(jù)類型的名稱,如int、double、struct Employee 等。8.1.3 結構變量的使用形式和初始化 C提供了兩種類型的聚合數(shù)據(jù)類型:數(shù)組和結構。數(shù)

7、組是相同類型的元素的集合,它的每個元素是通過下標引用或指針間接訪問選擇的。但在結構中情況并非如此,由于結構的成員可能長度不同,所以不能使用下標來訪問它們。相反,每個結構成員都有自己的名字,它們是通過名字來訪問的。此外,在結構說明的同時可以給各個成員項賦初值,即結構的初始化。1、結構的使用形式 結構是不同數(shù)據(jù)類型的若干數(shù)據(jù)的集合體。在程序中使用結構時,一般情況下不能把結構作為一整體參加數(shù)據(jù)處理,而參加各種運算和操作的是結構的各個成員項數(shù)據(jù)。結構的成員項用以下一般形式表示: 結構變量名.成員名 例如,上節(jié)給出的結構變量wang具有下列四個成員項: ,wang.sex,wang.o

8、ld, wang.wage 它們分別表示結構變量wang的四個組成數(shù)據(jù)。 在指明結構成員項時使用的“.”符號是C語言的一個運算符,它規(guī)定的運算是訪問結構的成員。例如,wang.old實質上是一個運算表達式,它的運算是訪問結構wang的成員old。因此,它代表了結構變量wang中名字為old的成員項。訪問成員運算“.”是第一運算優(yōu)先級中的一種運算,它的結合規(guī)律是從左向右。明確這一點,對于分析包括有訪問成員運算的復雜運算表達式中各種運算的先后順序有很大幫助。 當結構的成員項是指針變量時,要注意它的使用形式上的特點。例如:struct Employee1 char *name; char sex;

9、int old; int wage; zhou; 定義的Employee1結構中的成員項name是一個char型指針。如果結構變量zhou被說明為Employee1結構,則zhou的成員項 是一個char型指針。那么下面的使用形式 * 表示是該指針指向的目標變量,它的意義可以從運算表達式的角度進分析。上述表達式中有兩種運算:*(訪問目標)和(訪問成員)。運算優(yōu)先于*運算。所以,訪問成員運算在先,而訪問目標運算在后。上面的表達式等價于: *()例8.1 結構在程序中的使用形式#include struct Employee /結構的定義 ch

10、ar *name; char sex; int old; char *tel; char *adr;void main() struct Employee wang,gao; /結構變量的定 / 義 =“wang hai”; /結構變量的成 /員賦值 wang.sex=M; wang.old=34; wang.tel= ; wang.adr=beijing; =gao yang; gao.sex=F; gao.old=42; gao.tel= ; gao.adr=shanghai; /顯示結構變量的成員內容 printf( name sex old tel a

11、ddressn ); printf( n); printf(%-14s%-4c%-4d%-10s%- 20sn,,wang.sex,wang.old, wang.tel,wang.adr); printf(%-14s%-4c%-4d%-10s%- 20sn,,gao.sex,gao.old, gao.tel,gao.adr); 運行結果如下: name sex old tel adrwang hai m 34 beijinggao yang f 42 shanghai 在文件的開始部分定義結構Employee,在函數(shù)main的說明部分說明了使用該結構的兩個結構

12、變量wang和gao。程序的執(zhí)行部分由數(shù)據(jù)賦值和輸出兩大部分組成。在賦值部分中可以清楚地看到每個成員項的使用形式和使用特性。例如,其中的賦值語句: =wang jun; 由于是一個char型指針變量,所以可以用一個字符串常量直接向它賦值。再者,從數(shù)據(jù)輸出中看出,輸出項對應輸出轉換說明符是%s,所以輸出結果是指針所指向的字符串。由此可知,結構的成員項無論其表示形式多么復雜,它的類型和使用特性最終落實到成員名上。例如,成員名name在Employee結構定義時定義為char指針型,那么無論是、還是gao.na

13、me都是char指針型。它們在程序中使用時,與使用一個普通的字符指針完全相同,視作一個整體。2、結構的初始化 在結構說明的同時,可以給這個結構的每個成員賦初值,這稱為結構的初始化。結構初始化的一般形式如下: struct 結構名 結構變量=初始數(shù)據(jù);其中大括號中包圍的初始數(shù)據(jù)之間用逗號分隔,初始數(shù)據(jù)的個數(shù)與結構成員項的個數(shù)應該相同,它們是按先后順序一一對應賦值。此外,每個初始數(shù)據(jù)必須符合與其對應的成員項的數(shù)據(jù)類型。例如,前述Employee結構的結構變量wang在說明時可以初始化如下:struct Employee wang=wang hai,M,34,123-1111,beijing;它所實

14、現(xiàn)的功能,與程序中下列賦值相同:=wang hai;wang.sex=M;wang.old=34;wang.tel= ;wang.adr=beijing;8.2 結構數(shù)組與結構指針8.2.1 結構數(shù)組 在C語言中,具有相同數(shù)據(jù)類型的數(shù)據(jù)可以組成數(shù)組,指向相同類型的指針可以組成指針數(shù)組。根據(jù)同樣的原則,具有相同結構的結構也可以組成數(shù)組,稱它們?yōu)榻Y構數(shù)組。結構數(shù)組的每一個元素都是結構變量。 結構數(shù)組的說明形式如下: struct 結構名 結構數(shù)組名元素個數(shù) = 初值表 ;例如,struct Employee man3; 說明了結構數(shù)組man ,它有三個元素man0、man1和ma

15、n2,它們都是具有Employee結構的結構變量。 結構數(shù)組適合于處理由若干具有相同關系的數(shù)據(jù)組成的數(shù)據(jù)集合體。與數(shù)組一樣,在定義結構數(shù)組的同時可以用初始化列表給它的每個元素賦初值。 在對結構數(shù)組進行初始化時,方括號 中的元素個數(shù)可以缺省。 結構數(shù)組也具有數(shù)組的屬性,結構數(shù)組名是結構數(shù)組存儲首地址,如例中的man表示該結構數(shù)組存儲首地址。例8.2 結構數(shù)組的使用#include #define STUDENT 3 /*用符號常量STUDENT表示學生人數(shù) struct Data /定義一個結構 char name20; / 姓名 short age; / 年齡 char adr30; / 地址

16、 long tel; / 電話號碼 ;void main( ) struct Data manSTUDENT = /*定義一個結構數(shù)組并初始化 王偉, 20, 東八舍416室, 87543641, 李玲, 21, 南三舍219室, 87543945, 張利, 19, 東八舍419室, 87543645; int i; / 輸出顯示表頭提示信息 printf(“編號t姓名t年齡t地 址t電 話nn); /輸出結構數(shù)組的數(shù)據(jù) for(i = 0; i STUDENT; i+) printf(% -dt%-st%-dt%-st%Ldn, i + 1, , mani.age, man

17、i.adr, mani.tel); / 每個輸出項都左對齊,編號從1開始 printf(n結構類型Data的數(shù)據(jù)長度 : %d 字節(jié)。n, sizeof(struct Data);該程序的輸出結果為:編號 姓名 年齡 地 址 電 話1 王偉 20 東八舍416室 875436412 李玲 21 南三舍219室 875439453 張利 19 東八舍419室 87543645結構類型Data的數(shù)據(jù)長度 : 56字節(jié)。例8.3:選舉,對候選人得票進行統(tǒng)計,設有4個候選人,N個人參加選舉,每次輸入一個得票的候選人的名字,要求最后輸出個人的得票結果。程序如下:#include #include #de

18、fine N 10 /宏定義,定義參加選舉人的個數(shù)struct person /結構定義 char name20; int count;void main() /結構數(shù)組定義及初始化 struct person leader4=wang,0,zhang,0,zhou,0, gao,0; char name20,i,j; /模擬選舉過程,循環(huán)一次代表一次選舉 for(i=0;iN;i+) gets(name); /從鍵盤輸入候選人的名字 for(j=0;j4;j+) /在候選人中查找匹配的人 if(strcmp(name,)=0) leaderj.count+; /被投票

19、的候選人的票數(shù)加1 break; printf(n); for(j=0;j4;j+) /輸出選舉結果 printf(%s:%dn,,leaderj.count); 該程序的運行結果為:wangwangzhangzhangzhangzhangzhouzhougaogao /輸入wang:2zhang:4zhou:2gao:2 /輸出8.2.2 結構指針 在C語言中對于結構的數(shù)據(jù)可以使用指針進行處理。我們把指向結構的指針稱為結構指針。 指向結構的指針變量稱為結構指針,它與其他各類指針在特性和使用方法上完全相同。結構指針的運算仍按地址計算規(guī)則進行,其定義格式為: struct

20、 結構名 * 結構指針名 = 初始地址值 ; 其中結構名必須是已經定義過的結構類型。例如: struct Employee * pman; struct Employee * pd; 存儲類型是結構指針變量本身的存儲類型。編譯系統(tǒng)按指定的存儲類型為結構指針pman和pd分配內存空間。 由于結構指針是指向整個結構體而不是某個成員,因此結構指針的增(減)量運算,例如: “pman+;”將跳過一個結構變量的整體,指向內存中下一個結構變量或結構數(shù)組中下一個元素,結構指針本身的(物理)地址增量值取決于它所指的結構變量(或結構類型)的數(shù)據(jù)長度。 結構體可以嵌套,即結構體成員又是一個結構變量或結構指針。例如

21、:struct student char name20; short age; char adr30; struct Date BirthDay; struct Date StudyDate; studt300;其中成員項BirthDay、StudyDate是具有Date結構類型的結構變量,稱student為外層結構體,Date為內層結構體。 在結構嵌套中,當結構體的成員項具有與該結構體相同結構類型的結構變量或結構指針時,就形成了結構體的自我嵌套。這種結構體稱為遞歸結構體。例如:struct Node int num; / 數(shù)據(jù)場,節(jié)點序號 struct Node * next; / 指針場,

22、指向下一個節(jié)點的結構指針 ;該結構體中的成員項next是指向自身結構類型Node的結構指針,構成了遞歸結構體,鏈表、樹和有向圖等數(shù)據(jù)結構中廣泛采用遞歸結構體。 使用結構指針對結構成員進行引用時,有兩種形式:(1)使用運算符“.”,這時指針指向結構的成員項一般表示形式是: (*結構指針名).成員名 由于成員選擇運算符.的優(yōu)先級比取內容運算符*“高,所以需要使用圓括號。 在C語言程序中結構指針使用相當頻繁,所以C中提供了一種直觀的特殊運算符:結構指針運算符“-”(橫線加大于號)。在C語言程序中經常采用下面的形式。(2)使用運算符-“ 結構指針名-成員名 它與前一種表示方法在意義上是完全等價的。例如

23、,前面給出的pman指向的結構中的成員項old可以表示如下: pman-old在這種表示方法中,-(減號和大于號)也是一種運算符,它在第一運算優(yōu)先級中。它表示的運算意義是,訪問指針指向的結構中的成員項。例8.4:結構指針的使用#include struct Date /定義一個結構 int month; int day; int year;void main() struct Date today,*date_p; /定義一個結構變量和結構指針變量 date_p =&today; /將結構指針指向一個結構變量 date_p-month =4; /采用結構指針給目標變量賦值 date_p-day

24、 =15; date_p-year =1990; /采用結構指針輸出目標變量的數(shù)據(jù) printf(Today is %d/%d/%dn, date_p-month,date_p-day , date_p-year );程序運行結果:Today is 4/15/1990例8.5:結構指針運算#include struct Key /定義一個結構char *keyword;int keyno;void main() /定義一個結構數(shù)組 struct Key kd=are,123,my,456,you,789; struct Key *p; /定義一個結構指針變量 int a; char chr;

25、p=kd; /將結構數(shù)組的首地址賦給結構指針p a=p-keyno; printf(p=%d,a=%dn,p,a); a=+p-keyno; / 相當于chr=+(p-keyno), /結構指針無變化 printf(p=%d,a=%dn,p,a); /結構指針指向結構數(shù)組的下一個元素,結構指針發(fā)生變 /化;給a賦值是指針變化后所指向目標的成員數(shù)據(jù) a=(+p)-keyno; printf(p=%d,a=%dn,p,a); /給a賦值是指針變化前所指向目標的成員數(shù)據(jù);結構指 /針值發(fā)生變化,結構指針指向結構數(shù)組的下一個元素 a=(p+)-keyno; printf(p=%d,a=%dn,p,a)

26、; p=kd; /重新將結構數(shù)組的首地址賦給結構指針p chr=*p-keyword;/相當于chr=*(p-keyword) printf(p=%d,chr=%c(adr=%d)n,p,chr,p-keyword); /相當于chr=*(p-keyword)+,賦值之后,keyword指針發(fā) /生變化 chr=*p-keyword+; printf(p=%d,chr=%c(adr=%d)n,p,chr,p-keyword); /相當于chr=(*(p-keyword))+,給chr賦值的是 /*(p-keyword),所以/r(前面keyword指針指向r); /賦值之后*(p-keywor

27、d)進行加1變?yōu)閟 chr=(*p-keyword)+; printf(p=%d,chr=%c(adr=%d)n,p,chr,p-keyword); /給chr賦值是指針變化前所指向目標的成員數(shù)據(jù),chr=s; /結構指針值發(fā)生變化,結構指針指向結構數(shù)組的下一個 /元素, chr=*p+-keyword; printf(p=%d,chr=%c(adr=%d)n,p,chr,p-keyword); /相當于chr=*(+(p-keyword),結構指針值無變化,將 /my中的y賦給chr chr=*+p-keyword; printf(p=%d,chr=%c(adr=%d)n,p,chr,p-k

28、eyword);程序運行結果:p=158,a=123p=158,a=124p=162,a=456p=166,a=456p=158,chr=a(adr=170)p=158,chr=a(adr=171)p=158,chr=r(adr=171)p=162,chr=s(adr=174)p=162,chr=y(adr=175)注意輸出結果值中地址值每次運行時可能有所不同,但地址的相對值不變。例8.6:指向結構數(shù)組的指針的應用#include struct student /定義一個結構 int No; char name20; char sex; int age;void main() /定義一個結構數(shù)

29、組并初始化 struct student stu3= 10101,Li Lin,M,18, 10102,Zhang fan,M,19, 10104,Wang Min,F,20; /定義一個結構指針變量 struct student *p; printf(No. Name Sex Agen); for( p=stu ; pNo,p-name,p-sex,p-age);程序運行結果:No. Name Sex Age10101 Li Lin M 1810102 Zhang fan M 1910104 Wang Min F 208.3 結構在函數(shù)間的傳遞 將一個結構體變量的值傳遞給另一個函數(shù),有3種方

30、法:(1)用結構體變量的成員作參數(shù),用法和用普通變量作實參是一樣的,屬于“值傳遞”方式。應當注意實參和形參的類型保持一致。由于結構是不同數(shù)據(jù)類型的數(shù)據(jù)的集合體,采用這種方法,無實用價值,實際應用時,較少采用。(2)用結構體變量作實參。ANSI C支持在調用函數(shù)時,把結構作為參數(shù)傳遞給函數(shù),采取的是“值傳遞”的方式,將結構體變量所占的內存單元的內容全部順序傳遞給形參。形參也必須是同類型的結構體變量。在函數(shù)調用期間,形參也要占用內存單元。(3)用結構變量的地址或結構數(shù)組的首地址作為實參,用指向相同結構類型的結構指針作為函數(shù)的形參來接受該地址值。用結構指針作為函數(shù)的形參與用指針變量作為形參在函數(shù)間傳

31、遞一樣,即采用地址傳遞方式,把結構變量的存儲首地址或結構數(shù)組名作為實參向函數(shù)傳遞,函數(shù)的形參是指向相同結構類型的指針接收該地址值。例8.7, 采用值傳遞在函數(shù)間傳遞結構變量,計算雇傭天數(shù)和工資。#include struct Date int day; int month; int year; int yearday; char mon_name4;int day_of_year(struct Date pd);void main( ) struct Date HireDate; float laborage; / 存放每天的雇傭工資 printf(請輸入每天的工資 : ); scanf(%f

32、, & laborage); printf(請輸入年份 : ); scanf(%d, & HireDate.year); printf(請輸入月份 : ); scanf(%d, & HireDate.month); printf(請輸入日 : ); scanf(%d, & HireDate.day); HireDate.yearday = day_of_year( HireDate); printf(從%d年元月1日到%d年%d月%d日的雇傭期限 : %d天,n應付給你的工錢: %-.2f元。n, HireDate.year, HireDate.year,HireDate.month, Hir

33、eDate.day, HireDate.yearday, laborage * HireDate.yearday);/ 計算某年某月某日是這一年的第幾天int day_of_year(struct Date pd) int day_tab213 = 0,31,28,31,30,31,30,31,31,30,31,30,31, / 非閏年的每月 /天數(shù) 0,31,29,31,30,31,30,31,31,30,31,30,31; / 閏年的每月 天數(shù)/* 為了與月份一致,列號不使用為零的下標號。行號為0是非閏年的每月天數(shù),為1是閏年的每月天數(shù) */ int i, day, leap; / lea

34、p為0是非閏年,為1是閏年 day = pd.day; / 將當月的天數(shù)加入 leap = pd. year % 4 = 0 & / 能被4整除的年份基本上是閏年 pd. year % 100 != 0 | / 能被100整除的年份不是閏年 pd. year % 400 = 0; / 能被400整除的年份又是閏年 / 求從元月1日算起到這一天的累加天數(shù) for(i = 1 ; i pd .month ; i+) day += day_tableapi; return day;該程序的運行結果為:請輸入每天的工資 : 38.5(CR)請輸入年份 : 2000(CR)請輸入月份 : 10(CR)請

35、輸入日 : 1(CR)從2000年元月1日到2000年10月1日的雇傭期限 : 275天,應付給你的工錢 : 10587.50元。例8.8 通信錄的建立和顯示程序(采用地址方式傳遞結構變量)#include #define MAX 3 /用符號常量MAX表示建立通信錄人數(shù)最 /大記錄數(shù)struct Address /定義一個通信錄的結構,包括姓名、地址 /和電話 char name20; char addr50; char tel15;int input(struct Address *pt); /通信錄錄入函數(shù)原型void display(struct Address *pt,int n);

36、 /通信錄顯示函數(shù)原型void main() struct Address manMAX; /定義一個結構數(shù)組, /存放學生通信錄數(shù)據(jù) int i; for(i=0;iname); if(pt-name0=0)return 0; /輸入空字符串,停止錄 /入,返回0 printf(Address?); gets(pt-addr); printf(Telephone?); gets(pt-tel); return 1; /正常返回1 /*通信錄顯示函數(shù),顯示整個通信錄的數(shù)據(jù),*/void display(struct Address *pt,int n) int i; printf( name

37、address teln); printf(- -n); for(i=0 ; iname,pt-addr,pt-tel);該程序運行結果為:Name?王偉Address?東八舍416室Telephone? 87543641Name?李玲Address?南三舍219室Telephone? 87543945Name?張利Address?東八舍419室Telephone?87543645 /輸入/以下為輸出name address tel-王偉 東八舍416室 87543641李玲 南三舍219室 87543945張利 東八舍419室 87543645說明: (1)該程序由三個函數(shù)組成,其中inpu

38、t( )函數(shù)用于以人機對話方式輸入數(shù)據(jù),它的形式參數(shù)pt是結構指針,用來接收結構地址。在main( )函數(shù)中調用input( )函數(shù)時,實參數(shù)是&mani,它是結構數(shù)組man 中的第i個結構的地址。程序中看出,main( )的for循環(huán)中,通過i的遞增依次把man 中的各個結構地址傳送到input( ),在input( )中給該結構的各個成員項輸入數(shù)據(jù)。在輸入過程中,對name輸入零時,整個輸入過程結束。(2)輸入數(shù)據(jù)后,調用display( )函數(shù)顯示輸入結果。在調用display( )時,實參數(shù)是結構數(shù)組man 的首地址,從而把整個結構數(shù)組傳遞到函數(shù)中。display( )函數(shù)用結構指針p

39、t接收傳送來的地址。然后通過pt的加一運算,依次處理各個結構的數(shù)據(jù)。例8.9 返回結構變量的函數(shù)/*該例題中調用了一個名為str_add_int的函數(shù),該函數(shù)返回的是一個結構類型變量,在這個例題中,同時介紹了數(shù)字串與浮點數(shù)轉換的方法*/#include #include #include struct Record /定義一個結構 char str20; int num;struct Record str_add_int(struct Record x); /函數(shù)原型聲明void main() struct Record p,s=“31.45”,20; /*定義結構 變量p,s,并對s初始化*

40、/*以傳遞值的方式,將結構變量s傳遞給函數(shù)str_add_int,經過該函數(shù)對s的復制值加工處理后,再將結果通過return語句返回給main中的另一結構變量p*/ p=str_add_int(s); printf(%s %dn,s.str,s.num); printf(%s %dn,p.str,p.num);struct Record str_add_int(struct Record x) /形參x和實參s的類型一致 float e; e=atof(x.str); /將字符串x.str轉換為浮 /點數(shù)并賦給e e=e+x.num; /浮點數(shù)與整數(shù)相加 gcvt(e,5,x.str); /將

41、浮點數(shù)e再轉換為字 /符串,并賦給x.str return x; /將處理后的結果(結構 /變量)返回給調用函數(shù)程序運行結果:31.45 2051.45 20例8.10:返回結構變量的地址即結構指針型函數(shù)C語言中,結構的存儲首地址可以作為函數(shù)的返值傳遞給調用它的函數(shù)。返值為結構地址的函數(shù)就是結構指針型函數(shù)。/*本題中調用了一個名為find的函數(shù),根據(jù)小汽車的代號(不為0)在一個結構數(shù)組中來查找該種汽車數(shù)據(jù)的位置,該函數(shù)返回的是一個結構類型指針,該指針指向所找到的結構變量,如未找到,返回NULL*/#include #define NULL 0struct Sample /定義一個結構,包括小汽

42、車代號、顏色和 /類型等成員 int num; char color; char type;struct Sample *find(struct Sample *pd,int n); /查找函數(shù)原型void main() int num; struct Sample *result; /定義一個結構指針變量,接收被調 /用函數(shù)的返回值 /定義一個結構數(shù)組并初始化,存放了所有樣品汽車數(shù)據(jù) struct Sample car=101,G,c,210,Y,m,105,R,l, 222,B,s,308,P,b,0,0,0; printf(Enter the number:); scanf(%d,&nu

43、m); /輸入要查找樣品的代號 /*以傳遞地址的方式,將結構數(shù)組名car和查找代號num傳遞給函數(shù)find,該函數(shù)返回查找的結果,找到,返回代號所對應的樣品汽車數(shù)據(jù)的地址,否則,返回NULL*/ result=find(car,num); if(result-num!=NULL) /找到,顯示相關汽車數(shù)據(jù) printf(number :%dn,result-num); printf(color :%cn,result-color); printf(type :%cn,result-type); else printf(not found); /未找到,給出提示信息struct Sample *

44、find(struct Sample *pd,int n) int i; for(i=0 ; pdi.num!=0 ;i+) if(pdi.num=n)break; /找到,退出循環(huán) if(pdi.num!=NULL) return pd+i; /返回查找結果 else return NULL;該程序的運行結果為:Enter the number:101 /輸入number:101 /輸出color:Gtype:c 該程序是查找結構數(shù)組car 中的有關數(shù)據(jù)。鍵盤輸入一個整數(shù)后,調用find( )函數(shù)進行查找。然后把查到的結構地址作為返值返回。因此,find( )函數(shù)定義為struct samp

45、le *型。在main( )中用指向相同結構的指針result接收函數(shù)返值。在car 結構數(shù)組中,用一個全零結構作為結構數(shù)組的結束標志(汽車代號不為0)。采用這種方法便于程序處理??梢钥闯?,結構數(shù)組中的結構數(shù)目無論如何變化,函數(shù)都不需要做任何修改。 結構指針型函數(shù)是以地址傳遞方式向調用它的函數(shù)返回結構的數(shù)據(jù)。采用這種方式,不僅可以返回某個結構的地址,也可以返回結構數(shù)組的地址,從而把函數(shù)中處理的若干結構的數(shù)據(jù)返回給調用它的函數(shù)中。8.8 綜合舉例例8.14 編程處理某班N個學生4門課的成績,它們是數(shù)學、物理、英語和計算機,按編號從小到大的順序依次輸入學生的姓名、性別和四門課的成績。計算每個學生的

46、平均分,并以清晰的打印格式從高分到低分的順序打印平均分高于全班總平均成績的男生的成績單。分析:從題目的要求來看,該問題可以分成三個功能塊:輸入數(shù)據(jù)、排序,求總平均成績和輸出,我們把它規(guī)劃成四個函數(shù)。再來看主要的數(shù)據(jù)類型或數(shù)據(jù)結構的選擇,由于學生的姓名、性別、各門功課的成績及平均成績具有一定的關聯(lián)性,作為集合數(shù)據(jù),將其規(guī)劃為一個結構體:struct studentchar name20; /姓名char sex; /性別,m代表男,f代表女float score4; /學生的各科成績float aver; /平均成績; 這樣學生的數(shù)據(jù)就可以存放在一個結構數(shù)組中。有了上面的分析結果,我們就可以規(guī)劃出三個函數(shù)的原型:(1)輸入數(shù)據(jù):void input(struct student *p,int n);第一個參數(shù)用來接收存儲學生數(shù)據(jù)的結構數(shù)組的首地址,第二個參數(shù)接收學生的個數(shù),(2)排序:void sort(struct student *p,int n);第一個參數(shù)用來接收存儲學生數(shù)據(jù)的結構數(shù)組的首地址,第二個參數(shù)接收學生的個數(shù),(3)輸出:void output(struct student *p,int n,float aver);第一個參數(shù)用來接收存儲學生數(shù)據(jù)的結構數(shù)組的首地址,第二個參數(shù)接收學生的個數(shù),第三個參數(shù)接收總平均成績(4)求總平均成績:float a

溫馨提示

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

評論

0/150

提交評論