結(jié)構(gòu)比老譚還要通俗易懂的.ppt
《結(jié)構(gòu)比老譚還要通俗易懂的.ppt》由會(huì)員分享,可在線閱讀,更多相關(guān)《結(jié)構(gòu)比老譚還要通俗易懂的.ppt(68頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
1、結(jié)構(gòu),,1,引子,整數(shù)型 int 基本類型 實(shí)數(shù)型 float,double 字符型 char 指針類型 數(shù)據(jù)類型 數(shù)組型 構(gòu)造類型 結(jié)構(gòu)型 struct 聯(lián)合型 union 枚舉型 enum 空類型 void,,,,2,引子,一個(gè)學(xué)生有學(xué)號(hào)/姓名/性別/年齡/地址等屬性: int num; char name20; char sex; int age; char addr30; 如果將這些屬性分別定義為互相獨(dú)立的變量,則難以反映出屬性之間的內(nèi)在聯(lián)系同一個(gè)學(xué)生的相關(guān)屬性。,是否可以定義為一個(gè)一維數(shù)組?,數(shù)組是一組具有相同數(shù)據(jù)類型的數(shù)據(jù)的有序集合,3,第十章 結(jié)構(gòu),本章學(xué)習(xí)要點(diǎn) 理解結(jié)構(gòu)類
2、型的概念; 掌握結(jié)構(gòu)類型的定義,結(jié)構(gòu)變量的初始化和存儲(chǔ)結(jié)構(gòu),能正確引用結(jié)構(gòu)數(shù)據(jù); 掌握結(jié)構(gòu)數(shù)組和結(jié)構(gòu)指針的應(yīng)用; 掌握函數(shù)間傳遞結(jié)構(gòu)類型數(shù)據(jù)的特點(diǎn)。,掌握本章內(nèi)容的捷徑: 1. 充分理解結(jié)構(gòu)類型 2. 掌握兩種操作:. - (重點(diǎn)在優(yōu)先級(jí)),,,我們首先定義的是一種類型(和int、float一樣級(jí)別),,4,第十章 結(jié)構(gòu),結(jié)構(gòu)類型 結(jié)構(gòu)與數(shù)組 結(jié)構(gòu)與指針 結(jié)構(gòu)與函數(shù) 聯(lián)合 枚舉 用typedef定義數(shù)據(jù)類型 鏈表基礎(chǔ),5,10.1 結(jié)構(gòu)類型,結(jié)構(gòu)的定義 結(jié)構(gòu)是邏輯上相互聯(lián)系的一組分量的集合。 結(jié)構(gòu)中的分量可以是不同類型的數(shù)據(jù),結(jié)構(gòu)中的分量稱為結(jié)構(gòu)的成員。 在使用結(jié)構(gòu)之前,首先要對(duì)結(jié)構(gòu)的組成進(jìn)行
3、描述,稱為結(jié)構(gòu)的定義。 結(jié)構(gòu)定義說(shuō)明了該結(jié)構(gòu)的組成成員,以及每個(gè)成員的類型。,6,10.1 結(jié)構(gòu)類型,結(jié)構(gòu)定義的一般形式 struct 結(jié)構(gòu)類型名稱 數(shù)據(jù)類型 成員名1; 數(shù)據(jù)類型 成員名2; 數(shù)據(jù)類型 成員名n; ;,struct student int num; char name20; char sex; int age; char addr30; ;,,不是變量名,而是成員名,7,10.1 結(jié)構(gòu)類型,說(shuō)明 struct 為關(guān)鍵字。 結(jié)構(gòu)類型名稱是所定義的結(jié)構(gòu)類型標(biāo)識(shí),由用戶自己定義; 中包圍的是組成該結(jié)構(gòu)的成員; 每個(gè)成員的數(shù)據(jù)類型既可以是簡(jiǎn)
4、單的數(shù)據(jù)類型 (int、char、float、double...),也可以是復(fù)雜的構(gòu)造數(shù)據(jù)類型(數(shù)組類型或結(jié)構(gòu)類型)。,8,10.1 結(jié)構(gòu)類型,結(jié)構(gòu)變量的說(shuō)明 C語(yǔ)言提供的基本數(shù)據(jù)類型,如int/double等,都是由系統(tǒng)事先定義好的,我們可直接使用。 在使用變量之前,要先說(shuō)明變量。 結(jié)構(gòu)是一種構(gòu)造型數(shù)據(jù)類型,結(jié)構(gòu)定義描述了結(jié)構(gòu)的組成。結(jié)構(gòu)定義相當(dāng)于定義了一種“類型”; 要使用結(jié)構(gòu)必須先說(shuō)明結(jié)構(gòu)類型的變量。 定義結(jié)構(gòu)是定義了一種由成員組成的復(fù)合類型,而只有用這種結(jié)構(gòu)類型說(shuō)明了一個(gè)變量,才會(huì)產(chǎn)生具體的實(shí)體(變量)。,9,10.1 結(jié)構(gòu)類型,結(jié)構(gòu)變量說(shuō)明的一般形式 struct 結(jié)構(gòu)類型
5、名稱 結(jié)構(gòu)變量名; 系統(tǒng)為所說(shuō)明的結(jié)構(gòu)變量按照結(jié)構(gòu)定義時(shí)說(shuō)明的組成(成員),分配存儲(chǔ)數(shù)據(jù)的實(shí)際內(nèi)存單元。 例:將變量 today 說(shuō)明為date型的結(jié)構(gòu)變量: struct date today; 說(shuō)明多個(gè)address型的結(jié)構(gòu)變量: struct address wang, li, zhang; 結(jié)構(gòu)變量同樣有存儲(chǔ)類型,存儲(chǔ)特性與一般變量完全相同。,10,10.1 結(jié)構(gòu)類型,實(shí)例 為了描述日期可以定義如下結(jié)構(gòu): struct date int year; /*年。整型作為結(jié)構(gòu)中的成員*/ int month;/* 月 */ int day; /* 日 */ ;,struc
6、t date today; /*說(shuō)明了一個(gè)date型的 結(jié)構(gòu)變量today*/,11,10.1 結(jié)構(gòu)類型,為了處理通信錄可以定義如下結(jié)構(gòu): struct address char name30; /* 姓名。字符數(shù)組作為結(jié)構(gòu)中的成員 */ char street40; /* 街道名稱 */ char city20; /* 城市 */ char state2; /* 省市代碼 */ unsigned long zip;/* 郵政編碼*/ ;,struct address li; /*說(shuō)明了一個(gè)address型的 結(jié)構(gòu)變量li */,12,10.1 結(jié)構(gòu)類型,結(jié)構(gòu)的定義和結(jié)構(gòu)變量的說(shuō)明也
7、可以同時(shí)進(jìn)行: struct date int year; int month; int day; today, tomorrow;,13,10.1 結(jié)構(gòu)類型,還有一種結(jié)構(gòu)變量的說(shuō)明方式: struct int year; int month; int day; today; today是一個(gè)結(jié)構(gòu)變量。,14,10.1 結(jié)構(gòu)類型,結(jié)構(gòu)變量占用內(nèi)存情況 結(jié)構(gòu)變量的各個(gè)成員分量在內(nèi)存中占用連續(xù)存儲(chǔ)區(qū)域;結(jié)構(gòu)變量所占內(nèi)存大小為結(jié)構(gòu)中每個(gè)成員分量占用內(nèi)存的長(zhǎng)度之和。,15,10.1 結(jié)構(gòu)類型,求結(jié)構(gòu)變量占內(nèi)存大小sizeof運(yùn)算 sizeof 是單目運(yùn)算,其功能是求出運(yùn)算對(duì)象所占的內(nèi)
8、存空間的字節(jié)數(shù)目。使用的一般形式為: sizeof ( 變量 或 類型說(shuō)明符 ),16,例:sizeof運(yùn)算的意義 main ( ) char str20; struct date /* 定義結(jié)構(gòu)date */ int year, month, day; today; /* 說(shuō)明結(jié)構(gòu)變量today */ struct address /* 定義結(jié)構(gòu)address */ char name30,street40,city20,state2; unsigned long int zip; wang; /* 說(shuō)明結(jié)構(gòu)變量wang */ ...... ,17
9、,10.1 結(jié)構(gòu)類型,printf(char: %dt, sizeof(char)); printf(int: %dt, sizeof(int)); printf(long: %dt, sizeof(long)); printf(float: %dn, sizeof(float)); printf(double: %dt, sizeof(double)); printf(str: %dt, sizeof(str)); printf(date: %dt, sizeof(struct date)); printf(today: %dt, sizeof(today)); printf(wa
10、ng: %dn, sizeof(wang));,1 2 4 4 8 20 6 6 96,18,10.1 結(jié)構(gòu)類型,關(guān)于結(jié)構(gòu)類型的說(shuō)明 類型與變量是不同的概念 在定義結(jié)構(gòu)變量時(shí)一般先定義一個(gè)結(jié)構(gòu)類型,然后再說(shuō)明變量為該結(jié)構(gòu)類型; 只能對(duì)變量賦值、存取或運(yùn)算,而不能對(duì)一個(gè)類型賦值、存取或運(yùn)算; 在編譯時(shí),對(duì)類型是不分配空間的,只對(duì)說(shuō)明的變量分配空間。,19,10.1 結(jié)構(gòu)類型,對(duì)結(jié)構(gòu)中的成員,可以單獨(dú)使用,它的作用與地位相當(dāng)于普通變量; 成員也可以是結(jié)構(gòu); 成員名可以與程序中的變量名相同,二者代表不同的對(duì)象。,20,10.1 結(jié)構(gòu)類型,例如: struct date int month; i
11、nt day; int year; ; struct student int num; char name20; char sex; int age; struct date birthday; char addr30; student1, student2;,21,10.1 結(jié)構(gòu)類型,對(duì)結(jié)構(gòu)成員的引用按名引用: 結(jié)構(gòu)變量名. 成員名稱 “.”是運(yùn)算符,含義是訪問(wèn)結(jié)構(gòu)中的成員,優(yōu)先級(jí)為最高的15級(jí),結(jié)合性從左向右。,22,10.1 結(jié)構(gòu)類型,舉例: struct date int year; int month; int day; today; 將變
12、量 today 賦值為2007/12/20,則要對(duì)其各個(gè)成員分別賦值: today.year = 2007; today.month = 12; today.day = 20;,23,例:用結(jié)構(gòu)描述一個(gè)人的基本情況。 struct person /* 定義person結(jié)構(gòu)類型 */ char name 30; char sex; struct date birthday; /* 結(jié)構(gòu)的嵌套定義 */ man; /* man:1980年3月28日出生的zhang先生 */ strcpy(man.name, “zhang”); /* 注意:不能寫(xiě)成 man.nam
13、e=zhang; */ man.sex = M; /* 為結(jié)構(gòu)中的字符成員賦值 */ man.birthday.year = 1980; man.birthday.month = 3; man.birthday.day = 28; /* 為嵌套定義的結(jié)構(gòu)中的成員賦值 */,,成員名,,變量名,24,10.1 結(jié)構(gòu)類型,如果要將“zhang”改為“zhong”,只要將結(jié)構(gòu)變量 man 中的數(shù)組成員 name 下標(biāo)為2的元素a改為o即可。 可以使用下列語(yǔ)句: man.name2 = o; 為結(jié)構(gòu)變量中的數(shù)組成員的一個(gè)元素賦值。,25,10.1 結(jié)構(gòu)類型,對(duì)結(jié)構(gòu)變量的整體操作 能夠
14、對(duì)結(jié)構(gòu)進(jìn)行整體操作的運(yùn)算符只有: 賦值:= 取地址:,輸出地址,26,10.1 結(jié)構(gòu)類型,結(jié)構(gòu)類型的引用說(shuō)明 除=和 如果成員本身又是一個(gè)結(jié)構(gòu)類型,則要用若干個(gè)成員運(yùn)算符,一級(jí)一級(jí)地找到最低的一級(jí)的成員。即:只能對(duì)最低級(jí)的成員進(jìn)行賦值或存取以及運(yùn)算。 man.nameman.birthday.month,,,27,對(duì)成員變量可以象普通變量一樣進(jìn)行各種運(yùn)算 student2.birthday.year = student1.birthday.year; sum = student1.birthday.month + 12; student1.age ++; ++ student1.a
15、ge; 可以引用成員的地址,也可引用結(jié)構(gòu)變量的地址。例如: scanf (“%d”, ,28,10.1 結(jié)構(gòu)類型,例:輸入今天的日期,然后輸出該日期 main ( ) struct date /*在函數(shù)中定義結(jié)構(gòu)類型date*/ int year, month, day; ; struct date today; /* 說(shuō)明結(jié)構(gòu)變量today */ printf (Enter today date:); scanf(%d%d%d, ,29,10.1 結(jié)構(gòu)類型,結(jié)構(gòu)變量的初始化 在說(shuō)明變量的同時(shí),可以對(duì)每個(gè)成員置初值,稱為結(jié)構(gòu)的初始化。 和數(shù)組一樣,只有當(dāng)結(jié)構(gòu)體
16、變量為全局變量或靜態(tài)變量時(shí),才能進(jìn)行初始化。不能對(duì)自動(dòng)變量進(jìn)行初始化。,請(qǐng)回顧初始化和賦初值的區(qū)別,請(qǐng)回顧數(shù)組的初始化、賦初值,30,10.1 結(jié)構(gòu)類型,結(jié)構(gòu)初始化的一般形式: struct 結(jié)構(gòu)類型名稱 結(jié)構(gòu)變量 = 初值; 中的初始化數(shù)據(jù)用逗號(hào)分隔。 初始化數(shù)據(jù)的個(gè)數(shù)與結(jié)構(gòu)成員的個(gè)數(shù)應(yīng)相同,它們是按成員的先后順序一一對(duì)應(yīng)賦值的。 每個(gè)初始化數(shù)據(jù)必須符合與其對(duì)應(yīng)的成員的數(shù)據(jù)類型。,31,例: struct date /* 在函數(shù)的外部定義結(jié)構(gòu)date */ int year, month, day; ; struct person /* 在函數(shù)外定義結(jié)構(gòu)person */ char n
17、ame 14, sex; struct date birthday; ; 對(duì)date類型的變量初始化: struct date today = 1992, 10, 1 ; 又如對(duì)變量man的初始化: struct person man= zhao, M, 1980,3,28 ;,32,用結(jié)構(gòu)描述個(gè)人基本情況,打印個(gè)人檔案: struct person xu = Xu lihui, M, 1962, 10, 4 ; main ( ) static struct person fang=Fang jin,M,1963,9,13 ; static struct person yuan=Yuan z
18、hiping,M,1963,10,5; /* 說(shuō)明內(nèi)部靜態(tài)結(jié)構(gòu)變量fang、yuan,并初始化*/ printf (name sex birthdayn); printf (-------------------------------n); printf (%-14s%-4c%4d.%02d.%02dn, xu.name, xu.sex,xu.birthday.year, xu.birthday.month, xu.birthday.day); printf (%-14s%-4c%4d.%02d.%02dn, fang.name,fang.sex,fang.birthday.year,f
19、ang.birthday.month,fang.birthday.day); printf (%-14s%-4c%4d.%02d.%02dn, yuan.name,yuan.sex,yuan.birthday.year, yuan.birthday.month,yuan.birthday.day); ,33,10.1 結(jié)構(gòu)類型,注意: 除在初始化或賦初值時(shí)以外,數(shù)組、結(jié)構(gòu)都不能直接用 = 賦值 (但相同類型的兩個(gè)結(jié)構(gòu)變量可以相互賦值:Sunday = today;) 另外: man1為結(jié)構(gòu)變量: scanf(“%s,%c,%d,%d,%d”, ,,,,,34,第十章 結(jié)構(gòu),結(jié)構(gòu)類型 結(jié)構(gòu)與
20、數(shù)組 結(jié)構(gòu)與指針 結(jié)構(gòu)與函數(shù),35,10.2 結(jié)構(gòu)與數(shù)組,結(jié)構(gòu)與數(shù)組的關(guān)系 數(shù)組作為結(jié)構(gòu)的一個(gè)成員 結(jié)構(gòu)數(shù)組,36,10.2 結(jié)構(gòu)與數(shù)組,問(wèn)題,一個(gè)學(xué)生有學(xué)號(hào)/姓名/性別/年齡/地址等屬性 int num;char name20;char sex; int age;char addr30;int v; 若處理多個(gè)學(xué)生的信息:,NUM NAME SEX AGE ADDR V --------------------------------------------------------------------------- 1 Caojun M19 SHANGHAIJI
21、AODA86 2 Chenmengjuan W18 BEIJINGLIGONG92 3 Chenpengyuan M20 XIANJIAODA78,,37,10.2 結(jié)構(gòu)與數(shù)組,結(jié)構(gòu)數(shù)組的定義 結(jié)構(gòu)數(shù)組是一個(gè)數(shù)組,數(shù)組中的每一個(gè)元素都是結(jié)構(gòu)類型。 說(shuō)明結(jié)構(gòu)數(shù)組的方法:先定義一個(gè)結(jié)構(gòu),再用結(jié)構(gòu)類型說(shuō)明一個(gè)數(shù)組變量。,例:記錄100個(gè)人的基本情況。 可說(shuō)明一個(gè)有100個(gè)元素的數(shù)組,數(shù)組的基類型為結(jié)構(gòu): struct person man 100 ; man 就是有100個(gè)元素的結(jié)構(gòu)數(shù)組,數(shù)組的每個(gè)元素為 person 型。,38,10.2 結(jié)構(gòu)與數(shù)組,結(jié)構(gòu)數(shù)組存放在連續(xù)的內(nèi)存區(qū)域中,
22、所占內(nèi)存大小為結(jié)構(gòu)類型的大小乘以數(shù)組元素的數(shù)量。 struct person man100 占 37*100 = 3700字節(jié),39,10.2 結(jié)構(gòu)與數(shù)組,訪問(wèn)結(jié)構(gòu)數(shù)組的元素 訪問(wèn)結(jié)構(gòu)數(shù)組中的具體元素,必須遵守?cái)?shù)組使用的規(guī)定按下標(biāo)進(jìn)行訪問(wèn)。 要訪問(wèn)結(jié)構(gòu)數(shù)組中某個(gè)具體元素下的成員,又要遵守有關(guān)訪問(wèn)結(jié)構(gòu)成員的規(guī)定使用“.”訪問(wèn)運(yùn)算符和成員名。,40,例如:要將數(shù)組man中的 3 號(hào)元素賦值為: Fangjin, M, 1963, 9, 13, 使用下列語(yǔ)句:,strcpy ( man3.name, Fangjin” ); man3.sex = M; man3.birthday.year = 196
23、3; man3.birthday.month = 9; man3.birthday.day = 13; /* 為數(shù)組中一個(gè)元素的一個(gè)成員賦值 */,為了將“Fangjin”改為Fangjun”:,man3.name5 = u; /*為數(shù)組中元素的數(shù)組成員中的一個(gè)字符賦值*/,41,10.2 結(jié)構(gòu)與數(shù)組,例:簡(jiǎn)單的密碼加密程序 加密規(guī)則:先定義一張字母加密對(duì)照表。將需要加密的一行文字輸入加密程序,程序根據(jù)加密表中的對(duì)應(yīng)關(guān)系,可以很簡(jiǎn)單地將輸入的文字加密輸出,對(duì)于表中未出現(xiàn)的字符則不加密。 輸入 輸出 輸入 輸出 輸入 輸出 輸入 輸出 a d b w c k d ; e i
24、 i a k b ; c w e,42,10.2 結(jié)構(gòu)與數(shù)組,struct table /* 定義結(jié)構(gòu) table */ char input; /* 成員 input 存輸入的字符 */ char output; /* 成員output存輸出的字符*/ ; struct table translate = /* 外部結(jié)構(gòu)數(shù)組translate并初始化 */ a, d, b, w, c, k, d, ;, e, i, i, a, k, b, ;, c, w, e ; /* 建立加密對(duì)照表 */,以此為9個(gè)結(jié)構(gòu)變量賦值,43,10.2 結(jié)構(gòu)與數(shù)組
25、,main( ) char ch; int str_long, i; str_long=sizeof(translate)/sizeof(struct table); /* 計(jì)算元素個(gè)數(shù) */ while ( (ch=getchar( )) != n) for( i=0; translatei.input!=ch /* 原樣輸出 */ ,44,main ( ) int i=0; struct s s_var; /* 定義一個(gè)結(jié)構(gòu)變量s_ver */ s_var = array0; /* 整體賦給s_var */ printf (%dn,
26、s_var.x); printf (%dn, *s_var.y);,例:分析程序運(yùn)行結(jié)果 struct s int x; int *y; ; /* y: 結(jié)構(gòu)中的成員是指向整型的指針 */ int data5= 10, 20, 30, 40, 50 ; /* 整型數(shù)組 */ struct s array5= 100, /* array: 結(jié)構(gòu)數(shù)組,初始化 */,100,10,45,printf (%dn, arrayi.x); printf(%dn, *arrayi.y); printf (%dn, ++arrayi.x); printf(%dn, ++ * arrayi.y
27、); printf (%dn, array++i.x);,例:分析程序運(yùn)行結(jié)果 struct s int x; int *y; ; /* y: 結(jié)構(gòu)中的成員是指向整型的指針 */ int data5= 10, 20, 30, 40, 50 ; /* 整型數(shù)組 */ struct s array5= 100, /* array: 結(jié)構(gòu)數(shù)組,初始化 */,100,10,i = 0;,101,11,101,11,200,1,46,printf(%dn, * ++ arrayi.y); printf (%dn,(* arrayi.y) ++); printf(%dn, * (array
28、i.y ++)); printf (%dn, * arrayi.y ++); printf (%dn, * arrayi.y);,例:分析程序運(yùn)行結(jié)果 struct s int x; int *y; ; /* y: 結(jié)構(gòu)中的成員是指向整型的指針 */ int data5= 10, 20, 30, 40, 50 ; /* 整型數(shù)組 */ struct s array5= 100, /* array: 結(jié)構(gòu)數(shù)組,初始化 */,30,30,i = 0;,31,40,101,11,50,1,2,31,3,4,47,第十章 結(jié)構(gòu),結(jié)構(gòu)類型 結(jié)構(gòu)與數(shù)組 結(jié)構(gòu)與指針 結(jié)構(gòu)與函數(shù),48,10.
29、3 結(jié)構(gòu)與指針,結(jié)構(gòu)與指針的關(guān)系 指針作為結(jié)構(gòu)的一個(gè)成員 結(jié)構(gòu)指針指向結(jié)構(gòu)的指針,49,10.3 結(jié)構(gòu)與指針,結(jié)構(gòu)指針說(shuō)明的一般形式 struct 結(jié)構(gòu)類型名稱 * 結(jié)構(gòu)指針變量名; 例如: struct date * pdate, today; 說(shuō)明了兩個(gè)變量,一個(gè)是指向結(jié)構(gòu) date 的結(jié)構(gòu)指針pdate,一個(gè)是 date 結(jié)構(gòu)變量today。 執(zhí)行語(yǔ)句:pdate = ,50,10.3 結(jié)構(gòu)與指針,通過(guò)指針訪問(wèn)結(jié)構(gòu)中的成員 采用運(yùn)算符“-”進(jìn)行操作: 結(jié)構(gòu)指針-成員名 “-”運(yùn)算符優(yōu)先級(jí)是最高的15級(jí),結(jié)合性從左至右。 注:C語(yǔ)言中優(yōu)先級(jí)為15的運(yùn)算符有4種: ( ) .
30、 - 通過(guò)結(jié)構(gòu)指針pdate訪問(wèn)成員year的操作可以寫(xiě)成:pdate-year = 1963; 等價(jià)于: today.year = 1963; ( * pdate).year = 1963;/*必須加括號(hào)*/,51,例:用結(jié)構(gòu)指針改寫(xiě)加密程序 struct table char input, output; ; struct table translate =a,d, b,w, c,k, d,;, e,i, i,a, k,b, ;,c, w,e; /* 加密對(duì)照表 */ main ( ) char ch; struct table *p, *pend; /*p和pen
31、d:指向結(jié)構(gòu)的指針*/ pend= ,52,main ( ) p = array; /* p指向結(jié)構(gòu)數(shù)組的首地址 */ printf (%dn, p-x); printf (%dn, (*p).x); printf (%dn, *p-y); printf (%dn, *(*p).y); printf (%dn, ++p-x);,例:分析程序運(yùn)行結(jié)果 struct s int x; int *y; *p; /* y: 結(jié)構(gòu)中的成員是指向整型的指針 */ int data5= 10, 20, 30, 40, 50 ; /* 整型數(shù)組 */ struct s
32、array5= 100, /* array: 結(jié)構(gòu)數(shù)組,初始化 */,100,100,10,10,101,,,101,53,10.3 結(jié)構(gòu)與指針,指針運(yùn)算與++運(yùn)算小結(jié) 由運(yùn)算符的優(yōu)先級(jí)和結(jié)合性決定++操作的對(duì)象;由++的前綴/后綴形式,決定操作的時(shí)機(jī)。 ++p-x p-x++ ++ * p-y * ++ p-y *(++p)-y * p-y ++ * (p-y) ++ * p ++ -y,54,10.3 結(jié)構(gòu)與指針,例:用結(jié)構(gòu)表示學(xué)生的學(xué)號(hào)和成績(jī),編寫(xiě)程序,對(duì)班中30名學(xué)生按成績(jī)進(jìn)行排序,并輸出排序后的學(xué)號(hào)、成績(jī)和全班平均分。 struct stuinf int stid; /*
33、學(xué)生學(xué)號(hào) */ int score; /* 學(xué)生成績(jī) */ stu STNUM ; /* stu: 結(jié)構(gòu)數(shù)組 */ struct stuinf * pSTNUM; /* p: 由指向結(jié)構(gòu)的指針構(gòu)成的指針數(shù)組 */,55,10.3 結(jié)構(gòu)與指針,若是5個(gè)學(xué)生的數(shù)據(jù),則在完成初始化操作后,數(shù)組的關(guān)系如下:,算法分析: 程序使用結(jié)構(gòu)數(shù)組stu,指針數(shù)組p; 程序在結(jié)構(gòu)數(shù)組和指針數(shù)組之間建立指針關(guān)系。 程序中只用對(duì)指針數(shù)組進(jìn)行排序,就可以實(shí)現(xiàn)對(duì)指向的成績(jī)的排序(選擇排序)。,請(qǐng)與書(shū)P188例7-21進(jìn)行比較,56,#define STNUM 5 main ( ) struct stuinf
34、 * ptemp, * pSTNUM; int i,j,k,sum=0; for ( i=0; iscore score ) k=j; if ( k != i ) ptemp = pi; pi=pk; pk=ptemp; for (i=0; iscore); printf (average score = %dn, sum/STNUM); ,57,第十章 結(jié)構(gòu),結(jié)構(gòu)類型 結(jié)構(gòu)與數(shù)組 結(jié)構(gòu)與指針 結(jié)構(gòu)與函數(shù),58,10.4 結(jié)構(gòu)與函數(shù),結(jié)構(gòu)與函數(shù)的關(guān)系 向函數(shù)中傳遞結(jié)構(gòu)的成員; 在函數(shù)之間傳遞整個(gè)結(jié)構(gòu); 向函數(shù)傳遞結(jié)構(gòu)的地址(指針)。,59,10.4 結(jié)構(gòu)與函數(shù),向函數(shù)傳遞結(jié)
35、構(gòu)的成員 在函數(shù)中傳遞結(jié)構(gòu)成員的方法與傳遞簡(jiǎn)單變量的方法相同: 在函數(shù)之間傳遞成員的值; 在函數(shù)之間傳遞成員的地址。 例如: printf(%d,student.num); 傳遞結(jié)構(gòu)成員的值 scanf(%d, 傳遞結(jié)構(gòu)成員的地址,60,10.4 結(jié)構(gòu)與函數(shù),在函數(shù)之間傳遞整個(gè)結(jié)構(gòu) 將結(jié)構(gòu)作為整體,在函數(shù)之間傳遞: 將結(jié)構(gòu)變量作為形參; 函數(shù)的返回值為一個(gè)結(jié)構(gòu)類型。,61,例:利用結(jié)構(gòu)變量求解兩個(gè)復(fù)數(shù)之積 、(3+4i)(5+6i) 、(10+20i)(30+40i) struct complx int real, im; /* real:復(fù)數(shù)的實(shí)部 im:復(fù)數(shù)的虛部 */ ; str
36、uct complx cmult ( za, zb ) /*返回值為結(jié)構(gòu)類型*/ struct complx za, zb; /* 形參為結(jié)構(gòu)類型 */ struct complx w; w.real = za.real * zb.real - za.im * zb.im; w.im = za.real * zb.im + za.im * zb.real; return w ; /* 返回結(jié)構(gòu) */ ,62,程序: void cpr (za,zb,z) /* 輸出zazb=z */ struct complx za, zb, z; /* 形式參數(shù)為結(jié)
37、構(gòu)類型 */ printf ((%d+%di)*(%d+%di)=,za.real, za.im, zb.real, zb.im); printf ((%d+%di)n, z.real, z.im); int main ( ) static struct complx za = 3, 4 ; static struct complx zb = 5, 6 ; struct complx z, x, y; struct complx cmult( ); void cpr( ); z = cmult(za, zb); cpr (za, zb, z); x.real = 10;
38、x.im = 20; y.real = 30; y.im = 40; z = cmult (x, y); cpr (x, y, z); ,63,10.4 結(jié)構(gòu)與函數(shù),向函數(shù)傳遞結(jié)構(gòu)的地址 向函數(shù)中傳遞結(jié)構(gòu)的地址要將函數(shù)的形參定義為指向結(jié)構(gòu)的指針,在調(diào)用時(shí)要用結(jié)構(gòu)的地址作為實(shí)參。,64,例:輸入10本書(shū)的名稱和單價(jià),按照單價(jià)排序使用插入排序算法 插入排序的基本思想:在數(shù)組中,有 N 個(gè)已經(jīng)從小到大排好序的元素,要加入 1個(gè)新的 元素時(shí),可以從數(shù)組的第 1 個(gè)元素開(kāi)始,依次與新元素進(jìn)行比較。 當(dāng)數(shù)組中首次出現(xiàn)第i個(gè)元素的值大于新元素時(shí),則新的元素就應(yīng)當(dāng)插在原來(lái)數(shù)組中的第i-1個(gè)元素
39、與第i個(gè)元素之間。此時(shí)可以將數(shù)組中第i個(gè)元素之后(包括第i個(gè)元素)的所有元素向后移動(dòng) 1個(gè) 位置,將新元素插入,使它成為第i個(gè)元素。這樣就可以得到已經(jīng)排好序的 N+1個(gè) 元素。,65,#define NUM 10 struct book char name20; float price; ; main ( ) struct book term, booksNUM; int count; for ( count=0; count 40、; scanf (%s%f, term.name, ,66,sortbook ( term, pbook, count ) struct book term; /* 形參:結(jié)構(gòu)變量term */ struct book *pbook; /*指向結(jié)構(gòu)數(shù)組首元素的指針 */ int count; /* 數(shù)組中已存入count個(gè)有序元素 */ int i; struct book *q, *pend = pbook; for (i=0; iprice term.price) break; for ( q=pend-1; q=pbook; q- - ) *(q+1) = *q; *pbook = term; /* 在pbook處插入新元素term */ printbook (pbook) struct book *pbook; printf(%-20s%6.2fn,pbook-name,pbook-price); ,67,,int x; int * p; int * q3; int (* w)3; int * g( ); int (* y)( ); struct date today; struct date day7; struct date * ptoday; struct date * pday7;,
- 溫馨提示:
1: 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 110中國(guó)人民警察節(jié)(筑牢忠誠(chéng)警魂感受別樣警彩)
- 2025正字當(dāng)頭廉字入心爭(zhēng)當(dāng)公安隊(duì)伍鐵軍
- XX國(guó)企干部警示教育片觀后感筑牢信仰之基堅(jiān)守廉潔底線
- 2025做擔(dān)當(dāng)時(shí)代大任的中國(guó)青年P(guān)PT青年思想教育微黨課
- 2025新年工作部署會(huì)圍繞六個(gè)干字提要求
- XX地區(qū)中小學(xué)期末考試經(jīng)驗(yàn)總結(jié)(認(rèn)真復(fù)習(xí)輕松應(yīng)考)
- 支部書(shū)記上黨課筑牢清廉信念為高質(zhì)量發(fā)展?fàn)I造風(fēng)清氣正的環(huán)境
- 冬季消防安全知識(shí)培訓(xùn)冬季用電防火安全
- 2025加強(qiáng)政治引領(lǐng)(政治引領(lǐng)是現(xiàn)代政黨的重要功能)
- 主播直播培訓(xùn)直播技巧與方法
- 2025六廉六進(jìn)持續(xù)涵養(yǎng)良好政治生態(tài)
- 員工職業(yè)生涯規(guī)劃方案制定個(gè)人職業(yè)生涯規(guī)劃
- 2024年XX地區(qū)黨建引領(lǐng)鄉(xiāng)村振興工作總結(jié)
- XX中小學(xué)期末考試經(jīng)驗(yàn)總結(jié)(認(rèn)真復(fù)習(xí)輕松應(yīng)考)
- 幼兒園期末家長(zhǎng)會(huì)長(zhǎng)長(zhǎng)的路慢慢地走