




下載本文檔
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
結(jié)構(gòu):完整的邏輯整體共74頁(yè)第2
頁(yè)提出問(wèn)題
一個(gè)學(xué)生有學(xué)號(hào)/姓名/性別/年齡/地址等屬性:
intnum; charname[20]; charsex; intage; charaddr[30]; 這些屬性具有內(nèi)在聯(lián)系:同一個(gè)學(xué)生的相關(guān)屬性。結(jié)構(gòu)類型共74頁(yè)第3
頁(yè)解決方案:采用結(jié)構(gòu)定義結(jié)構(gòu):描述“學(xué)生”信息是如何組成組成的;說(shuō)明結(jié)構(gòu)變量:使用變量存儲(chǔ)學(xué)生信息;使用結(jié)構(gòu)變量:進(jìn)行相關(guān)的數(shù)據(jù)處理。
結(jié)構(gòu)稱為:自定義數(shù)據(jù)類型。結(jié)構(gòu)類型共74頁(yè)第4
頁(yè)結(jié)構(gòu)定義 結(jié)構(gòu):邏輯上相關(guān)的一組分量的集合。 結(jié)構(gòu)中的分量可以是不同類型的數(shù)據(jù),結(jié)構(gòu)中的分量稱為結(jié)構(gòu)的成員。
結(jié)構(gòu)定義:在使用結(jié)構(gòu)之前,首先要給出結(jié)構(gòu)的組成。結(jié)構(gòu)定義說(shuō)明了組成該結(jié)構(gòu)的成員以及每個(gè)成員的類型。
結(jié)構(gòu)定義是定義了一種由不同的成員組成的復(fù)合類型,只有用這種結(jié)構(gòu)類型說(shuō)明了一個(gè)變量,才會(huì)產(chǎn)生具體的實(shí)體(變量)。結(jié)構(gòu)類型共74頁(yè)第5
頁(yè)結(jié)構(gòu)定義的一般形式
struct結(jié)構(gòu)類型名稱 {數(shù)據(jù)類型成員名1; 數(shù)據(jù)類型成員名2;
…… 數(shù)據(jù)類型成員名n; };結(jié)構(gòu)變量說(shuō)明的一般形式
struct結(jié)構(gòu)類型名稱結(jié)構(gòu)變量名;結(jié)構(gòu)類型共74頁(yè)第6
頁(yè)實(shí)例:日期 structdate{ intyear; /*年*/ intmonth; /*月*/ intday; /*日*/};structdatetoday;結(jié)構(gòu)類型4字節(jié)4字節(jié)4字節(jié)today(structdate)12個(gè)字節(jié)yearmonthday共74頁(yè)第7
頁(yè)實(shí)例:處理通信錄structaddress{charname[30]; //姓名charstreet[40]; //街道名稱 charcity[20]; //城市 charstate[2]; //省市代碼 unsignedlongzip; //郵政編碼}wang,li,zhang;結(jié)構(gòu)類型wang(96字節(jié))30字節(jié)40字節(jié)20字節(jié)2字節(jié)4字節(jié)namestreetcitystatezip共74頁(yè)第8
頁(yè)結(jié)構(gòu)變量的說(shuō)明 基本數(shù)據(jù)類型,int/long/double等,是由系統(tǒng)事先定義,可直接使用。 在使用變量之前,要先聲明(說(shuō)明)變量。 結(jié)構(gòu)是一種構(gòu)造型數(shù)據(jù)類型,用戶要根據(jù)自己的需要可定義結(jié)構(gòu)的組成。 要使用結(jié)構(gòu)必須先說(shuō)明結(jié)構(gòu)類型的變量。 定義結(jié)構(gòu)是定義了一種由不同的成員組成的復(fù)合類型,而只有用這種結(jié)構(gòu)類型說(shuō)明了一個(gè)變量,才會(huì)產(chǎn)生具體的實(shí)體(變量)?!?0-1結(jié)構(gòu)類型共74頁(yè)第9
頁(yè)結(jié)構(gòu)變量說(shuō)明的一般形式
struct結(jié)構(gòu)類型名稱結(jié)構(gòu)變量名; 系統(tǒng)為說(shuō)明的結(jié)構(gòu)變量按照結(jié)構(gòu)定義時(shí)的組成(成員分量),分配存儲(chǔ)數(shù)據(jù)的實(shí)際內(nèi)存單元。
例:說(shuō)明結(jié)構(gòu)變量。
structdatetoday;
structaddresswang,li,zhang; 結(jié)構(gòu)變量同樣有存儲(chǔ)類型。結(jié)構(gòu)類型共74頁(yè)第10
頁(yè)結(jié)構(gòu)變量占用內(nèi)存情況 結(jié)構(gòu)變量的各成員在內(nèi)存中占用連續(xù)存儲(chǔ)區(qū)域,占用內(nèi)存大小為結(jié)構(gòu)中每個(gè)成員所占內(nèi)存的長(zhǎng)度之和。4字節(jié)4字節(jié)4字節(jié)today(structdate)12個(gè)字節(jié)yearmonthdaywang(structaddress)96個(gè)字節(jié)30字節(jié)40字節(jié)20字節(jié)2字節(jié)4字節(jié)namestreetcitystatezipintcharunsignedlong結(jié)構(gòu)類型共74頁(yè)第11
頁(yè)2字節(jié)2字節(jié)2字節(jié)today(structdate)6個(gè)字節(jié)yearmonthdaywang(structaddress)96個(gè)字節(jié)30字節(jié)40字節(jié)20字節(jié)2字節(jié)4字節(jié)namestreetcitystatezip結(jié)構(gòu)類型求結(jié)構(gòu)變量占用內(nèi)存大小
sizeof 單目運(yùn)算sizeof,求運(yùn)算對(duì)象占用的內(nèi)存空間的字節(jié)數(shù)。 一般形式:sizeof(變量或數(shù)據(jù)類型說(shuō)明符)共74頁(yè)第12
頁(yè)例C10-1.C:sizeof運(yùn)算的意義。
main() {charstr[20]; structdate /*定義結(jié)構(gòu)date*/ { intyear,month,day; }today; /*說(shuō)明結(jié)構(gòu)變量today*/ structaddress /*定義結(jié)構(gòu)address*/ { charname[30],street[40],city[20],state[2]; unsignedlongintzip; }wang; /*說(shuō)明結(jié)構(gòu)變量wang*/
...... }結(jié)構(gòu)類型共74頁(yè)第13
頁(yè)例C10-1.C:sizeof運(yùn)算的意義。 printf("char:%d\t",sizeof(char)); printf("int:%d\t",sizeof(int)); printf("long:%d\t",sizeof(long)); printf("float:%d\n",sizeof(float)); printf("double:%d\t",sizeof(double)); printf("str:%d\t",sizeof(str));printf("date:%d\t",sizeof(structdate));
printf(“today:%d\t",sizeof(today)); printf("wang:%d\n",sizeof(wang));§10-1結(jié)構(gòu)類型例C10_120112448206696共74頁(yè)第14
頁(yè)關(guān)于結(jié)構(gòu)類型的說(shuō)明
數(shù)據(jù)類型與變量是不同的概念在說(shuō)明結(jié)構(gòu)變量時(shí)一般先定義一個(gè)結(jié)構(gòu)類型,然后再說(shuō)明變量為該結(jié)構(gòu)類型。只能對(duì)變量賦值、存取或運(yùn)算,而不能對(duì)一種數(shù)據(jù)類型賦值、存取或運(yùn)算。在編譯時(shí),對(duì)類型是不分配空間的,只對(duì)說(shuō)明的變量分配空間。結(jié)構(gòu)類型共74頁(yè)第15
頁(yè)關(guān)于結(jié)構(gòu)類型的說(shuō)明對(duì)結(jié)構(gòu)中的成員,可以單獨(dú)使用,它的作用與地位相當(dāng)于普通變量。成員也可以是結(jié)構(gòu)。成員名可以與程序中的變量名相同,二者代表不同的對(duì)象。結(jié)構(gòu)類型共74頁(yè)第16
頁(yè)例如:structdate {intmonth; intday; intyear; }; structstudent {intnum; charname[20]; charsex; intage; structdatebirthday; charaddr[30]; }student1,student2;d..m..y..birthdayagesexnamenumaddr結(jié)構(gòu)類型程序中可以另定義一個(gè)變量
year,它和struct
date
中的成員
year是兩回事,互不干擾。共74頁(yè)第17
頁(yè)引用結(jié)構(gòu)變量中的成員分量訪問(wèn)結(jié)構(gòu)中的成員通過(guò)成員名,稱為“按名引用”:結(jié)構(gòu)變量名.成員名
例如:將變量today賦值為:2011/5/18,則要對(duì)其各個(gè)成員分別賦值:
today.year=2011;today.month=5; today.day=18;“.”是運(yùn)算符:訪問(wèn)結(jié)構(gòu)中的成員?!?”優(yōu)先級(jí)最高;結(jié)合性為從左到右。
結(jié)構(gòu)類型共74頁(yè)第18
頁(yè) 例:用結(jié)構(gòu)描述一個(gè)人的基本情況。 structperson {charname[30]; charsex; structdatebirthday;/*結(jié)構(gòu)的嵌套定義*/ }man;結(jié)構(gòu)類型共74頁(yè)第19
頁(yè) 例:用結(jié)構(gòu)描述一個(gè)人的基本情況。
man:1980年3月28日出生的zhang先生: strcpy(,”zhang”);
/*注意:不能寫(xiě)成="zhang";*/ man.sex=’M’;/*為結(jié)構(gòu)中的字符成員賦值*/ man.birthday.year=1980; man.birthday.month=3; man.birthday.day=28; /*為嵌套定義的結(jié)構(gòu)中的成員賦值*/結(jié)構(gòu)類型共74頁(yè)第20
頁(yè)如果要將“zhang”改為“zhong”,只要將結(jié)構(gòu)變量man中的數(shù)組成員name下標(biāo)為2的元素‘a(chǎn)’改為‘o’即可。可使用語(yǔ)句: [2]='o';
//為結(jié)構(gòu)變量中數(shù)組成員的一個(gè)元素賦值結(jié)構(gòu)類型共74頁(yè)第21
頁(yè)對(duì)結(jié)構(gòu)變量的整體操作 能夠?qū)Y(jié)構(gòu)進(jìn)行整體操作的運(yùn)算符只有:賦值:=
取地址:& 例如:
structdatesunday,today; sunday=today;/*結(jié)構(gòu)變量整體賦值*/結(jié)構(gòu)類型共74頁(yè)第22
頁(yè)結(jié)構(gòu)類型的引用說(shuō)明不能將一個(gè)結(jié)構(gòu)變量作為一個(gè)整體直接訪問(wèn)。例如,已定義結(jié)構(gòu)變量student1且已賦值,
不能這樣引用:
printf(”%s,%c,%d,%d,%d\n”,student1);如果成員本身又是一個(gè)結(jié)構(gòu)類型,則要用若干個(gè)成員運(yùn)算符,一級(jí)一級(jí)地找到最低一級(jí)的成員?!?0-1結(jié)構(gòu)類型共74頁(yè)第23
頁(yè)結(jié)構(gòu)類型的引用說(shuō)明只能對(duì)最低級(jí)的成員進(jìn)行賦值或存取以及運(yùn)算。 例如,對(duì)上面定義的結(jié)構(gòu)變量student1,可以這樣訪問(wèn)各個(gè)成員: student1.sex student1.birthday.month student1.birthday.day student1.birthday.year結(jié)構(gòu)類型共74頁(yè)第24
頁(yè)對(duì)變量的成員可以進(jìn)行各種運(yùn)算: student2.birthday.year=student1.birthday.year; sum=student1.birthday.month+12; student1.age++;
++student1.age;可以引用成員的地址,也可引用結(jié)構(gòu)變量的地址。 例如:scanf(”%d”,&student1.num); printf(”%p”,&student1);結(jié)構(gòu)類型共74頁(yè)第25
頁(yè)結(jié)構(gòu)與數(shù)組的關(guān)系在結(jié)構(gòu)中使用數(shù)組作為結(jié)構(gòu)的成員;使用結(jié)構(gòu)類型作為數(shù)組的基類型構(gòu)成數(shù)組——結(jié)構(gòu)數(shù)組結(jié)構(gòu)數(shù)組
數(shù)組中的每一個(gè)元素都是結(jié)構(gòu)。
例:記錄100個(gè)人的基本情況。
structpersonman[100];
man是有100個(gè)元素的結(jié)構(gòu)數(shù)組,數(shù)組的每個(gè)元素為
person型。結(jié)構(gòu)與數(shù)組共74頁(yè)第26
頁(yè)結(jié)構(gòu)數(shù)組結(jié)構(gòu)數(shù)組的起始下標(biāo)從0開(kāi)始數(shù)組名表示該結(jié)構(gòu)數(shù)組的首地址。結(jié)構(gòu)數(shù)組存放在連續(xù)的內(nèi)存區(qū)域中,占用內(nèi)存大小為結(jié)構(gòu)類型的大小乘以數(shù)組元素的數(shù)量。structpersonman[100];43*100=4300字節(jié)301444301444301444......namesymdnsymdnsymdman[0]man[1]man[99]結(jié)構(gòu)與數(shù)組共74頁(yè)第27
頁(yè)訪問(wèn)結(jié)構(gòu)數(shù)組中的元素及結(jié)構(gòu)成員要訪問(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)算符和成員名。結(jié)構(gòu)與數(shù)組共74頁(yè)第28
頁(yè)實(shí)例
要將數(shù)組man中的3號(hào)元素賦值為:"Fangjin",'M',1983,9,13, 就可以使用下列語(yǔ)句: strcpy(man[3].name,"Fangjin"); man[3].sex='M'; man[3].birthday.year=1983; man[3].birthday.month=9; man[3].birthday.day=13; 要將“Fangjin”改為“Fangjun”:
man[3].name[5]='u';結(jié)構(gòu)與數(shù)組共74頁(yè)第29
頁(yè)例C10-5.C:簡(jiǎn)單的密碼加密程序。 最簡(jiǎn)單的加密過(guò)程是定義一張加密表。將需要加密的文字輸入加密程序,程序根據(jù)加密表中的對(duì)應(yīng)關(guān)系,可以很簡(jiǎn)單地將輸入的明文加密后輸出,表中未出現(xiàn)的字符則不變。
輸入
輸出
輸入
輸出
輸入
輸出
輸入
輸出
a
d
b
w
c
k
d
;
e i
i
a
k
b
;
c
w
e結(jié)構(gòu)與數(shù)組共74頁(yè)第30
頁(yè)建立加密對(duì)照表structtable /*定義結(jié)構(gòu)table*/{ charinput; /*成員input存輸入的字符*/ char
output;/*成員output存輸出的字符*/};structtabletranslate[]=/*外部結(jié)構(gòu)數(shù)組translate并初始化*/{'a','d','b','w','c','k',
'd',';','e','i','i','a',
'k','b',';','c','w','e’}; /*建立加密對(duì)照表*/結(jié)構(gòu)與數(shù)組共74頁(yè)第31
頁(yè)“structtabletranslate[]={...}”有三個(gè)作用:說(shuō)明一個(gè)外部的結(jié)構(gòu)數(shù)組translate;數(shù)組大小由給出的初始化數(shù)據(jù)決定;對(duì)結(jié)構(gòu)數(shù)組進(jìn)行初始化。 程序中給出了數(shù)組初始化數(shù)據(jù),所以結(jié)構(gòu)數(shù)組translate有9個(gè)元素。adbwckd;eiiakb;cwetranslate[0]translate[1]translate[2]translate[3]translate[4]translate[5]translate[6]translate[7]translate[8]結(jié)構(gòu)與數(shù)組共74頁(yè)第32
頁(yè)例C10-5.C:簡(jiǎn)單的密碼加密程序。structtable{ charinput,output;};structtabletranslate[]={'a','d','b','w','c','k',
'd',';','e','i','i','a','k','b',';','c','w','e‘};main(){ charch; intstr_long,i; str_long=sizeof(translate)/sizeof(structtable);
/*計(jì)算元素個(gè)數(shù)*/
while((ch=getchar())!='\n')
{
for(
i=0;translate[i].input!=ch&&i<str_long;i++);
if(i<str_long)putchar(translate[i].output);
/*加密*/
else
putchar(ch); /*原樣輸出*/
}}結(jié)構(gòu)與數(shù)組例C6_2002共74頁(yè)第33
頁(yè)難點(diǎn)說(shuō)明 str_long=sizeof(translate)
/sizeof(structtable); /*計(jì)算元素個(gè)數(shù)*/結(jié)構(gòu)與數(shù)組共74頁(yè)第34
頁(yè)例C10-4.C:分析程序運(yùn)行結(jié)果 structs
{ intx;int*y;};
intdata[5]={10,20,30,40,50};
structs
array[5]={100,&data[0],200,&data[1],300,&data[2],400,&data[3],500,&data[4]};
數(shù)組array的初始化狀態(tài)如下:100200300400500array[0]array[1]array[2]array[3]array[4]1020304050data[0]data[1]data[2]data[3]data[4]結(jié)構(gòu)與數(shù)組共74頁(yè)第35
頁(yè)例C10-4.C:分析程序運(yùn)行結(jié)果。 main(){ inti=0;/*說(shuō)明變量i并賦初值*/
structss_var; /*s_ver:一般的結(jié)構(gòu)變量*/
s_var=array[0];/*整體賦給s_var*/ printf("%d\n",s_var.x); printf("%d\n",*s_var.y); printf("Forarray:\n"); printf("%d\n",array[i].x); printf("%d\n",*array[i].y); printf("%d\n",++array[i].x); printf("%d\n",++*array[i].y); printf("%d\n",array[++i].x); printf("%d\n",*++array[i].y); printf("%d\n",(*array[i].y)
++); printf("%d\n",*
(array[i].y++)); printf("%d\n",*array[i].y++); printf("%d\n",*array[i].y);}結(jié)構(gòu)與數(shù)組例C6_2001共74頁(yè)第36
頁(yè)例C10-4.C:分析程序運(yùn)行結(jié)果 各個(gè)printf語(yǔ)句中對(duì)數(shù)組操作的含義如下(i=0):
①s_var.x 取s_var的成員x的值 ②*s_var.y 取s_var的成員指針y所指的內(nèi)容
③array[i].x 取array[i]的x的值 ④*array[i].y 取array[i]的指針y所指的內(nèi)容1002003004005001020304050array[0]array[1]array[2]array[3]array[4]data[0]data[1]data[2]data[3]data[4]s_var10010010100結(jié)構(gòu)與數(shù)組1001010010共74頁(yè)第37
頁(yè)
①++
array[i].x
②++
*
array[i].y
③array[++i].x
④*
++
array[i].y1002003004005001020304050array[0]array[1]array[2]array[3]array[4]data[0]data[1]data[2]data[3]data[4]1001011011i0120030結(jié)構(gòu)與數(shù)組取array[i]的x的值,x加1后輸出101取array[i]的y所指的內(nèi)容,y的內(nèi)容加1后輸出11i先加1后取array[1]的成員x的值200將array[i]的指針y先加1后再取y所指的內(nèi)容輸出30共74頁(yè)第38
頁(yè)
①
(*array[i].y)++
②*(array[i].y++)
③*
array[i].y++
④*array[i].y1012003004005001120304050array[0]array[1]array[2]array[3]array[4]data[0]data[1]data[2]data[3]data[4]i0130314050結(jié)構(gòu)與數(shù)組取array[i]的指針y的內(nèi)容,輸出30,y的內(nèi)容再加1取array[i]的指針y的內(nèi)容,輸出31,指針y再加1同*(array[i].y++),根據(jù)運(yùn)算符的結(jié)合性,隱含了括號(hào),輸出40輸出50
共74頁(yè)第39
頁(yè)結(jié)構(gòu)與指針的關(guān)系其一是將指針作為結(jié)構(gòu)中的一個(gè)成員其二是指向結(jié)構(gòu)的指針(也稱為結(jié)構(gòu)指針)結(jié)構(gòu)與指針共74頁(yè)第40
頁(yè)結(jié)構(gòu)指針說(shuō)明的一般形式struct
結(jié)構(gòu)類型名稱*
結(jié)構(gòu)指針變量名; 例如: structdate
*
pdate,today; 說(shuō)明了兩個(gè)變量,一個(gè)是指向結(jié)構(gòu)date的結(jié)構(gòu)指針pdate,today是一個(gè)
date結(jié)構(gòu)變量。 執(zhí)行語(yǔ)句:pdate=&today;pdatedayyearmonthtoday結(jié)構(gòu)與指針共74頁(yè)第41
頁(yè)通過(guò)指針訪問(wèn)結(jié)構(gòu)中的成員 采用運(yùn)算符“->”進(jìn)行操作。結(jié)構(gòu)指針->成員名 優(yōu)先級(jí)是最高的(15級(jí)),從左至右結(jié)合 注意:C語(yǔ)言中優(yōu)先級(jí)為15的運(yùn)算符有4種:()[].-> 通過(guò)結(jié)構(gòu)指針pdate訪問(wèn)成員year的操作:pdate->year=2011;
等價(jià)于:today.year=2011;
(*pdate).year=2011;//必須加括號(hào)結(jié)構(gòu)與指針共74頁(yè)第42
頁(yè)例C10-7.C:用結(jié)構(gòu)指針改寫(xiě)加密程序 structtable { charinput,output; }; structtabletranslate[]={’a’,’d’,’b’,’w’,’c’,’k’,'d',';','e','i',’i’,’a’,’k’,’b’,’;’,’c’,’w’,’e’};/*加密對(duì)照表*/ main() {charch; structtable*p,*pend;/*p和pend:指向結(jié)構(gòu)的指針*/
pend=&translate[sizeof(translate)/sizeof(structtable)-1];/*pend
指向結(jié)構(gòu)數(shù)組translate的最后一個(gè)元素*/
while((ch=getchar())!='\n')
{ for(p=translate;p->input!=ch&&p!=pend;p++);
if(p->input==ch)putchar(p->output);
else
putchar(ch);
}}結(jié)構(gòu)與指針例C6_3001共74頁(yè)第43
頁(yè)例C10-8.C:請(qǐng)分析程序的運(yùn)算結(jié)果structs{ intx,*y; /*y:結(jié)構(gòu)中的成員是指向整型的指針*/}*p; /*p:指向結(jié)構(gòu)的指針*/intdata[5]={10,20,30,40,50,}; /*data:整型數(shù)組*/structsarray[5]={100,&data[0],200,&data[1],300,&data[2],400,&data[3],500,&data[4]}; /*array:結(jié)構(gòu)數(shù)組*/main(){ p=array; /*指針p指向結(jié)構(gòu)數(shù)組的首地址*/ printf("%d\n",p->x); printf("%d\n",(*p).x); printf("%d\n",*p->y); printf("%d\n",*(*p).y); printf("%d\n",++p->x); printf("%d\n",(++p)->x); printf("%d\n",p->x++); printf("%d\n",p->x); printf("%d\n",++(*p->y)); printf("%d\n",++*p->y); printf("%d\n",*++p->y); printf("%d\n",p->x); printf("%d\n",*(++p)->y); printf("%d\n",p->x); printf("%d\n",*p->y++); printf("%d\n",p->x); printf("%d\n",*(p->y)++); printf("%d\n",p->x); printf("%d\n",*p++->y); printf("%d\n",p->x);}結(jié)構(gòu)與指針例C6_3002共74頁(yè)第44
頁(yè)例C10-8.C:請(qǐng)分析程序的運(yùn)算結(jié)果 結(jié)構(gòu)數(shù)組array的初始化后的狀態(tài)如下:1002003004005001020304050array[0]array[1]array[2]array[3]array[4]data[0]data[1]data[2]data[3]data[4]p10010101結(jié)構(gòu)與指針①p->x ②(*p).x ③*p->y ④*(*p).y⑤
++p->x取結(jié)構(gòu)指針p指向的結(jié)構(gòu)的成員x的值,輸出100取結(jié)構(gòu)指針p的內(nèi)容的成員x的值,輸出100取結(jié)構(gòu)指針p的指針成員y的內(nèi)容,輸出10取指針p的內(nèi)容的指針成員y的內(nèi)容,輸出10p所指的x加1,x先加1后再輸出101。p不加1共74頁(yè)第45
頁(yè)例C10-8.C:請(qǐng)分析程序的運(yùn)算結(jié)果1012003004005001020304050array[0]array[1]array[2]array[3]array[4]data[0]data[1]data[2]data[3]data[4]p200201202122結(jié)構(gòu)與指針①(++p)->x
②p->x++
③p->x ④++(*p->y)⑤
++
*p->y p先加1后再取x的值,x不加1,輸出200先取x的值,然后x再加1,輸出200輸出201p所指的y的內(nèi)容先加1,輸出21。p不加1,y不加1同上,由運(yùn)算的結(jié)合性隱含了括號(hào),輸出22共74頁(yè)第46
頁(yè)①*
++
p->y②p->x ③*(++p)->y④p->x⑤*
p->y++⑥
p->x1012013004005001022304050array[0]array[1]array[2]array[3]array[4]data[0]data[1]data[2]data[3]data[4]p30201300結(jié)構(gòu)與指針p所指的y先加1后再取y的內(nèi)容,輸出30,p不加1,y的內(nèi)容不加1輸出201p先加1后再取所指y的內(nèi)容,輸出
30輸出300取p所指的y的內(nèi)容,輸出30,然后p所指的y加1輸出300共74頁(yè)第47
頁(yè)①*(p->y)++②p->x ③*p++
->y④p->x 1012013004005001022304050array[0]array[1]array[2]array[3]array[4]data[0]data[1]data[2]data[3]data[4]p4030050400結(jié)構(gòu)與指針取p所指的y的內(nèi)容,輸出40,然后p所指的y再加1輸出300取p所指的y的內(nèi)容,輸出50,然后p再加1輸出400共74頁(yè)第48
頁(yè)指針運(yùn)算與++運(yùn)算規(guī)律小結(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結(jié)構(gòu)與指針共74頁(yè)第49
頁(yè)例C10-9.C 用結(jié)構(gòu)保存學(xué)號(hào)和成績(jī)。編寫(xiě)程序,在保持?jǐn)?shù)據(jù)原始順序的前提下,對(duì)30名學(xué)生按成績(jī)升序排列,輸出排序后的學(xué)號(hào)、成績(jī)和平均分。
struct
stuinf { intstid; /*學(xué)生學(xué)號(hào)*/ intscore; /*學(xué)生成績(jī)*/ }stu[
STNUM
]; /*stu:結(jié)構(gòu)數(shù)組*/ structstuinf*
p[STNUM];/*p:由指向結(jié)構(gòu)的指針構(gòu)成的指針數(shù)組*/結(jié)構(gòu)與指針共74頁(yè)第50
頁(yè)
若有5名學(xué)生:stu數(shù)組01020304059095857392p數(shù)組p[0]p[1]p[2]p[3]p[4]算法分析:程序中使用結(jié)構(gòu)數(shù)組stu,指針數(shù)組p;在結(jié)構(gòu)數(shù)組和指針數(shù)組之間建立指向關(guān)系。結(jié)構(gòu)與指針stu數(shù)組01020304059095857392p數(shù)組p[0]p[1]p[2]p[3]p[4]程序中只對(duì)指針數(shù)組進(jìn)行排序,即可實(shí)現(xiàn)對(duì)所指成績(jī)的排序(選擇排序)。共74頁(yè)第51
頁(yè)結(jié)構(gòu)與指針 #defineSTNUM
5
...... main() { structstuinf*ptemp,*p[STNUM];inti,j,k,sum=0;
for(i=0;i<=STNUM-1;i++)
{
scanf("%d%d",&stu[i].stid,&stu[i].score);
p[i]=&stu[i]; sum+=stu[i].score;
}
for(i=0;i<=STNUM-2;i++)
{k=i;
for(j=i;j<=STNUM-1;j++)
if(p[k]->score
<p[j]->score)k=j;
if(k!=i)
{
ptemp=p[i];p[i]=p[k];p[k]=ptemp;}
}
for
(i=0;i<=STNUM-1;i++) printf("%d,%d\n",(*p[i]).stid,p[i]->score); printf("averagescore=%d\n",sum/STNUM); }例C6_3003共74頁(yè)第52
頁(yè)結(jié)構(gòu)與函數(shù)的關(guān)系 向函數(shù)中傳遞結(jié)構(gòu)的成員; 在函數(shù)之間傳遞整個(gè)結(jié)構(gòu); 向函數(shù)傳遞結(jié)構(gòu)的地址(指針)。在函數(shù)之間傳遞結(jié)構(gòu)共74頁(yè)第53
頁(yè)向函數(shù)中傳遞結(jié)構(gòu)的成員 在函數(shù)中傳遞結(jié)構(gòu)成員的方法與傳遞簡(jiǎn)單變量的方法相同:在函數(shù)之間傳遞成員的值;在函數(shù)之間傳遞成員的地址。實(shí)例
printf("%d",man.birthday.year);傳遞結(jié)構(gòu)成員的值 scanf("%d",&man.birthday.year);傳遞結(jié)構(gòu)成員的地址 gets();傳遞結(jié)構(gòu)成員的地址在函數(shù)之間傳遞結(jié)構(gòu)共74頁(yè)第54
頁(yè)在函數(shù)之間傳遞整個(gè)結(jié)構(gòu)
將結(jié)構(gòu)作為整體,在函數(shù)之間傳遞:將結(jié)構(gòu)變量作為形參;函數(shù)的返回值為一個(gè)結(jié)構(gòu)類型。在函數(shù)之間傳遞結(jié)構(gòu)共74頁(yè)第55
頁(yè)例C10-12.C:利用結(jié)構(gòu)變量求解兩個(gè)復(fù)數(shù)之積。①(3+4i)×(5+6i)②(10+20i)×(30+40i)structcomplx{intreal,im;/*real:復(fù)數(shù)的實(shí)部im:復(fù)數(shù)的虛部*/};structcomplxcmult(za,zb)/*返回值為結(jié)構(gòu)類型*/
structcomplx
za,zb;/*形參為結(jié)構(gòu)類型*/{ structcomplx
w; w.real=za.real*zb.real-za.im*zb.im; w.im=za.real*zb.im+za.im*zb.real; return(
w); /*返回結(jié)果,為結(jié)構(gòu)*/}在函數(shù)之間傳遞結(jié)構(gòu)共74頁(yè)第56
頁(yè)例C10-12.C:利用結(jié)構(gòu)變量求解兩個(gè)復(fù)數(shù)之積 voidcpr(za,zb,z) /*輸出復(fù)數(shù)za×zb=z*/
structcomplx
za,zb,z; /*形式參數(shù)為結(jié)構(gòu)類型*/ { printf("(%d+%di)*(%d+%di)=",za.real,za.im,zb.real,zb.im); printf("(%d+%di)\n",z.real,z.im); } main() { staticstructcomplx
za={3,4}; staticstructcopmlxzb={5,6}; structcomplxz,x,y; structcomplxcmult();/*說(shuō)明返回值是complx型*/ voidcpr();
z=cmult(za,zb); cpr(za,zb,z); x.real=10;x.im=20;y.real=30;y.im=40; z=cmult(x,y); cpr(x,y,z); }在函數(shù)之間傳遞結(jié)構(gòu)例C6_4202共74頁(yè)第57
頁(yè)向函數(shù)傳遞結(jié)構(gòu)的地址
向函數(shù)中傳遞結(jié)構(gòu)的地址要將函數(shù)的形式參數(shù)定義為指向結(jié)構(gòu)的指針。 在調(diào)用時(shí)要使用結(jié)構(gòu)的地址作為實(shí)際參數(shù)。
structbook{ charname[20];
floatprice;};sortbook(term,pbook,count)structbook
term; /*形參:結(jié)構(gòu)變量term*/structbook
*pbook;/*指向結(jié)構(gòu)數(shù)組首元素的指針pbook*/intcount;在函數(shù)之間傳遞結(jié)構(gòu)共74頁(yè)第58
頁(yè)例C10-14.C:輸入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è)元素與第i個(gè)元素之間。此時(shí)可以將數(shù)組中第i個(gè)元素之后(包括第i個(gè)元素)的所有元素向后移動(dòng)1個(gè)位置,將新元素插入,使它成為第i個(gè)元素。這樣就可以得到已經(jīng)排好序的N+1個(gè)元素。在函數(shù)之間傳遞結(jié)構(gòu)共74頁(yè)第59
頁(yè)例C10-14.C:輸入10本書(shū)的名稱和單價(jià),按照單價(jià)排序。 #defineNUM10
structbook
{ charname[20];
floatprice;
}; main()
{structbook
term,books[NUM]; intcount;
for(count=0;count<NUM;)
{printf("Enterbooknameandprice.book%d=",count+1); scanf("%s%f",,&term.price); sortbook(term,books,count++);/*插入排序*/
}
printf("--------BOOKLIST---------\n"); for
(count=0;count<NUM;count++)
printbook(
&books[count]);/*輸出*/
}在函數(shù)之間傳遞結(jié)構(gòu)共74頁(yè)第60
頁(yè)sortbook(term,pbook,count)
structbook
term; /*形參:結(jié)構(gòu)變量term*/
structbook
*pbook;/*指向結(jié)構(gòu)數(shù)組首元素的指針*/intcount; /*數(shù)組中已存入count個(gè)有序元素*/{inti;
structbook*q,*pend
=pbook;
for(i=0;i<count;i++,pend++);
for(;pbook<pend;pbook++)
if(pbook->price>term.price)break;
for(q=pend-1;q>=pbook;q--) *(q+1)=*q; *pbook=term; /*在pbook處插入新元素term*/}printbook(structbook*pbook){printf("%-20s%6.2f\n",pbook->name,pbook->price);}在函數(shù)之間傳遞結(jié)構(gòu)例C6_4302共74頁(yè)第61
頁(yè)聯(lián)合與結(jié)構(gòu)的異同聯(lián)合與結(jié)構(gòu)都是由多個(gè)成員組成的一個(gè)整體;聯(lián)合與結(jié)構(gòu)在定義、說(shuō)明和使用(成員引用、指針)上十分相似。結(jié)構(gòu):多個(gè)成員分量分別占用不同的存儲(chǔ)空間構(gòu)成一個(gè)整體;成員分量之間是相互獨(dú)立的,所進(jìn)行的各種操作互不影響。聯(lián)合:多個(gè)成員分量共同占用同一存儲(chǔ)空間;成員分量之間是相互聯(lián)系的,所進(jìn)行的操作相互依賴。聯(lián)合共74頁(yè)第62
頁(yè)定義聯(lián)合定義一般形式 union
聯(lián)合類型名
{ 數(shù)據(jù)類型成員名1; 數(shù)據(jù)類型成員名2; …… 數(shù)據(jù)類型成員名n;
}; 其中union為關(guān)鍵字。實(shí)例
union
u_type/*定義聯(lián)合類型u_type*/
{ charch; inti; longli;
}cnvt,*
pcnvt;/*說(shuō)明聯(lián)合類型的變量*/聯(lián)合共74頁(yè)第63
頁(yè)聯(lián)合類型占用內(nèi)存情況
聯(lián)合類型的變量占用內(nèi)存空間的大小等于成員分量中最長(zhǎng)的成員分量所占用內(nèi)存的長(zhǎng)度。
對(duì)于聯(lián)合變量cnvt,在TC編譯環(huán)境下,內(nèi)存占用情況如圖:變量cnvt成員ch成員i成員li聯(lián)合占用4個(gè)字節(jié)共74頁(yè)第64
頁(yè)例C10-16.C:分析以下程序的運(yùn)行結(jié)果。 main() {union{
/*定義聯(lián)合并說(shuō)明聯(lián)合變量mix*/
longi; /*定義long型成員*/
intk; /*定義int型成員*/
charii; /*定義char型成員*/
chars[4];
/*定義char型數(shù)組成員*/
}
mix;
mix.i=0x12345678; /*通過(guò)聯(lián)合中的long型成員i為聯(lián)合賦初值*/ printf("mix.i=%lx\n",mix.i); printf("mix.k=%x\n",mix.k); printf("mix.ii=%x\n",mix.ii); printf("mix.s[0]=%x\tmix.s[1]=%x\n",mix.s[0],
mix.s[1]); printf("mix.s[2]=%x\tmix.s[3]=%x\n",mix.s[2],
mix.s[3]); }聯(lián)合共74頁(yè)第65
頁(yè)mix0x78ii0x780x56k0x780x560x340x12i0x780x560x340x12ss[0]s[1]s[2]s[3]聯(lián)合在內(nèi)存中的數(shù)據(jù)存儲(chǔ)情況:mix.i=0x12345678例C6_5001mix.i
mix.kmix.iimix.s[0]mix.s[1]mix.s[2]mix.s[3]=12345678=5678在VC下為:12345678=78=78=56=34=12地址聯(lián)
溫馨提示
- 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. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 木質(zhì)樂(lè)器制作工藝傳承考核試卷
- 票務(wù)代理行程規(guī)劃與咨詢考核試卷
- 電池制造過(guò)程中的市場(chǎng)趨勢(shì)分析考核試卷
- 木材的天然防腐和抗菌性能考核試卷
- 植物油加工過(guò)程中的副產(chǎn)物利用策略考核試卷
- 電視接收設(shè)備的智能廣告投放系統(tǒng)考核試卷
- 泵的耐高溫材料與涂層技術(shù)考核試卷
- 有機(jī)化學(xué)原料的可持續(xù)采購(gòu)策略考核試卷
- 廈門(mén)城市職業(yè)學(xué)院《醫(yī)學(xué)成像原理與圖像處理》2023-2024學(xué)年第二學(xué)期期末試卷
- 萍鄉(xiāng)衛(wèi)生職業(yè)學(xué)院《文化產(chǎn)業(yè)項(xiàng)目策劃》2023-2024學(xué)年第二學(xué)期期末試卷
- 支票抵押借款協(xié)議
- 2024年個(gè)人之間清賬協(xié)議書(shū)模板
- GB/T 36187-2024冷凍魚(yú)糜
- 人教版四年級(jí)上冊(cè)數(shù)學(xué)【選擇題】專項(xiàng)練習(xí)100題附答案
- 數(shù)字船廠智慧園區(qū)整體解決方案兩份資料
- GB/T 31078-2024低溫倉(cāng)儲(chǔ)作業(yè)規(guī)范
- 湖南省長(zhǎng)沙市雨花區(qū)2023-2024學(xué)年八年級(jí)下學(xué)期期末考試歷史試題(解析版)
- 空天地一體化算力網(wǎng)絡(luò)資源調(diào)度機(jī)制
- 2024年計(jì)算機(jī)二級(jí)MS Office考試題庫(kù)500題(含答案)
- DL∕T 5863-2023 水電工程地下建筑物安全監(jiān)測(cè)技術(shù)規(guī)范
- DL∕T 846.11-2016 高電壓測(cè)試設(shè)備通 用技術(shù)條件 第11部分:特高頻局部放電檢測(cè)儀
評(píng)論
0/150
提交評(píng)論