《Ada程序設(shè)計(jì)語言》word版(20210306021209)_第1頁
《Ada程序設(shè)計(jì)語言》word版(20210306021209)_第2頁
《Ada程序設(shè)計(jì)語言》word版(20210306021209)_第3頁
《Ada程序設(shè)計(jì)語言》word版(20210306021209)_第4頁
《Ada程序設(shè)計(jì)語言》word版(20210306021209)_第5頁
已閱讀5頁,還剩131頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、Ada 程序igtH吾言(The Ada Programming Language) 版權(quán)(Copyright) Ada程序設(shè)訃語言的版權(quán)隸屬于網(wǎng)站VenusIC,允許任何用戶翻閱、傳播、批評等等, 只要讀者想的岀的行為,都可以作用于本教材。唯一一條禁令則是:不允許惡劣地直接抄錄 本教材,并冠以他人名字為作者(這種人肯泄不得好死)。版權(quán)宣言結(jié)束。 前言(Preface) 經(jīng)過幾個星期的努力,Ada語言程序設(shè)汁終于有了基本框架,為了及早聽取讀者的意見 和促進(jìn)Ada的推廣,在未最終完稿前,筆者將它搬上了 VenusIC網(wǎng)站。 在此,我想提一下寫作動機(jī)。大約是在去年,我才始接觸Ada語言,當(dāng)時可以說

2、“一見鐘 情”,心情激動的很,當(dāng)場被Ada所吸引。按照慣例,是需要在網(wǎng)絡(luò)上找點(diǎn)Ada的資料, 但不幸的是,國內(nèi)好像對此很冷淡,沒有什么網(wǎng)站,當(dāng)時只找到一個在上的 wangcity個人主頁,但沒有多少資料,而且現(xiàn)在都已經(jīng)關(guān)閉了。當(dāng)時就有想法,自己也辦 一個Ada網(wǎng)站,促進(jìn)Ada在國內(nèi)的推廣,可惜自己功力太淺(現(xiàn)在也不怎么樣),而且當(dāng) 時感覺自己過于才疏學(xué)注,將大力花在了英語、社會科學(xué)上,于是經(jīng)濟(jì)學(xué)、曾國藩家書 、 劍橋中國史等書的地位就相當(dāng)高,而自己又是倒篷透頂?shù)闹攸c(diǎn)中學(xué)學(xué)生,時間上也很不 夠。直至今年初,越來越感覺國內(nèi)學(xué)術(shù)風(fēng)氣之糟糕,一味跟著當(dāng)前市場需求泄,不管長遠(yuǎn)利 益:在淸華圖書館檢索時,

3、發(fā)現(xiàn)Ada的書都是以前的古董了,至此才決左硬著頭皮寫一份 中文教材。由于自己也沒有什么經(jīng)驗(yàn)可言,一路上是摸著路邊的石頭過河,也屢次想放棄, 幸運(yùn)的是,大致的框架是在今天完成了。接下來的工作,大概就是擴(kuò)充已知的未添加的內(nèi)容, 同時聽取讀者反饋,對原有內(nèi)容做做修改。 由于自己才不過是高二學(xué)生而已,水平、經(jīng)驗(yàn)方而都很不足,因此希望讀到本教材的朋友能 多提意見,多抓錯誤(可不是什么客套話,的確很需要別人的意見),在此就先謝過了。同 時也希望能有志于推廣Ada在中國的使用的朋友能與我一起交個朋友,否則一個人孤單單 的實(shí)在乏味。 *本教材適宜對C、C+或其它語言以及操作系統(tǒng)有所了解的讀者。 *在內(nèi)容分布上

4、,第1章-第13章主要集中在語法部份,第14章以后的內(nèi)容主要集中在預(yù)定 義程序包上,基于Ada Reference Manual,讀者可自行跳過一些章節(jié),無須按部就班或直 接參看RM。 王振銘 2001年5月12日 第1章Ada簡介 1. 1 概述(Overview) 1. 2 Ada 的歷史(The History of Ada) 1. 3 與 C 和 C+ 的比較(Contrast :Ada and C, C+) 1.4 網(wǎng)絡(luò)資源(Internet Resources) 1.5 第一個程序仃he First Program) 第1章Ada簡介 1. 1 概述(Overview) Ada語言

5、最初設(shè)計(jì)是為了構(gòu)建長周期的、髙度可靠的軟件系統(tǒng)。它提供了一系列功能來泄義 相關(guān)的數(shù)據(jù)類型(type)、對象(object)和操作(operation)的程序包(package)程序包可以 被參數(shù)化,數(shù)拯類型可以被擴(kuò)展以支持可重用庫的構(gòu)建。操作既可以使用方便的順序控制結(jié) 構(gòu),通過子程序(subprogram)來實(shí)現(xiàn),也可以通過包含并發(fā)線程同步控制的入口 (entry)來 實(shí)現(xiàn)。Ada也支持單獨(dú)編譯(separate compilation),在物理層上支持模塊性。 Ada包含了很復(fù)雜的功能以支持實(shí)時(real-time),并發(fā)程序設(shè)計(jì)(concurrent programming) 0錯誤可以作

6、為異常(exception)來標(biāo)示,并可以被明確地處理。Ada也覆蓋 了系統(tǒng)編程(system programming):這需要對數(shù)據(jù)表示和系統(tǒng)特性訪問的精確控制。最后, 提供了預(yù)定義的標(biāo)準(zhǔn)程序包,包括輸入輸出、字符串處理、數(shù)值汁算的基本函數(shù)和隨機(jī)數(shù)生 成。 -譯自Ada Reference Manua 1Sectionl:General 1. 2 Ada 的歷史(The History of Ada) 為了更好的理解Ada,它的歷史有必要簡要地了解一下。 1974年時,美國國防部(DoD)意識到開發(fā)和維護(hù)嵌入式系統(tǒng)(固化在硬件中的系統(tǒng),如導(dǎo)彈 彈導(dǎo)系統(tǒng))耗費(fèi)了過多的時間,精力和資金。 當(dāng)時,

7、在使用的計(jì)算機(jī)語言有450多種,這增加了開發(fā)新系統(tǒng)以及培訓(xùn)程序員使熟悉現(xiàn)有 系統(tǒng)的時間和成本。維護(hù)工作也由于沒有標(biāo)準(zhǔn)化的工具(編借器,編譯器等)而受阻。所有 這些因素使DoD意識到它需要一門強(qiáng)大的語言,能被所有嵌入式電腦供應(yīng)商使用。 開發(fā)工作始于1975年,當(dāng)時DoD列舉了一系列的語言需求:但沒有一門現(xiàn)有語言指定了 這些特性,因此在1977年,DoD起草了一份建議,開發(fā)一門新的語言。不像COBOL這些 語言由專門的委員會制左,新語言是一場競爭的主題,在產(chǎn)業(yè)界和學(xué)術(shù)界的評估中產(chǎn)生。 在眾多競爭者當(dāng)中,有4家被選中以完成進(jìn)一步的工作。最終只剩下Cii-Honeywell Bull 公司。這門語言被

8、命名為Ada。設(shè)計(jì)小組由Jean Ichbiah領(lǐng)導(dǎo),對語言全權(quán)負(fù)責(zé)。 在1983, Ada成為了一個ANSI標(biāo)準(zhǔn)ANSI/MIL-STD-1815A。此年成為一個ISO標(biāo)準(zhǔn)。 在參考手冊中左義的語言通常稱為LRM或ARM (Ada Reference Manual)在Ada的相關(guān)書 籍和編譯器的報(bào)錯信息中經(jīng)常出現(xiàn)手冊內(nèi)容的引用。對于任何Ada站點(diǎn),參考手冊都是推 薦的:雖然很難閱讀,但它是所有Ada問題的最權(quán)威解釋(一個小組正在澄淸語言立義中 已發(fā)現(xiàn)的語義不淸的內(nèi)容)。 Ada也經(jīng)過了一次修正,即1995的新的ISO標(biāo)準(zhǔn)。新標(biāo)準(zhǔn)修正了 Ada83的很多缺陷,并 進(jìn)一步擴(kuò)展了它的功能(在修正工

9、作中,有個臨時的標(biāo)準(zhǔn),即Ada9x,不少Ada文章是在這 段時間寫的,因此有些內(nèi)容在細(xì)節(jié)上可能與Ada95有所區(qū)別,但主要原理差不多)。 為了防止Ada編譯器的不兼容版本的擴(kuò)散,Ada Joint Program Office (控制Ada語言的 執(zhí)彳亍部門,于1998年10月1日關(guān)閉,見Ada Joint Program Office closed)采取了 不尋常的做法-他們注冊Ada商標(biāo)。除非通過他們的兼容性測試,編譯器廠商不允許出售 Ada編譯器。這在不久以后放松了,保護(hù)協(xié)議變成了 Validated Ada。因而產(chǎn)生的Ada 確認(rèn)證書被限制在一定的時間內(nèi)并有一個期滿時間。當(dāng)時間過期后,

10、該編譯器不能再被標(biāo)記 為Validated Ada編譯器。通過這種方式,AJPO確保當(dāng)前市場上的編譯器與當(dāng)前標(biāo)準(zhǔn)相 一致。 目標(biāo)是使所有的Ada程序能在所有系統(tǒng)上被編譯-在這點(diǎn)上,AJPO比英它語言小組做得好。 上述內(nèi)容基本上是從Quick Ada翻譯過來的(以前翻譯該教材“半途而廢”的殘留品,直接 引用一下了),Ada語言的詳細(xì)歷史細(xì)節(jié)見The History of Ada。 1. 3 與 C 和 C+ 的比較(Contrast : Ada and C, C+) 由于Ada出生年月遲了一點(diǎn),而且目前的操作系統(tǒng)基本上由C,C+寫成,導(dǎo)致Ada在“平 民層”的推廣比較糟糕,至今還不是很流行,Wh

11、y Ada isnt Popular 文對此有比較詳細(xì) 的解釋。而Ada愛好者們?yōu)榱孙@示Ada的優(yōu)越性(這種心情相當(dāng)能理解),將Ada與C, C+做了一系列比較,英結(jié)果反正綜和指數(shù)都是Ada高,這方而文章有不少,如Comparing Development Costs of C and Ada Contrasts: Ada 95 002 procedure Hello is 003 begin 004 Ada. Text.IO. Put CHello World!); 005 Ada. Text_I0. New_Line; 006 end Hello; 先介紹一下在本教材中代碼的一些問題:每行

12、代碼前的000,001等數(shù)字表示該代碼是第幾 行,只為了講解方便,在實(shí)際源代碼中是不存在的;With, procedure等保留字(reserved word)都用粗體表示,以示區(qū)別:有些字是用斜體表示,表示該字是用其它有效字符替換。 現(xiàn)在讓我們分析上述的簡單程序: 000標(biāo)示該程序文件名為hello, adb,在程序中并不需要:一是注釋符,表示從其所在位 置至行尾都是注釋,對程序沒有什么影響,與C的/* */類似。 0011 Ada. Text_I0 是預(yù)定義的一個程序包(package) : with package_name 和 C 的 include功能差不多。 002-006是程序的

13、主體部份。與C下的main函數(shù)類似,Ada也需要一個主過程(main procedure),在這個例子中是過程Hello。過程的用法和上例一樣,都是 procedure procedure_name is statementsl; begin statements2; end procedure_name; statementl可以是變量、常量、函數(shù)、過程等的聲明:statements2是過程procedure_name 要執(zhí)行的語句,對象的聲明不能在這部份;end后的不是必需的,但為了 程序的可讀性,應(yīng)加上。 003, 004分別輸岀Hello World!和新行

14、符。Put 和 New.Line 都是 Ada. Text.IO 里 的過程。 但上7例調(diào)用過程Put和New.Line的方法比較羅嗦,因此我們也可以使用use語句: 000 一一 filename:hello. adb: 001 with Ada. Text_I0; use Ada. Text_I0; 002 procedure Hello is 003 begin 004 Put CHello World!); 005 New_Line; 006 end Hello; 這樣Ada編譯器就能在程序包Ada. Text_I0中自動搜尋Put, New_Line,而無需用戶指左 它們所在的準(zhǔn)確位

15、置。 我們在將上例略微改動以下,以使讀者了解一下聲明部份: 000 - filename:hello. adb 001 with AdaText_I0; use AdaText_I0; 002 procedure Hello is 003 Str:String :二Hello World!; 004 begin 005 Put(Str); 006 New.Line; 007 end Hello; 在is和begin之間,聲明了一個字符串變量Str,它的初始值為Hello World。String 是預(yù)定義的字符串類型。上述的聲明方式和Pascal差不多。 現(xiàn)在我們對Ada程序長的什么樣已有了基

16、本的認(rèn)識,下而需要了解幾個術(shù)語。一個Ada程 序是由一個或多個程序單元組成(program unit) 一個程序單元可以為: 1. 子程序(subprogram) , 義一些可執(zhí)行運(yùn)算。過程(procedure)和函數(shù)(function)都是 子程序。 2. 程序包(package),泄義一些實(shí)體(entity)。程序包是Ada中的主要分組機(jī)制,類似 于C的函數(shù)庫,Mo du la的module。 3. 任務(wù)單元(task unit),與線程類似,定義一些計(jì)算,然后并發(fā)執(zhí)行。 4. 保護(hù)單元(protected unit),在并發(fā)計(jì)算中協(xié)調(diào)數(shù)據(jù)共享,這在Ada 83中不存在。 5. 類屬單元(

17、generic unit),幫助構(gòu)建可重用組建,和C+的模板類似。 后3類屬于高級話題,在后而的章節(jié)中我們會依次介紹。程序單元又可為兩部份: 1. 聲明部份(declaration) o左義對其它程序的接口,有些可用資源可以被用戶使用,與C 下的.h文件相似。 2. 主體部份(body) o是聲明部份的具體實(shí)現(xiàn),等價(jià)與C的.c文件。 其中程序包(package)和子程序(subprogram)是用的最廣泛的2個程序單元。大部份Ada程 序基于一堆程序包,在以一個主過程(main proceudre)來開始Ada程序。 第二章基本元素與特性 2. 1 概述(Overview) 2. 2 詞法元素

18、(Lexical Element) 2. 3創(chuàng)建數(shù)據(jù)類型和子類型(Create Types and Subtypes) 2. 4 標(biāo)量類型(Scale Types) 2. 5數(shù)據(jù)類型屬性(Attributes) 2. 6 類型限制和類型轉(zhuǎn)換(Type Qualification and Type Conversion) 2. 7 表達(dá)式和運(yùn)算符(Expressions and Operators) 第2章基本數(shù)據(jù)類型和表達(dá)式(Basic Types and Expressions) 2. 1 槪述(Overview) 數(shù)據(jù)類型是一門計(jì)算機(jī)語言最基本的特性,表示一個對象的類型,是數(shù)字、字符或其它

19、類型。 由于Ada在數(shù)據(jù)類型上提供的強(qiáng)大處理能力,我們又不能很簡單地認(rèn)為數(shù)據(jù)類型僅是定義 一個對象的類型。在Ada里,數(shù)據(jù)類型可以自己創(chuàng)建,它的相關(guān)運(yùn)算符也可以自己立義, 同時又有數(shù)據(jù)類型屬性這項(xiàng)特性,具有相當(dāng)大的靈活性。學(xué)過其它的語言,特別是有C和 Pascal背景的朋友初次接觸時可能會感到有點(diǎn)新鮮。 創(chuàng)建新類型,是用戶自己左義數(shù)據(jù)類型,包括該類型的需稱、取值范用及相關(guān)操作;其中又 包括了派生類型和創(chuàng)建子類型,即以現(xiàn)有數(shù)據(jù)類型為母類型創(chuàng)建新類型,繼承母類型的一部 份屬性。 數(shù)據(jù)類型屬性,如同我們玩RPG游戲時的人物屬性:體力值、魔法值一樣,是說明該類型固 有的屬性,包括最小取值范圍、最大取值

20、范圍等等。 本章將會先介紹詞法元素以及創(chuàng)建數(shù)據(jù)類型的基礎(chǔ)性知識,然后是整型(integer).實(shí)型 (real)、字符型(character) 布爾型(boolean)、枚舉類型(enumuration)這幾種標(biāo)量類型, 最后則是相關(guān)的數(shù)據(jù)類型屬性、類型限制和類型轉(zhuǎn)換、表達(dá)式和運(yùn)算符。 2. 2 詞法元素(Lexical Element) Ada里的詞法元素與其它語言的左義還是有不小差別,下而按照RM95關(guān)于詞法元素的分類 來逐項(xiàng)介紹,包括標(biāo)識符、保留字.字符、數(shù)值文字等及它們的一些規(guī)則。 2. 2. 1 基本字符集(Character Set) Ada 95規(guī)定的標(biāo)準(zhǔn)字符集是Latin-1,

21、支持8位(基于ISO-8869)和16位(基于ISO-10646) 字符,在非標(biāo)準(zhǔn)模式下也可用本地字符集,具體情況取決于當(dāng)前的系統(tǒng)。(一般來說,涉及 字符時默認(rèn)是指Latin-1,程序幾乎都是用Latin-1字符集寫的) 字符在RM 95中是分成了三類:圖形字符(graphic character)、格式控制符(format effector) 其它控制符(other control function),它們所表示的范用為: 圖形字符包括字母(letter).數(shù)字(digit)、空格符(space)、特殊字符(special character)(例如#_) ); 格式控制符包括水平制表符(H

22、T)、垂直制表符(VT)、回車(CR)、換行(LF)、換頁(FF); 其它控制符則是除了格式控制符以外的控制符。 更詳細(xì)的內(nèi)容參見RM 95、ISO 8869, ISO 10646。 Ada是大小寫忽略的(除了字符和字符串中的實(shí)際內(nèi)容,如字符z和Z不相同,但標(biāo)識符 z和Z相同),但為了可讀性,一般來說變量劣或函數(shù)名首字母都會大寫,其余小寫,縮近 格式也需要引起注意。根據(jù)實(shí)際情況盡量保證可讀性。 為了兼容性,Ada95要求編譯器最少支持一行字符串和一個詞法元素的長度為200個字符 (不包括行尾符)。 Ada在字符集上并沒有很嚴(yán)格要求編譯器一左要怎樣,但應(yīng)該支持標(biāo)準(zhǔn)字符集。 2. 2.2 標(biāo)識符(

23、Identifier) Ada中不管是變疑、函數(shù)還是其它對象都需要一個名稱,這就叫做標(biāo)識符。如X、Count、 me就是簡單的標(biāo)識符。 Ada中的標(biāo)識符有以下一些注意點(diǎn): 1. 標(biāo)識符一泄要是字母開頭,接下去可以是數(shù)字和下劃線,結(jié)尾不能為下劃線。如Fig_、 丄ik、lme是不合法的。 2. 兩個連續(xù)的下劃線不能在一起,因?yàn)橛行┐蛴C(jī)可能會將兩個下劃線當(dāng)作一個處理。 3. 雖然單個字符可作為標(biāo)識符,但一般情況下不應(yīng)該濫用這項(xiàng)特性(我不知道這除了少敲 幾個字外,還有什么意義,想想數(shù)字0和字母0、數(shù)字1和字母1吧,絕對害死人的做法)。 4. 不能將保留字作為標(biāo)識符。在Ada 83中,標(biāo)識符包括了保

24、留字,但在Ada 95中保留 字從標(biāo)識符中分離了出來。 5.如上節(jié)所提及的,標(biāo)識符是不分大小寫的,但為了可讀性,請注意你對標(biāo)識符的命名。 2. 2.3 保留字(Reserved Word) 保留字在程序語法中有特殊的含義,不屬于標(biāo)識符范圍,這與C和Pascal等語言的左義 有所不同。Ada 95中的保留字如下: abort abs abstract accept access aliased all and array at begin body case constant declare delay delta digits do else elsif end entry exception

25、 exit for function generic goto if in is limited loop mod new not null of or others out package pragma private procedur亡 protected raise range record rem renames requeue return reverse select separate subtype tagged task terminate then type until use when while with xor 在以后的內(nèi)容中,我們會逐個解釋它們的含義及作用。Ada95

26、的保留字比原先添加了 6個: abstract, aliased, protected, requeue, tagged 和 until.雖然這可能會牽連到兼容性 問題,但通常也無須計(jì)較這點(diǎn)。 2. 2. 4 分隔符(Separator and Delimiter) Ada程序中,各元素之間需要空格符、格式控制符或EOF隔開。RM 95里將它們作為 separator,而delimiter則是指下列特殊字符(中文有點(diǎn)說不淸楚): 10#153#表示10進(jìn)制數(shù)153,等價(jià)與153: 16#90#,表示16進(jìn)制數(shù)90,其10進(jìn)值為144: 2. 2.6 字符文字(Character Literal

27、) 字符文字的表示是單個圖形字符在單引號中,如a表示小寫字母a, K表示大寫 字母K,表示一個單引號,表示一個空格。 2. 2.7 字符串文字(String Literal) 字符串是雙引號()之間的有序圖形字符。如What I said.就是一個字符串。表示空 字符串時直接用如果字符串中有雙引號,一個雙引號要用兩個來表示。如He said, I am hungry.” ”,而He said, I am hungry.或He said, I am hungry.是不 合法的。至于其它字符,如$%之類可以直接出現(xiàn)在兩個雙引號間。與C語言不同,Ada里 沒有與之相同的轉(zhuǎn)義字符,并且EOL不會算到字

28、符串中。 2. 2. 8 注釋(Comment) 注釋由兩個連字號(hyphen)(-)開始,直到行尾。可以岀現(xiàn)在程序的任一個地方,不影響程 序本身。例如: the comment; end;-一 processing of Line is complete. 2. 2. 9 Pragmas Pragma是編譯指示(compile directive),給編譯器指令如優(yōu)化程序,列表控制等。它的作 用往往不只影響一個編譯單元,而是整個程序。 Pragma是些預(yù)先定義的指令,如pragma Page, pragma List (OFF),編譯器也可擴(kuò)展RM 95 中pragmac我們先接觸List

29、, Page, Optimize這3個pragmao更多內(nèi)容我們會在以后接 觸。 pragma List(identifier); pragma Page; pragma Optimize(identifier); pragma List將identifier On或Off作為它的參數(shù)它指定編譯列表(listing of compilation)是繼續(xù)還是停止,直到在同一個編譯單元內(nèi),一個pragma List使用了相反 的參數(shù)。 pragma Page指泄在pragma后的程序正文在新頁開始(如果編譯器正在列表) pragma Optimize有Time, Space或Off 3個參數(shù),它的

30、影響區(qū)域直到pragama 所在編 譯單元的底部。Time和Space指示優(yōu)化時間還是優(yōu)化空間,Off則關(guān)閉優(yōu)化。 下而是簡單的例子: pragma List (Off): -關(guān)閉列表生成 pragma Optimize (Off):-關(guān)閉可選的優(yōu)化 不過,上述3個pragma是影響編譯過程用的,基本上用戶也用不著,以后涉及的 inline. Pure等pragma使用頻率倒挺髙。 2. 3創(chuàng)建數(shù)據(jù)類型和子類型(Creating Types and Subtypes) 使用變量時,除了以某標(biāo)識符作為變量的爼稱外,還要指左該變量的數(shù)據(jù)類型。一個數(shù)據(jù)類 型泄義了變量可接受的值以及所能執(zhí)行的操作。比

31、如說,一個數(shù)據(jù)類型為Age的變疑B訂1, Age的取值范圍為1.100,并只有+-這兩種操作,在這里,對象(object)為名為B訂1的 變量,它的取值在1.100之間(包括1, 100),值的變化只能通過+ -這些基本運(yùn)算符 (primitive operation)來實(shí)現(xiàn),而無法通過* /等其它運(yùn)算符。Ada中的數(shù)據(jù)類型,包括預(yù) 龍義類型,都是按照一立的格式在程序包中創(chuàng)建的。下而就介紹創(chuàng)建數(shù)據(jù)類型的一些基本內(nèi) 容,更多相關(guān)內(nèi)容會在以后見到。 2. 3. 1創(chuàng)建新的數(shù)據(jù)類型 創(chuàng)建一個新類型,需要使用保留字type, is, range。格式如下: type type_name is rang

32、e range_specifeat ion: type_name為新類型的拿稱,是一個合法標(biāo)識符:range_specifcation表示該類型的取值 范圍,表示方式為FirstLast,如1. 100 , -9 . 10 o 例如創(chuàng)建上面提及的一個新類型Age : type Age is range 1 100; 這樣就有了一個數(shù)據(jù)類型Age,取值范囤1 . 100。 有一點(diǎn)要注意:range_specfication 中 First 要大于 Last。如 type months is range 12 . 0,實(shí)際上months是一個空集(null),而不是所期望的0. . 12。 不同數(shù)

33、據(jù)類型之間是不能進(jìn)行混合運(yùn)算的,即使取值范弗1和運(yùn)算符一樣,看以下的程序例子: 000 一一 filename: putwageadb 001 with AdaText_I0; use AdaText_I0; 002 with Ada Integer_Text_IO; use Ada Integer_Text_IO; 003 procedure putwage is 004 type Age is range 1 100; 005 type Wage is range 1 100; 006 Bill_Age : Age := 56; 007 Bill.Wage: Wage := 56; 008

34、 begin 009 Put (Total wage is); 010 Put (Bill.Wage * Bill.Age); Oil New.Line; 012 end putwage; 001-002:使用軟件包Ada. Text.IO, Ada. Integer.Text.IO;兩個軟件包分別處理字符 類輸岀和整數(shù)輸出。 003: 008 1012泄義一個過程 putwage 0 004-005:立義新的數(shù)據(jù)類型Age, Wage,它們?nèi)≈捣秶紴?. 100。 006-007:聲明兩個變量Bill_Age,Bin_Wage,類型分別為Age和Wage,并賦予相同 初始值56。 009

35、-011:依次輸出字符串Total wage is,整數(shù) Bi linage 和 Bill.Age 的乘積,和一 個新行符(EOL) o 以上程序看上去亳無問題,但根本無法編譯通過。首先,沒有左義類型Age和wage的*操 作,因此Bill_Age和Bill_Wage無法相乘:第二,兩者數(shù)據(jù)類型不同,即使左義了*操作, 還是無法相乘。當(dāng)然也可使用后面提到的類型轉(zhuǎn)換,如果將010改為Put (Integer(Bi 1 l_wage) * Integer(Bill_Age),將會輸岀所要的 3136;但如果改成 Put (Integer (Bill_wage * 56),看上去也行的通,但實(shí)際結(jié)果

36、卻不是3136。不同數(shù)據(jù)之間不 能進(jìn)行運(yùn)算,要牢牢記住。(Integer是預(yù)先泄義的一個整型,Integer (Bi ll_Wage)是將 Bill_Wage強(qiáng)制轉(zhuǎn)換為整型)。 2. 3. 2派生類型 大家可能會發(fā)現(xiàn),如果像上面一樣創(chuàng)建一個截然不同的新類型,還需要泄義它的運(yùn)算符,使 用很不方便。因此,往往是派生現(xiàn)有的類型,英格式為: type type_name is new old_type range range_specification; type_name為新類型的名稱,是一個合法標(biāo)識符;range range_specif ication表示該類型 的取值范圍,是可選的,沒有的話表

37、示新類型的取值范圍和old_type 樣。 如將上例改為: 000 -一 filenameutwageadb 001 with Ada. Text_I0; use Ada. Text_I0; 002 with Ada Integer_Text_I0; use Ada Integer_Text_I0; 003 procedure putwage is 004 type Age is new Integer range 1 100; 005 type wage is new Integer; 006 Bill_Age : Age := 56; 007 Bi linage: Wag

38、e := 56; 008 begin 009 Put (Total wage is); 010 Put (Bilinage * Bill.Age); Oil New.Line; 012 end putwage; 上例還是不能編譯通過,因?yàn)榕缮愋椭焕^承母類型的屬性,如運(yùn)算符,不同的派生類型即 使母類型相同也還是屬于不相同的類型。但將10改為Put (Integer (Bill.wage * 56)則 能輸出正確的結(jié)果。但是派生類型使用還是麻煩了一點(diǎn),不同類型之間即使都是數(shù)字類型也 無法混合使用,只是自己不用創(chuàng)建運(yùn)算符省力了點(diǎn)。 2. 3. 3創(chuàng)建子類型 創(chuàng)建新類型和派生類型的麻煩從上文就可以感

39、受的到,特別是在科學(xué)計(jì)算這些有很多種小類 型的軟件當(dāng)中,上述兩種方法實(shí)在過于繁雜。這時子類型(subtype)就相當(dāng)有用,子類型的 定義格式為: subtype type_name is old_type range range_specification; type_name為新類型的夕i稱,是一個合法標(biāo)識符;range range_specif ication表示該類型 的取值范用,是可選的,沒有的話表示新類型的取值范囤和old_type 樣。 再將先前的例子改一下: 000 -一 putwage adb 001 with Ada. Text_I0; use Ada. T

40、ext_I0; 002 with Ada Integer_Text_IO; use Ada Integer_Text_IO; 003 procedure putwage is 004 subtype Age is Integer range 1 100; 005 subtype Wage is Integer; 006 Bill_Age : Age := 56; 007 Bi linage: Wage := 56; 008 begin 009 Put (Total wage is); 010 Put (Bill.Wage * Bill.Age); Oil New.Line; 012 end p

41、utwage; 編譯通過,輸岀值為31360子類型不僅繼承母類型的屬性,而且和母類型、英它同母類型 的子類型可混合使用。 在前而的例子中的,我們都提到了取值范囤,這也是Ada的一項(xiàng)“特色”:Ada不同于C和 Pascal賦給一個變量超過其取值范圍的值或進(jìn)行不合法運(yùn)算,會輸出錯誤的值而不報(bào) 錯,與此相反,Ada程序在編譯時會提示錯誤,或在運(yùn)行Ada程序時產(chǎn)生Constraint_Error 異常(異常和C中的信號Signal差不多,詳見第9章異常(Exception),掛起程序,來 減少程序的調(diào)試時間。 2. 4 標(biāo)量類型(Scalar Type) 大部份語言,基本的數(shù)據(jù)類型如果按照該類型所表示

42、的數(shù)據(jù)類型來分,一般來說可分為整型 (integer),實(shí)型(real),布爾型(boolean),字符型(character)這四類,并以它們?yōu)榛A(chǔ) 構(gòu)成了數(shù)組,記錄等其它更復(fù)雜的數(shù)據(jù)類型。在程序包Standard中預(yù)左義了一些簡單數(shù)據(jù) 類型,例 女口 Integer , Long_Integer Float LongFloat , Boolean , Character , Wide.Character,以及這些數(shù)據(jù)類型的運(yùn)算符。下而我們除了學(xué)習(xí)上述的4種標(biāo)量類型 (Scalar Type)夕卜,還要學(xué)習(xí)一卜枚舉類型(Enumration) 由于Ada中布爾型和字符型都 是由枚舉類型實(shí)現(xiàn)的

43、,因此也可將這兩種類型認(rèn)為是枚舉類型。 2. 4. 1 整型(Integer) Integer 整型 一個整型數(shù)據(jù)能存放一個整數(shù)。預(yù)泄義的整型有Integer , Short_Integer , Short_Short_Integer Long_Integer , Long_Long_Integer 還 有 Integer 的 子類型 Positive , Naturalo RM95沒有規(guī)左Integer及其它整型的具體取值范國及英位數(shù),由編 譯器決左。只規(guī)左了沒多大意思的最小取值范圉,如要求一個Integer至少要為16位數(shù), 最 小取值 范圍為-32767. 32767 ( -2 * 15

44、+1 .2*15-1) 因 此還有 Integer_8, Integer_16, Integer_32, Integer_61這些指泄了位數(shù)的整型,以方便用戶。在 RM95里,也就是編譯器實(shí)現(xiàn)里,以上類型聲明格式為: type Integer is range implementation_def ined(Long_Integer flJtil一樣) subtype Positive is Integer range 1. Integer,Last; subtype Natural is Integer range 0. Integer,Last; (Integer,Last 表示 Inte

45、ger 的最 后一個值,即上限,見2. 5數(shù)據(jù)類型屬性) 程序System里左義了整數(shù)的取值范圍: Min_Int : constant := Long_Long_Integer,F(xiàn)irst; Max_Int : constant := Long_Long_Integer*Last; Modular 整型 還有一類整型是Modular,異于上而的整型。如果將Integer整型與C中的signed int 相類比,它們的取值范圍可包括負(fù)數(shù);那么Modular類型就是unsigned int,不能包含負(fù) 數(shù)。其聲明格式為: type tyep_name is mod range_specifica

46、tion; 其中的range_spec辻ication應(yīng)為一個正數(shù);type_name的取值范用為 (0. range_specification - 1)。 如下而類型Byte: type Byte is mod 256; 這里Byte的取值范圍為0 . 255。 Modular類型在程序包System也有常量限制,range_specification如是2的幕則不能大 1 Max_Binary_Modulus ,如不是幕的形式則不能大于Max_Nonbinary_Moduluso這兩個 常量的聲明一般如下: Max_Binary_Modulus : constant :二 2 * Lon

47、g_Long_Integer* Size; Max_Nonbinary_Modulus : constant := Integer* Last; 細(xì)心的讀者可能會發(fā)現(xiàn)上面兩個常量的值實(shí)際上是不一樣的,也就是說Modular類型實(shí)際 上有兩個不同的限制。RM95關(guān)于這點(diǎn)的解釋是,2進(jìn)制兼容機(jī)上,Max_Nonbinary_Modulus 的值大于Max_int很難實(shí)現(xiàn)。 2. 4.2 實(shí)型(Real) 相對于整型表示整數(shù),實(shí)型則表示浮點(diǎn)數(shù)。實(shí)型分為兩大類:浮點(diǎn)類型(floating point)和 圧點(diǎn)類型(fixed point)。它們之間的區(qū)別在于浮點(diǎn)類型有一個相對誤差;泄點(diǎn)類型則有一 個界

48、左誤差,該誤差的絕對值稱為delta。下而就分類介紹這兩類數(shù)據(jù)類型。 浮點(diǎn)類型(Floating Type) 浮點(diǎn)類型預(yù)左義的有 Float , Short_Float , Short_Short_Float , Long_Float , Long_Long_Float等,它們的聲明格式入I: type type_name is digits number range range_specification; digits number表示這個浮點(diǎn)類型精度,即取number位有效數(shù)字,因此number要大于0: range range_specification是可選的,表示該類型的取值范用。

49、下面是幾個例子: type Real is digits 8; type Mass is digits 7 range 0. 0 . 1.0E35; subtype Probability is Real range 0. 0 . 1. 0; Real表示精度為8位的符點(diǎn)數(shù)類型,它的取值范用由于沒給左,實(shí)際上由編譯器來決定: RM 95里關(guān)于這種情況是給出了安全范囤(safe range),取值范圍是-10. 0*(4*D). +10. 0*(4*D), D表示精度,此例中為 Probab訂ity是Real的子類型,精度也是8位,取值范圍0. 0.1.0; 程序包System左義了精度的兩個上

50、限:Max_Base_Digits和Max_Digits , 一般來說應(yīng)為 Max_Base_Digits : constant :二 Long_Long_Floatdigits; (H卩 Long_Long_Float 的精度) Max_Digits : constant := Long_Long_Float,digits; 當(dāng)range_specification指圧時,所左義類型的精度不能大于Max_Base_Digits;當(dāng) range_specification沒有指泄時,所定義類型的精度不能大于Max_Digitso 定點(diǎn)類型 立點(diǎn)類型主要是多了一個delta,它表示該浮點(diǎn)類型的絕

51、對誤差。比方說美元精確到0. 01 元(美分),則表示美元的數(shù)拯類型Dollar的delta為0.01,不像浮點(diǎn)型是近似到0. 01。 定點(diǎn)型的聲明格式有兩種: 普通怎點(diǎn)型:type type_name is delta de 11a_number_range range_specification; 十進(jìn)制左點(diǎn)型:type type_name is delta delta_number digits digit_number .range range_specification: 除delta delta_number夕卜,各部份意義與浮點(diǎn)型相同。 立點(diǎn)型中有一個small的槪念。立點(diǎn)數(shù)由一

52、個數(shù)字的整數(shù)倍組成,這個數(shù)字就稱為該泄點(diǎn) 數(shù)類型的small.如果是普通左點(diǎn)型,則small的值可以被用戶指圧(見下節(jié)數(shù)據(jù)類型屬 性),但不能大于該類型的delat:如果沒有指世,small值由具體實(shí)現(xiàn)決定,但不能大于 delta。如果是十進(jìn)制定點(diǎn)型,則small值為delta, delta應(yīng)為10的幕,如果指定了該 定點(diǎn)型的取值范圍,則范圍應(yīng)在-(10*digits-l)*delta. +(10*digits-l)*delta 之間。 看一下下例: type Volt is delta 0. 125 range 0. 0. 255. 0; type Fraction is delta Sys

53、tem. Fine_Delta range -1. 0. 1. 0; type Money is delta 0. 01 digits 15; subtype Salary is Money digits 10; 2.4.3 布爾型(Boolean) 邏借運(yùn)算通常需要表示是和非這兩個值,這時就需要使用布爾型。Ada中的布爾型與 Pascal中的類似,是True和False兩個值。布爾型屬于枚舉數(shù)據(jù)類型,它在程序包 Standard中定義如下: type Boolean is (True, False); 習(xí)慣于C語言的朋友在這里需要注意一下,Boolean的兩個值True, False和整型沒

54、有什 么關(guān)系,而不是C語言中往往將True泄義為值1, False為2。 2. 4. 4 字符型(Character) Ada83最初只支持7位字符.這條限制在Ada95制訂前已經(jīng)放松了,但一些老編譯器如 Meridian Ada還是強(qiáng)制執(zhí)行.這導(dǎo)致在一臺PC上顯示圖形字符時岀現(xiàn)問題;因此,在一般 情況下,是使用整型來顯示Ascii 127以后的字符,并使用編譯器廠商提供的特殊函數(shù)。 在Ada95里,基本字符集已由原來的ISO 646標(biāo)準(zhǔn)的7位字符變?yōu)镮SO 8859標(biāo)準(zhǔn)的8位 字符,基于Latin-1并且提供了 256個字符位宜。Ada95同樣也支持寬字符ISO 10646, 有2*16個的

55、字符位宜。因此現(xiàn)代編譯器能很好地處理8位字符和16位字符。 7位字符在已經(jīng)廢棄的程序包Standard. Ascii內(nèi)泄義。在程序包Standard內(nèi)預(yù)左義的字 符型Character和Wide_Character分別表示Latin-1字符集和寬字符集,類型 Wide_Character已經(jīng)包含了類型Character并以它作為前256個字符。程序包 Ada. Characters. Latin_l 和 Ada. Characters. Wide_Latin_l 提供了 Latin-1 字符集的可 用名稱,Ada. Characters. Handling則提供一些基本的字符處理函數(shù)。具體內(nèi)容

56、見第14 章字符和字符串處理。 從下例可以了解一下字符型: 000 -一 filename: putaadb 001 with Ada. Text_IO; use Ada. Text_IO; 002 procedure puta is 003 subtype Sma 1 l_Character is , b, c, d; 004 Level : Sma1l_Character := * a ; 005 begin 006 Put (You level is); 007 Put (Level); 008 New.Line; 009 end puta; 003:創(chuàng)建了一個字符類型Small_Cha

57、racter,包含a, b, c, d四個字母:如C語言一樣, 使用字符時需加 004聲明變量Level,類型為Sma 1 Character,值為字母a。 上面這個例子主要還是說明一下字符類是怎樣左義的,但Character和Wide_Chracter實(shí) 際實(shí)現(xiàn)卻不是這么簡單。 2. 4. 5 枚舉類型(Enumeration) 有時候我們需要一個變量能表示一組特左值中的一個。如today這個變量,我們希望它的 值是 Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday 其中的一個, 這時枚舉類型就相當(dāng)有用,上述情況中就

58、可以創(chuàng)建新類型Day,如下: type Day is ( Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday); 然后聲明變量today的數(shù)據(jù)類型為Day: today : Day ; 這樣 today 就能接受 Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday 這幾個值中的任意一個。 前面提及的類型Character , Wide_Character, Boolean都是枚舉類型,也按照下而給岀的 格式聲明: type type_name is

59、 (elememt_list): element_list需列舉岀該類型所有的可能值。 Ada能自動檢測上下文,因此大部份情況下能分辨不同枚舉數(shù)據(jù)類型下的枚舉元素,如再聲 明一個類型Weekend: type Weekend is ( Saturday, Sunday); 或 subtype Weekend is range Saturday Sunday; 賦給上例中的變量Today值為Sunday時,不會產(chǎn)生歧義:但在有些情況下,Ada無法分 辨枚舉元素時則會產(chǎn)生問題,這時就要使用類型限制,詳見26類型限制和類型轉(zhuǎn)換 Ada中的基本數(shù)據(jù)類型就講到這里,實(shí)際上本節(jié)是基于上一節(jié)內(nèi)容的擴(kuò)展,說穿

60、了還是 創(chuàng)建數(shù)據(jù)類型。Ada在數(shù)據(jù)類型處理上提供的強(qiáng)大功能在接下的章肖里我們將會接觸的更 多,在這方面Ada的確比其它大部份語言做的好多了,熟悉C , Pascal的朋友大概會感到 相當(dāng)有意思。 2. 5數(shù)據(jù)類型屬性(Attributes) 數(shù)據(jù)類型屬性,表示某個數(shù)據(jù)類型的具體特征-一取值范用,最小值,最大值,某數(shù)在該類 型中的位置應(yīng)該說是相當(dāng)有用的起碼不像C語言,還要翻翻系統(tǒng)手冊才能知道 某個數(shù)據(jù)類型的具體定義。這些屬性的用法和調(diào)用函數(shù)一樣,也可以認(rèn)為它們就是預(yù)立義的 函數(shù)-一-雖然不怎么準(zhǔn)確,關(guān)于函數(shù),詳見第6章子程序:有些返回值為通用類型 (universal type)和字符串型。 數(shù)

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論