ADA 95教程 字符和字符串类型
字符类型的快速回顾
Example program ------> e_c11_p1.ada
-- Chapter 11 - Program 1 with Ada.Text_IO; use Ada.Text_IO; procedure Chars is My_Char : CHARACTER; Another : CHARACTER := 'D'; begin My_Char := 'A'; if My_Char < Another then Put_Line("My_Char is less than Another."); end if; Put(My_Char); Put(Another); Put(My_Char); Put_Line(" character output."); My_Char := CHARACTER'SUCC(My_Char); -- 'B' My_Char := CHARACTER'FIRST; -- nul code My_Char := CHARACTER'LAST; -- del code end Chars; -- Result of execution -- My_Char is less than Another. -- ADA character output.
学习任何主题的最好方法是用一个例子,因此,请检查名为e_c11_p1.ada的程序中使用字符类型变量的一些例子。
类型字符是Ada中预定义的类型,定义为可打印的ASCII字符集,包括一些实际上不打印的字符。有关字符元素的完整列表,请参见Ada 95参考手册(ARM)的附录A.1。枚举类型变量可用的所有操作都可用于字符类型变量。为了说明它们的用法,我们在第7行和第8行中声明了两个字符类型变量,其中第二个被初始化为字母D。请注意,单引号定义了名为Another的变量被初始化为的字符类型文本。第12行中的变量My_Char分配了一个不同的文本值,在if语句中比较这两个变量。由于“A”的值小于“D”,因此第14行中的文本行被输出到监视器。
第17行到第20行显示了一些非常可预测的输出,这些输出作为字符输出的示例而包括,最后,第22行到第24行说明了CHARACTER 类型变量可用的一些属性。字符类型变量定义的属性与枚举类型定义的属性相同,所有属性都列在ARM的附录K中。
编译并执行这个程序以获得使用CHARACTER类型变量的感觉。
您可能希望查看第7章中名为e_c07_p3.ada的程序,以更新您对预定义字符类型的子类型和派生类型的声明。
字符串类型
Example program ------> e_c11_p2.ada
-- Chapter 11 - Program 2 with Ada.Text_IO; use Ada.Text_IO; procedure String1 is Line : STRING(1..33); NAME : constant STRING := ('J','o','h','n'); JOB : constant STRING := "Computer Programmer"; Address : STRING(1..13) := "Anywhere, USA"; Letter : CHARACTER; EXAMPLE1 : constant STRING := "A"; -- A string of length 1 EXAMPLE2 : constant STRING := ""; -- An empty string begin Line := "This is a test of STRINGS in Ada."; Put(Line); New_Line; Put(NAME); Put(" is a "); Put(JOB); Put(" and lives in "); Put(Address); New_Line(2); Address(3) := 'X'; -- Individual letters Address(4) := 'Y'; -- Individual letters Address(10..13) := NAME(1..4); -- A slice Put(Address); New_Line; end String1; -- Result of execution -- This is a test of STRINGS in Ada. -- John is a Computer Programmer and lives in Anywhere, USA -- -- AnXYhere,John
名为e_c11_p2.ada的程序演示了使用预定义类型字符串可以完成的一些操作。字符串是字符类型变量的数组,具有固定的长度,以元素号1或更高开始。索引使用POSITIVE类型。请注意,这个程序被称为e_c11_p2.ada,而不是更理想的名称字符串.ADA因为单词STRING 是Ada中预定义的单词,使用它作为程序名会使它无法正确使用。
第7行声明了一个由33个字符组成的未初始化字符串,而第8行声明了一个由4个元素组成的常量字符串,初始化为单词“John”,并以图形的方式说明了该字符串是由单个字符类型的元素组成的。第9行声明了另一个已初始化的常量,所有常量都必须是该常量才能使用。请注意,第8行和第9行不包含字符计数,计算机为我们计算字符数并提供数组的限制。
声明字符串变量
第10行定义了一个字符串变量,该变量将被初始化为给定的字符串。即使给定了初始化字符串,也必须为变量显式指定数组限制。不仅必须给出限制,初始化字符串中的元素数必须与定义为数组范围的元素数一致,否则将给出编译器错误。这是使用字符串时遇到的第一个困难,但随着我们的进步,还会有更多的困难。似乎计算机应该能够为我们计算变量中的字符,但由于Ada中使用了强大的类型检查,这无法完成。
字符串操作很困难
当我们到达程序的可执行部分时,我们给名为Line的字符串变量赋值一个字符串常量。同样,根据Ada的定义,字符串常量的字符数必须与变量行声明中的字符数完全相同,否则将发出编译错误。这是另一个似乎不必要的不便,在使用字符串,我们必须忍受。名为Line的变量显示在监视器的第18行中,其他一些常量也随之显示。请注意,第21行中的字符串文字只是另一个字符串常量,但它没有名称。最后,我们将数据分配给名为Address的字符串变量的几个单独元素,以说明它确实是一个数组,然后执行片分配,最后输出结果。应该注意的是,可以使用Put_Line来代替第30行和第31行中的两个单独的输出过程调用,但这只是个人喜好的问题。
编译并运行这个程序,看看输出是否和你对程序的理解完全一致。
字条串连接
Example program ------> e_c11_p3.ada
-- Chapter 11 - Program 3 with Ada.Text_IO, Ada.Characters.Latin_1; use Ada.Text_IO; procedure Concat is String4 : STRING(1..4); String7 : STRING(1..7); begin String7 := "CAT" & "FISH"; -- CATFISH Put(String7); New_Line; String4 := "CAT" & "S"; -- CATS Put(String4); New_Line; String4 := "S" & "CAT"; -- SCAT Put(String4); New_Line; String7 := String4 & "cat"; -- SCATcat Put(String7); New_Line; String7 := "Go" & Ada.Characters.Latin_1.CR & Ada.Characters.Latin_1.LF & "Car"; -- Go Put(String7); New_Line; -- Car String7(3..5) := "ldb"; -- Goldbar Put(String7); New_Line; end Concat; -- Result of execution -- CATFISH -- CATS -- SCAT -- SCATcat -- Go -- Car -- Goldbar
检查程序e_c11_p3.ada中的几个字符串连接示例。在第7行和第8行中声明了两个未初始化的字符串变量,并在整个程序中使用它们。
第12行说明了通过使用连接运算符“&”来连接三元素字符串和四元素字符串。四元素字符串附加到三元素字符串的末尾,形成一个七元素字符串,分配给变量String7。第21行演示了四元素变量与三元素常量的串联。
第24行是这里最有趣的赋值,因为它是四个字符串的串联,其中两个字符串每个只包含一个元素。“CR”和“LF”的值使得它们在发送到监视器时产生“回车”和“换行”,因此当输出String7时,它将在监视器的两个连续行上。所有字符的ASCII值在名为 Ada.Characters.Latin_1,,这就是为什么虚线表示法给出了这些常量的实际值。以这种方式使用点表示法将在本教程后面进行更全面的定义。一定要编译并运行这个程序,一定要理解结果。
字符串比较
Example program ------> e_c11_p4.ada
-- Chapter 11 - Program 4 with Ada.Text_IO; use Ada.Text_IO; procedure StrngCmp is MY_CAR : constant STRING := "Ford"; YOUR_CAR : constant STRING := "FORD"; Her_Car : STRING(1..8) := "Mercedes"; Rental : STRING(1..4); Lease : STRING(1..4); begin if MY_CAR /= YOUR_CAR then Put_Line("Case matters in a STRING constant or variable"); end if; Her_Car := "Ford "; -- This is still not equal to My_Car Rental := MY_CAR; Rental := "Junk"; Lease := Rental; If Rental = "Junk" then Put_Line("A variable can be compared to a string literal."); end if; end StrngCmp; -- Result of execution -- Case matters in a STRING constant or variable -- A variable can be compared to a string literal.
名为e_c11_p4.ada的示例程序将为您提供一些在ada中使用的字符串比较示例,因此您现在应该检查它。字符串声明对您来说并不是什么新鲜事,因此将不再对它们进行说明。
在第15行中,比较常量MY_CAR和YOUR_CAR的不等式,它们将不相等,因为某些字符的大小写不同,而且大小写在字符串表达式中很重要。字母“A”使用的ASCII值与字母“a”使用的ASCII值不同,因此它们不相同。要使字符串比较相等,所有元素必须与另一个字符串中的相应元素完全相同,并且元素数必须相同。因此,在执行第19行之后,分配给Her_Car的值仍然与常量MY_CAR中存储的值不同。如果您试图比较它们,您将得到一个编译错误,因为这两个字符串的长度不同,因此它们无论如何都无法进行比较。第24行说明了可以将变量与字符串文字进行比较。
第20行到第22行是根据Ada定义的法律声明示例。编译并运行这个程序并研究结果。
字符和字符串的属性
Example program ------> e_c11_p5.ada
-- Chapter 11 - Program 5 with Ada.Text_IO, Ada.Integer_Text_IO; use Ada.Text_IO, Ada.Integer_Text_IO; procedure CharInt is Char : CHARACTER; Index : INTEGER; Stuff : array(0..25) of CHARACTER; begin Char := 'A'; Index := 5 + CHARACTER'POS(Char); Put(Index, 5); Char := CHARACTER'VAL(Index); Put(Char); New_Line; Stuff(21) := 'X'; Index := 2 + CHARACTER'POS(Stuff(21)); Put(Index, 5); Stuff(0) := CHARACTER'VAL(Index); Put(Stuff(0)); end CharInt; -- Result of execution -- 70F -- 90Z
检查名为e_c11_p5.ada的程序,以获取如何将字符类型变量转换为整数类型变量的示例。属性POS和VAL的使用如图所示。为了将字符(例如“a”)递增到下一个值,必须将其转换为整数,递增,然后再转换回字符。当然,您可以始终使用SUCC属性来递增CHARACTER 类型变量。
这个程序应该是不言自明的。研究完之后,编译并运行它。
现在有两种字符串种类
随着ada95的升级,现在有两种字符串。我们在本章中讨论的字符串类型,以及一个新的WIDE_STRING类型。由于世界上有些语言中有超过256个不同的字符,而且Ada得到了国际标准组织(ISO)的批准,因此有必要提供处理更多字符的能力。定义了WIDE_STRING类型,它提供65536个不同的字符,并提供了WIDE_STRING库,它为每个字符使用较大的字符类型。宽字符类型的前256个字符与字符类型中的字符相同。剩下的字符可以定义为任何给定应用程序中使用的任何语言所需的字符。
一个新的,非常有用的库包
ADA95定义了一个新的字符处理库,用于基于文本的处理。名为Ada.Characters.Handling 由许多有用的子程序组成,用于文本处理。例如,它包含一个名为 Is_Upper的函数,该函数返回一个布尔值,指示作为参数传入的字符是否为大写。另一个函数To_Upper 将传入的字符的大小写更改为大写(如果是字母字符)。有一些函数可以检查空格、字符是否是数字、字符是否是特殊字符,以及许多其他有用的函数。我们鼓励学生学习编译器提供的这个软件包,特别是如果文本处理将是您编程工作的主要部分。
动态字符串即将出现
由于缺乏灵活性,您可能对Ada中字符串的使用感觉不太好,但是不要担心它们。Ada是一种可扩展语言,当我们进入第16章时,我们将有一个示例包,它将使您能够以您希望的方式使用字符串。一个相当广泛的动态字符串包将呈现给你,你将有能力进一步完善它,如果你这样想。实际上,您将能够扩展Ada语言。
ADA95有一个ADA83没有的改进,这个预定义的字符串包将在本教程后面介绍。
编程练习
1.编写一个程序,将您的名字声明为字符串常量,将您的姓氏声明为另一个字符串常量。把你的名字和姓连在一起,中间留一个空格,然后用一行字显示结果。您将发现用于结果的字符串变量的定义非常不灵活(Solution)
2.在e_c11_p5.ada中添加代码,使用POS和VAL属性增加名为Char的变量。然后添加额外的代码,通过使用SUCC属性来增加相同的变量(Solution)
---------------------------------------------------------------------------------------------------------------------------
原英文版出处:https://perso.telecom-paristech.fr/pautet/Ada95/a95list.htm
翻译(百度):博客园 一个默默的 *** 的人