程序設(shè)計(jì)語(yǔ)言與編譯原理-第二章數(shù)據(jù)類型課件_第1頁(yè)
程序設(shè)計(jì)語(yǔ)言與編譯原理-第二章數(shù)據(jù)類型課件_第2頁(yè)
程序設(shè)計(jì)語(yǔ)言與編譯原理-第二章數(shù)據(jù)類型課件_第3頁(yè)
程序設(shè)計(jì)語(yǔ)言與編譯原理-第二章數(shù)據(jù)類型課件_第4頁(yè)
程序設(shè)計(jì)語(yǔ)言與編譯原理-第二章數(shù)據(jù)類型課件_第5頁(yè)
已閱讀5頁(yè),還剩77頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第二章數(shù)據(jù)類型數(shù)據(jù)類型實(shí)質(zhì)上是對(duì)存儲(chǔ)器中所存儲(chǔ)的數(shù)據(jù)進(jìn)行的抽象。它包含了一組值的集合和一組操作。1第二章數(shù)據(jù)類型數(shù)據(jù)類型實(shí)質(zhì)上是對(duì)存儲(chǔ)器中所存儲(chǔ)的數(shù)據(jù)進(jìn)行本章內(nèi)容1、將類型作為數(shù)據(jù)結(jié)構(gòu)的抽象表示可以分為三個(gè)層次的抽象,即

內(nèi)部類型、用戶定義類型和抽象數(shù)據(jù)類型2、數(shù)據(jù)類型與編譯有關(guān)的幾個(gè)問(wèn)題3、類型的實(shí)現(xiàn)模型2本章內(nèi)容1、將類型作為數(shù)據(jù)結(jié)構(gòu)的抽象表示22.1引言1.數(shù)據(jù)類型的作用實(shí)現(xiàn)了數(shù)據(jù)抽象從機(jī)器的具體特征中解脫出來(lái)提高了編程效率32.1引言1.數(shù)據(jù)類型的作用3語(yǔ)言的某種特定的數(shù)據(jù)抽象受到兩個(gè)因素的影響:語(yǔ)言所面向的機(jī)器(只提供定點(diǎn)運(yùn)算或同時(shí)提供浮點(diǎn)運(yùn)算);語(yǔ)言所面向的應(yīng)用領(lǐng)域。4語(yǔ)言的某種特定的數(shù)據(jù)抽象受到兩個(gè)因素的影響:42.數(shù)據(jù)類型的分類內(nèi)部類型自定義類型52.數(shù)據(jù)類型的分類5語(yǔ)言根據(jù)所面向的機(jī)器和應(yīng)用定義了不同的數(shù)據(jù)類型,這些類型稱為內(nèi)部類型(語(yǔ)言定義類型

)。自Pascal語(yǔ)言開(kāi)始,語(yǔ)言提供了由用戶定義類型的方法。采用這類方法由用戶自己定義的數(shù)據(jù)類型稱為用戶定義類型(自定義類型)。6語(yǔ)言根據(jù)所面向的機(jī)器和應(yīng)用定義了不同的數(shù)據(jù)類型,這些類

第二節(jié)內(nèi)部類型一.內(nèi)部類型的特點(diǎn)內(nèi)部類型反映基本硬件特性在語(yǔ)言級(jí),內(nèi)部類型是共用某些操作的數(shù)據(jù)對(duì)象的抽象表示7第二節(jié)內(nèi)部類型一.內(nèi)部類型的特點(diǎn)7

二.內(nèi)部類型的優(yōu)越性1.基本表示的不可見(jiàn)性基本位串對(duì)程序員是不可見(jiàn)的。優(yōu)點(diǎn):導(dǎo)致不同的程序設(shè)計(jì)風(fēng)格可寫性可讀性可修改性例:25+9=34

基本表示00011001+00001001

結(jié)果001000108二.內(nèi)部類型的優(yōu)越性1.基本表示的不可見(jiàn)性例:25+9=

進(jìn)行靜態(tài)類型檢查,如非法運(yùn)算,形實(shí)參類型匹配(某些動(dòng)態(tài)特性不一定能查出,如i/j中j=0)2.編譯時(shí)能檢查變量使用的正確性3.編譯時(shí)可以確定無(wú)二義的操作超載(多態(tài))的概念:運(yùn)算符的意義依賴于操作數(shù)的類型。如“+”可以表示整數(shù)加或?qū)崝?shù)加編譯時(shí),可拒絕混合運(yùn)算,或提供類型轉(zhuǎn)換指令合理地使用超載,可以提高語(yǔ)言的可讀性和可用性9進(jìn)行靜態(tài)類型檢查,如非法運(yùn)算,形實(shí)參類型匹配2.編譯時(shí)能檢

4.精度控制

可以通過(guò)數(shù)據(jù)類型顯式定義數(shù)據(jù)的精度精度說(shuō)明有利于空間優(yōu)化精度說(shuō)明可作為檢查的一種手段精度說(shuō)明有利于程序的修改104.精度控制精度說(shuō)明有利于空間優(yōu)化10

第三節(jié)用戶定義類型許多語(yǔ)言除了定義內(nèi)部類型外,還允許程序員定義新的數(shù)據(jù)類型,規(guī)定基本數(shù)據(jù)對(duì)象的聚合,乃至聚合的聚合。Howtodefine?11第三節(jié)用戶定義類型許多語(yǔ)言除了定義內(nèi)部類型外,還

1.笛卡爾積定義:N個(gè)集合A1,A2,…,An的笛卡爾積表示為A1

A2

An,它是一個(gè)集合,其元素為(a1,a2,…,an),其中ai

Ai在語(yǔ)言中對(duì)應(yīng)什么構(gòu)造?121.笛卡爾積定義:N個(gè)集合A1,A2,…,An的笛卡爾積

任意正多邊形integer

real表示為邊數(shù)每邊邊長(zhǎng)在COBOL和PASCAL中稱為記錄;在ALGOL中稱為結(jié)構(gòu)。

注意:語(yǔ)言把笛卡爾積數(shù)據(jù)對(duì)象看成由若干個(gè)域組成,每個(gè)域有一個(gè)唯一的名字;通常用域名來(lái)選取域,對(duì)它進(jìn)行修改;例:對(duì)于如前定義的多邊形,有兩個(gè)域no-of-edges和edge-size,Structpolygon{intno-of-edges;doubleedge-size}t1;若t1是一個(gè)邊長(zhǎng)為7.53的等邊三角形(3,3.75),則可以寫為:t1.no-of-edges=3;t1.edge-size=3.75;13任意正多邊形integerreal表示為邊數(shù)每邊邊長(zhǎng)

2.有限映像(射)定義:從定義域類型DT(domaintype)的值的有限集合,到值域類型RT(rangetype)的值的有限集合的函數(shù)稱為有限映像(射)。在語(yǔ)言中對(duì)應(yīng)什么構(gòu)造?142.有限映像(射)定義:從定義域類型DT(domain

有限映像(射)的一些特點(diǎn)在高級(jí)語(yǔ)言中通常體現(xiàn)為數(shù)組構(gòu)造;值域?qū)ο笸ㄟ^(guò)下標(biāo)選取下標(biāo)越界會(huì)出錯(cuò),動(dòng)態(tài)檢查下標(biāo)可用來(lái)選取值域的多個(gè)元素(如數(shù)組的分割、切片)SNOBOL4的ARRAY構(gòu)造符并不要求值域集的所有元素是同一類型的

例如:Chararray[50]可看成是從0到49的整數(shù)到字符集的有限映像15有限映像(射)的一些特點(diǎn)在高級(jí)語(yǔ)言中通常體現(xiàn)為數(shù)組構(gòu)造;

有限映像(射)的一些特點(diǎn)

DT到相應(yīng)值的特定子集的綁定策略:

.編譯時(shí)綁定(靜態(tài)數(shù)組).對(duì)象建立時(shí)綁定(執(zhí)行到分程序時(shí),

動(dòng)態(tài)數(shù)組).對(duì)象處理時(shí)綁定(對(duì)APL,子集范圍可變)16有限映像(射)的一些特點(diǎn)DT到相應(yīng)值的特定子集的綁定策略

3.序列定義:序列由任意多個(gè)數(shù)據(jù)項(xiàng)組成,這些數(shù)據(jù)項(xiàng)稱為該序列的成分,且類型相同(記為CT)。串的一般操作有4種:連接首項(xiàng)選取尾項(xiàng)選取子串例:串是從所周知的序列,其成分類型為字符;順序文件的思路也來(lái)自序列的概念173.序列定義:序列由任意多個(gè)數(shù)據(jù)項(xiàng)組成,這些數(shù)據(jù)項(xiàng)稱為該序

4.遞歸定義:若數(shù)據(jù)類型T包含屬于同一類型T的成份,那么類型T稱為遞歸類型。遞歸類型的特點(diǎn):允許在類型定義中使用被定義類型的名字指針是建立遞歸數(shù)據(jù)對(duì)象的重要手段例:二叉樹(shù)可通過(guò)遞歸類型來(lái)定義。它的左子樹(shù)和右子樹(shù)分別是另一棵二叉樹(shù)。184.遞歸定義:若數(shù)據(jù)類型T包含屬于同一類型T的成份,那么類

5.判定或定義:判定或是一個(gè)選擇對(duì)象結(jié)構(gòu)的構(gòu)造機(jī)制,規(guī)定在兩個(gè)不同選擇對(duì)象之間作出適當(dāng)?shù)倪x擇;每一選擇對(duì)象結(jié)構(gòu)稱為變體。例如:PASCAL和ADA中的變體記錄;C和ALGOL68中的聯(lián)合。195.判定或定義:判定或是一個(gè)選擇對(duì)象結(jié)構(gòu)的構(gòu)造機(jī)制,規(guī)定在結(jié)構(gòu)、共用體舉例namenumtypeScore

situationchen0000012teacherHardworkingZhang2000112student90,88,99,89

20結(jié)構(gòu)、共用體舉例namenumtypeScorechen00結(jié)構(gòu)、共用體舉例Struct{ charname[10]; Intnum; Chartype[8]; Union { floatscore[10]; Charsituation[40]; }state;}person[2];21結(jié)構(gòu)、共用體舉例Struct21

定義:類型T的元素所有子集的集合,稱為冪集,記為Powerset(T),T稱為基類型。冪集類型的操作:

由于具有該類型的變量的值是一個(gè)子集,因此它們的基本操作是集合的操作,比如:聯(lián)合、與、以及測(cè)試某個(gè)元素是否在一個(gè)集合中等。6.冪集22定義:類型T的元素所有子集的集合,稱為冪集,記為Power

小結(jié)1.程序語(yǔ)言允許程序員以上六種機(jī)制來(lái)定義復(fù)雜的數(shù)據(jù)對(duì)象(新的類型);2.新的類型可以通過(guò)非顯式的方式說(shuō)明;3.也可通過(guò)顯式的方式說(shuō)明;4.顯示定義有如下優(yōu)點(diǎn):可讀性(選擇名字)可修改性(不修改變量說(shuō)明)可分性(重復(fù)使用)一致性檢查例如:struct{double:radius;doubleangle;}complexc1,c2,c3;例如:structcomplex{double:radius;doubleangle;}complexc1,c2,c3;23structstudent{charname[48];intage;…};小結(jié)1.程序語(yǔ)言允許程序員以上六種機(jī)制來(lái)定義復(fù)雜的數(shù)據(jù)對(duì)象可分性可分性概念用得比較普遍,C語(yǔ)言的函數(shù)就使用了可分性。把程序中相同的代碼“分離”出來(lái),用一個(gè)名字來(lái)標(biāo)識(shí),待使用這段代碼時(shí),通過(guò)該名字調(diào)用該段代碼即可。可分性可分性概念用得比較普遍,C語(yǔ)言的函數(shù)就使用了可分性

內(nèi)容回顧2.數(shù)據(jù)類型1.編譯時(shí)-源程序2.運(yùn)行時(shí)-代碼段+活動(dòng)記錄3.活動(dòng)記錄4.別名、副作用1.程序單元1.值的集合+操作的集合2.六種數(shù)據(jù)類型聚合方式笛卡爾積有限映射序列遞歸冪集判定或記錄、結(jié)構(gòu)數(shù)組字符串、順序文件二叉樹(shù)聯(lián)合、變體記錄集合25內(nèi)容回顧2.數(shù)據(jù)類型1.編譯時(shí)-源程序2.運(yùn)行時(shí)-代碼段+

第四節(jié)PASCAL語(yǔ)言數(shù)據(jù)類型結(jié)構(gòu)1.非結(jié)構(gòu)類型內(nèi)部類型integer,real,boolean,char有序類型每一元素都有唯一的前驅(qū)和后繼如:整型,布爾型,字符型定義新的有序類型的方法枚舉型其值不能直接讀/寫子界型動(dòng)態(tài)檢查范圍例:typeday=(sunday,monday,tuseday,wednesday,thursday,friday,saturday);//枚舉typework_day=monday..friday;//子界varclass_day:work_day;class_day:=succ(class_day); //后繼……26第四節(jié)PASCAL語(yǔ)言數(shù)據(jù)類型結(jié)構(gòu)1.非結(jié)構(gòu)類型例:26

2.聚合構(gòu)造數(shù)組構(gòu)造構(gòu)造符ARRAY允許程序員定義有限映像;數(shù)組構(gòu)造的一般形式為:

array[t1]of[t2]元素(值域)的類型;下標(biāo)(定義域)的類型;

注意:PASCAL把下標(biāo)類型不同的數(shù)組看成不同的類型typea1=array[1..50]ofinteger;typea2=array[1..70]ofinteger;=?

272.聚合構(gòu)造數(shù)組構(gòu)造元素(值域)的類型;下標(biāo)(定義域)的類

!這樣定義的數(shù)組類型會(huì)產(chǎn)生嚴(yán)重問(wèn)題,使得形式參數(shù)定義的數(shù)組和實(shí)際參數(shù)的數(shù)組類型不一致;解決辦法:引入符合數(shù)組概念--維數(shù)相同,成分類型相同的數(shù)組;符合數(shù)組可以形、實(shí)參數(shù)匹配。例:proceduresort(vara:array[low..high:integer]ofctype);vari:integer;more:boolean;begin{sort}……end{sort}28!這樣定義的數(shù)組類型會(huì)產(chǎn)生嚴(yán)重問(wèn)題,使得形式參數(shù)定義的數(shù)

2)記錄構(gòu)造構(gòu)造符RECORD用以定義笛卡爾積,一般形式為:Recordfield_1:type_1;field_2:type_2;… field_n:type_n;end記錄可以整體訪問(wèn),也可用圓點(diǎn)“.”作為選擇符訪問(wèn)單個(gè)的域;假設(shè)t,p是前面定義的多邊形,t.no_of_edges:=3;t.edge_size:=7.53;p:=t;292)記錄構(gòu)造記錄可以整體訪問(wèn),也可用圓點(diǎn)“.”作為選擇符訪

PASCAL的變體記錄typedept=(house,sports,drugs,food,liquor);month=1..12;item=recordprice:real;caseavailable:booleanoftrue:(amount:integer;where:dept);false:(month_expected:month)end;變體記錄item標(biāo)識(shí)符域available,記錄的判定成分

注意:PASCAL允許程序員訪問(wèn)記錄結(jié)構(gòu)的所有域,包括標(biāo)識(shí)符域。例如,如果i1和i2被說(shuō)明,則可對(duì)它們進(jìn)行如下操作:vari1,i2:item:……i1.price:=5.24;i1.available:=true;i1.amount:=29;i1.where:=liquor;i2.price:=324.99;i2.available:=false;i2.month_expect:=8;30PASCAL的變體記錄typedept=(house,s

程序的執(zhí)行結(jié)果priceavailableamountwhere5.24true29liquori1priceavailablemonth_expected324.99false8i231程序的執(zhí)行結(jié)果priceavailableamountwh

變體記錄的特點(diǎn)改變一個(gè)變體記錄的標(biāo)識(shí)符,在概念上建立了一個(gè)新記錄;變體記錄在同一塊存儲(chǔ)區(qū)上重疊存放所有變體;變體記錄允許程序員根據(jù)每個(gè)變體的類型,以不同的觀點(diǎn)來(lái)解釋存儲(chǔ)在該區(qū)域中的位串;PASCAL變體記錄的缺點(diǎn)使用變體記錄不安全可以對(duì)變體賦值可以改變變體標(biāo)識(shí)符標(biāo)識(shí)符域的標(biāo)識(shí)符可省缺recordprice:realcasebooleanoftrue:(amount:integer;where:dept);false:(mouth_expected:month)end32變體記錄的特點(diǎn)改變一個(gè)變體記錄的標(biāo)識(shí)符,在概念上建立了一個(gè)

集合構(gòu)造PASCAL語(yǔ)言的SET構(gòu)造符是冪集構(gòu)造受限制的形式,基類型只能是有序類型,而不能是實(shí)數(shù)、集合類型。例:typevegetable=(bean,cabbage,carrot,celery,lettuce,onion,mushroom,zucchizi);varmy_salad,leftover:setofvegetable;33集合構(gòu)造例:33

文件構(gòu)造PASCAL文件是任意類型的諸元素的序列;PASCAL文件僅能順序處理;只能進(jìn)行PUT和GET操作;例:typepattern=record…end;tape=fileof

pattern;vart1,t2:tape;Get操作把下一個(gè)元素讀到緩沖區(qū)put操作把緩沖區(qū)中的元素附加到文件末尾34文件構(gòu)造例:Get操作把下一個(gè)元素讀到緩沖區(qū)put操作把緩

指針是PASCAL的第三類數(shù)據(jù)類型,是非結(jié)構(gòu)的,可用來(lái)構(gòu)造遞歸結(jié)構(gòu);指針可引用匿名數(shù)據(jù)對(duì)象,這類對(duì)象由建立語(yǔ)句NEW顯示分配在堆上;空指針nil的使用;指針的操作:賦值,比較(相等或不等)PASCAL指針只能指向匿名數(shù)據(jù)對(duì)象,不能指向在棧上分配的的單元3.指針35指針是PASCAL的第三類數(shù)據(jù)類型,是非結(jié)構(gòu)的,可用來(lái)構(gòu)造typetree_ref=binary_tree_node;binary_tree_node=recordinfo:char;left,right:tree_refend;pointer=node;node=recorddata:integer;next:pointerend;指針例子36typetree_ref=binary_tree_nod

Pascal類型非結(jié)構(gòu)類型指針類型(遞歸)結(jié)構(gòu)類型內(nèi)部類型整型實(shí)型字符型布爾型枚舉類型子界類型記錄類型(迪卡爾積)變體記錄(判定或)數(shù)組集合文件4.小結(jié)37Pascal類型非結(jié)構(gòu)類型指針類型結(jié)構(gòu)類型內(nèi)部類型枚舉類型

第六節(jié)C語(yǔ)言數(shù)據(jù)類型結(jié)構(gòu)1.非結(jié)構(gòu)類型:分為內(nèi)部類型和用戶自定義類型非結(jié)構(gòu)內(nèi)部類型有整型、實(shí)型和字符型類型類型標(biāo)志符數(shù)值范圍占用字節(jié)數(shù)基本型int-32768327672短整型Short-32768327672長(zhǎng)整型Long-231(231-1)4無(wú)符號(hào)整型Unsigned0655352無(wú)符號(hào)短整型Unsignedshort0655352無(wú)符號(hào)長(zhǎng)整型Unsignedlong0(232-1)438第六節(jié)C語(yǔ)言數(shù)據(jù)類型結(jié)構(gòu)1.非結(jié)構(gòu)類型:類型類型標(biāo)志符數(shù)

實(shí)型又稱浮點(diǎn)型,其值是實(shí)數(shù)的一個(gè)子集,分為單精度和雙精度兩種類型字符型數(shù)據(jù)的值是一個(gè)有限字符集的元素;在C語(yǔ)言中,int類型與char類型在存儲(chǔ)中沒(méi)有本質(zhì)區(qū)別;-308308-10308

1030815168Double雙精度型-3838-1038

103874Float單精度型階的范圍數(shù)值范圍能表示數(shù)值的有效位點(diǎn)用字節(jié)數(shù)類型標(biāo)志符類型浮點(diǎn)型數(shù)據(jù)類型的特性

注意:C語(yǔ)言中沒(méi)有布爾(bool)類型;0表示false,非0表示true。39實(shí)型又稱浮點(diǎn)型,其值是實(shí)數(shù)的一個(gè)子集,分為單精度和雙精度兩

用戶自定義的非結(jié)構(gòu)類型用戶自定義的非結(jié)構(gòu)類型在C語(yǔ)言中稱為枚舉類型(enum)enumbool{false,true};或typedefenum{false,true}bool;(1)定義了一個(gè)新類型bool(2)bool數(shù)據(jù)類型的取值為false和true(3)定義了一個(gè)順序:false<true(4)可對(duì)這個(gè)類型的變量進(jìn)行賦值和比較等操作enumbool{false,true};boolb;b=true;if(b==true){……}40用戶自定義的非結(jié)構(gòu)類型用戶自定義的非結(jié)構(gòu)類型在C語(yǔ)言中稱為

2.聚合構(gòu)造(1)數(shù)組實(shí)現(xiàn)有限映像說(shuō)明的格式<類型說(shuō)明符><數(shù)組名>[常量表達(dá)式]例如:intintarr[5];charchararr[255];boolboolarr[3];

注意:C語(yǔ)言中數(shù)組的下標(biāo)總是從0開(kāi)始。412.聚合構(gòu)造(1)數(shù)組例如: 注意:C語(yǔ)言中數(shù)組的下標(biāo)總

可以定義多維數(shù)組說(shuō)明的格式<類型說(shuō)明符><數(shù)組名>[常量表達(dá)式]…[常量表達(dá)式]例如:floatfarr[3][4];charc[2][2][2];C語(yǔ)言的數(shù)組按行存放對(duì)數(shù)組名的處理相當(dāng)于指針數(shù)組a[3][4]的存放次序?yàn)椋篴[0][0]a[0][1]a[0][2]a[0][3]a[1][0]a[1][1]a[1][2]a[1][3]a[2][0]a[2][1]a[2][2]a[2][3]inta[10];int*pa;pa=a;42可以定義多維數(shù)組例如:C語(yǔ)言的數(shù)組按行存放數(shù)組a[3]

(2)結(jié)構(gòu)C語(yǔ)言中構(gòu)造符struct支持笛卡爾積說(shuō)明的格式struct<結(jié)構(gòu)體名>{成員表列};成員表列由若干個(gè)成員類型說(shuō)明組成:

<類型標(biāo)識(shí)符><成員名>;例如:structstudent{ intnum; charname[2]; charsex; intage; floatscore; charaddr[30]; }43(2)結(jié)構(gòu)例如:structstudent{43

注意:C語(yǔ)言中結(jié)構(gòu)不能整體賦值和輸出,只能對(duì)其中的各個(gè)成員分別進(jìn)行操作。在內(nèi)存中,結(jié)構(gòu)的各成員依次存放;結(jié)構(gòu)體可以嵌套;例如:structstudentme,you;strcpy(,“john”);me.sex=‘M’;me.age=21;me.score=80;strcpy(me.addr,“UESTC”);44 注意:C語(yǔ)言中結(jié)構(gòu)不能整體賦值和輸出,只能對(duì)其中的各個(gè)成

(3)聯(lián)合

C語(yǔ)言中構(gòu)造符union(聯(lián)合)支持判定或聯(lián)合結(jié)構(gòu)舉例:

uniondata{ inti; charc; floatf; } uniondataa,b,c;a.i=2;a.c=‘s’;a.f=3.14;(1)C語(yǔ)言中聯(lián)合中沒(méi)有標(biāo)識(shí)符域;(2)單元中的值的類型,取決于程序員的使用;45(3)聯(lián)合聯(lián)合結(jié)構(gòu)舉例:a.i=2;(1)C語(yǔ)言中聯(lián)合

(4)文件C語(yǔ)言中文件是一個(gè)字符序列;分為ASCII碼文件和二進(jìn)制文件;C語(yǔ)言中文件的預(yù)定義格式如下:

typedefstruct{ int_fd; int_cleft; int_mode; char*_next; char*_buf; }FILE;文件名緩沖區(qū)中剩下的字符數(shù)文件操作模式下一個(gè)字符指針緩沖區(qū)指針46(4)文件C語(yǔ)言中文件的預(yù)定義格式如下:文件名緩沖區(qū)中剩下

3.指針

C語(yǔ)言中的指針是第三種數(shù)據(jù)類型,是非結(jié)構(gòu)類型;可用來(lái)構(gòu)造結(jié)構(gòu)類型;支持遞歸;利用指針定義遞歸結(jié)構(gòu)的例子:

structtree{ charday; structtree*lchild; structtree*rchild; }; structtree*my_tree;473.指針C語(yǔ)言中的指針是第三種數(shù)據(jù)類型,是非結(jié)構(gòu)類型

4.空類型

C語(yǔ)言中有一種特殊的數(shù)據(jù)類型void,稱為空類型;是一種非結(jié)構(gòu)類型;有兩個(gè)主要用途:用來(lái)表示一個(gè)無(wú)返回值的函數(shù)用來(lái)表示不確定類型的指針例:voidmain(){ inti; i=1;}例如:void*p;表示這是一個(gè)指針,它的值是一個(gè)地址,但不指明p指向的值是什么類型。484.空類型C語(yǔ)言中有一種特殊的數(shù)據(jù)類型void,稱為

5.C數(shù)據(jù)類型小結(jié)C數(shù)據(jù)類型非結(jié)構(gòu)型結(jié)構(gòu)型指針類型(遞歸)內(nèi)部類型枚舉類型數(shù)組類型(有限映象)聯(lián)合類型(判定或)結(jié)構(gòu)類型(笛卡爾積)(文件)(序列)整型空類型實(shí)型字符型單精度型雙精度型495.C數(shù)據(jù)類型小結(jié)C數(shù)據(jù)類型非結(jié)構(gòu)型結(jié)構(gòu)型指針類型內(nèi)部類

第八節(jié)抽象數(shù)據(jù)類型1.用戶定義類型與內(nèi)部類型的異同都建立某種基本表示的抽象內(nèi)部類型:對(duì)二進(jìn)制位串的抽象;用戶定義類型:對(duì)內(nèi)部類型和已定義的用戶定義類型的數(shù)據(jù)作為基本表示的抽象每一類型都關(guān)聯(lián)一組操作內(nèi)部類型隱蔽了基本表示,不能對(duì)它的成分進(jìn)行操作;用戶定義類型具有更高級(jí)別的抽象,可以對(duì)其基本表示的成分進(jìn)行操作。能不能仿照內(nèi)部類型,隱藏用戶自定義類型的內(nèi)部信息?50第八節(jié)抽象數(shù)據(jù)類型1.用戶定義類型與內(nèi)部類型的異同能不能

2.抽象數(shù)據(jù)類型的定義滿足下述特性的用戶定義類型稱為抽象數(shù)據(jù)類型:在實(shí)現(xiàn)該類型的程序單元中,建立與表示有關(guān)的基本操作;對(duì)使用該類型的程序單元來(lái)說(shuō),該類型的表示是隱蔽的。3.在描述實(shí)現(xiàn)的程序單元中進(jìn)行修改1.對(duì)象的表示是被保護(hù)的,外界不能對(duì)它進(jìn)行直接操作2.隱蔽了表示的細(xì)節(jié),通過(guò)過(guò)程來(lái)訪問(wèn)抽象數(shù)據(jù)對(duì)象512.抽象數(shù)據(jù)類型的定義3.在描述實(shí)現(xiàn)的程序單元中進(jìn)行修改

1.SIMULA67的類機(jī)制2.CLU的抽象數(shù)據(jù)類型-簇3.Ada的抽象數(shù)據(jù)類型4.Modula-2的抽象數(shù)據(jù)類型521.SIMULA67的類機(jī)制2.CLU的抽象數(shù)據(jù)類型

C++語(yǔ)言中的抽象數(shù)據(jù)類型稱為類(class),類的實(shí)例稱為對(duì)象(object);class<類名>{private:

私有段數(shù)據(jù)定義;私有段函數(shù)定義;

protected:

保護(hù)段數(shù)據(jù)定義;保護(hù)段函數(shù)定義;

public:

公有段數(shù)據(jù)定義;公有段函數(shù)定義;

}C++語(yǔ)言類定義的一般形式5.C++語(yǔ)言的抽象數(shù)據(jù)類型C++的類滿足抽象數(shù)據(jù)類型的條件(1)和(2)?53C++語(yǔ)言中的抽象數(shù)據(jù)類型稱為類(class),類的

類的實(shí)例是對(duì)象,對(duì)象繼承類中的數(shù)據(jù)和方法封裝、繼承、多態(tài)C++支持重載和多態(tài)C++的繼承性通過(guò)派生類來(lái)實(shí)現(xiàn)虛函數(shù)、抽象類54類的實(shí)例是對(duì)象,對(duì)象繼承類中的數(shù)據(jù)和方法封裝、繼承、多態(tài)C

第九節(jié)類型檢查對(duì)數(shù)據(jù)對(duì)象的類型和使用的操作是否匹配的一致性檢查稱為類型檢查;語(yǔ)言的類型檢查分為靜態(tài)檢查(staticchecking)和動(dòng)態(tài)檢查(dynamicchecking);靜態(tài)檢查使程序更正確更有效動(dòng)態(tài)檢查使編程方便,但影響了可讀性,且降低了執(zhí)行效率語(yǔ)言按類型可分為無(wú)類型語(yǔ)言、弱類型語(yǔ)言和

強(qiáng)類型語(yǔ)言;在編譯時(shí)進(jìn)行的檢查在運(yùn)行時(shí)進(jìn)行的檢查語(yǔ)言沒(méi)有類型定義語(yǔ)言的類型檢查不能全部在編譯時(shí)完成,有些要在運(yùn)行時(shí)才能完成語(yǔ)言的類型檢查全部在編譯時(shí)完成55第九節(jié)類型檢查對(duì)數(shù)據(jù)對(duì)象的類型和使用的操作是否匹配的一致

理由:編譯時(shí),不能確定一個(gè)過(guò)程中的過(guò)程參數(shù)和子程序參數(shù)類型Pascal的子界類型不能靜態(tài)檢查變體記錄的標(biāo)識(shí)符可以在運(yùn)行時(shí)改變Pascal沒(méi)有嚴(yán)格規(guī)定類型的一致性規(guī)則procedurewho_knows(i,j:integer;proceduref);vark:boolean;begink:=j<i;ifkthenf(k)elsef(j)end;如:a:=b+c;且a、b、c均屬于子界類型1..10PASCAL是非強(qiáng)類型語(yǔ)言56procedurewho_knows(i,j:integ

第九節(jié)類型轉(zhuǎn)換將一個(gè)類型的值轉(zhuǎn)換成另一個(gè)類型的值,稱為類型轉(zhuǎn)換;類型轉(zhuǎn)換分為拓展(widening)和收縮(narrowing);在某些語(yǔ)言中,類型轉(zhuǎn)換的要求和規(guī)則是隱式的,它由編譯器自動(dòng)生成類型轉(zhuǎn)換的代碼;一般來(lái)說(shuō),語(yǔ)言對(duì)基本類型提供適當(dāng)?shù)念愋娃D(zhuǎn)換,而對(duì)復(fù)合類型或用戶自定義類型不提供轉(zhuǎn)換;轉(zhuǎn)換之后的類型值的集合包含轉(zhuǎn)換之前的類型值的集合;例如:整型

實(shí)型轉(zhuǎn)換之前的類型值的集合包含轉(zhuǎn)換之后的類型值的集合;例如:實(shí)型整型1.截?cái)?.舍入法57第九節(jié)類型轉(zhuǎn)換將一個(gè)類型的值轉(zhuǎn)換成另一個(gè)類型的值,稱為類

一些語(yǔ)言規(guī)定的轉(zhuǎn)換規(guī)則:FORTRAN語(yǔ)言:轉(zhuǎn)換規(guī)則隱式給出;轉(zhuǎn)換規(guī)則根據(jù)類型和類型之間的優(yōu)先級(jí)來(lái)確定;由低級(jí)類型向高級(jí)類型轉(zhuǎn)換;FORTRAN的類型優(yōu)先級(jí)為:COMPLEX>DOUBLEPRECISION>REAL>INTEGERPASCAL語(yǔ)言:只允許整數(shù)到實(shí)數(shù),以及子界類型到整數(shù)的轉(zhuǎn)換;其他的轉(zhuǎn)換必須顯示處理varr:real;i:integer;i:=r;?應(yīng)寫為varr:real;i:integer;i:=round(r);58一些語(yǔ)言規(guī)定的轉(zhuǎn)換規(guī)則:FORTRAN語(yǔ)言:PASCAL語(yǔ)

ALGOL68語(yǔ)言:完全的、形式化的隱式轉(zhuǎn)換規(guī)則;它一共給出6種隱式轉(zhuǎn)換規(guī)則;Ada語(yǔ)言:必須顯示轉(zhuǎn)換;59ALGOL68語(yǔ)言:Ada語(yǔ)言:59

隱式轉(zhuǎn)換發(fā)生在下述的情況下:混合運(yùn)算:級(jí)別低的類型向級(jí)別高的類型值轉(zhuǎn)換。將表達(dá)式的值賦給變量:表達(dá)式的值向變量類型的值轉(zhuǎn)換。實(shí)參向函數(shù)形參傳值:實(shí)參的值向形參的值進(jìn)行轉(zhuǎn)換。函數(shù)返回值:返回值向函數(shù)返回類型的值進(jìn)行轉(zhuǎn)換。注意語(yǔ)言規(guī)定的轉(zhuǎn)換規(guī)則隱式轉(zhuǎn)換發(fā)生在下述的情況下:注意語(yǔ)言規(guī)定的轉(zhuǎn)換規(guī)則

第十節(jié)類型等價(jià)若T1和T2是兩個(gè)類型,T1的任何值都可以賦予T2類型的變量,反之亦然,T1類型的實(shí)參可以對(duì)應(yīng)類型T2的形參,反之亦然,則稱T1和T2是相容的,或等價(jià)的;61第十節(jié)類型等價(jià)若T1和T2是兩個(gè)類型,61

第十節(jié)類型等價(jià)有兩種類型的相容性概念:①名字等價(jià):兩個(gè)變量的類型名相同62structRecA{charx;inty;};typedefstructRecARecA;structRecAa;RecAb;structRecAc;struct{charx;inty;}d;a和c是名字等價(jià),b和d與其他任何變量都不是名字等價(jià)。struct{charx;inty;}d,e;struct{charx;inty;}d;struct{charx;inty;}e;第十節(jié)類型等價(jià)有兩種類型的相容性概念:62struct不等價(jià)第十節(jié)類型等價(jià)有兩種類型的相容性概念:②結(jié)構(gòu)等價(jià)兩個(gè)變量的類型具有相同的結(jié)構(gòu)。63structRec1{charx;inty;charz[10];};structRec2{charx;inty;charz[10];};structRec3{inty;charx;charz[10];};Rec1和Rec2是結(jié)構(gòu)等價(jià),Rec1和Rec3不是結(jié)構(gòu)等價(jià)。structRec1{charx;inty;};structRec2{chara;intb;};不等價(jià)第十節(jié)類型等價(jià)有兩種類型的相容性概念:63stru

第十節(jié)類型等價(jià)兩種相容性實(shí)現(xiàn)時(shí)的比較①名字等價(jià)的實(shí)現(xiàn)比較簡(jiǎn)單②結(jié)構(gòu)等價(jià)的實(shí)現(xiàn)需要的模式匹配過(guò)程可能十分復(fù)雜64第十節(jié)類型等價(jià)兩種相容性實(shí)現(xiàn)時(shí)的比較64

第十一節(jié)實(shí)現(xiàn)模型在實(shí)現(xiàn)模型中,數(shù)據(jù)用描述符和數(shù)據(jù)對(duì)象來(lái)表示;描述符用來(lái)描述數(shù)據(jù)對(duì)象的所有屬性只考慮原理性的實(shí)現(xiàn),不考慮效率以PASCAL語(yǔ)言為例

描述符:描述數(shù)據(jù)對(duì)象的所有屬性數(shù)據(jù)數(shù)據(jù)對(duì)象(存儲(chǔ)區(qū)及其值)65第十一節(jié)實(shí)現(xiàn)模型在實(shí)現(xiàn)模型中,數(shù)據(jù)用描述符和數(shù)據(jù)對(duì)象來(lái)表

1.內(nèi)部類型和用戶定義的非結(jié)構(gòu)類型的實(shí)現(xiàn)模型描述符一般由“類型”和一個(gè)指針組成integer描述符數(shù)據(jù)對(duì)象整數(shù)變量的表示real描述符實(shí)型變量的表示數(shù)據(jù)對(duì)象子界的描述符必須包括子界的界值布爾型和字符型可以壓縮存儲(chǔ)661.內(nèi)部類型和用戶定義的非結(jié)構(gòu)類型的實(shí)現(xiàn)模型integer

2.結(jié)構(gòu)類型的實(shí)現(xiàn)模型笛卡爾積各成分順序排列(數(shù)據(jù))描述符包含:類型名、構(gòu)造符、若干三元式。每個(gè)域?qū)?yīng)一個(gè)三元式(選擇符名,域類型,指針)每個(gè)成分占整數(shù)個(gè)可編址的存儲(chǔ)單元(字編址或字節(jié)編址)672.結(jié)構(gòu)類型的實(shí)現(xiàn)模型67

typet=recorda:real;

b:integer;

end;數(shù)據(jù)對(duì)象浮點(diǎn)值定點(diǎn)值描述符類型名構(gòu)造符選擇符選擇符類型類型引用引用trecordarealbinteger域1域268typet=recorda:real;數(shù)據(jù)對(duì)象浮點(diǎn)值定

有限映像為每一成分分配整數(shù)個(gè)可編址的存儲(chǔ)單元描述符包括:類型名、構(gòu)造符、定義域的基類型、下界、上界、成分類型、單元個(gè)數(shù)、首地址內(nèi)情向量;69有限映像69地址公式的計(jì)算若定義域類型是子界m..n,每個(gè)元素占k個(gè)存儲(chǔ)單元,那么,按照k*(i-m)計(jì)算a[i]從首地址b到所分配的存儲(chǔ)之間的位移。

a[i]的地址可以寫成

b+k*(i-m)=b-k*m+k*i=b'+k*i其中,b’=b-k*m是編譯時(shí)能計(jì)算出的地址公式的計(jì)算

例:typea=array[1..10]ofreal;描述符類型名構(gòu)造符基類型成分類型下界單元個(gè)數(shù)上界引用aarrayinteger1real1下標(biāo)類型10數(shù)據(jù)對(duì)象浮點(diǎn)值浮點(diǎn)值浮點(diǎn)值71例:typea=array[1..10]ofreal

序列PASCAL中的串長(zhǎng)度靜態(tài)可定;靜態(tài)分配;其他語(yǔ)言中(如SNOBOL4和ALGOL68中),可變長(zhǎng)串的表示:靜態(tài)描述符+動(dòng)態(tài)描述符+堆string5ALPHA

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論