版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、Chap 9 結構,9.1 構建手機通訊錄9.2 結構變量9.3 結構數組9.4 結構指針,本章要點,什么是結構?結構與數組有什么差別?有幾種結構的定義形式,它們之間有什么不同?什么是結構的嵌套?什么是結構變量和結構成員變量,如何引用結構成員變量?結構變量如何作為函數參數使用?什么是結構數組,如何定義和使用結構數組?什么是結構指針,它如何實現對結構分量的操作?結構指針是如何作為函數的參數的?,9.1 構建
2、手機通訊錄,9.1.1 程序解析9.1.2 結構的概念與定義9.1.3 結構的嵌套定義,9.1.1 程序解析,例9-1 構建簡單的手機通訊錄聯系人的基本信息:姓名、年齡和聯系電話最多容納50名聯系人的信息 具有新建和查詢功能,9.1.1 程序解析-程序結構,程序結構主函數main:程序的總體控制函數new_friend:新建聯系人功能函數search_friend:查詢聯系人功能,main(),new_frie
3、nd(),search_friend(),程序解析-數據類型/變量,數據類型/變量結構類型struct friends_list:在程序首部定義,其中的成員分別代表聯系人的基本信息struct friends_list{ char name[10]; /* 姓名 */ int age; /* 年齡 */ char telepho
4、ne[13]; /* 聯系電話 */}; 結構數組friends:每個元素就是一個結構變量,對應一個聯系人struct friends_list friends[50];,程序解析-全局變量/函數參數,全局變量Count:記錄當前的聯系人總數 函數new_friend和search_friend的參數之一是結構數組:void new_friend(struct friends_list friends[ ] )
5、;void search_friend(struct friends_list friends[ ], char *name); 結構數組名作為函數實參與普通數組名作函數參數一樣,將數組首地址傳遞給函數形參,程序解析-源程序,#include#include/*手機通訊錄結構定義*/struct friends_list{ char name[10]; /* 姓名 */ int ag
6、e; /* 年齡 */ char telephone[13]; /* 聯系電話 */}; int Count = 0; /* 全局變量記錄當前聯系人總數 */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個人的通訊錄 */ do{ printf("手機通訊錄功能選項:1:新建 2:查詢 0:退出\n"); printf("請選擇功能:&
8、quot;); scanf("%d", &choice); switch(choice){ case 1: new_friend(friends); break; case 2: printf("請輸入要查找的聯系人名:"); scanf(
9、"%s", name); search_friend(friends, name); break; case 0: break; } }while(choice != 0); printf("謝謝使用通訊錄功能!\n"); return 0;},源程序,/*新建聯系人*/void new_friend
10、(struct friends_list friends[ ]){ struct friends_list f; if(Count == 50){ printf("通訊錄已滿!\n"); return; } printf("請輸入新聯系人的姓名:"); scanf("%s", f.name);
11、 printf("請輸入新聯系人的年齡:"); scanf("%d", &f.age); printf("請輸入新聯系人的聯系電話:"); scanf("%s", f.telephone); friends[Count] = f; Count++;},源程序,/*查詢聯系人*/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){ /* 找到聯系人*/ 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("無此聯系人!");},9.1.2 結構的概念與定義,使用結構來表示通訊錄信息:struct friends_list{ char name[10]; /*姓名*/ int age; /*年齡*/ char teleph
15、one[13]; /*聯系電話*/}; 結構:構造數據類型,把有內在聯系的不同類型的數據統(tǒng)一成一個整體,使它們相互關聯結構又是變量的集合,可以單獨使用其成員,結構的定義,結構類型定義的一般形式為: struct 結構名 { 類型名 結構成員名1; 類型名 結構成員名2; ? ? ? 類型名 結構成員名n;
16、 };,結構的定義以分號結束,被看作一條語句,,關鍵字struct和它后面的結構名一起組成一個新的數據類型名,,結構定義示例,定義平面坐標結構:struct point { double x; double y;}; 雖然x、y的類型相同,也可以用數組的方式表示,但采用結構體描述整體性更強,增加了程序的可讀性,使程序更清晰。,9.1.3 結構的嵌套定義,在實際生活中,一個較大的實體可能由多個成員構成,而這
17、些成員中有些又有可能是由一些更小的成員構成的實體。在手機通訊錄中,增加“通信地址”,結構的嵌套定義,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;,在定義嵌套的結構類型時,必須先定義成員的結構類型,再定義主結構類型。,9.2 結構變量,9.2.1 結構變量的定義和初始化9.2.2 結構變量的使用,9.2.1結構變量的定義和初始化,三種定義結構變量的方式: 1.單獨定義先定義結構類型,再定義具有這種結構類型的變量 struct friends_lis
19、t{ char name[10]; /* 姓名 */ int age; /* 年齡 */ char telephone[13]; /* 聯系電話 */}; struct friends_list friend1, friend2;,,結構變量的定義,2. 混合定義在定義結構體類型的同時定義結構體變量 struct f
20、riends_list{char name[10]; int age; char telephone[13]; } friend1, friend2; 3. 無類型名定義在定義結構體變量時省略結構體名struct { char name[10]; int age; char telephone[13]; } friend1, friend2;
21、,,結構變量的初始化,struct friends_list friend1 = { "Zhang", 26, "0571-85171880 " } ;,name age telephone ↓ ↓ ↓,9.2.2 結構變量的使用,1. 結構變量成員的引用結構變量名 .結構成員名friend1.age = 26;st
22、rcpy(friend1.name, "Zhang San"); nest_friend.addr.zip,例9-2 計算實發(fā)工資,在一個職工工資管理系統(tǒng)中,工資項目包括編號、姓名、基本工資、獎金、保險、實發(fā)工資。輸入一個正整數n,再輸入n個職工的前5項信息,計算并輸出每位職工的實發(fā)工資。實發(fā)工資 = 基本工資+獎金–保險。,例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("請輸入職工人數n: "); scanf("%d", &n); for(i = 1; i <= n; i++){
24、 printf("請輸入第%d個職工的信息: ", 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實發(fā)工資:%.2f\n", e.num, e.name, e.sfgz); } return 0;},請輸入職工人數n: 1請輸入第1個職工的信息:102 Zhong 2200.5 800 85.2編號:102 姓名:Zhong 實發(fā)工資:2915.30,結構變量的使用-整體賦值,2. 結構變量的整體賦值具有相同類型的結構變量可以直接賦值。將賦值符號右邊結構變量的每一
26、個成員的值都賦給了左邊結構變量中相應的成員。 struct friends_list { char name[10]; int age; char telephone[13];} friend1 = {Zhang",26, “0571-85271880”}, friend2;friend2 = friend1;,結構變量的使用-函數參數,3. 結構變量作為函數參數當程序的規(guī)模較
27、大,功能較多時,需要以函數的形式進行功能模塊的劃分和實現;如果在函數間傳遞結構數據,則需用結構變量作為函數的參數或返回值。,例9-3 結構變量做為函數參數,改寫例9-2,要求使用結構變量作為函數參數。定義一個用于計算實發(fā)工資的函數: float count_sfgz(struct employee m) { return m.jbgz + m.jj - m.bx;
28、 }再將主函數main中的語句: e.sfgz = e.jbgz + e.jj - e.bx; 改為: e.sfgz = count_sfgz(e);,一個結構變量只能表示一個實體的信息,如果有許多相同類型的實體,就需要使用結構數組。結構數組是結構與數組的結合,與普通數組的不同之處在于每個數組元素都是一個結構類型的數據,包括各個成員項。,9.3 結構數組,結構數組的定義方法與結構變量
29、相同 struct friends_list{ char name[10]; int age; char telephone[13]; } friends[10]; 結構數組friends,它有10個數組元素,從friends[0]到friends[9],每個數組元素都是結構類型struct friends_list,9.3 結構數組,結構數組的初始化,str
30、uct friends_list friends[10] = { { "zhang san", 26, "0571-85271880"}, { "Li Si", 30, "13605732436"} };,結構數組元素,結構數組元素的成員引用結構體數組名[下標] . 結構體成員名 使用方法與同類型的變量完全相同friends[
31、5].age = 26;strcpy(friends[5].name,"Zhang San");friends[4] = friends[1];,例9-4 結構數組排序,輸入并保存10個學生的信息,計算并輸出平均分,再按照從高分到低分的順序輸出他們的信息。 #include struct student{ int num; char name[20]; int score;
32、}; struct student stud[10]; /* 定義結構數組 */,例9-4 源程序,int main(void){ int i, j, index, sum = 0; struct student temp; /* 輸入10個學生的記錄,并累加成績 */ 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; } /* 按照分數從低到高排序,使用選擇排序法 */ 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; /*交換數組元素*/ } /
35、* 輸出成績 略*/ return 0;},9.4 結構指針,9.4.1 結構指針的概念9.4.2 結構指針作為函數參數,9.4.1結構指針的概念,結構指針:指向結構類型變量的指針例9-1定義的結構類型 struct friends_liststruct friends_list friend1 = {"zhang", 26, "88018445"}; struc
36、t friends_list *p;p = &friend1;,,結構指針的使用,(1) 用*p訪問結構成員(*p).age = 36;(2) 用指向運算符“->”訪問指針指向的結構成員。p->age = 36;當p = &friend1時,以下三條語句相同: friend1.age = 36; (*p).age = 36; p->age = 36;,,9.4.2 結構指針
37、作為函數參數,當結構指針作為函數的參數時,執(zhí)行效率高,可以完成比基本類型指針更為復雜的操作。例9-5 輸入10個學生的學號、姓名和成績,輸出學生的成績等級和不及格人數。每個學生的記錄包括學號、姓名、成績和等級要求定義和調用函數set_grade根據學生成績設置等級,并統(tǒng)計不及格人數等級設置: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;},調用set_grade返回主函數后,主函數中結構數組stu的元素的grade成員已經被賦值,例9-1 說明,例9-1中,結構數組名friends作為函數參數時,其實質就是結構指
41、針作為函數參數,因為數組名代表數組的首地址。因此,結構數組名與結構指針變量都可以做為函數的參數。 與結構變量作為函數參數相比,用結構指針作為函數參數的效率更高,因而是更佳的選擇。,,本章要點,什么是結構?結構與數組有什么差別?有幾種結構的定義形式,它們之間有什么不同?什么是結構的嵌套?什么是結構變量和結構成員變量,如何引用結構成員變量?結構變量如何作為函數參數使用?什么是結構數組,如何定義和使用結構數組?什么是結構指針,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- chap2_用c語言編寫程序1-3 - 浙江大學計算機輔助 …
- chap2_用c語言編寫程序1-3 - 浙江大學計算機輔助設計與
- c語言程序設計(第3版)何欽銘-顏-暉-第2章--c語言編寫程序
- c語言題解(1-3)
- 非線性曲線編寫程序.txt
- 安全專篇編寫程序
- 同花順公式編寫程序及規(guī)則
- 非線性曲線編寫程序.txt
- 用c語言編寫萬年歷程序
- 用c語言編寫個人財務管理程序
- c語言程序編寫和調試環(huán)境簡介
- 用vhdl語言編寫的數字鐘程序
- 《c++程序設計》實驗報告1-3
- 能干職員廣告編寫程序與內容策劃書
- c語言程序報告3
- c語言程序設計3
- c#編寫聊天程序
- 01vc6.0上機指導---編寫簡單的c語言程序
- unit 2 letters (1-3)
- c語言程序
評論
0/150
提交評論