計算機二級第10講推選優(yōu)秀ppt_第1頁
計算機二級第10講推選優(yōu)秀ppt_第2頁
計算機二級第10講推選優(yōu)秀ppt_第3頁
計算機二級第10講推選優(yōu)秀ppt_第4頁
計算機二級第10講推選優(yōu)秀ppt_第5頁
已閱讀5頁,還剩33頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

計算機二級第10講第一頁,共38頁。10.1結(jié)構(gòu)(jiégòu)類型與結(jié)構(gòu)(jiégòu)變量的定義10.1.1結(jié)構(gòu)類型(lèixíng)定義struct結(jié)構(gòu)類型(lèixíng)名 /*struct是結(jié)構(gòu)類型(lèixíng)關(guān)鍵字*/

{數(shù)據(jù)類型(lèixíng)數(shù)據(jù)項1;

數(shù)據(jù)類型(lèixíng)數(shù)據(jù)項2;

…………

數(shù)據(jù)類型(lèixíng)數(shù)據(jù)項n;

}; /*此行分號不能少!*/

[案例10.1]定義一個反映學生基本情況的結(jié)構(gòu)類型(lèixíng),用以存儲學生的相關(guān)信息。

/*案例代碼文件名:。*/

/*功能:定義一個反映學生基本情況的結(jié)構(gòu)類型(lèixíng)*/

第二頁,共38頁。structdate /*日期結(jié)構(gòu)類型:由年、月、日三項組成*/{intyear;intmonth;intday;};structstd_info /*學生信息結(jié)構(gòu)類型:由學號、姓名、性別和生日(shēngri)共4項組成*/{charno[7];charname[9];charsex[3];structdatebirthday;};structscore /*成績結(jié)構(gòu)類型:由學號和三門成績共4項組成*/{charno[7];intscore1;intscore2;intscore3;};第三頁,共38頁。(1)“結(jié)構(gòu)類型名”和“數(shù)據(jù)項”的命名規(guī)則,與變量名相同(xiānɡtónɡ)。(2)數(shù)據(jù)類型相同(xiānɡtónɡ)的數(shù)據(jù)項,既可逐個、逐行分別定義,也可合并成一行定義。例如,本案例代碼中的日期結(jié)構(gòu)類型,也可改為如下形式:structdate{intyear,month,day;};(3)結(jié)構(gòu)類型中的數(shù)據(jù)項,既可以是基本數(shù)據(jù)類型,也允許是另一個已經(jīng)定義的結(jié)構(gòu)類型。例如,本案例代碼中的結(jié)構(gòu)類型std_info,其數(shù)據(jù)項“birthday”就是一個已經(jīng)定義的日期結(jié)構(gòu)類型date。(4)本書將1個數(shù)據(jù)項稱為結(jié)構(gòu)類型的1個成員(或分量)。第四頁,共38頁。10.1.2結(jié)構(gòu)(jiégòu)變量定義用戶自己定義的結(jié)構(gòu)(jiégòu)類型,與系統(tǒng)定義的標準類型(int、char等)一樣,可用來定義結(jié)構(gòu)(jiégòu)變量的類型。1.定義結(jié)構(gòu)(jiégòu)變量的方法,可概括為兩種:(1)間接定義法──先定義結(jié)構(gòu)(jiégòu)類型、再定義結(jié)構(gòu)(jiégòu)變量例如,利用[案例10.1]中定義的學生信息結(jié)構(gòu)(jiégòu)類型std_info,定義了一個相應(yīng)的結(jié)構(gòu)(jiégòu)變量student:structstd_infostudent;結(jié)構(gòu)(jiégòu)變量student:擁有結(jié)構(gòu)(jiégòu)類型的全部成員,其中birthday成員是一個日期結(jié)構(gòu)(jiégòu)類型,它又由3個成員構(gòu)成。注意:使用間接定義法定義結(jié)構(gòu)(jiégòu)變量時,必須同時指定結(jié)構(gòu)(jiégòu)類型名。第五頁,共38頁。(2)直接定義法──在定義結(jié)構(gòu)類型的同時,定義結(jié)構(gòu)變量例如,結(jié)構(gòu)變量student的定義可以改為如下形式:structstd_info{……}student;同時定義結(jié)構(gòu)類型及其結(jié)構(gòu)變量的一般格式如下:struct[結(jié)構(gòu)類型名]{……}結(jié)構(gòu)變量表;2.說明(shuōmíng)(1)結(jié)構(gòu)類型與結(jié)構(gòu)變量是兩個不同的概念,其區(qū)別如同int類型與int型變量的區(qū)別一樣。(2)結(jié)構(gòu)類型中的成員名,可以與程序中的變量同名,它們代表不同的對象,互不干擾。[Return]第六頁,共38頁。10.2結(jié)構(gòu)變量(biànliàng)的引用與初始化[案例10.2]利用[案例10.1]中定義的結(jié)構(gòu)類型structstd_info,定義一個結(jié)構(gòu)變量student,用于存儲和顯示(xiǎnshì)一個學生的基本情況。#include<stdio.h>

#include"struct.h"

/*定義并初始化一個外部結(jié)構(gòu)變量student*/

structstd_infostudent={"000102","張三","男",{1980,9,20}};

main()

{printf("No:%s\n",);

printf("Name:%s\n",);

printf("Sex:%s\n",);

printf("Birthday:%d-%d-%d\n",,student.birthday.month,student.birthday.day);}

第七頁,共38頁。程序運行結(jié)果:No:000102Name:張三Sex:男Birthday:1980-9-20

1.結(jié)構(gòu)變量的引用規(guī)則對于結(jié)構(gòu)變量,要通過成員(chéngyuán)運算符“.”,逐個訪問其成員(chéngyuán),且訪問的格式為:結(jié)構(gòu)變量.成員(chéngyuán) /*其中的“.”是成員(chéngyuán)運算符*/例如,案例中的,引用結(jié)構(gòu)變量student中的no成員(chéngyuán);引用結(jié)構(gòu)變量student中的name成員(chéngyuán),等等。第八頁,共38頁。如果某成員本身又是一個結(jié)構(gòu)類型,則只能通過多級的分量運算(yùnsuàn),對最低一級的成員進行引用。此時的引用格式擴展為:結(jié)構(gòu)變量.成員.子成員.….最低1級子成員例如,引用結(jié)構(gòu)變量student中的birthday成員的格式分別為:(1)對最低一級成員,可像同類型的普通變量一樣,進行相應(yīng)的各種運算(yùnsuàn)。(2)既可引用結(jié)構(gòu)變量成員的地址,也可引用結(jié)構(gòu)變量的地址。例如,&,&student。第九頁,共38頁。2.結(jié)構(gòu)變量的初始化結(jié)構(gòu)變量初始化的格式,與一維數(shù)組相似:結(jié)構(gòu)變量={初值表}不同的是:如果(rúguǒ)某成員本身又是結(jié)構(gòu)類型,則該成員的初值為一個初值表。例如,[案例10.2]中的structstd_infostudent={"000102","張三","男",{1980,9,20}};注意:初值的數(shù)據(jù)類型,應(yīng)與結(jié)構(gòu)變量中相應(yīng)成員所要求的一致,否則會出錯。[Return]第十頁,共38頁。10.3結(jié)構(gòu)(jiégòu)數(shù)組結(jié)構(gòu)數(shù)組的每一個元素,都是結(jié)構(gòu)類型數(shù)據(jù),均包含結(jié)構(gòu)類型的所有成員。[案例10.3]利用(lìyòng)[案例10.1]中定義的結(jié)構(gòu)類型structstd_info,定義一個結(jié)構(gòu)數(shù)組student,用于存儲和顯示三個學生的基本情況。/*案例代碼文件名:AL10_3.C*/

#include<stdio.h>#include"struct.h"

/*定義并初始化一個外部結(jié)構(gòu)數(shù)組student[3]*/

structstd_infostudent[3]={{“000102”,“張三”,“男”,{1980,9,20}},

{“000105”,“李四”,“男”,{1980,8,15}},

{“000112”,“王五”,“女”,{1980,3,10}}};

第十一頁,共38頁。/*主函數(shù)main()*/main(){inti;/*打印(dǎyìn)表頭:"□"表示1個空格字符*/printf("No.□□□□Name□□□□□Sex□Birthday\n"); /*輸出三個學生的基本情況*/for(i=0;i<3;i++){printf("%-7s",student[i].no);printf("%-9s",student[i].name);printf("%-4s",student[i].sex);printf("%d-%d-%d\n",,student[i].birthday.month,student[i].birthday.day);}} [程序演示]第十二頁,共38頁。程序運行結(jié)果:No.NameSexBirthday000102張三男1980-9-20000105李四男1980-8-15000112王五女1980-3-10與結(jié)構(gòu)變量的定義相似,結(jié)構(gòu)數(shù)組的定義也分直接定義和間接定義兩種方法,只需說明為數(shù)組即可。與普通數(shù)組一樣,結(jié)構(gòu)數(shù)組也可在定義時進行初始化。初始化的格式為:結(jié)構(gòu)數(shù)組[n]={{初值表1},{初值表2},...,{初值表n}}例如(lìrú),本案例中的結(jié)構(gòu)數(shù)組student[3]。[Return]第十三頁,共38頁。A)10,1B)20,1C)10,2D)20,2#include"score3;1、有以下(yǐxià)程序段printf("\n");3]利用(lìyòng)[案例10.A)1001,ZhangDa,1098.(3)在定義體最前面加上typedef:(2)直接定義法──在定義結(jié)構(gòu)類型的同時,定義結(jié)構(gòu)變量第二十一頁,共38頁。for(i=0;i<p->n-1;i++)10.4指向(zhǐxiànɡ)結(jié)構(gòu)類型數(shù)據(jù)的指針結(jié)構(gòu)變量在內(nèi)存中的起始地址(dìzhǐ)稱為結(jié)構(gòu)變量的指針。10.4.1指向結(jié)構(gòu)變量的指針

[案例10.4]使用指向結(jié)構(gòu)變量的指針來訪問結(jié)構(gòu)變量的各個成員。

/*案例代碼文件名:AL10_4.C*/

#include“struct.h”

structstd_infostudent={“000102”,“張三”,“男”,{1980,9,20}};

main(){structstd_info*p_std=&student;printf("No:%s\n",p_std->no);printf("Name:%s\n",p_std->name);printf("Sex:%s\n",p_std->sex);printf("Birthday:%d-%d-%d\n",,p_std->birthday.month,p_std->birthday.day);} 第十四頁,共38頁。通過(tōngguò)指向結(jié)構(gòu)變量的指針來訪問結(jié)構(gòu)變量的成員,與直接使用結(jié)構(gòu)變量的效果一樣。一般地說,如果指針變量pointer已指向結(jié)構(gòu)變量var,則以下三種形式等價:(1)var.成員(2)pointer->成員(3)(*pointer).成員/*“*pointer”外面的括號不能??!*/注意:在格式(1)中,分量運算符左側(cè)的運算對象,只能是結(jié)構(gòu)變量,;而在格式(2)中,指向運算符左側(cè)的運算對象,只能是指向結(jié)構(gòu)變量(或結(jié)構(gòu)數(shù)組)的指針變量,否則都出錯。思考題:如果要求從鍵盤上輸入結(jié)構(gòu)變量student的各成員數(shù)據(jù),如何修改程序?第十五頁,共38頁。10.4.2指向結(jié)構(gòu)數(shù)組的指針[案例10.5]使用指向結(jié)構(gòu)數(shù)組的指針來訪問結(jié)構(gòu)數(shù)組。/*案例代碼文件名:AL10_5.C*/#include"struct.h"/*定義(dìngyì)并初始化一個外部結(jié)構(gòu)數(shù)組student*/structstd_infostudent[3]={{"000102","張三","男",{1980,5,20}},{"000105","李四","男",{1980,8,15}},{“000112”,“王五”,“女”,{1980,3,10}}};main(){structstd_info*p_std=student; inti=0;/*打印表頭*/printf("No.□□□□Name□□□□□Sex□Birthday\n");第十六頁,共38頁。/*輸出結(jié)構(gòu)數(shù)組內(nèi)容*/for(;i<3;i++,p_std++){printf("%-7s%-9s%-4s",p_std->no,p_std->name,p_std->sex);printf("%4d-%2d-%2d\n",p_std->birthday.year,p_std->birthday.month,p_std->birthday.day);}} [程序演示]如果指針變量p已指向某結(jié)構(gòu)數(shù)組,則p+1指向結(jié)構(gòu)數(shù)組的下一個元素,而不是當前(dāngqián)元素的下一個成員。另外,如果指針變量p已經(jīng)指向一個結(jié)構(gòu)變量(或結(jié)構(gòu)數(shù)組),就不能再使之指向結(jié)構(gòu)變量(或結(jié)構(gòu)數(shù)組元素)的某一成員。第十七頁,共38頁。10.4.3指向結(jié)構(gòu)數(shù)據(jù)的指針作函數(shù)參數(shù)[案例10.6]用函數(shù)調(diào)用方式,改寫[案例10.5]:編寫一個專門的顯示函數(shù)display(),通過主函數(shù)調(diào)用來實現(xiàn)顯示。/*案例代碼文件名:AL10_6.C*/#include"struct.h"/*定義并初始化一個外部結(jié)構(gòu)數(shù)組student*/structstd_infostudent[3]={{"000102","張三","男",{1980,5,20}},{"000105","李四","男",{1980,8,15}},{“000112”,“王五”,“女”,{1980,3,10}}};/*主函數(shù)main()*/main(){voiddisplay(); /*函數(shù)說明(shuōmíng)*/inti=0;/*打印表頭*/printf("No.□□□□Name□□□□□Sex□Birthday\n");第十八頁,共38頁。/*打印內(nèi)容(nèiróng)*/for(;i<3;i++){display(student+i); printf("\n");}}voiddisplay(structstd_info*p_std){printf("%-7s%-9s%-4s",p_std->no,p_std->name,p_std->sex);printf("%4d-%2d-%2d\n",p_std->birthday.year,p_std->birthday.month,p_std->birthday.day);} [程序演示][Return]第十九頁,共38頁。10.5共用(ɡònɡyònɡ)型簡介10.5.1共用型

1.概念

使幾個不同的變量占用(zhànyònɡ)同一段內(nèi)存空間的結(jié)構(gòu)稱為共用型。

2.共用類型的定義──與結(jié)構(gòu)類型的定義類似

union共用類型名

{成員列表;};

3.共用變量的定義──與結(jié)構(gòu)變量的定義類似(1)間接定義──先定義類型、再定義變量例如,定義data共用類型變量un1,un2,un3的語句如下:uniondataun1,un2,un3;第二十頁,共38頁。(2)直接定義──定義類型的同時定義變量例如,union[data]{inti;charch;floatf;}un1,un2,un3;共用變量占用的內(nèi)存空間,等于最長成員的長度,而不是各成員長度之和。例如,共用變量un1、un2和un3,在16位操作系統(tǒng)中,占用的內(nèi)存空間均為4字節(jié)(不是2+1+4=7字節(jié))。4.共用變量的引用──與結(jié)構(gòu)變量一樣,也只能逐個引用共用變量的成員例如,訪問(fǎngwèn)共用變量un1各成員的格式為:、、。[案例10.9]共用(ɡònɡyònɡ)體變量的引用(AL10_9.C)第二十一頁,共38頁。5.特點(1)系統(tǒng)采用覆蓋技術(shù),實現(xiàn)共用變量各成員的內(nèi)存共享,所以在某一時刻,存放的和起作用的是最后一次存入的成員值。例如,執(zhí)行后,才是有效的成員。(2)由于所有成員共享同一內(nèi)存空間,故共用變量與其各成員的地址相同。例如,&un1=&=&=&。(3)不能對共用變量進行初始化(注意:結(jié)構(gòu)變量可以);也不能將共用變量作為(zuòwéi)函數(shù)參數(shù),以及使函數(shù)返回一個共用數(shù)據(jù),但可以使用指向共用變量的指針。(4)共用類型可以出現(xiàn)在結(jié)構(gòu)類型定義中,反之亦然。第二十二頁,共38頁。10.6定義已有類型(lèixíng)的別名除可直接使用C提供的標準類型和自定義的類型(結(jié)構(gòu)、共用、枚舉)外,也可使用typedef定義已有類型的別名。該別名與標準類型名一樣,可用來定義相應(yīng)的變量。

定義已有類型別名的方法如下(rúxià):

(1)按定義變量的方法,寫出定義體;

(2)將變量名換成別名;

(3)在定義體最前面加上typedef。

[案例10.10]給實型float定義1個別名REAL。

(1)按定義實型變量的方法,寫出定義體:floatf;

(2)將變量名換成別名:floatREAL;

(3)在定義體最前面加上typedef:typedeffloatREAL;第二十三頁,共38頁。[案例10.10]給如下所示的結(jié)構(gòu)類型structdate定義1個別名DATE。structdate{intyear,month,day;};(1)按定義結(jié)構(gòu)變量的方法,寫出定義體:structdate{……}d;(2)將變量名換成別名:structdate{……}DATE;(3)在定義體最前面加上typedef:typedefstructdate{……}DATE;說明:(1)用typedef只是給已有類型增加1個別名,并不能創(chuàng)造1個新的類型。就如同人一樣,除學名外,可以再取一個小名(或雅號),但并不能創(chuàng)造出另一個人來。(2)typedef與#define有相似之處,但二者是不同的:前者是由編譯器在編譯時處理的;后者是由編譯預(yù)處理器在編譯預(yù)處理時處理的,而且(érqiě)只能作簡單的字符串替換。第二十四頁,共38頁。for(i=0;i<n-1;i++)a[i]+=i;A)Qian,f,95,92B)變量(biànliàng)demo中各成員的地址相同{display(student+i);month,p_std->birthday.程序運行后的輸出(shūchū)結(jié)果是()}2]利用[案例10.for(i=0;i<2;i++)/*輸出結(jié)構(gòu)數(shù)組內(nèi)容*/voidf(int*a,intn)typedefstructdate{……}DATE;(2)數(shù)據(jù)類型相同(xiānɡtónɡ)的數(shù)據(jù)項,既可逐個、逐行分別定義,也可合并成一行定義。以下敘述正確的是()6]用函數(shù)調(diào)用方式,改寫[案例10.structstd_infostudent;2007年4月1、有以下程序typedefstruct{intb,p;}A;voidf(Ac)/*注意:c是結(jié)構(gòu)變量名*/{intj;c.b+=1;c.p+=2;}main(){inti;Aa={1,2};f(a);printf(“%d,%d\n”,a.b,a.p);}程序運行后的輸出(shūchū)結(jié)果是()A)2,3B)2,4C)1,4D)1,2第二十五頁,共38頁。2007年4月2、有以下程序(chéngxù)structS{intn;inta[20];};voidf(structS*p){inti,j,t;for(i=0;i<p->n-1;i++)for(j=i+1;j<p->n;j++)if(p->a[i]>p->a[j]){t=p->a[i];p->a[i]=p->a[j];p->a[j]=t;}}main(){inti;structSs={10,{2,3,1,6,8,7,5,4,10,9}};f(&s);for(i=0;i<s.n;i++)printf(“%d”,s.a[i]);}程序(chéngxù)運行后的輸出結(jié)果是()A)1,2,3,4,5,6,7,8,9,10,B)10,9,8,7,6,5,4,3,2,1,C)2,3,1,6,8,7,5,4,10,9,D)10,9,8,7,6,1,2,3,4,5,第二十六頁,共38頁。2007年4月3、有以下(yǐxià)程序structS{intn;inta[20];};voidf(int*a,intn){inti;for(i=0;i<n-1;i++)a[i]+=i;}main(){inti;structSs={10,{2,3,1,6,8,7,5,4,10,9}};f(s.a,s.n);for(i=0;i<s.n;i++)printf(“%d”,s.a[i]);}程序運行后的輸出結(jié)果是()A)2,4,3,9,12,12,11,11,18,9,B)3,4,2,7,9,8,6,5,11,10,C)2,3,1,6,8,7,5,4,10,9,D)1,2,3,6,8,7,5,4,10,9,第二十七頁,共38頁。2007年4月4、有以下程序段typedefstructnode{intdata;structnode*next;}*NODE;NODEp;以下敘述正確的是()A)p是指向structnode結(jié)構(gòu)變量(biànliàng)的指針的指針B)NODEp;語句出錯C)p是指向structnode結(jié)構(gòu)變量(biànliàng)的指針D)p是structnode結(jié)構(gòu)變量(biànliàng)第二十八頁,共38頁。2007年4月5、設(shè)有說明structDATE{intyear;intmonth;intday;};請寫出一條(yītiáo)定義語句,該語句定義d為上述結(jié)構(gòu)體變量,并同時為其成員year、month、day依次賦初值2006、10、1:_______________structDATEd={2006,10,1};第二十九頁,共38頁。2007年9月1、以下關(guān)于typedef的敘述錯誤的是:A)用typedef可以增加新類型B)typedef只是將已存在的類型用一個新的名字來代表C)用typedef可以為各種類型說明一個新名,但不能用來為變量(biànliàng)說明一個新名D)用typedef為類型說明一個新名,通常可以增加程序的可讀性2、設(shè)有以下定義:uniondata{intd1;floatd2;}demo;則下列敘述中錯誤的是:A)變量(biànliàng)demo與成員d2所占的內(nèi)存字節(jié)數(shù)相同B)變量(biànliàng)demo中各成員的地址相同C)變量(biànliàng)demo和各成員的地址相同D)若給賦99后,中的值是第三十頁,共38頁。年4月1、有以下(yǐxià)程序段#include<stdio.h>#include<string.h>typedefstruct{charname[9];charsex;floatscore[2];}STU;voidf(STUa){STUb={“Zhao”,’m’,85.0,90.0};inti;strcpy(,);a.sex=b.sex;for(i=0;i<2;i++) a.score[i]=b.score[i];}main(){STUc={“Qian”,’f’,95.0,92.0};f(c);printf(“%s,%c,%2.0f,%2.0f\n”,,c.sex,c.score[0],c.score[1]);}第三十一頁,共38頁。年4月程序的運行(yùnxíng)結(jié)果是A)Qian,f,95,92B)Qian,m,85,90C)Zhao,f,95,92D)Zhao,m,85,90第三十二頁,共38頁。年9月1.有以下程序(chéngxù)#include<stdio.h>structst{intx,y;}data[2]={l,10,2,20};main(){structst*p=data;printf("%d,",p->y);printf("%d\n",(++p)->x);}程序(chéngxù)的運行結(jié)果是()。A)10,1B)20,1C)10,2D)20,2第三十三頁,共38頁。年9月2.有以下(yǐxià)程序#include<stdio.h>main(){structSTU{charname[9];charsex;doubles

溫馨提示

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

評論

0/150

提交評論