高職程序設計語言與編譯課件_第1頁
高職程序設計語言與編譯課件_第2頁
高職程序設計語言與編譯課件_第3頁
高職程序設計語言與編譯課件_第4頁
高職程序設計語言與編譯課件_第5頁
已閱讀5頁,還剩881頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

程式設計語言與編譯

第一章緒論

第一節(jié)引言1.程式設計語言的產生人機通信、人機交流2.程式設計語言的發(fā)展機器語言→組合語言→高級語言 (說明翻譯,解釋,彙編,編譯等概念)3.高級語言的特點

①直觀、自然、易於理解

②易讀,易寫,易於交流、出版和存檔

③一般都是獨立於機器的,易於移植4.本書的目標

①介紹程式設計語言的設計和實現的最基本的理論和技術;提高鑒賞和評估語言的能力

②在瞭解語言的重要概念、功能和限制的基礎上,以便具有選擇、設計和實現程式設計語言的能力第二節(jié)語言的定義語法:用以構造程式及其成分的一組規(guī)則的集合語義:用以規(guī)定語法正確的程式或其成分的含義的一組規(guī)則的集合一.語法

1.幾個術語

①字母表:語言允許使用字元的集合,其元素稱為字元

②符號:由字元組成的有限串(字串)

③字彙表:由符號組成的集合,其元素稱為字

④詞法規(guī)則:規(guī)定什麼樣的字串可以構成語言的有效符號

⑤語法規(guī)則:確定一個符號序列是否為一個句子,並提供句子的結構(什麼樣的符號序列是合法的)2.生成的觀點①一個簡單英語句子的描述

I/Studentsstudy/run.②文法:語言的一個完整的語法描述,記為(N,T,P,S)<句子>→<主語><謂語><主語>→I|Students<謂語>→study|run③語言:所有句子的集合④”識別字”和”運算式”的定義(遞歸定義)(注意遞歸的結束條件)識別字

<識別字>→<字母><識別字>→<識別字><字母><識別字>→<識別字><數字><字母>→A|B|…|X|Y|Z|a|b|…|x|y|z<數字>→0|1|2|3|4|5|6|7|8|9運算式

<運算式>→<識別字><運算式>→(<運算式>)<運算式>→<運算式><運算符><運算式><運算符>→+|-|*|/3.識別的觀點.用語法圖來定義給定的語言①語法圖的構造N→

1|2|…|n對應一個語法圖

終結符x

非終結符N

N→

1|2|…|n

XN

2

n

1

b1

b2

bm

g

b

1|2|…|m

→|②識別原則:若一個終結符序列是合法的,那麼,必須從語法圖的入口邊通過語法圖而到達出口邊,而且在通過的過程中,恰恰能識別該終結符序列。

Ⅰ.終結符框

Ⅱ.非終結符框

Ⅲ.分支、回溯參見圖1-6、圖1-7、圖1-8、圖1-9③語言:語法圖能識別的所有終結符序列的集合。識別字運算式運算符運算式()運算式運算式

字母字母

數字識別字

字母

字母

數字運算式運算式()運算式+運算式-*/+-*/運算符圖1-6圖1-7圖1-8圖1-94.語法描述的基本用途①表達語言設計者的意圖和設計目標;②指導語言的設計者如何寫一個正確的程式;③指導語言的實現者如何編寫一個語法檢查程式來識別所有合法的程式。二.語義例:大象吃花生

Elephantseatpeanuts.1.何謂語義?

定義語言合法句子的含義,即句子的作用和意義。

2.GAM的結構指令指針+代碼記憶體C+數據記憶體D

舉例:若懂漢語,可以將任何外語以漢語解釋;亦即理解了漢語則理解了外語.一.馮.諾依曼體系結構

1.基礎一個記憶體,一個控制器,一個處理器

2.特點①數據或指令以二進位形式存儲;②“存儲程式”的工作方式;③程式順序執(zhí)行;④記憶體的內容可以被修改。ip代碼記憶體(C)數據記憶體(D)3.在命令式語言上的表現①變數存儲單元及它的名稱由變數的概念來代替??梢源硪粋€或一組單元,可以修改。②賦值計算結果必須存儲。③重複因語句順序執(zhí)行,指令存儲在有限的記憶體中,完成複雜計算時必須重複執(zhí)行某些指令序列。二.綁定(Binding)概念

1.屬性:實體具有的特性。如變數,副程式,語句等均為實體。

2.綁定:一個對象(或事物)與其某種屬性建立起某種聯繫的過程。

3.描述符:用以描述實體的屬性的符號、語句或表格等。亦即實體到屬性的映象。4.“靜態(tài)”和“動態(tài)”特性:凡是在編譯時能確定的特性,稱為靜態(tài)的;凡是在運行時才能確定的屬性稱為動態(tài)的。舉例:動態(tài)數組和靜態(tài)數組。數組的屬性有保留其值的存儲區(qū)。三.變數變數是對一個(或若干個)存儲單元的抽象,賦值語句則是修改存儲單元內容的抽象。變數除名字外,具有四個屬性:作用域、生存期、值和類型。1.變數的作用域變數的作用域是指可以訪問該變數的程式範圍。①靜態(tài)作用域綁定:按照程式的語法結構定義變數的作用域。②動態(tài)作用域綁定:按照程式的執(zhí)行動態(tài)地定義變數的作用域。2.變數的生存期一個存儲區(qū)綁定於一個變數的時間區(qū)間,稱為變數的生存期。數據對象:存儲區(qū)和它保存的值分配:變數獲得存儲區(qū)的活動舉例說明靜態(tài)分配和動態(tài)分配。3.變數的值——存儲區(qū)單元的內容匿名變數的訪問通過指針實現變數與它的值的綁定是動態(tài)的符號常數的值不能修改變數的初始化⊙不初始化則出錯⊙隨機⊙缺省值04.變數的類型①類型的定義:變數的類型可以看成與變數相關聯的值的類,以及對這些值進行的操作的說明。類型可用來解釋變數綁定的存儲區(qū)的內容(二進位位串)的意義;語言定義時,類型名通常綁定於某一個值類和某一組操作;語言實現時,值和操作綁定於某種機器二進位表示。②靜態(tài)綁定:通過說明語句完成如:Pascal、Fortran③動態(tài)綁定:執(zhí)行時隱式說明,且動態(tài)變化

如:APLA5整型

A標號、轉到AA12510一維數組

A[2:3]0二維數組

A0AB+C四.虛擬機

1.虛擬機是由軟體實現的機器①M1是實際的機器,執(zhí)行二進位機器語言②若組合語言是虛擬機M2的機器語言,則

M2=M1+組合語言程式③若高級語言是虛擬機M3的機器語言,則

M3=M2+編譯程序2.虛擬機與抽象機的不同虛擬機是在一臺實際機器上配置某種軟體擴大其功能而實現的;而抽象機僅僅是一個抽象模型,並不要求與之匹配的實際機器存在。ip代碼記憶體(C)數據記憶體(D)4.非局部變數:一個程式單元可以引用未被本單元說明而被其他單元說明的變數。5.引用環(huán)境:局部變數+非局部變數。6.別名:同一單元的引用環(huán)境中有兩個變數綁定於同一數據對象,稱這些變數具有別名。7.副作用的產生:對綁定於一個非局部變數的對象進行修改。8.程式單元可以遞歸啟動,從而一個單元可以有很多個實例,但代碼段相同。不同的僅僅是活動記錄。9.靜態(tài)分配和動態(tài)分配

FortranPascal或C

隨著電腦技術的發(fā)展,電腦應用也日益廣泛,已經滲透到社會的各個領域,對程式設計語言也提出了新的要求(諸如可維護性,可靠性,可移植性等),從而促進了語言的發(fā)展。第五節(jié)程式設計語言發(fā)展簡介一.早期的高級語言(50年代)

—追求效率1.FORTRANFORmulaTRANslation.主要用於科學計算.副程式獨立編譯.COMMON語句實現了模組之間的通信2.ALGOL60ALGOrithmicLanguage60.主要用於科學計算

.引入了分程式結構和遞歸過程

.採用BNF形式描述語法3.COBOL

COmmonBusinessOrientedLanguage.廣泛應用於各種事務處理領域.引入了檔和數據描述.類自然語言程式描述二.早期的突破

60年代初,不再盲目地追求效率,出現了基於良好刻畫數學原則的語言。1.LISP.具有很強的符號處理能力.統一的數據結構.數據和程式統一的表示方法.其基礎是函數和函數作用2.APL.支持函數式程式設計風格.廣泛應用於涉及大量矩陣運算的科學計算中.具有豐富的操作符3.SNOBOL4.主要用於字串處理

.給出了一種與機器無關的宏功能,增加了程式的可移植性三.概念的集成(64年)

PL/1.希望將所有語言概念集成大全

.分程式概念和遞歸過程

.數據描述機能

.動態(tài)數據結構

.異常處理

.多任務機能

.可用於科學數值計算,數據處理和開發(fā)系統軟體

.難以得到廣泛的應用四.再一次突破(60年代後期)

引入了許多有趣的概念1.ALGOL68.以零型文法描述

.引入正交性和通用性原則2.SIMULA67.應用於模擬領域

.增加了一個特殊結構——協同程式

.引入了類的概念3.PASCAL.具有明顯的簡潔性

.體現結構程式設計思想

.具有用戶自定義類型4.BASIC.簡單易學

.互動式工作環(huán)境

.解釋執(zhí)行五.大量的探索

70年代,支持系統軟體開發(fā)

1.語言研究涉及抽象數據類型,異常處理和並行處理機制

2.MODULA-2.支持模組結構,模組可以獨立編譯

.面向即時系統和並行系統綜合功能3.CCPL→BCPL→B→C.C的最大特點是具有高級語言和低級語言的優(yōu)點

.應用於各種領域六.Ada和第四代語言

70年代以後,注重可移植性

1.Ada.面向專門領域的特殊要求

.是在引入了一個不大的,容易理解的概念集合的基礎上開發(fā)的

.是直接體現許多現代軟體設計方法學的語言

.提高程式的可讀性,可靠性,可維護性2.第四代語言——超高級語言面向問題

.表達力更強,使用更方便,更接近於問題的描述

.著重關心的是”做什麼”七.新一代程式設計語言以拋棄馮.諾依曼概念為基礎,包括函數式,對象式,邏輯式第一章習題1.必做題:1-2、1-6、1-112.思考題:1-3、1-5、1-10、1-12、1-14通知1.本週五的課暫停一次2.答疑時間改為:

第六周起,雙週四下午3:00起在806第二章數據類型

數據類型實質上是對記憶體中所存儲的數據進行的抽象。它包含了一組值的集合和一組操作。第一節(jié)引言1.數據類型的作用實現了數據抽象使程式員從機器的具體特徵中解脫出來提高了編程效率2.數據類型的分類內部類型自定義類型第二節(jié)內部類型一.內部類型的特點

.反映基本硬體特性如:定點加

.在語言級,標識共用某些操作的數據對象的抽象表示如:整型共用+、-、*、/二.內部類型的優(yōu)越性1.基本表示的不可見性基本位串對程式員是不可見的。

25+9=34

基本表示00011001+00001001

結果00100010

從而具有優(yōu)點:不同的程式設計風格,可寫性,可讀性,可修改性。

2.編譯時能檢查變數使用的正確性進行靜態(tài)類型檢查,如非法運算,形實參類型匹配3.編譯時可以確定無二義的操作超載(多態(tài))的概念:運算符的意義依賴於運算元的類型。如”+”可以表示整數加或實數加編譯時,可拒絕混合運算,或提供類型轉換指令合理地使用超載,可以提高語言的可讀性和可用性4.精度控制

可以通過數據類型顯式定義數據的精度第三節(jié)用戶定義類型

許多語言允許程式員規(guī)定基本數據對象的聚合,乃至聚合的聚合1.笛卡爾積

N個集合A1,A2,…,An的笛卡爾積表示為A1

A2

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

Ai

任意正多邊形可表示為

integer*real2.有限映像①定義:從定義域類型DT的值的有限集合,到值域類型RT的值的有限集合的函數稱為有限映像。

vara:array[1..50]ofchar;表示:整數1至50到字元集的有限映像②值域對象通過下標選取。③下標越界會出錯,動態(tài)檢查

④下標可用來選取值域的多個元素⑤SNOBOL4的ARRAY構造符並不要求值域集的所有元素是同一類型的⑥DT到相應值的特定子集的綁定策略:

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

動態(tài)數組).對象處理時綁定(對APL,子集範圍可變)3.序列①序列由任意多個數據項組成,這些資料項目稱為該序列的成分,且類型相同②串是序列③順序檔的思想也是來自序列的概念,只能順序讀寫4.遞歸若數據類型T包含屬於同一類型T的成分,那麼類型T稱為遞歸類型。①允許在類型定義中使用被定義類型的名字②指針是建立遞歸數據對象的重要手段5.判定或判定或是一個選擇對象結構的構造機制,規(guī)定在兩個不同選擇對象之間作出適當的選擇。每一選擇對象結構稱為變體。例如:PASCAL的變體記錄;C的聯合。6.冪集類型T的元素所有子集的集合,稱為冪集,記為Powerset(T),T稱為基類型。應用:每次的操作對象僅僅是某個集合的子集。7.小結通過PASCAL的類型定義和變數說明,給出用戶定義類型顯式命名的優(yōu)點:①可讀性(選擇名字)②可修改性(不修改變數說明)③可分性(重複使用)④一致性檢查(參考第8節(jié))匿名類型vara:recordx:integer;y:array[1..10]ofcharend;顯式命名typecomplex=recordradius:real;angle:realend;varc1,c2,c3:complex;第三節(jié)PASCAL類型結構一.非結構類型1.內部類型

integer,real,boolean,char2.有序類型每一元素都有唯一的前驅和後繼如:整型,布爾型,字元型3.定義新的有序類型的方法枚舉型其值不能直接讀/寫子界型動態(tài)檢查範圍例:typeday=(sunday,monday,tuseday,wednesday,thursday,friday,saturday);work_day=monday..friday;varclass_day:work_day;class_day:=succ(class_day);二.聚合構造1.數組構造構造符ARRAY允許程式員定義有限映象

array[t1]of[t2]PASCAL把下標類型不同的數組看成不同的類型

typea1=array[1..50]ofinteger;a2=array[1..70]ofinteger;“符合數組”的概念(見下頁)維數相同,成分類型相同PASCAL可定義多維數組typerow=array[-5..10]ofinteger;varmy_matrax:array[3..30]ofrow;或varmy_matrix:array[3..30,-5..10]ofinteger;proceduresort(vara:array[low..high:integer]ofctype);vari:integer;more:boolean;begin{sort}more:=true;whilemoredobeginmore:=false;fori:=lowtohigh-1dobeginifa[i]>a[i+1]thenbeginmove_right(i);more:=trueendendendend{sort};2.記錄構造①構造符RECORD用以定義笛卡爾積②記錄可以整體訪問,也可用圓點“.”

作為選擇符訪問單個的域③PASCAL的變體記錄④使用變體記錄不安全3.集合構造SET構造符是冪集構造受限制的形式基本型只能是有序類型4.檔構造PASCAL檔是任意類型的諸元素的序列PASCAL檔僅能順序處理PUT和GET操作三.指針指針可引用匿名數據對象

NEW,堆空指針的使用指針的操作:賦值,比較PASCAL指針只能指向匿名數據對象1.笛卡爾積

N個集合A1,A2,…,An的笛卡爾積表示為A1

A2

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

Ai

任意正多邊形可表示為

integer*real2.有限映像①定義:從定義域類型DT的值的有限集合,到值域類型RT的值的有限集合的函數稱為有限映像。

vara:array[1..50]ofchar;表示:整數1至50到字元集的有限映像②值域對象通過下標選取。③下標越界會出錯,動態(tài)檢查

④下標可用來選取值域的多個元素⑤SNOBOL4的ARRAY構造符並不要求值域集的所有元素是同一類型的⑥DT到相應值的特定子集的綁定策略:

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

動態(tài)數組).對象處理時綁定(對APL,子集範圍可變)3.序列①序列由任意多個數據項組成,這些資料項目稱為該序列的成分,且類型相同②串是序列③順序檔的思想也是來自序列的概念,只能順序讀寫4.遞歸若數據類型T包含屬於同一類型T的成分,那麼類型T稱為遞歸類型。①允許在類型定義中使用被定義類型的名字②指針是建立遞歸數據對象的重要手段5.判定或判定或是一個選擇對象結構的構造機制,規(guī)定在兩個不同選擇對象之間作出適當的選擇。每一選擇對象結構稱為變體。例如:PASCAL的變體記錄;C的聯合。6.冪集類型T的元素所有子集的集合,稱為冪集,記為Powerset(T),T稱為基類型。應用:每次的操作對象僅僅是某個集合的子集。7.小結通過PASCAL的類型定義和變數說明,給出用戶定義類型顯式命名的優(yōu)點:①可讀性(選擇名字)②可修改性(不修改變數說明)③可分性(重複使用)④一致性檢查(參考第8節(jié))匿名類型vara:recordx:integer;y:array[1..10]ofcharend;顯式命名typecomplex=recordradius:real;angle:realend;varc1,c2,c3:complex;第四節(jié)PASCAL類型結構一.非結構類型1.內部類型

integer,real,boolean,char2.有序類型每一元素都有唯一的前驅和後繼如:整型,布爾型,字元型3.定義新的有序類型的方法枚舉型其值不能直接讀/寫子界型動態(tài)檢查範圍例:typeday=(sunday,monday,tuseday,wednesday,thursday,friday,saturday);work_day=monday..friday;varclass_day:work_day;class_day:=succ(class_day);二.聚合構造1.數組構造構造符ARRAY允許程式員定義有限映象

array[t1]of[t2]PASCAL把下標類型不同的數組看成不同的類型

typea1=array[1..50]ofinteger;a2=array[1..70]ofinteger;“符合數組”的概念(見下頁)維數相同,成分類型相同PASCAL可定義多維數組typerow=array[-5..10]ofinteger;varmy_matrax:array[3..30]ofrow;或varmy_matrix:array[3..30,-5..10]ofinteger;proceduresort(vara:array[low..high:integer]ofctype);vari:integer;more:boolean;begin{sort}more:=true;whilemoredobeginmore:=false;fori:=lowtohigh-1dobeginifa[i]>a[i+1]thenbeginmove_right(i);more:=trueendendendend{sort};2.記錄構造①構造符RECORD用以定義笛卡爾積②記錄可以整體訪問,也可用圓點“.”

作為選擇符訪問單個的域③PASCAL的變體記錄

typedept=(house,sports,drugs,food,liquor);month=1..12;item=recordprice:real;caseavailable:booleanoftrue:(amount:integer;where:dept);false:(month_expected:month)end; 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;priceavailableamountwhere5.24true29liquorpriceavailablemonth_expected324.99false8④使用變體記錄不安全

■可以對變體賦值

■可以改變識別字域

■識別字域的識別字可省缺3.集合構造SET構造符是冪集構造受限制的形式基類型只能是有序類型typevegetable=(bean,cabbage,carrot,celery,lettuce,onion,mushroom,zucchizi);varmy_salad,leftover:setofvegetable;4.檔構造PASCAL檔是任意類型的諸元素的序列PASCAL檔僅能順序處理PUT和GET操作typepattern=record…end;tape=fileofpattern;vart1,t2:tape;三.指針指針可引用匿名數據對象

NEW,堆空指針的使用指針的操作:賦值,比較PASCAL指針只能指向匿名數據對象typetree_ref=binary_tree_node;binary_tree_node=recordinfo:char;left,right:tree_refend;pointer=node;node=recorddata:integer;next:pointerend;指針例子四.小結.(P37圖2-4)Pascal類型非結構類型指針類型(遞歸)結構類型內部類型整型實型字元型布爾型枚舉類型子界類型記錄類型(迪卡爾積)變體記錄(判定或)數組集合檔第五節(jié)Ada類型結構一.標量類型

1.分類實型數字類型標量類型:整型枚舉類型

2.標量類型的值的集合是有序的,允許關係運算離散類型3.用戶自定義類型typeTWO_DIGITisrange0..99;typeFLOAT_1isdigits10range0.0..3.0;typeFIT_PTisdelta0.01range0.00..100.01;typeBOOLLEANis(FALSE,TRUE);二.組合類型

1.數組①約束數組類型

下標界是靜態(tài)確定的typeMONTHis(JAN,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DEC);typeYEARLY_PAYisarray(MONTH)ofINTEGER;typeSUMMER_PAYisarray(MONTHrangeJUL..SEP)ofINTEGER;②非約束數組類型

Ada支持動態(tài)數組typeSOME_PERIOD_PAYiaarray(MONTHrange<>)ofINTEGER;typeINT_VERTORiaarray(INTEGERrange<>)ofINTEGER;typeBOOL_MAXTRIXisarray(INTEGERrange<>,INTEGERrange<>)ofBOOLEAN;

③Ada數組類型由分量的類型,下標個數和下標類型來刻畫④界的確定可在數據對象成為實體時,或參數傳遞時完成SPRING_MONTH:SOME_PERIOD_PAY(APR..JUN);Z:INT_VECTOR(-100..100);W:INT_VERTOR(20..40);Y:BOOL_MAXTRIX(0..N,0..M);其中,界的值不一定靜態(tài)給出functionSUM(X:INT-VECTOR)returnINTEGER;RESULT:INTEGER:=0;beginforIinX’FIRST..X’LASTloopRESULT:=RESULT+X(I);endloop;returnRESULT;endSUM;可用不同大小的數組作為實參來調用該函數A:=SUM(Z)+SUM(W);⑤可以在過程的局部說明中說明一個數組,它的界依賴於一個參數TEMPORARY:INT_VECTOR(X’FIRST..X’LAST);⑥切片:用以選取一維數組若干個相繼分量LINE:STRING(1..80);LINE(1..11):=(‘D’,’e’,’a’,’r’,’’,’f’,’r’,’i’,’e’,’n’,’d’);2.記錄①說明形式typeCOORDINATEisrecordX:INTEGERrange0..100;Y:CHARACTER;endrecord;②Ada的判全或是安全的typeDEPTis(HOUSEWARE,SPORTS,DRUGS,FOOD,LIQUOR);typeMONTHisrange1..12;typeITEM(AVAILABLE:BOOLEAN:=TRUE)isrecordPRICE:REAL;caseAVAILABLEofwhenTRUE=>AMOUNT:INTEGER;WHERE:DEPT;whenFALSE=>MONTH_EXPECTED:MONTHendcase;endrecord; 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;priceavailableamountwhere5.24true29liquorpriceavailablemonth_expected324.99false8二.組合類型

1.數組①約束數組類型

下標界是靜態(tài)確定的typeMONTHis(JAN,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DEC);typeYEARLY_PAYisarray(MONTH)ofINTEGER;typeSUMMER_PAYisarray(MONTHrangeJUL..SEP)ofINTEGER;②非約束數組類型

Ada支持動態(tài)數組typeSOME_PERIOD_PAYiaarray(MONTHrange<>)ofINTEGER;typeINT_VERTORiaarray(INTEGERrange<>)ofINTEGER;typeBOOL_MAXTRIXisarray(INTEGERrange<>,INTEGERrange<>)ofBOOLEAN;

③Ada數組類型由分量的類型,下標個數和下標類型來刻畫④界的確定可在數據對象成為實體時,或參數傳遞時完成SPRING_MONTH:SOME_PERIOD_PAY(APR..JUN);Z:INT_VECTOR(-100..100);W:INT_VERTOR(20..40);Y:BOOL_MAXTRIX(0..N,0..M);其中,界的值不一定靜態(tài)給出functionSUM(X:INT_VECTOR)returnINTEGER;RESULT:INTEGER:=0;beginforIinX’FIRST..X’LASTloopRESULT:=RESULT+X(I);endloop;returnRESULT;endSUM;可用不同大小的數組作為實參來調用該函數如:A:=SUM(Z)+SUM(W);⑤可以在過程的局部說明中說明一個數組,它的界依賴於一個參數TEMPORARY:INT_VECTOR(X’FIRST..X’LAST);⑥切片:用以選取一維數組若干個相繼分量LINE:STRING(1..80);LINE(1..11):=(‘D’,’e’,’a’,’r’,’’,’f’,’r’,’i’,’e’,’n’,’d’);2.記錄①說明形式typeCOORDINATEisrecordX:INTEGERrange0..100;Y:CHARACTER;endrecord;②Ada的判全或是安全的typeDEPTis(HOUSEWARE,SPORTS,DRUGS,FOOD,LIQUOR);typeMONTHisrange1..12;typeITEM(AVAILABLE:BOOLEAN:=TRUE)isrecordPRICE:REAL;caseAVAILABLEofwhenTRUE=>AMOUNT:INTEGER;WHERE:DEPT;whenFALSE=>MONTH_EXPECTED:MONTHendcase;endrecord;

判定或可具有缺省初值也可以說明一個對象的變體是凍結的單獨對判定或賦值是不允許的PEACH:ITEM;ORANGE:ITEM(FALSE);COCA_COLA:ITEM;COCA_COAL:=ORANGE;(合法)COCA_COAL:=(PRICE=>1.99,AVAILABLE=>TRUE,AMOUNT=>1500,WHERE=>FOOD);

3.訪問類型①不完全類型說明應用於Ada的遞歸類型typeBINARY_TREE_NODE;typeTREE_REFisaccessBINARY_TREE_NODE;typeBINARY_TREE_NODEisrecordINFO:CHARACTER;LEFT,RIGHT:TREE_REF;end;②P.all代表整個結點

4.子類型和派生類型

①可以通過子類型來規(guī)定類型的一個特性typeFLAVORis(CHOCOLATE,MINT,PEATH,STRAWBERRY,VANILLA,BLUECHEESE,CATSUP,GARLIC,ONION);subtypeICE_CREAM_FLAVORisrangeCHOCOLATE..VANILLA;subtypeSMALL_INTisINTEGERrange-10..10;subtypeSMALL_POS_INTEGERisINTEGERrange1..10;subtypeMY_INT_SETisINTEGERrangeA..B;②子類型繼承基類型的所有特性,還滿足某個約束

③子類型機制也可以用來約束數組類型

(類似於給出實例)typeMY_ORDERSisarray(INTEGERrange<>)ofICE_CREAM_FLAVOR;subtypeMONTHLY_ORDERSisMY_ORDERS(1..31);subtypeANNUAL_ORDERSisMY_ORDERS(1..365);

④也可以使用子類型來凍結判定或類型的變數subtypeOUT_OF_STOCKisITEM(FALSE);⑤子類型機制並未定義新類型⑥派生類型定義新類型,這些新類型繼承了母體類型的所有特性type<新類型>isnew<母體類型>[<約束>]typePOSITIVEis1..INTEGER’LAST;typeWEIGHTisnewPOSITIVErange1..100;typeLENGTHisnewPOSITIVE;

5.屬性

Ada的屬性用來指定數據對象、類型的特性。如:INTEGER’LAST三.Ada數據類型小結Ada類型標量類型組合類型訪問類型

(遞歸)數值類型枚舉類型數組類型記錄類型預定義類型用戶定義類型預定義類型用戶定義類型整型字元型實型布爾型第六節(jié)類型檢查1.類型檢查對數據對象的類型和使用的操作是否匹配的一致性檢查稱為類型檢查

2.靜態(tài)檢查和動態(tài)檢查①靜態(tài)檢查使程式更正確更有效②動態(tài)檢查使編程方便,但影響了可讀性,且降低了執(zhí)行效率

3.強類型語言若一個語言允許所有的類型靜態(tài)檢查

4.Pascal是非強類型語言①編譯時,不能確定一個過程中的過程參數和副程式參數類型procedurewho_knows(i,j:integer;proceduref);vark:boolean;begink:=j<i;ifkthenf(k)elsef(j)end;②Pascal的子界不能靜態(tài)檢查如:a:=b+c;且a、b、c均屬於子界類型1..10③變體記錄的識別字可以在運行時改變④Pascal沒有嚴格規(guī)定類型的一致性規(guī)則第七節(jié)類型轉換1.語言應該提供類型轉換機制如A+B2.兩種轉換方式①拓展:整型→實型②收縮:實型→整型有的“截斷”,有的“四捨五入”

3.注意語言規(guī)定的轉換規(guī)則①Fortran:低級類型→高級類型②Pascal允許:整數→實數;實數→整數顯式轉換(frunc、round)③ALGOL68提供了六種強制轉換規(guī)則(隱式的)④Ada要求必須顯式轉換例如:派生類型到母體類型的轉換P是POSITIVE的變數、L是LENGTH的變數

P:=POSITIVE(2*L+35);第八節(jié)類型等價T1和T2是相容的:T1可賦給T2,T1可對應T2的形參;反之亦然。1.名字等價兩個變數的類型名相同。2.結構等價兩個變數的類型具有相同的結構。

驗證法:用用戶定義類型的定義來代替用戶定義名,重複這一過程,直到沒有用戶定義類型名為止。3.兩種相容性實現時的比較①名字等價的實現比較簡單②結構等價的實現需要的模式匹配過程可能十分複雜第九節(jié)抽象數據類型1.用戶定義類型與內部類型的異同①都建立某種基本表示的抽象如:integer是位串的抽象;reg_polygon是記錄的抽象②每一類型都關聯一組操作③內部類型隱蔽了基本表示,不能對它的成分進行操作;用戶定義類型具有更高級別的抽象,可以對其基本表示的成分進行操作。2.抽象數據類型的定義滿足下述特性的用戶定義類型稱為抽象數據類型:①在實現該類型的程式單元中,建立與表示有關的基本操作;②對使用該類型的程式單元來說,該類型的表示是隱蔽的。一.SIMULA67的類機制

1.類的說明

<類頭>;<類體><類頭>包括類名和形式參數<類體>是傳統的分程式,可包含變數、過程和類的局部說明,以及一些執(zhí)行語句例:複數表示(幅角,半徑)classcomplex(x,y);realx,y;beginrealangle,radius;

radius:=sqrt(x**2+y**2);

ifabs(x)<epsilon

thenbeginifabs(y)<epsilon

thenerror

elsebeginify>epsilon

thenangle:=pi/2

elseangle:=3*pi/2

end

end

elseangle:=arctan(y/x)endcomplex2.類的有關性質①類說明定義了一類數據對象的原型或樣板②類的每個實例是一個可操作的數據對象③類的實例可多次動態(tài)建立,且僅能通過指針引用例:ref(complex)c;c:-newcomplex(1.0,1.0);c0.781.421.01.0angleradiusxy④類實例的屬性是指類體的局部變數和類頭中的參數my_angle:=c.angle;my_radius:=c.radius;my_x:=c.x;my_y:=c.y;⑤類支持抽象數據類型的封裝機制,它可以封裝實現對數據操作的各種過程例:可將複數加和乘的過程add和multiply封裝入類complex的類體說明中,作為complex的屬性。procedureadd(operand);ref(complex)operandproceduremultiply(operand);ref(complex)operand變數c1、c2引用的兩個複數相加可表示為:c1.add(c2)3.子類用以定義類型的判斷或和類屬。要求:定義一個棧,完成引用棧頂元素入棧出棧判棧是否空(這些操作與棧中元素的類型無關)棧內成員的元素類classstack_member;beginref(stack_member)next_member;next_member:-noneend指針型局部變數classstack;beginref(stack_member)first;ref(stack_member)proceduretop;top:-first;procedurepop;if?emptythenfirst:-first.next_member;procedurepush(e);ref(stack_member)e;beginiffirst=/=nonethene.next_member:-first;first:-eendpush;booleanprocedureempty;empty:=first==none;first:-noneendstackstack_memberclasscomplex(……);……endcomplex定義了一個複數棧其中complex稱為stack_member的子類加在類說明之前①子類complex具有自己的屬性,同時繼承了stack_member的屬性

newcomplex產生的對象具有stack_member和complex的所有屬性ref(stack)s;s:-newstack;s.push(c1);s.push(c2);s.push(c3);建立一個複數棧

3.強類型語言若一個語言允許所有的類型靜態(tài)檢查

4.Pascal是非強類型語言①編譯時,不能確定一個過程中的過程參數和副程式參數類型procedurewho_knows(i,j:integer;proceduref);vark:boolean;begink:=j<i;ifkthenf(k)elsef(j)end;②Pascal的子界不能靜態(tài)檢查如:a:=b+c;且a、b、c均屬於子界類型1..10③變體記錄的識別字可以在運行時改變④Pascal沒有嚴格規(guī)定類型的一致性規(guī)則第七節(jié)類型轉換1.語言應該提供類型轉換機制如A+B2.兩種轉換方式①拓展:整型→實型②收縮:實型→整型有的“截斷”,有的“四捨五入”

3.注意語言規(guī)定的轉換規(guī)則①Fortran:低級類型→高級類型②Pascal允許:整數→實數;實數→整數。但必須顯式轉換(frunc、round)③ALGOL68提供了六種強制轉換規(guī)則(隱式的)④Ada要求必須顯式轉換例如:派生類型到母體類型的轉換P是POSITIVE的變數、L是LENGTH的變數

P:=POSITIVE(2*L+35);第八節(jié)類型等價T1和T2是相容的:T1可賦給T2,T1可對應T2的形參;反之亦然。1.名字等價兩個變數的類型名相同。2.結構等價兩個變數的類型具有相同的結構。

驗證法:用用戶定義類型的定義來代替用戶定義名,重複這一過程,直到沒有用戶定義類型名為止。3.兩種相容性實現時的比較①名字等價的實現比較簡單②結構等價的實現需要的模式匹配過程可能十分複雜第九節(jié)抽象數據類型1.用戶定義類型與內部類型的異同①都建立某種基本表示的抽象如:integer是位串的抽象;reg_polygon是記錄的抽象②每一類型都關聯一組操作③內部類型隱蔽了基本表示,不能對它的成分進行操作;用戶定義類型具有更高級別的抽象,可以對其基本表示的成分進行操作。2.抽象數據類型的定義滿足下述特性的用戶定義類型稱為抽象數據類型:①在實現該類型的程式單元中,建立與表示有關的基本操作;②對使用該類型的程式單元來說,該類型的表示是隱蔽的。一.SIMULA67的類機制

1.類的說明

<類頭>;<類體><類頭>包括類名和形式參數<類體>是傳統的分程式,可包含變數、過程和類的局部說明,以及一些執(zhí)行語句例:複數表示(幅角,半徑)classcomplex(x,y);realx,y;beginrealangle,radius;

radius:=sqrt(x**2+y**2);

ifabs(x)<epsilon

thenbeginifabs(y)<epsilon

thenerror

elsebeginify>epsilon

thenangle:=pi/2

elseangle:=3*pi/2

end

end

elseangle:=arctan(y/x)endcomplex2.類的有關性質①類說明定義了一類數據對象的原型或樣板②類的每個實例是一個可操作的數據對象③類的實例可多次動態(tài)建立,且僅能通過指針引用例:ref(complex)c;c:-newcomplex(1.0,1.0);c0.781.421.01.0angleradiusxy④類實例的屬性是指類體的局部變數和類頭中的參數my_angle:=c.angle;my_radius:=c.radius;my_x:=c.x;my_y:=c.y;⑤類支持抽象數據類型的封裝機制,它可以封裝實現對數據操作的各種過程例:可將複數加和乘的過程add和multiply封裝入類complex的類體說明中,作為complex的屬性。procedureadd(operand);ref(complex)operandproceduremultiply(operand);ref(complex)operand變數c1、c2引用的兩個複數相加可表示為:c1.add(c2)或c3.angle:=c1.angle;c3.radius:=c1.radius+c2.radius;用戶可以直接訪問複數的內部表示,故add和multiply不是複數對象的唯一操作3.子類用以定義類型的判定或和類屬。要求:定義一個棧,完成引用棧頂元素入棧出棧判棧是否空(這些操作與棧中元素的類型無關)棧內成員的元素類classstack_member;beginref(stack_member)next_member;next_member:-noneend指針型局部變數classstack;beginref(stack_member)first;ref(stack_member)proceduretop;top:-first;procedurepop;if?emptythenfirst:-first.next_member;procedurepush(e);ref(stack_member)e;beginiffirst=/=nonethene.next_member:-first;first:-eendpush;booleanprocedureempty;empty:=first==none;first:-noneendstackstack_memberclasscomplex(……);……endcomplex定義了一個複數棧其中complex稱為stack_member的子類加在類說明之前①子類complex具有自己的屬性,同時繼承了stack_member的屬性

newcomplex產生的對象具有stack_member和complex的所有屬性ref(stack)s;s:-newstack;s.push(c1);s.push(c2);s.push(c3);建立一個複數棧②具有ref(stack_member)的變數可引用多種類型的量,但不同類型的元素不得壓入同一棧實例中下述語句說明向量也可是棧中元素:stack_memberclassvector(…);……endvector二.CLU的抽象數據類型例:定義複數完成:建立、加、判等complex=clusteriscreate,add,equal

rep=record[x,y:real]create=proc(a,b:real)returns(cvt)

return(rep${x:a,y:b})

endcreateadd=proc(a,b:cvt)returns(cvt)

return(rep${x:a.x+b.x,y:a.y+b.y})

endaddequal=proc(a,b:cvt)returns(bool)

return(a.x=b.xanda.y=b.y)

endequalendcomplex1.簇(Cluster)是CLU用來定義抽象數據類型的機制①簇內,需要內部表示②簇外,看到的是抽象表示

rep說明數據對象的具體表示

cvt用於抽象表示和具體表示之間的相互轉換,僅能在簇內使用

return(rep$…)的含義為返回一個具體表示類型的對象2.CLU的性質①CLU變數的作用域和生存期互不相干P:complex僅僅是一個說明而P:=complex$create(h,k)才產生一個對象賦於P②CLU變數被一致看成是對數據對象的引用如x:=e

其中x類似於指針變數③CLU的參數傳遞由賦值定義

complex$add(x,y)

把x和y分別賦予形式參數a和b三.Ada的抽象數據類型

1.Ada用程式包描述抽象數據類型程式包包括規(guī)格說明和程式包體

2.“移出”的概念這是程式包向外部世界提供的可以訪問的實體,是程式包的可見部分3.私有類型①私有類型的表示細節(jié)在程式包外是不可見的②允許的操作:移出的副程式、函數;賦值、相等、不等packageCOMPLEX-NUMBERSistypeCOMPLEXisprivate;

procedureINITIALIZE(A,B:inREAL;X:outCOMPLEX);functionADD(A,B:inCOMPLEX)returnCOMPLEX;privatetypeCOMPLEXisrecordR,I:REAL;endrecord;endCOMPLEX-NUMBERS;packagebodyCOMPLEX-NUMBERisprocedureINITIALIZE(A,B:inREAL;X:outCOMPLEX)isbeginX.R:=A;X.I:=B;endINITIALIZE;

溫馨提示

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

評論

0/150

提交評論