程序設(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)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

程序設(shè)計(jì)語(yǔ)言與編譯1第二章數(shù)據(jù)類型數(shù)據(jù)類型實(shí)質(zhì)上是對(duì)存儲(chǔ)器中所存儲(chǔ)的數(shù)據(jù)進(jìn)行的抽象。它包含了一組值的集合和一組操作。程序設(shè)計(jì)語(yǔ)言與編譯2本章內(nèi)容1、將類型作為數(shù)據(jù)結(jié)構(gòu)的抽象表示可以分為三個(gè)層次的抽象,即內(nèi)部類型、用戶定義類型和抽象數(shù)據(jù)類型2、數(shù)據(jù)類型與編譯有關(guān)的幾個(gè)問題3、類型的實(shí)現(xiàn)模型程序設(shè)計(jì)語(yǔ)言與編譯32.1

引言1.

數(shù)據(jù)類型的作用實(shí)現(xiàn)了數(shù)據(jù)抽象從機(jī)器的具體特征中解脫出來(lái)提高了編程效率程序設(shè)計(jì)語(yǔ)言與編譯4語(yǔ)言的某種特定的數(shù)據(jù)抽象受到兩個(gè)因素的影響:語(yǔ)言所面向的機(jī)器(只提供定點(diǎn)運(yùn)算或同時(shí)提供浮點(diǎn)運(yùn)算);語(yǔ)言所面向的應(yīng)用領(lǐng)域。程序設(shè)計(jì)語(yǔ)言與編譯52.

數(shù)據(jù)類型的分類內(nèi)部類型

自定義類型程序設(shè)計(jì)語(yǔ)言與編譯6語(yǔ)言根據(jù)所面向的機(jī)器和應(yīng)用定義了不同的數(shù)據(jù)類型,這些類型稱為內(nèi)部類型(語(yǔ)言定義類型

)。自Pascal語(yǔ)言開始,語(yǔ)言提供了由用戶定義類型的方法。采用這類方法由用戶自己定義的數(shù)據(jù)類型稱為用戶定義類型(自定義類型)。程序設(shè)計(jì)語(yǔ)言與編譯7第二節(jié)內(nèi)部類型一. 內(nèi)部類型的特點(diǎn)內(nèi)部類型反映基本硬件特性在語(yǔ)言級(jí),內(nèi)部類型是共用某些操作的數(shù)據(jù)對(duì)象的抽象表示程序設(shè)計(jì)語(yǔ)言與編譯二. 內(nèi)部類型的優(yōu)越性1.基本表示的不可見性基本位串對(duì)程序員是不可見的。優(yōu)點(diǎn):導(dǎo)致不同的程序設(shè)計(jì)風(fēng)格可寫性可讀性

可修改性例:25+9=34基本表示00011001+00001001結(jié)果001000108程序設(shè)計(jì)語(yǔ)言與編譯編譯時(shí)能檢查變量使用的正確性進(jìn)行靜態(tài)類型檢查,如非法運(yùn)算,形實(shí)參類型匹配(某些動(dòng)態(tài)特性不一定能查出,如i/j中j=0)編譯時(shí)可以確定無(wú)二義的操作超載(多態(tài))的概念:運(yùn)算符的意義依賴于操作數(shù)的類型。如“+”可以表示整數(shù)加或?qū)崝?shù)加編譯時(shí),可拒絕混合運(yùn)算,或提供類型轉(zhuǎn)換指令合理地使用超載,可以提高語(yǔ)言的可讀性和可用性9程序設(shè)計(jì)語(yǔ)言與編譯104.精度控制可以通過數(shù)據(jù)類型顯式定義數(shù)據(jù)的精度精度說明有利于空間優(yōu)化精度說明可作為檢查的一種手段精度說明有利于程序的修改程序設(shè)計(jì)語(yǔ)言與編譯第三節(jié)用戶定義類型許多語(yǔ)言除了定義內(nèi)部類型外,還允許程序員定義新的數(shù)據(jù)類型,規(guī)定基本數(shù)據(jù)對(duì)象的聚合,乃至聚合的聚合。How

todefine?11程序設(shè)計(jì)語(yǔ)言與編譯1.

笛卡爾積定義:N個(gè)集合A1,A2,…,An的笛卡爾積表示為A1×A2×…×An,它是一個(gè)集合,其元素為(a1,a2,…,an), 其中

ai∈Ai在語(yǔ)言中對(duì)應(yīng)什么構(gòu)造?12程序設(shè)計(jì)語(yǔ)言與編譯邊數(shù)表示為任意正多邊形任意正多邊形

integer

×

real在COBOL和PASCAL中稱為記錄;在ALGOL每邊邊長(zhǎng)中稱為結(jié)構(gòu)。例:對(duì)于如前定義的多邊形,有兩個(gè)域no-of-edges和edge-size,Struct

polygon{int

no-of-edges;double

edge-size}t1;若t1是一個(gè)邊長(zhǎng)為7.53的等邊三角形(3,3.75),則可以寫為:t1.no-of-edges

=

3;t1.edge-size

=

3.75;注意:語(yǔ)言把笛卡爾積數(shù)據(jù)對(duì)象看成由若干個(gè)域組成,每個(gè)域有一個(gè)唯一的名字;通常用域名來(lái)選取域,對(duì)它進(jìn)行

修改;13程序設(shè)計(jì)語(yǔ)言與編譯2. 有限映像(射)定義:從定義域類型DT

domaintype

)的值的有限集合,到值域類型

RT

range

type )的值的有限集合的函數(shù)稱為有限映像(射)

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

array[50]可看成是從0到49的整數(shù)到字符集的有限映像15程序設(shè)計(jì)語(yǔ)言與編譯有限映像(射)的一些特點(diǎn)DT到相應(yīng)值的特定子集的綁定策略:.編譯時(shí)綁定

(靜態(tài)數(shù)組).對(duì)象建立時(shí)綁定

(執(zhí)行到分程序時(shí),動(dòng)態(tài)數(shù)組).對(duì)象處理時(shí)綁定(對(duì)APL,子集范圍可變)16程序設(shè)計(jì)語(yǔ)言與編譯3.序列定義:序列由任意多個(gè)數(shù)據(jù)項(xiàng)組成,這些數(shù)據(jù)項(xiàng)稱為該序列的成分,且類型相同(記為CT)。串的一般操作有4種:連接首項(xiàng)選取尾項(xiàng)選取子串例:串是從所周知的序列,其成分類型為字符;順序文件的思路也來(lái)自序列的概念17程序設(shè)計(jì)語(yǔ)言與編譯遞歸定義:若數(shù)據(jù)類型T包含屬于同一類型T的成份,那么類型T稱為遞歸類型。遞歸類型的特點(diǎn):允許在類型定義中使用被定義類型的名字指針是建立遞歸數(shù)據(jù)對(duì)象的重要手段18例:二叉樹可通過遞歸類型來(lái)定義。它的左子樹和右子樹分別是另一棵二叉樹。程序設(shè)計(jì)語(yǔ)言與編譯5.判定或定義:判定或是一個(gè)選擇對(duì)象結(jié)構(gòu)的構(gòu)造機(jī)制,規(guī)定在兩個(gè)不同選擇對(duì)象之間作出適當(dāng)?shù)倪x擇;每一選擇對(duì)象結(jié)構(gòu)稱為變體。19例如:PASCAL和ADA中的變體記錄;C和ALGOL68中的聯(lián)合。程序設(shè)計(jì)語(yǔ)言與編譯結(jié)構(gòu)、共用體舉例namenumtypeScoresituationchen0000012teacherHardworkingZhang2000112student90,88,99,8920程序設(shè)計(jì)語(yǔ)言與編譯21結(jié)構(gòu)、共用體舉例Struct{ charname[10];Int

num;Chartype[8];Union{ float

score[10];Charsituation[40];}state;}person[2];程序設(shè)計(jì)語(yǔ)言與編譯6.冪集定義:類型T的元素所有子集的集合,稱為冪集,記為Powerset(T),T稱為基類型。冪集類型的操作:由于具有該類型的變量的值是一個(gè)子集,因此它們的基本操作是集合的操作,比如:聯(lián)合、與、以及測(cè)試某個(gè)元素是否在一個(gè)集合中等。22程序設(shè)計(jì)語(yǔ)言與編譯小結(jié)雜的數(shù)據(jù)對(duì)象(新的類型);可讀性(選擇名字)可修改性(不修改變量說明)可分性(重復(fù)使用)一致性檢查例如:struct

{double:radius;double

angle;}complex

c1,

c2,

c3;例如:struct

complex{double:radius;double

angle;}complex

c1,

c2,

c3;23struct

student{

char

name[48];1.程序語(yǔ)言允許程序員以上六種機(jī)制in來(lái)t

定age義;

復(fù)…新的類型可以通過非顯式的方};式說明;也可通過顯式的方式說明;顯示定義有如下優(yōu)點(diǎn):程序設(shè)計(jì)語(yǔ)言與編譯可分性可分性概念用得比較普遍,C語(yǔ)言的函數(shù)就使用了可分性。把程序中相同的代碼“分離”出來(lái),用一個(gè)名字來(lái)標(biāo)識(shí),待使用這段代碼時(shí),通過該名字調(diào)用該段代碼即可。程序設(shè)計(jì)語(yǔ)言與編譯內(nèi)容回顧2.數(shù)據(jù)類型1.編譯時(shí)-源程序3.活動(dòng)記錄2.運(yùn)行時(shí)-代碼段+活動(dòng)記錄4.別名、副作用1.程序單元1.值的集合+操作的集合2.六種數(shù)據(jù)類型聚合方式笛卡爾積25有限映射序

列遞

歸冪

集判

或記錄、結(jié)構(gòu)數(shù)組字符串、順序文件二叉樹聯(lián)合、變體記錄集合程序設(shè)計(jì)語(yǔ)言與編譯1.非結(jié)構(gòu)類型內(nèi)部類型integer,real,boolean,char有序類型定義新的有序類型的方法枚舉型子界型其值不能直接讀/寫動(dòng)態(tài)檢查范圍第四節(jié)P例A:SCAL語(yǔ)言數(shù)據(jù)類型結(jié)構(gòu)type

day=(sunday,monday,tuseday,wednesday,thursday,friday,saturday); //枚舉type

work_day=monday..friday;//子界var

class_day:work_day;每一元素都有cl唯ass一_d的ay前:=驅(qū)su和cc后(cl繼ass_day);//后繼如:整型,布爾…型…,字符型26構(gòu)造的一般形式為:array[t1]

of

[t2]元素(值域)的類型;程序設(shè)計(jì)語(yǔ)言與編譯2.聚合構(gòu)造下標(biāo)(定義域)的類型;1)數(shù)組構(gòu)造構(gòu)造符ARRAY允許程序員定義有限映像;數(shù)組注意:PASCAL把下標(biāo)類型不同的數(shù)組看成不同的類型typea1=array[1..50]

ofinteger;typea2=array[1..70]

ofinteger;?×=27程序設(shè)計(jì)語(yǔ)言與編譯產(chǎn)生嚴(yán)重問題, 使得形式參數(shù)定義的數(shù)組和實(shí)際參數(shù)的數(shù)組類型不一致;例:pr!ocedure

sort(var

a:a這rr樣ay定[lo義w.的.hi數(shù)gh組:in類te型ge會(huì)r]of

ctype);解決辦法:引入符合數(shù)組概念--維數(shù)相同,成分類型相同的數(shù)組;符合數(shù)組可以形、實(shí)參數(shù)匹配。28var

i:integer;more:boolean;begin

{sort}……end

{sort}程序設(shè)計(jì)語(yǔ)言與編譯2)記錄構(gòu)造構(gòu)造符RECORD用以定義笛卡爾積,一般形式為:Record

field_1:type_1;field_2:type_2;…field_n:type_n;end記錄可以整體訪問,也可用圓點(diǎn)“.”作為選擇符訪問單個(gè)的域;假設(shè)t,p是前面定義的多邊形

t.no_of_edges:=3;t.edge_size:=7.53;p:=t;29程序設(shè)計(jì)語(yǔ)言與編譯標(biāo)識(shí)符域available,記錄的判定成分PASCAL例的如變,體如記果錄i1和i2被說明變,體則記可錄對(duì)ite它m們進(jìn)行如下操作:type

dept=(housvea,rspio1r,it2s:i,tdemru:gs,food,liquor);30month=1..1…2;…item=recorid1.price:=5.24;price:real;casie1.aavvaaiilalbalbel:e=:trbuoeo;lean

ofi1.atmruoeu:n(ta:=mo2u9n;

t:integer;

where:dept);i2.available:=false;i1.wfahlesree::=(lmiqountohr;_expected:month)

end;

i2.price:=324.99;注意:PASCAL允許程序員訪問記錄結(jié)構(gòu)的所有域,包括標(biāo)識(shí)符域i2。.month_expect:=8;程序設(shè)計(jì)語(yǔ)言與編譯程序的執(zhí)行結(jié)果5.24true29liquorpriceavailableamountwherei1priceavailablemonth_expected324.99false8i231程序設(shè)計(jì)語(yǔ)言與編譯使用變體記錄不安全可以對(duì)變體賦值可以改變變體標(biāo)識(shí)符標(biāo)識(shí)符域的標(biāo)識(shí)符可省缺變體記錄的特點(diǎn)改變一個(gè)變體記錄的標(biāo)識(shí)符,在概念上建立了一個(gè)新記錄;變體記錄在同一塊存儲(chǔ)區(qū)上重疊存放所有變體;變體記錄允許程序員根據(jù)每個(gè)變體的類型,以不同的觀點(diǎn)來(lái)解釋存儲(chǔ)在該區(qū)域中的位串;record

price:realcase

boolean

ofPASCAL變體記錄的缺點(diǎn)

true:(amount:integer;

where:dept);false:(mouth_expected:month)end32程序設(shè)計(jì)語(yǔ)言與編譯3)集合構(gòu)造PASCAL語(yǔ)言的SET構(gòu)造符是冪集構(gòu)造受限制的形式,基類型只能是有序類型,而不能是實(shí)數(shù)、集合類型。例:type

vegetable=(bean,cabbage,carrot,celery,lettuce,onion,mushroom,zucchizi);var

my_salad,leftover:set

ofvegetable;33程序設(shè)計(jì)語(yǔ)言與編譯4)

文件構(gòu)造PASCAL文件是任意類型的諸元素的序列;例:type

patterGne=tr操ec作or把d

下…一en個(gè)d;

元素讀到緩沖區(qū)

tape=file

ofpattern;var

t1,t2:tape;PASCAL文件僅能順序處理;只能進(jìn)行

PUT

GET 操作;put操作把緩沖區(qū)中的元素附加到文件末尾34程序設(shè)計(jì)語(yǔ)言與編譯3.指針指針是PASCAL的第三類數(shù)據(jù)類型,是非結(jié)構(gòu)的,可用來(lái)構(gòu)造遞歸結(jié)構(gòu);指針可引用匿名數(shù)據(jù)對(duì)象,這類對(duì)象由建立語(yǔ)句NEW顯示分配在堆上;空指針nil的使用;指針的操作:賦值,比較(相等或不等)

PASCAL指針只能指向匿名數(shù)據(jù)對(duì)象,不能指向在棧上分配的的單元35程序設(shè)計(jì)語(yǔ)言與編譯36指針例子type

tree_ref=

binary_tree_node;binary_tree_node=recordinfo:char;left,right:tree_refend;pointer=

node;node=recorddata:integer;next:pointerend;程序設(shè)計(jì)語(yǔ)言與編譯Pascal類型非結(jié)構(gòu)類型指針類型

(遞歸)結(jié)構(gòu)類型內(nèi)部類型整型實(shí)型

字符型布爾型枚舉類型子界類型記錄類型(迪卡爾積)變體記錄(判定或)數(shù)組集合37文件4.小結(jié)程序設(shè)計(jì)語(yǔ)言與編譯第六節(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-32768

327672短整型Short-32768

327672長(zhǎng)整型Long-231

(231-1)4無(wú)符號(hào)整型Unsigned0

655352無(wú)符號(hào)短整型Unsignedshort0

655352無(wú)符號(hào)長(zhǎng)整型Unsignedlong0

(232-1)438程序設(shè)計(jì)語(yǔ)言與編譯實(shí)型又稱浮點(diǎn)型,其值是實(shí)數(shù)的一個(gè)子集,分為單精度和雙精度兩種類型浮點(diǎn)型數(shù)據(jù)類型的特性DF數(shù)能的點(diǎn)節(jié)類型類型標(biāo)志符用字?jǐn)?shù)表示數(shù)值有效位值范圍階的范圍單精度型loat47-1038~1038-38~38雙精度型ouble815~16-10308~10308-308~308字符型數(shù)據(jù)的值是一個(gè)有限字符集的元素;在C語(yǔ)言中,int類型與char類型在存儲(chǔ)中沒有本質(zhì)區(qū)別;注意:C語(yǔ)言中沒有布爾(bool)類型;0表示false,非

0表示true。39程序設(shè)計(jì)語(yǔ)言與編譯或用戶自定義的非結(jié)構(gòu)類型(1)定義了一個(gè)用戶自定義的非結(jié)構(gòu)類新型類在型C語(yǔ)bo言ol中稱為枚舉類型(enum)enum

bool

{false,

true};(2)bool數(shù)據(jù)類序:

false<true(3)定義ty了pe一de個(gè)f

順enum

{false,

tr(ue4}型)b的可oo取對(duì)l;值這為個(gè)f類al型se40的變和量tr進(jìn)ue行賦值和比較等操作enum

bool

{false,

true};bool

b;b

=

true;if(b

==

true)

{……}程序設(shè)計(jì)語(yǔ)言與編譯2.

聚合構(gòu)造(1)數(shù)組實(shí)現(xiàn)有限映像說明的格式<類型說明符>

<數(shù)組名>

[常量表達(dá)式]例如:int

intarr[5];char

chararr[255];bool

boolarr[3];注意:C語(yǔ)言中數(shù)組的下標(biāo)總是從0開始。41程序設(shè)計(jì)語(yǔ)言與編譯可以定義多維數(shù)組說明的格式<類型說明符>

<數(shù)組名>

[常量表達(dá)式]…[常量表達(dá)式]例如:float

farr[3][4];char

c[2][2][2];數(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]C語(yǔ)言的數(shù)組按行存放對(duì)數(shù)組名的處理相當(dāng)于指針int

a[10];int

*pa;pa

=

a;42程序設(shè)計(jì)語(yǔ)言與編譯(2)結(jié)構(gòu)C語(yǔ)言中構(gòu)造符struct支持笛卡爾積說明的格式stru成員表列<類型ct

<結(jié)構(gòu)體名>

{成員表列};由若干個(gè)成員類型說明組成:標(biāo)識(shí)符>

<成員名>;例如:struct

student

{int

num;char

name[2];char

sex;int

age;float

score;char

addr[30];}43程序設(shè)計(jì)語(yǔ)言與編譯注意:C語(yǔ)言中結(jié)構(gòu)不能整體賦值和輸出,只能對(duì)其中的各個(gè)成員分別進(jìn)行操作。在內(nèi)存中,結(jié)構(gòu)的各成員依次存放;結(jié)構(gòu)體可以嵌套;44例如:struct

student

me,

you;strcpy(,

“john”);me.sex

=

‘M’;me.age

=

21;me.score

=

80;strcpy(me.addr,

“UESTC”);程序設(shè)計(jì)語(yǔ)言與編譯(3)聯(lián)合C語(yǔ)言中構(gòu)造符union(聯(lián)合)支持判定或聯(lián)合結(jié)構(gòu)舉例:union

data

{int

i;char

c;float

f;}union

data

a,b,c;a.i

=

2;45a.c

=

‘s’;a.f

=

3.14;C語(yǔ)言中聯(lián)合中沒有標(biāo)識(shí)符域;單元中的值的類型,取決于程序員的使用;程序設(shè)計(jì)語(yǔ)言與編譯(4)文件C語(yǔ)言中文件是一個(gè)字符序列;

分為ASCII碼文件和二進(jìn)制文件;C語(yǔ)言中文件的預(yù)定義格式如下:typedef

struct

{int

_fd;int

_cleft;int

_mode;char

*_next;char

*_buf;}

FILE;文件名緩沖區(qū)中剩下的字符數(shù)文件操作模式下一個(gè)字符指針緩沖區(qū)指針46程序設(shè)計(jì)語(yǔ)言與編譯3.

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

tree

{char

day;struct

tree

*lchild;struct

tree

*rchild;};struct

tree

*my_tree;47程序設(shè)計(jì)語(yǔ)言與編譯空類型C語(yǔ)言中有一種特殊的數(shù)據(jù)類型void,稱為空類型;是一種非結(jié)構(gòu)類型;有兩個(gè)主要用途:用來(lái)表示一個(gè)無(wú)返回值的函數(shù)用來(lái)表示不確定類型的指針例:void

main例()如{:void

*p;int

i;

表示這是一個(gè)指針,它的值i

=

1;

是一個(gè)地址,但不指明p指向的值是什么類型。}48程序設(shè)計(jì)語(yǔ)言與編譯5.

C數(shù)據(jù)類型小結(jié)C數(shù)據(jù)類型非結(jié)構(gòu)型結(jié)構(gòu)型指針類型

(遞歸)數(shù)組類型聯(lián)合類型(判定或(有限映象)結(jié)構(gòu)類型(笛卡爾積)(文件)(序列)空類型內(nèi)部類型 枚舉類型整型 實(shí)型 字符型單精度型雙精度型49程序設(shè)計(jì)語(yǔ)言與編譯50第八節(jié)抽象數(shù)據(jù)類型用戶定義類型與內(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)部信息?程序設(shè)計(jì)語(yǔ)言與編譯512.抽象數(shù)據(jù)類型的定義滿足下述特性的用戶定義類型稱為抽象數(shù)據(jù)類型:①

在實(shí)現(xiàn)該類型的程序單元中,建立與表示有關(guān)的基本操作;②

對(duì)使用該類型的程序單元來(lái)說,該類型的表示是隱蔽的。3.

在描述實(shí)現(xiàn)的程序單元中進(jìn)行修改1.

對(duì)象的表示是被保護(hù)的,外界不能對(duì)它進(jìn)行直接操作2.

隱蔽了表示的細(xì)節(jié),通過過程來(lái)訪問抽象數(shù)據(jù)對(duì)象程序設(shè)計(jì)語(yǔ)言與編譯521.

SIMULA 67的類機(jī)制2. CLU的抽象數(shù)據(jù)類型-簇3. Ada的抽象數(shù)據(jù)類型4. Modula-2的抽象數(shù)據(jù)類型程序設(shè)計(jì)語(yǔ)言與編譯class<類名>{

private:私有段數(shù)據(jù)定義;私有段函數(shù)定義;protected:保護(hù)段數(shù)據(jù)定義;保護(hù)段函數(shù)定義;public:公有段數(shù)據(jù)定義;公有段函數(shù)定義;}C++語(yǔ)言類定義的一般形式5. C++語(yǔ)言的抽象數(shù)據(jù)類型C++語(yǔ)言中的抽象數(shù)據(jù)類型稱為類(class),類的實(shí)例稱為對(duì)象(object);53C++的類滿足抽象數(shù)據(jù)類型的條件(1)和(2)?程序設(shè)計(jì)語(yǔ)言與編譯54類的實(shí)例是對(duì)象,對(duì)象繼承類中的數(shù)據(jù)和方法封裝、繼承、多態(tài)C++支持重載和多態(tài)C++的繼承性通過派生類來(lái)實(shí)現(xiàn)虛函數(shù)、抽象類程序設(shè)計(jì)語(yǔ)言與編譯第九節(jié)類型檢查語(yǔ)言按類型可分為 無(wú)類型語(yǔ)言

、 弱類型語(yǔ)言

和強(qiáng)類型語(yǔ)言;對(duì)數(shù)據(jù)對(duì)象的類型和使用的操在作編是譯否時(shí)匹進(jìn)行配的的檢一查致性檢查稱為類型檢查;語(yǔ)言的類型檢查分為靜態(tài)檢查(staticchecking)和動(dòng)態(tài)檢查(dyna語(yǔ)m言ic的c類he型c檢ki查ng不)能;全部在編譯時(shí)完靜態(tài)檢查使程序成更,正有確些更要有在效運(yùn)行時(shí)才能完成動(dòng)態(tài)檢查在使運(yùn)編行程時(shí)方進(jìn)便行,的但檢影查響了可讀性,且降低了執(zhí)55語(yǔ)言的沒行類有效型類率檢型查定全義部在編譯時(shí)完成程序設(shè)計(jì)語(yǔ)言與編譯④

Pascal沒有嚴(yán)格規(guī)定類型的一致性規(guī)則frocedure

who_knows(i,j:integer;pr);var

k:boolean;p

ocedure如:

a:=b+c;56且a、b、c均屬于子界類型1..10begin

k:=j<i;if

k

then

f(k)

else

f(j)end;PASCAL是非強(qiáng)類型語(yǔ)言理由:①

編譯時(shí),不能確定一個(gè)過程中的過程參數(shù)和子程序參數(shù)類型②

Pascal的子界類型不能靜態(tài)檢查③

變體記錄的標(biāo)識(shí)符可以在運(yùn)行時(shí)改變程序設(shè)計(jì)語(yǔ)言與編譯第九節(jié)類型轉(zhuǎn)換將一個(gè)類型的值轉(zhuǎn)換成另一個(gè)類型的值,稱為類型轉(zhuǎn)換;類型轉(zhuǎn)換分為拓展(widening)和收縮(narrowing);轉(zhuǎn)換之后的類型值的集合包含轉(zhuǎn)換之前的編譯器整自型動(dòng)→生實(shí)成型類型轉(zhuǎn)換的代碼;類型值的集轉(zhuǎn)合換;之例前如的:類型值的集合包含轉(zhuǎn)換57在某些語(yǔ)言之中后,的類類型型值轉(zhuǎn)的換集的合要;求例和如規(guī):則是隱式的,它由實(shí)型→整型一般來(lái)說,語(yǔ)言對(duì)基本類型提供適當(dāng)?shù)念愋娃D(zhuǎn)換,而對(duì)復(fù)合類型或用戶自定義類型不提供轉(zhuǎn)換;截?cái)嗌崛敕ǔ绦蛟O(shè)計(jì)語(yǔ)言與編譯一些語(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>DOUBLE

PRECISION>REAL>INTEGER②

PASCAL語(yǔ)言:只允許整數(shù)到實(shí)數(shù),以及子界類型到整數(shù)的轉(zhuǎn)換;其他的轉(zhuǎn)換必須顯示處理var

r:real;i:integer;i:=r;?應(yīng)寫為var

r:real;i:integer;i:=round(r);58程序設(shè)計(jì)語(yǔ)言與編譯③

ALGOL

68語(yǔ)言:完全的、形式化的隱式轉(zhuǎn)換規(guī)則;它一共給出6種隱式轉(zhuǎn)換規(guī)則;④

Ada語(yǔ)言:必須顯示轉(zhuǎn)換;59程序設(shè)計(jì)語(yǔ)言與編譯隱式轉(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ī)則程序設(shè)計(jì)語(yǔ)言與編譯第十節(jié)類型等價(jià)若T1和T2是兩個(gè)類型,T1的任何值都可以賦予T2類型的變量,反之亦然,T1類型的實(shí)參可以對(duì)應(yīng)類型T2的形參,反之亦然,則稱T1和T2是相容的,或等價(jià)的;61程序設(shè)計(jì)語(yǔ)言與編譯第十節(jié)類型等價(jià)有兩種類型的相容性概念:①名字等價(jià):兩個(gè)變量的類型名相同62struct

RecA{

char

x;int

y;};typedef

struct

RecA

RecA

;struct

RecA

a;RecA

b;struct

RecA

c;struct{

char

x;int

y;}d;a和c是名字等價(jià),b和d與其他任何變量都不是名字等價(jià)。struct{

char

x;int

y;}d,e;struct{

char

x;int

y;}

d;struct{

char

x;int

y;}

e;程序設(shè)計(jì)語(yǔ)言與編譯不等價(jià)第十節(jié)類型等價(jià)有兩種類型的相容性概念:②結(jié)構(gòu)等價(jià)兩個(gè)變量的類型具有相同的結(jié)構(gòu)。63struct

Rec1{

char

x;int

y;char

z[10];};struct

Rec2{

char

x;int

y;char

z[10];};struct

Rec3{int

y;char

x;char

z[10];};Rec1和Rec2是結(jié)構(gòu)等價(jià),

Rec1和Rec3不是結(jié)構(gòu)等價(jià)。struct

Rec1{

char

x;int

y;};struct

Rec2{

char

a;int

b;};程序設(shè)計(jì)語(yǔ)言與編譯64第十節(jié)類型等價(jià)兩種相容性實(shí)現(xiàn)時(shí)的比較①名字等價(jià)的實(shí)現(xiàn)比較簡(jiǎn)單②結(jié)構(gòu)等價(jià)的實(shí)現(xiàn)需要的模式匹配過程可能十分復(fù)雜程序設(shè)計(jì)語(yǔ)言與編譯第十一節(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程序設(shè)計(jì)語(yǔ)言與編譯整數(shù)變量的表示integer描述符

數(shù)據(jù)對(duì)象real66內(nèi)部類型和用戶定義的非結(jié)構(gòu)類型的實(shí)現(xiàn)模型描述符一般由“類型”和一個(gè)指針組成實(shí)型變量的表示描述符 數(shù)據(jù)對(duì)象子界的描述符必須包括子界的界值布爾型和字符型可以壓縮存儲(chǔ)程序設(shè)計(jì)語(yǔ)言與編譯67結(jié)構(gòu)類型的實(shí)現(xiàn)模型笛卡爾積各成分順序排列(數(shù)據(jù))描述符包含:類型名、構(gòu)造符、若干三元式。每個(gè)域?qū)?yīng)一個(gè)三元式(選擇符名,域類型,指針)每個(gè)成分占整數(shù)個(gè)可編址的存儲(chǔ)單元(字編址或字節(jié)編址)程序設(shè)計(jì)語(yǔ)言與編譯type

t=record

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

選擇符類型引用域1域268程序設(shè)計(jì)語(yǔ)言與編譯69有限映像為每一成分分配整數(shù)個(gè)可編址的存儲(chǔ)單元描述符包括:類型名、構(gòu)造符、定義域

的基類型、下界、上界、成分類型、單元個(gè)數(shù)、首地址內(nèi)情向量

;程序設(shè)計(jì)語(yǔ)言與編譯地址公式的計(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ì)算出的程序設(shè)計(jì)語(yǔ)言與編譯例:type

a=array[1..10]

of

real;aarrayinteger110real1描述符類型名構(gòu)造符基類型下界上界成分類型單元個(gè)

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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)論