Ada 程序设计语言(The Ada Programming Language)[第二集]- -


 

2.5.2 通用离散类型属性
离散类型包括整型和枚举型,除了上述的属性外,还有:
S'Pos   函数定义为: function S'Pos (Arg : S'Base) return universal_integer。返回 Arg 在 S 类型中的位置。
S'Val   函数定义为: function S'Pos (Arg : S'Base) return S'Base。返回 在 S 类型中位置为 Arg 的值。
例如:
type Color is (red, white, blue);
Color'Pos (White) = 2
Color'Val (1) = red
2.5.3 浮点类型属性
S'Digits  返回 S 类型的精度,为 universal_integer 类型。
2.5.4 定点类型属性
S'Small  返回 S 类型的 small 值,返回值为实型。
S'Delta 返回 S 类型的 delata,返回值为实型。
S'Fore  返回 S 类型所表示数的小数点前面的最小字符数量,返回值类型 universal_integer。
S'Alt    返回 S 类型所表示数的小数点后面的最小字符数量,返回值类型 universal_integer。
十进制定点型属性
S'Digits 返回 S 类型的精度。
S'Scale  返回 S 类型的标度 N,使 S'Delta=10.0**(-N)。
S'Round  函数定义为 function S'Round(X:universal_real) return S'Base;返回 X 的舍入值。
2.6 类型限制和类型转换(Type Qualification and Type Conversion)
先让我们看一下下面的例子:
这里明显有歧义,编译器也就无法自动判定 red,blue 到底是 primary 还是 rainbow 中的元素。因此我们就需要使用类型限制,精确指明元素: 
类型限制并不改变一个值的类型,只是告诉编译器程序员所期望的数据类型。由于 Ada 中提供了重载等特性,变量、子程序等重名的现象相当普遍,以后我们会碰到,解决方法和现在所讲的类型限制差不多,都是指明资源的准确位置。
类型转换我们也常常在使用,比方说 modular 类型的数的输入输出需要特定的程序包,初学者便可以将 modular 数转换成 Integer 数来处理(虽然不怎么好)。下面是一个 Integer 和 Float 类型数互相转换的例子:
这导致编译器插入合适的代码来做类型转换,实际效果就取决于编译器,而且一些类型之间的转换是禁止的;像上述的强行转换一般也不推荐,除非意义很明确,建议是使用上节所讲的数据类型属性、以及以后会碰到的相关子程序等来进行类型转换。
还有一种不进行检查的类型转换,我们会在以后遇到。
2.7 表达式和运算符(Expressions and Operators)
我们在先前的简单例子中对于一些表达式和运算符已有所认识,现在具体的讲解一下。
2.7.1 变量、常量声明
变量声明
变量声名的格式很简单:
variable_name : type;
    variable_name 是变量名称,只要是合法的标识符即可;type 为该变量的数据类型。声明时可以初始化变量值,也就只需在上述语句后添加 := value,:= 赋值运算符。如:
也可以在声明某一变量时指定它的取值范围。如:
常量声明
常量声明格式如下:
variable_name :constant type := value;
这里需要注意一下,考虑下列两种情况:
Cons1 :constant Integer := 8;
Cons2 :constant := 8;
虽然 Cons1 和 Cons2 都是常量 8,但数据类型是不一样的。Cons1 为 Integer 型的常量;Cons2 是 universal_integer 的常量。
2.7.2 运算符
Ada 下的运算符有以下几类:
逻辑运算符: and、or、xor;
关系运算符: =、/=、<、>、<=、>=
加减运算符:+,-,&
乘除运算符:*,/,rem,mod 
最高优先级运算符:**,not,abs
逻辑运算符
逻辑运算符适用于布尔型(即布尔型作为元素的数组)和Modular型的数。对于布尔型,and,or,xor 分别执行"与"、"或"、"异或"操作。对于 Mudular 类型的数,进行2进制逐位运算,该数的二进制位中 0 表示  False,1表示 True。具体参见下面的表格:
关系运算符
运算符=、/=、<、>、<=、>=的使用和大部份语言以一样,只要看一下例子即可,下面的有些未讲到的内容如字符串、访问类型,读者可翻看后面的章节:
X /= Y
"" < "A" and "A" < "Aa"   --True
"Aa" < "B" and "A" <"A  " -- True
My_Car = null;           --True,如果 My_Car 被设置为 null
My_Car = Your_Car        --True,如果 My_Car 和 You_Car 所指的是同一个对象
My_Car.all = Your_Car.all  --True,如果 My_Car 和 You_Car 所指的对象相同
 N not in 1..10 --范围测试,如果 N 在 1..10中,为 True
Today in Mon..Fri
Today in Weekday
加减运算符
+,-对于任何数值 T 都进行加法运算;&则是用于数组及字符串,如 "A"&"B" = "AB",在第3章我们会近一部讲述。
乘除运算符
*,/不用多说,很简单的乘除运算符。注意的是 rem 和 mod。假如 N 表示一个自然数,A,B有下列的关系:
A = (A/B)*B + (A rem B);
A = B*N + (A mod B);
因此:
最高优先级运算符
** 表示取某数的幂,如 2**2 = 4,3**7 = 2187;
not 则表示非,如 not True = Flase;
abs 为取绝对值,因此 abs(-34) =34;
第3章 数组(Array)
3.1 概述(Overview)
    数组是一种复合数据类型(composite type),包含多个同一种类型的数据元素。数组元素的名称用指定的下标表示,这些下标是离散数。数组的值则是一个由这些元素的值构成的合成值(composite value)。Ada 下的数组和其它语言很相似,只是多了一些“宽松”的规定,如无约束数组、动态数组,更加方便了用户。字符串类型 String,Wide_String 等则是数组元素为字符型的数组类型。
3.2 简单数组(Simple Array)
    数组类型的一般声明格式如下:
type

array_name is array (index specification) of type;

    array_name
    通常情况下,数组类型的使用方式和下例相同:
type
type Wages is array (Total) of Integer;-- 声明一个数组类型Wages,该类型有100个Integer元素。
Unit1 : Wages; -- 声明一个Wages类型的变量Unit1,具有100个Integer元素,下标取值 1 .. 100。

Total is range 1 .. 100; -- 声明一个整型 Total,取值范围 1..100。

    Wages 的声明也可改为
type Wages is array (1 .. 100) of Integer;
    效果是一样的,只是从维护性的角度来讲还是由 Total 来决定 Wages 的下标比较好。
 
    Ada 数组的index specification 是离散数,可以是一个范围,也可以是枚举类型,而不是单纯的一个表示数组大小的数值,这点和 C 、Pascal 有所区别 。数组元素的下标也不需要一定从 0 或从 1 开始,例如:
type
type Enrollment is array ( First_Name ) of Integer;
Var : Enrollment;  -- 数组 Var 有 3 个 Integer 元素,Var (Bill)、Var (Jack)、Var (Tom)。

type NO is array (-5 .. 100) of Integer;
X : NO; -- 数组 X 有 105 个 Integer 元素,第一个元素是 X (-5),最后一个是 X (100)。
3.3 匿名数组(Anonymous Array)
   如果嫌上一节中的 Unit1 的声明过程麻烦,也可以直接声明:
Unit1 : array (1 .. 100) of Integer;
    虽然更为精简了,但不推荐这样使用数组。这种数组没有明确的类型,被称为匿名数组(anonymous array),既不能作为子程序的参数,也无法同其它数组混用----即使声明一样。通常情况下应避免出现这种情况。
3.4 无约束数组(Unconstrained Array)
    像上面的例子,数组有几个元素在声明数组类型时已经决定,而不是在声明该类型的数组变量时决定,当然这样的好处是明确的知道每个数组会占用多少空间,控制起来也方便。但如同我们先前提及的一样,字符串类型 String,Wide_String 是数组类型,而用户输入的字符串却是不定的,如果它们的长度也预先定好了,使用字符串时无疑会造成内存空间浪费或不够用,这时一般是使用无约束数组---其声明和一般数组类型相同,只是没有规定它的长度---其长度在声明该类型的数组变量时决定。
    如 String 类型的声明:
subtype
type
type

Wide_String is array (Positive range <>) of Wide_Character; String is array (Positive range <>) of Character; Positive is Integer range 1..Integer'Last;

    < > 表示当声明该无约束数组类型的变量时,需要在( )中指定一个范围。如创建一个变量 Path_Name, 长度为1024:
Path_Name: String (1 .. 1024);
    如果没有指定该数组的大小,如:
Path_Name: String;
    是不合法的。
    当然范围也无须从 1 开始,Path_Name:String (7..1030) 和上例表示的字符串长度一样,只是下标不同而已。如果有一个函数 Get_Path (Path_Name :in out String),将当前路径名赋给参数 Path_Name,只要是 String 类型的参数就可以通用,长度也无须计较---函数出错或不处理不符合长度要求的字符串则是另一回事。
    这里强调一下字符串类型的赋值问题,假如将 Path_Name 赋予"/root/",可以在一开始就赋值:
Path_Name :String := "/root/";
    这样 Path_Name 的长度就自动成为6。但如果
Path_Name :String(1..10) := "/root/";
    则会引起错误(看上去很正确),因为还缺4个字符,应为
Path_Name :String(1..10) := "/root/    ";
或采用从理论上讲麻烦点实际上根本不会这么做的方案:
Path_Name:String (1..10);
Path_Name(1) := '/';
Path_Name(2) := 'r';
...
Path_Name(6) :='/';
这点是和其它语言有所不同,也是很不方便的一点。

  First_Name is( Bill, Jack, Tom );

3.5 动态数组 (Dynamic Array)
    数组大小也可以在运行时动态决定,而不是在程序的源代码中就决定。如:
X : Positive := Y;
Var : array (1 .. X) of Integer;
    这样 Var 的大小就由 X 来决定了,X 多大它也多大。只是这样做相当不妙,假设 Y 值是用户输入的,它的大小,甚止于输入的到底是什么,就根本无法确定,如果过大或负数或非Positive 类型都会产生麻烦。一般情况下还是用在子程序中:
procedure
    copy : String(Item'First..Item'Last) := Item;
    double: String(1..2*Item'Length) := Item & Item;   --Item'First,Item'Last等都是数组属性,& 是将两个字符串相连,参见下文。
begin

    ...
end Demo;Demo (Item :string) is

    这样的话,对于动态数组的操作与用户没有多大关系,保证了安全性。
3.6 多维数组(Multidimensional Array)
    前面提及的数组用法对多维数组也适用,只是多维数组的声明和元素的表示略有不同。如定义一个矩阵:
type Marix is array (1 .. 100,1..100) of Integer;
Var :Marix;---Var有 100x100个元素,分别为 Var(1,1),Var(1,2)....Var(100,99),Var(100,100)。
    上例的Matrix是二维数组,多维数组的 index_specification 由多个范围组成,每个范围由 , 隔开。
3.7 访问和设置数组(Access and Set Arrays)
   访问数组时,只需在添加在 index specification 范围内的下标,如 3.2 中的数组Unit1:
Unit1 (1) := 190; -- 赋予Unit(1)值 190;
Unit1 (7) := 210;
Unit1 (7) > Unit (1) -- 返回 True;
  数组的值虽然可以单个元素分别赋予,但这样做明显是开玩笑的麻烦。以上例中的Var:Enrollment 为例,一般情况下可以如下赋值:
Var := (15,14,13);
   结果为 Var (Bill) = 15, Var (Jack) = 14, Var (Tom) =13,( )中的值,按顺序赋给数组里的元素,因此数量也不能少:
Var := (15,14) -- 不合法
   当数组元素有名称时,例如元素下标是用枚举类型表示,也可以这样赋值:
Var := (Bill => 15, Jack => 14, Tom => 13);
   结果与上等同。但如果同时用以上两种表示法是不合法的,如:
Var := (Bill => 15, Jack => 14, 13); -- 不合法
   如希望相邻的一些元素都是相同值,如 Var (Bill)、 Var(Jack)、Var(Tom)都等于 15,则可以如下:
Var := (Bill .. Tom => 15);
   注意是 Bill 和 Tom (包括它们本身)之间的所有元素值为 15。
   而希望 Var (Bill) 等于 15,其余都等于14时,也可以如下:
Var := (Bill => 15, others => 14);
   这样 Var (Jack) = Var(Tom) =14。others 在有很多元素都要赋予相同值时是相当有用。
   如果将 Var 作为常量数组,则在声明该数组时就赋予初使值:
Var :constant Enrollment := (Bill => 15, others => 14);
最后看一下以下三种情况:
type

Vector is array (Integer range <>) of Float;
V: Vector(1 .. 5) := (3 .. 5 => 1.0, 6 | 7 => 2.0);-- [1]
V := (3 .. 5 => 1.0, others => 2.0); -- [2]
V := (1.0, 1.0, 1.0, others => 2.0); -- [3]

对于 [3],我们已经学过:V(1)=V(2)=V(3)=1.0,V(4)=V(5)=2.0。 但 [1] 和 [2] 却很特殊,在 [1] 中:V(1)=V(2)=V(3)=1.0,V(4)=V(5)=2.0;在[2]中V(3)=V(4)=V(5)=1.0,V(1)=V(2)=2.0。 [1]和[2] 的情况是 Ada95 新增的。像 [1] 的话,Ada83 会认为它是超过了数组的下标,产生异常 Constraint_Error,而在 Ada95 则是合法的,并且( )里面的值按顺序赋给数组的元素;[2] 在 Ada83 里也是不允许的,Ada95 允许先赋值给V(3),V(4),V(5),others 就默认是指 V(1) 和 V(2)。这3种情况很容易引起混淆,请读者注意一下。
3.8 数组运算符(Array Operations)
赋值
    整个数组的值可以赋给另一个数组,但这两个数组需要是同1种数组类型,如果是无约束数组,数组的元素的个数要相等。如:
My_Name   : String (1..10) := "Dale       ";
Your_Name : String (1..10) := "Russell  ";
Her_Name  : String (21..30) := "Liz       ";
His_Name  : String (1..5) := "Tim  ";
Your_Name := My_Name;
Your_Name := Her_Name; -- 合法的,它们的元素个数和类型相同
His_name  := Your_name; -- 会产生错误,类型虽然相同,但长度不同
等式与不等式
    数组也可以使用运算符 = ,/=,<=,>=,<,> ,但意义与单个元素使用这些运算符不一样。如:
Your_Name = His_Name --返回值为 False
    =,/= 比较两个数组中每个元素的值。如果两个数组相对应的元素值---包括数组长度都相等,则这两个数组相等,否则不相等。
Your_Name < His_Name --返回值为 True
    <=,>=,>,< 实际上比较数组中第一个值的大小,再返回True或Fasle,数组长度不一样也可比较。
连接符
    连接符为 & ,表示将两个数组类型相“串联”。如:
His_Name & Your_Name --返回字符串 "Tim Russell"
type
a : vector (1..10);
b : vector (1..5) := (1,2,3,4,5);
c : vector (1..5) := (6,7,8,9,10);
a := b & c;

vector is array(positive range <>) of integer;

则 a =( 1,2,3,4,5,6,7,8,9,10);如果再添一句:
a := a (6..10) & a(1..5);
则 a =(6,7,8,9,10,1,2,3,4,5)。这种情况也有点特殊,虽然 a(1..5) 看上去接在 a(10) 后面,实际上 a(6..10)和a(1..5)连接重新组合成一个10个元素的数组,再赋该值给 a。这种用法在 Ada83 里是认为不合法的,因为它认为 a(1..5) 是接在 a(10) 之后,而 a 只有10 个元素,不是 15 个。
3.9 数组属性(Array Attributes)
    数组属性有以下一些,A 表示该数组:
A'First 返回 A 的下标范围的下限。
A'Last 返回 A 的下标范围的上限。
A'Range 返回 A 的下标范围,等价于 A'First .. A'Last。
A'Length 返回 A 中元素的数目。
    下面的是为多维数组准备的:
A'First(N) 返回 A 中第 N 个下标范围的下限。
A'Last(N) 返回 A 中第 N 个下标范围的上限。
A'Range(N) 返回 A 中第 N 个下标范围,等价于 A'First(N) .. A'Last(N)。
A'Length(N) 返回 A 中第 N 个下标范围所包含元素的数目。
如:
Rectange : Matrix (1..20,1..30);
Length : array (1..10) of Integer;
因此:
Rectange'First (1) = 1; Rectange'Last (1) = 20;
Rectange'First (2) = 1; Rectange'Last (1) = 30;
Rectange'Length (1) = 20; Rectange'Length (2) = 30;
Rectange'Range(1) =1.. 20; Rectange'Range (2) = 1..30;
Length'First = 1; Length'Last = 10;
Length'Range = 1..10; Length'Length = 10;

是该数组类型的名称;index specification 指明该数组类型的元素下标;type 是已经定义了的一个数据类型,表示每个元素的数据类型。

职场 休闲 程序语言 编程语言

0

分享

微博 QQ 微信

收藏

上一篇:Ada 程序设计语言(The A... 下一篇:Ada 程序设计语言(The A...
hagejid

44篇文章,35W+人气,1粉丝

关注

Ctrl+Enter 发布

发布

取消

推荐专栏更多

微服务技术架构和大数据治理实战

大数据时代的微服务之路

共18章 | 纯洁微笑

¥51.00 669人订阅

订   阅

基于Python的DevOps实战

自动化运维开发新概念

共20章 | 抚琴煮酒

¥51.00 431人订阅

订   阅

猜你喜欢

我的友情链接 挂起C++,开始学习使用D语言 Java线程:线程的调度-休眠 我们不得不面对的中年职场危机 职场终极密籍--记我的职业生涯 用光影魔术手制作一寸照片(8张一寸) 我的IT职场生涯: 毕业4年,月薪过万 Linux关闭休眠和屏保模式 年薪从0到10万-我的IT职场经验总结 Windows7删除休眠文件hiberfil.sys节省大量C盘空间 致IT同仁 — IT人士常犯的17个职场错误 “跳槽加薪”现象,无奈的职场规则 智能合约编程语言-solidity快速入门(下) Android中适配器的notifyDataSetChanged()为何有时不刷新 如何在Spring Boot中使用Hibernate Natural ID 从hook开始聊聊那些windows内核数据结构 Scala的actor 正则性能调优 windows下kafka+ELK的日志系统 Nginx下,请求本机另外Host很慢

扫一扫,领取大礼包

0

分享

关注

hagejid

转载于:https://blog.51cto.com/hagejid/74842

Ada 程序设计语言(The Ada Programming Language)[第二集]相关推荐

  1. Ada 程序设计语言(The Ada Programming Language)[第一集]

    Ada 程序设计语言(The Ada Programming Language)[第一集]- - 版权(Copyright) <Ada 程序设计语言>的版权隶属于网站 VenusIC,允许 ...

  2. Ada 程序设计语言(The Ada Programming Language)[第四集]

    Ada 程序设计语言(The Ada Programming Language)[第四集]- - 第6章 子程序(Subprogram) 6.1 概述 (Overview) 一个程序是由一个或更多的子 ...

  3. Ada 程序设计语言(The Ada Programming Language)[第三集]

    Ada 程序设计语言(The Ada Programming Language)[第三集]- - 第4章 记录(Record) 4.1 概述(Overview)     记录则是由命名分量(named ...

  4. C程序设计语言(The C Programming Language)读书笔记

    文章目录 C程序设计语言 笔记 1 导言 1.1 入门 1.2 变量与算术表达式 1.3 for语句 1.4 符号常量 1.5 字符输入/输出 1.5.1 文本复制 1.5.2 字符计数 1.5.3 ...

  5. Ada程序设计语言初识

    Ada曾是美国国防部指定的唯一一款可用于军用系统开发的语言,旨在整合美军事系统中运行着450多种不同的程序设计语言,她是迄今为止最复杂.最完备的软件工具.开发始于1975年,最早是针对嵌入式和实时系统 ...

  6. 经典高清C语言 The C Programming Language

    https://pan.baidu.com/s/11QrfGXJ1gn65aogi5hF8bg bdc5

  7. 计算机程序设计语言是英文翻译,程序设计英语怎么说

    程序设计是给出解决特定问题程序的过程,是软件构造活动中的重要组成部分.随着硬件技术的飞速发展和软件规模的日益庞大,程序的结构.可维护性.复用性.可扩展性等因素日益重要.那么你知道程序设计用英语怎么说吗 ...

  8. R语言(The R Programming Language)

    R是用于统计分析.绘图的语言和操作环境.R是属于GNU系统的一个自由.免费.源代码开放的软件,它是一个用于统计计算和统计制图的优秀工具. R是统计领域广泛使用的诞生于1980年左右的S语言的一个分支. ...

  9. 读经典《C程序设计语言》(The C Programming Language)

    作为软工专业的学生,大三下,我重新开始学习C语言,为什么呢?因为我发现在大学生涯里,我花了很多时间去刷GPA,花了很多时间去做了很多无谓的事情,以至于马上就面临找实习.找工作.自己甚至连一门语言都没有 ...

最新文章

  1. lua创建文件和文件夹
  2. 输入字符串,包含数字,大小写字母,编程输出出现做多的数字的和
  3. 斯坦德机器人收购_斯坦德机器人合伙人兼CMO王茂林:人是公司发展根本,多数企业都死于合伙人...
  4. UltraGrid指定栏位实现Summary
  5. 上海应用物理所计算机,【中国科学报】上海应用物理所建立组合学原理DNA计算器原型...
  6. CCF-百度松果基金闭门研讨会成功举办,百度飞桨提供基金平台支持
  7. 网贷申请技巧,提高90%通过率
  8. 用于用户C语言标识符,下列可用于C语言用户标识符的一组是( )
  9. spark学习-76-目标:如何成为大数据Spark高手
  10. 如何用Python做舆情时间序列可视化?
  11. 箭头函数写法_初探ES6:箭头函数
  12. isis宣告网络_ISIS协议及其配置
  13. u-boot之ARM920T的start.S分析
  14. 815 - Flooded!
  15. 淘宝API接口系列,获取购买到的商品订单列表,订单详情,订单物流,收货地址列表,买家信息,买家token,卖出的商品订单列表
  16. PaddleOCR - (1) PPOCRLabel数据标注
  17. 跳转系统设置token
  18. 微信小程序之获取表单数据
  19. linux网络编程--Web Server and HTTP
  20. yolov3 NMS非极大值抑制

热门文章

  1. LeetCode 16 3Sum Closest
  2. PHP内核之PHP_FUNCTION宏定义
  3. 使用littleTools简化docker/kubectl的命令
  4. source insight 4.0.086破解
  5. 通过自动回复机器人学Mybatis---加强版
  6. MySQL 的存储引擎
  7. MyISAM存储引擎
  8. zoj 3812 状压dp
  9. VB.NET中的日期时间转换
  10. 将字符串转换成ListT