chap2_用c語言編寫程序1-3_第1頁
已閱讀1頁,還剩38頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、Chap 9 結(jié)構(gòu),9.1 構(gòu)建手機(jī)通訊錄9.2 結(jié)構(gòu)變量9.3 結(jié)構(gòu)數(shù)組9.4 結(jié)構(gòu)指針,本章要點(diǎn),什么是結(jié)構(gòu)?結(jié)構(gòu)與數(shù)組有什么差別?有幾種結(jié)構(gòu)的定義形式,它們之間有什么不同?什么是結(jié)構(gòu)的嵌套?什么是結(jié)構(gòu)變量和結(jié)構(gòu)成員變量,如何引用結(jié)構(gòu)成員變量?結(jié)構(gòu)變量如何作為函數(shù)參數(shù)使用?什么是結(jié)構(gòu)數(shù)組,如何定義和使用結(jié)構(gòu)數(shù)組?什么是結(jié)構(gòu)指針,它如何實(shí)現(xiàn)對結(jié)構(gòu)分量的操作?結(jié)構(gòu)指針是如何作為函數(shù)的參數(shù)的?,9.1 構(gòu)建

2、手機(jī)通訊錄,9.1.1 程序解析9.1.2 結(jié)構(gòu)的概念與定義9.1.3 結(jié)構(gòu)的嵌套定義,9.1.1 程序解析,例9-1 構(gòu)建簡單的手機(jī)通訊錄聯(lián)系人的基本信息:姓名、年齡和聯(lián)系電話最多容納50名聯(lián)系人的信息 具有新建和查詢功能,9.1.1 程序解析-程序結(jié)構(gòu),程序結(jié)構(gòu)主函數(shù)main:程序的總體控制函數(shù)new_friend:新建聯(lián)系人功能函數(shù)search_friend:查詢聯(lián)系人功能,main(),new_frie

3、nd(),search_friend(),程序解析-數(shù)據(jù)類型/變量,數(shù)據(jù)類型/變量結(jié)構(gòu)類型struct friends_list:在程序首部定義,其中的成員分別代表聯(lián)系人的基本信息struct friends_list{ char name[10]; /* 姓名 */ int age; /* 年齡 */ char telepho

4、ne[13]; /* 聯(lián)系電話 */}; 結(jié)構(gòu)數(shù)組friends:每個(gè)元素就是一個(gè)結(jié)構(gòu)變量,對應(yīng)一個(gè)聯(lián)系人struct friends_list friends[50];,程序解析-全局變量/函數(shù)參數(shù),全局變量Count:記錄當(dāng)前的聯(lián)系人總數(shù) 函數(shù)new_friend和search_friend的參數(shù)之一是結(jié)構(gòu)數(shù)組:void new_friend(struct friends_list friends[ ] )

5、;void search_friend(struct friends_list friends[ ], char *name); 結(jié)構(gòu)數(shù)組名作為函數(shù)實(shí)參與普通數(shù)組名作函數(shù)參數(shù)一樣,將數(shù)組首地址傳遞給函數(shù)形參,程序解析-源程序,#include#include/*手機(jī)通訊錄結(jié)構(gòu)定義*/struct friends_list{ char name[10]; /* 姓名 */ int ag

6、e; /* 年齡 */ char telephone[13]; /* 聯(lián)系電話 */}; int Count = 0; /* 全局變量記錄當(dāng)前聯(lián)系人總數(shù) */void new_friend(struct friends_list friends[ ] );void search_friend(struct friends_list friends

7、[ ], char *name);,源程序,int main(void){ int choice; char name[10]; struct friends_list friends[50]; /* 包含50個(gè)人的通訊錄 */ do{ printf("手機(jī)通訊錄功能選項(xiàng):1:新建 2:查詢 0:退出\n"); printf("請選擇功能:&

8、quot;); scanf("%d", &choice); switch(choice){ case 1: new_friend(friends); break; case 2: printf("請輸入要查找的聯(lián)系人名:"); scanf(

9、"%s", name); search_friend(friends, name); break; case 0: break; } }while(choice != 0); printf("謝謝使用通訊錄功能!\n"); return 0;},源程序,/*新建聯(lián)系人*/void new_friend

10、(struct friends_list friends[ ]){ struct friends_list f; if(Count == 50){ printf("通訊錄已滿!\n"); return; } printf("請輸入新聯(lián)系人的姓名:"); scanf("%s", f.name);

11、 printf("請輸入新聯(lián)系人的年齡:"); scanf("%d", &f.age); printf("請輸入新聯(lián)系人的聯(lián)系電話:"); scanf("%s", f.telephone); friends[Count] = f; Count++;},源程序,/*查詢聯(lián)系人*/void search_

12、friend(struct friends_list friends[ ], char *name){ int i, flag = 0; if(Count == 0){ printf("通訊錄是空的!\n"); return; } for(i = 0; i < Count; i++) if(strcmp(name, friends[i

13、].name) == 0){ /* 找到聯(lián)系人*/ flag=1; break; } if(flag){ printf("姓名: %s\t", friends[i].name); printf("年齡: %d\t", friends[i].age); printf("電話:

14、%s\n", friends[i].telephone); } else printf("無此聯(lián)系人!");},9.1.2 結(jié)構(gòu)的概念與定義,使用結(jié)構(gòu)來表示通訊錄信息:struct friends_list{ char name[10]; /*姓名*/ int age; /*年齡*/ char teleph

15、one[13]; /*聯(lián)系電話*/}; 結(jié)構(gòu):構(gòu)造數(shù)據(jù)類型,把有內(nèi)在聯(lián)系的不同類型的數(shù)據(jù)統(tǒng)一成一個(gè)整體,使它們相互關(guān)聯(lián)結(jié)構(gòu)又是變量的集合,可以單獨(dú)使用其成員,結(jié)構(gòu)的定義,結(jié)構(gòu)類型定義的一般形式為: struct 結(jié)構(gòu)名 { 類型名 結(jié)構(gòu)成員名1; 類型名 結(jié)構(gòu)成員名2; ? ? ? 類型名 結(jié)構(gòu)成員名n;

16、 };,結(jié)構(gòu)的定義以分號結(jié)束,被看作一條語句,,關(guān)鍵字struct和它后面的結(jié)構(gòu)名一起組成一個(gè)新的數(shù)據(jù)類型名,,結(jié)構(gòu)定義示例,定義平面坐標(biāo)結(jié)構(gòu):struct point { double x; double y;}; 雖然x、y的類型相同,也可以用數(shù)組的方式表示,但采用結(jié)構(gòu)體描述整體性更強(qiáng),增加了程序的可讀性,使程序更清晰。,9.1.3 結(jié)構(gòu)的嵌套定義,在實(shí)際生活中,一個(gè)較大的實(shí)體可能由多個(gè)成員構(gòu)成,而這

17、些成員中有些又有可能是由一些更小的成員構(gòu)成的實(shí)體。在手機(jī)通訊錄中,增加“通信地址”,結(jié)構(gòu)的嵌套定義,struct address{ char city[10]; char street[20]; int code; int zip;};,struct nest_friendslist { char name[10]; int age; stru

18、ct address addr; char telephone[13]; } nest_friend;,在定義嵌套的結(jié)構(gòu)類型時(shí),必須先定義成員的結(jié)構(gòu)類型,再定義主結(jié)構(gòu)類型。,9.2 結(jié)構(gòu)變量,9.2.1 結(jié)構(gòu)變量的定義和初始化9.2.2 結(jié)構(gòu)變量的使用,9.2.1結(jié)構(gòu)變量的定義和初始化,三種定義結(jié)構(gòu)變量的方式: 1.單獨(dú)定義先定義結(jié)構(gòu)類型,再定義具有這種結(jié)構(gòu)類型的變量 struct friends_lis

19、t{ char name[10]; /* 姓名 */ int age; /* 年齡 */ char telephone[13]; /* 聯(lián)系電話 */}; struct friends_list friend1, friend2;,,結(jié)構(gòu)變量的定義,2. 混合定義在定義結(jié)構(gòu)體類型的同時(shí)定義結(jié)構(gòu)體變量 struct f

20、riends_list{char name[10]; int age; char telephone[13]; } friend1, friend2; 3. 無類型名定義在定義結(jié)構(gòu)體變量時(shí)省略結(jié)構(gòu)體名struct { char name[10]; int age; char telephone[13]; } friend1, friend2;

21、,,結(jié)構(gòu)變量的初始化,struct friends_list friend1 = { "Zhang", 26, "0571-85171880 " } ;,name age telephone ↓    ↓   ↓,9.2.2 結(jié)構(gòu)變量的使用,1. 結(jié)構(gòu)變量成員的引用結(jié)構(gòu)變量名 .結(jié)構(gòu)成員名friend1.age = 26;st

22、rcpy(friend1.name, "Zhang San"); nest_friend.addr.zip,例9-2 計(jì)算實(shí)發(fā)工資,在一個(gè)職工工資管理系統(tǒng)中,工資項(xiàng)目包括編號、姓名、基本工資、獎(jiǎng)金、保險(xiǎn)、實(shí)發(fā)工資。輸入一個(gè)正整數(shù)n,再輸入n個(gè)職工的前5項(xiàng)信息,計(jì)算并輸出每位職工的實(shí)發(fā)工資。實(shí)發(fā)工資 = 基本工資+獎(jiǎng)金–保險(xiǎn)。,例9-2 源程序,#includestruct employee{ int

23、 num; char name[20]; float jbgz, jj, bx, sfgz;};int main(void){ int i, n; struct employee e; printf("請輸入職工人數(shù)n: "); scanf("%d", &n); for(i = 1; i <= n; i++){

24、 printf("請輸入第%d個(gè)職工的信息: ", i); scanf("%d%s", &e.num, e.name); scanf("%f%f%f", &e.jbgz, &e.jj, &e.bx); e.sfgz = e.jbgz + e.jj - e.bx; printf(

25、"編號:%d 姓名:%s實(shí)發(fā)工資:%.2f\n", e.num, e.name, e.sfgz); } return 0;},請輸入職工人數(shù)n: 1請輸入第1個(gè)職工的信息:102 Zhong 2200.5 800 85.2編號:102 姓名:Zhong 實(shí)發(fā)工資:2915.30,結(jié)構(gòu)變量的使用-整體賦值,2. 結(jié)構(gòu)變量的整體賦值具有相同類型的結(jié)構(gòu)變量可以直接賦值。將賦值符號右邊結(jié)構(gòu)變量的每一

26、個(gè)成員的值都賦給了左邊結(jié)構(gòu)變量中相應(yīng)的成員。 struct friends_list { char name[10]; int age; char telephone[13];} friend1 = {Zhang",26, “0571-85271880”}, friend2;friend2 = friend1;,結(jié)構(gòu)變量的使用-函數(shù)參數(shù),3. 結(jié)構(gòu)變量作為函數(shù)參數(shù)當(dāng)程序的規(guī)模較

27、大,功能較多時(shí),需要以函數(shù)的形式進(jìn)行功能模塊的劃分和實(shí)現(xiàn);如果在函數(shù)間傳遞結(jié)構(gòu)數(shù)據(jù),則需用結(jié)構(gòu)變量作為函數(shù)的參數(shù)或返回值。,例9-3 結(jié)構(gòu)變量做為函數(shù)參數(shù),改寫例9-2,要求使用結(jié)構(gòu)變量作為函數(shù)參數(shù)。定義一個(gè)用于計(jì)算實(shí)發(fā)工資的函數(shù): float count_sfgz(struct employee m) { return m.jbgz + m.jj - m.bx;

28、 }再將主函數(shù)main中的語句: e.sfgz = e.jbgz + e.jj - e.bx; 改為: e.sfgz = count_sfgz(e);,一個(gè)結(jié)構(gòu)變量只能表示一個(gè)實(shí)體的信息,如果有許多相同類型的實(shí)體,就需要使用結(jié)構(gòu)數(shù)組。結(jié)構(gòu)數(shù)組是結(jié)構(gòu)與數(shù)組的結(jié)合,與普通數(shù)組的不同之處在于每個(gè)數(shù)組元素都是一個(gè)結(jié)構(gòu)類型的數(shù)據(jù),包括各個(gè)成員項(xiàng)。,9.3 結(jié)構(gòu)數(shù)組,結(jié)構(gòu)數(shù)組的定義方法與結(jié)構(gòu)變量

29、相同 struct friends_list{ char name[10]; int age; char telephone[13]; } friends[10]; 結(jié)構(gòu)數(shù)組friends,它有10個(gè)數(shù)組元素,從friends[0]到friends[9],每個(gè)數(shù)組元素都是結(jié)構(gòu)類型struct friends_list,9.3 結(jié)構(gòu)數(shù)組,結(jié)構(gòu)數(shù)組的初始化,str

30、uct friends_list friends[10] = { { "zhang san", 26, "0571-85271880"}, { "Li Si", 30, "13605732436"} };,結(jié)構(gòu)數(shù)組元素,結(jié)構(gòu)數(shù)組元素的成員引用結(jié)構(gòu)體數(shù)組名[下標(biāo)] . 結(jié)構(gòu)體成員名 使用方法與同類型的變量完全相同friends[

31、5].age = 26;strcpy(friends[5].name,"Zhang San");friends[4] = friends[1];,例9-4 結(jié)構(gòu)數(shù)組排序,輸入并保存10個(gè)學(xué)生的信息,計(jì)算并輸出平均分,再按照從高分到低分的順序輸出他們的信息。 #include struct student{ int num; char name[20]; int score;

32、}; struct student stud[10]; /* 定義結(jié)構(gòu)數(shù)組 */,例9-4 源程序,int main(void){ int i, j, index, sum = 0; struct student temp; /* 輸入10個(gè)學(xué)生的記錄,并累加成績 */ for(i = 0; i < 10; i++){ printf("No %d: ",

33、i+1); scanf("%d%s%d", &stud[i].num, stud[i].name, &stud[i].score); sum = sum + stud[i].score; } /* 按照分?jǐn)?shù)從低到高排序,使用選擇排序法 */ for( i = 0; i < 9; ++i ){ index =i;

34、 for (j = i+1; j <10; j++ ) if (stud[j].score < stud[index].score) /* 比較成績的大小 */ index = j; temp = stud[index];stud[index] = stud[i];stud[i] = temp; /*交換數(shù)組元素*/ } /

35、* 輸出成績 略*/ return 0;},9.4 結(jié)構(gòu)指針,9.4.1 結(jié)構(gòu)指針的概念9.4.2 結(jié)構(gòu)指針作為函數(shù)參數(shù),9.4.1結(jié)構(gòu)指針的概念,結(jié)構(gòu)指針:指向結(jié)構(gòu)類型變量的指針例9-1定義的結(jié)構(gòu)類型 struct friends_liststruct friends_list friend1 = {"zhang", 26, "88018445"}; struc

36、t friends_list *p;p = &friend1;,,結(jié)構(gòu)指針的使用,(1) 用*p訪問結(jié)構(gòu)成員(*p).age = 36;(2) 用指向運(yùn)算符“->”訪問指針指向的結(jié)構(gòu)成員。p->age = 36;當(dāng)p = &friend1時(shí),以下三條語句相同: friend1.age = 36; (*p).age = 36; p->age = 36;,,9.4.2 結(jié)構(gòu)指針

37、作為函數(shù)參數(shù),當(dāng)結(jié)構(gòu)指針作為函數(shù)的參數(shù)時(shí),執(zhí)行效率高,可以完成比基本類型指針更為復(fù)雜的操作。例9-5 輸入10個(gè)學(xué)生的學(xué)號、姓名和成績,輸出學(xué)生的成績等級和不及格人數(shù)。每個(gè)學(xué)生的記錄包括學(xué)號、姓名、成績和等級要求定義和調(diào)用函數(shù)set_grade根據(jù)學(xué)生成績設(shè)置等級,并統(tǒng)計(jì)不及格人數(shù)等級設(shè)置:A :85-100;B:70-84;C:60-69;D:0-59,,例9-5 源程序,#define N 10struct studen

38、t{ int num; char name[20]; int score; char grade;};int main(void){ struct student stu[N], *ptr; ptr = stu; /* 輸入 略 */ count = set_grade( ptr ); …},,int set_grade(struct student * p)

39、{ int i, n = 0; for(i = 0; i score >= 85) p->grade = 'A'; else if(p->score >= 70) p->grade = 'B'; else if(p->score >= 60)

40、p->grade = 'C'; else{ p->grade = 'D'; n++; } } return n;},調(diào)用set_grade返回主函數(shù)后,主函數(shù)中結(jié)構(gòu)數(shù)組stu的元素的grade成員已經(jīng)被賦值,例9-1 說明,例9-1中,結(jié)構(gòu)數(shù)組名friends作為函數(shù)參數(shù)時(shí),其實(shí)質(zhì)就是結(jié)構(gòu)指

41、針作為函數(shù)參數(shù),因?yàn)閿?shù)組名代表數(shù)組的首地址。因此,結(jié)構(gòu)數(shù)組名與結(jié)構(gòu)指針變量都可以做為函數(shù)的參數(shù)。 與結(jié)構(gòu)變量作為函數(shù)參數(shù)相比,用結(jié)構(gòu)指針作為函數(shù)參數(shù)的效率更高,因而是更佳的選擇。,,本章要點(diǎn),什么是結(jié)構(gòu)?結(jié)構(gòu)與數(shù)組有什么差別?有幾種結(jié)構(gòu)的定義形式,它們之間有什么不同?什么是結(jié)構(gòu)的嵌套?什么是結(jié)構(gòu)變量和結(jié)構(gòu)成員變量,如何引用結(jié)構(gòu)成員變量?結(jié)構(gòu)變量如何作為函數(shù)參數(shù)使用?什么是結(jié)構(gòu)數(shù)組,如何定義和使用結(jié)構(gòu)數(shù)組?什么是結(jié)構(gòu)指針,

溫馨提示

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

評論

0/150

提交評論