ADA 95教程 整数类型变量 - 1

我们的第一个整型变量

Example program ------> e_c03_p1.ada

                                       -- Chapter 3 - Program 1
with Ada.Text_IO, Ada.Integer_Text_IO;
use Ada.Text_IO, Ada.Integer_Text_IO;

procedure OneInt is

   Index : INTEGER;           -- A simple Integer type

begin

   Index := 23;
   Put("The value of Index is");
   Put(Index);                -- The default field width is 11 columns
   New_Line;
   Index := Index + 12;
   Put("The value of Index is");
   Put(Index, 8);
   New_Line;

end OneInt;

-- Result of execution

-- The value of Index is         23
-- The value of Index is      35

检查名为e_c03_p1.ada的程序,这是我们的第一个带有变量的示例程序。有些编程语言在使用变量之前不需要预先定义它。相反,您只需开始使用它,系统就有了一些机制,通过这些机制,它可以创建变量,并使其准备好供您使用。Ada要求您在使用之前明确定义每个变量。必须为变量指定一个名称,该名称是任何有效的标识符,并通过为变量指定一个类型来告诉编译器计划如何使用该变量。

 

什么是类型?

类型定义了变量可以分配给它的一组值,还定义了可以对变量执行的一组操作。Ada是一种强类型语言,因为它有非常严格的规则来限制如何使用变量。除非你非常仔细地遵循所有的规则,否则编译器不会给你一个可用的程序。Ada研究的一个主要部分涉及类型的研究以及如何使用类型作为编程辅助。

 

阿达的一条不动规则,从未被打破

Ada要求您使用的任何东西都必须事先定义好。这包括变量以及常量、过程、函数和所有其他实体。至少有一种语言,Pascal,提出了这个观点,但在一些情况下打破了它。ADA从不违反这条规则。

 

with和use语句

本程序第2行和第3行中的with和use语句包含Ada.Integer_Text_IO和Ada.Text_IO。术语Ada.Text_IO文件指一个同名的Ada包,它使我们能够将文本输出到监视器,包括字符、字符串、回车符和各种其他实体,以便我们可以生成一些格式化文本输出到监视器。它还提供了从键盘输入文本的功能,并提供了一些文件输入/输出功能。

术语Ada.Integer_Text_IO指的是另一个该名称的Ada包,它使我们能够以格式良好的方式将整型变量输出到监视器,因为它使我们能够控制使用了多少列,以及使用什么进制作为编号系统,例如二进制、十进制、十六进制和其他选项。with语句,因为它提到了这两个库包,使我们能够将文本和数字值输出到监视器,因为它使这两个库的副本都可供我们的程序使用。use语句,因为它提到了这两个包,使得在我们的程序中“使用”这些包非常容易。如果没有use语句,我们将不得不限定每个输入或输出语句,这将导致非常难看的代码,但是一些编程人员出于各种原因认为更可取。

我们将在本教程后面的部分详细介绍所有这些内容,但是您最好在初始编程工作的with语句和use语句中简单地包含适当的包,稍后再学习其他知识。一次只能吸收和理解这么多,本教程的作者希望通过将一些主题推迟到以后,尽可能简化您对Ada的学习。

 

如何声明变量?

回到刚刚的程序。要理解变量的定义,请检查手头的程序,特别是第7行。这声明了一个变量,我们称之为Index,它的类型是INTEGER,因此定义了可以分配给它的允许值范围。大多数16位计算机允许整数类型变量覆盖范围为-32768到32767。32位计算机的相应范围是从-2147483648到2147483647,但是Ada的定义允许在这两个范围内都具有灵活性。我们将在本章后面看到一种确定编译器限制的方法。

类型还定义了可以对变量执行的许多操作。关于这一点,我们稍后将作更多的讨论。整型用于声明标量变量,标量变量可以包含单个值。

整型INTEGER不是一个保留字,而是一个预定义的字,如果我们选择的话,我们可以重新定义它。我们不会这么做很长一段时间因为它可能会导致无数的问题,在一个程序。你应该知道,你有可能重新定义这个词,以及许多其他类似的预定义词,以表示完全不同于其预定义的含义。

在上一章中,我们说过程序的声明性部分在保留字is和begin之间,您会注意到我们确实在程序的该区域声明了名为Index的变量。第7行的最终结果是我们有一个名为Index的变量,它的类型是INTEGER。但是,它还没有包含有用的值。

 

如何在程序中使用变量?

在上一章中,我们还说可执行语句位于begin和end保留字之间,您将看到在这个范围内,在这个程序的第11行到第18行中有一些可执行语句。在第11行中,我们将23的值赋给变量Index,这是有效的,因为23在可以赋给整型变量的允许值范围内。

 

赋值运算符

组合:=可以理解为“获取的值”。第11行可以理解为,“Index获取23的值。”只有等号被保留,以供其他用途。实际上,如果我们说Index=23,只有当Index永远不变时,它在数学意义上才是正确的,但是由于它是一个变量,并且会被改变,所以等式不是真的。

我们已经成功地将值23赋给名为Index的变量,并且可以在Ada程序中以多种不同的方式使用它,但是我们将在这一点上仅说明非常简单的用法。

第12行指示系统向监视器输出一行文本,并将光标留在行的末尾。在第13行中,我们使用名为Put的预定义过程告诉系统在监视器上显示Index的值,该值为23。由于其定义,系统将在一个字段宽度中右对齐输出,该字段宽度取决于系统上整数的大小。整数Put()是在Ada.Integer_Text_IO包裹。第12行的Put()来自Ada.Text_IO文件包. 在本教程的后面,您将了解哪个Put来自哪个包以及为什么。第14行将光标返回到下一行的开头。New_Line过程来自Ada.Text_IO文件包。

 

我们的第一个算术

第15行包含我们的第一个算术语句,它将执行它看起来的操作,“Index获取Index的值,并将12添加到其中。”变量Index现在应该有一个存储值23+12,或35,我们通过告诉系统显示Index的新值来验证这个值。第17行中的数字8指示系统在8列宽的字段中显示右对齐的值。我们将在本教程后面详细讨论Put过程。如果您记得这些语句是按顺序执行的,那么遵循这个程序应该不会有任何困难。

编译并执行这个程序,注意观察索引的两个值显示在不同宽度的字段中。

 

现在我们使用很多整数

Example program ------> e_c03_p2.ada  

   -- Chapter 3 - Program 2
with Ada.Text_IO, Ada.Integer_Text_IO;
use Ada.Text_IO, Ada.Integer_Text_IO;

procedure MoreInts is

   Index_1                   : INTEGER;
   Index_2, Index_3, Index_4 : INTEGER;
   Cat                       : INTEGER := 12;
   Dog                       : INTEGER := -5;
   Pig, Hog, Sow             : INTEGER := 1000;

begin

   Index_1 := Cat + 4;                -- Index_1 is 16
   Index_2 := Dog - 3;                -- Index_2 is -8
   Index_3 := Pig * 7;                -- Index_3 is 7000
   Index_4 := Pig / 300;              -- Index_4 is 3
   Put("Index_1 = "); Put(Index_1); New_Line;
   Put("Index_2 = "); Put(Index_2); New_Line;
   Put("Index_3 = "); Put(Index_3); New_Line;
   Put("Index_4 = "); Put(Index_4); New_Line(2);

   Index_1 := 5 * Cat - Pig / 4 ;     -- Index_1 is -190
   Index_2 := (5 * Cat) - (Pig / 4);  -- Index_2 is -190
   Index_3 := Pig mod 3;              -- Index_3 is 1
   Index_4 := Pig rem 3;              -- Index_4 is 1
   Put("Index_1 = "); Put(Index_1); New_Line;
   Put("Index_2 = "); Put(Index_2); New_Line;
   Put("Index_3 = "); Put(Index_3); New_Line;
   Put("Index_4 = "); Put(Index_4); New_Line(2);

   Index_1 := abs(Dog);               -- Index_1 is 5
   Index_2 := Cat**3;                 -- Index_2 is 1728
   Index_3 := (Cat-5)**(abs(Dog)-2);  -- Index_3 is 343
   Index_4 := -Index_3;               -- Index_4 is -343
   Put("Index_1 = "); Put(Index_1); New_Line;
   Put("Index_2 = "); Put(Index_2); New_Line;
   Put("Index_3 = "); Put(Index_3); New_Line;
   Put("Index_4 = "); Put(Index_4); New_Line(2);

end MoreInts;




-- Result of execution

-- Index_1 =          16
-- Index_2 =          -8
-- Index_3 =        7000
-- Index_4 =           3
--
-- Index_1 =        -190
-- Index_2 =        -190
-- Index_3 =           1
-- Index_4 =           1
--
-- Index_1 =           5
-- Index_2 =        1728
-- Index_3 =         343
-- Index_4 =        -343

您将看到一个在程序中使用整数类型的多个变量的示例。第7行和第8行说明,您可以在一行上定义一个或多个变量。所有四个变量都是整数类型,可以在为特定编译器定义的整数变量范围内分配值。由于这些变量是在没有初始值的情况下创建的,因此每个变量都没有与它们关联的值。程序的可执行部分可以为每个程序分配一个值。名为Cat的变量也是一个整数类型变量,但创建后,它被分配了12的初始值。同样,创建Dog并初始化为-5的值。第11行中的三个变量被创建,并且每个变量都被分配了1000的初始值,是不是很神奇。

根据Ada的定义,就Ada编译器而言,第11行仅仅是三个不同行的简写,每行上都有一个变量声明。第8行也是如此。这是一个非常微妙的点,对手头的程序没有影响,但在我们以后开始研究数组时会有所不同。

 

现在来练习这些变量

通过检查程序的可执行部分,我们发现第15行到第18行中的四个算术运算应该是显尔易见的。请注意,第18行中的整数除法将导致截断,而不是舍入。这四个值以每行使用几个语句的格式显示在监视器的第19行到第22行中,这只是样式问题。

继续第24行和第25行,我们有更复杂的数学计算的例子,您应该很清楚。Ada 95参考手册(ARM)第4.5节详细介绍了数学运算符的优先顺序。优先顺序与其他语言相似,遵循常识。优先顺序的讨论将在本教程的下一章末尾给出。

第26行和第27行说明了mod和rem操作符的用法,每个操作符都返回整数除法运算后得到的余数。当涉及负数时,它们只在符号上有所不同,而且由于使用这些运算符时很少出现负数,因此除了简要说明这些差异外,将很少提及。

    mod - gets the sign of the second operator.    取模运算
    rem - gets the sign of the first operator.     求余运算

 

再来一波

在显示结果后,计算了另外四个值,第一个是第33行中变量Dog的绝对值。这不是函数,而是用保留字abs定义的操作。当我们来讨论重载操作符的教程的一部分时,它将是一个非常重要操作符。abs操作符返回作为参数给定给它的变量的绝对值。

第34行中的操作**是整数的指数化的图示。由于Cat的值为12,因此这行表示12的值提升到第3次幂。使用整数的指数化的唯一规则是,指数必须是整数类型值,并且不能为负值。注意,指数的零值是合法的。第35行是前面几个操作的组合,第36行是一元否定的说明。

确保编译并执行此程序并研究结果。

 

我们如何声明常数?

Example program ------> e_c03_p3.ada

                                       -- Chapter 3 - Program 3
with Ada.Text_IO, Ada.Integer_Text_IO;
use Ada.Text_IO, Ada.Integer_Text_IO;

procedure InitEx is

   Index_1, Index_2, Index_3    : INTEGER;
   This_Is_A_Long_Variable_Name : INTEGER;

   DOZEN  : constant INTEGER := 12;
   GROSS  : constant INTEGER := 12 * DOZEN;
   BIG_NO : constant         := 32_24_7;           -- This is 32247
   TWO    : constant         := BIG_NO - 3_22_45;  -- This is 2

begin

   Index_1 := GROSS;                    -- Index_1 is 144
   Index_2 := BIG_NO - TWO;             -- Index_2 is 32245
   Index_3 := TWO * GROSS;              -- Index_3 is 288
   This_Is_A_Long_Variable_Name := DOZEN * DOZEN - GROSS;
   Put("Index_1 = "); Put(Index_1); New_Line;
   Put("Index_2 = "); Put(Index_2); New_Line;
   Put("Index_3 = "); Put(Index_3); New_Line;
   Put("This_Is_A_Long_Variable_Name =");
   Put(This_Is_A_Long_Variable_Name); New_Line;

   Index_1 := 123E2;                    -- 12300
   Index_2 := 1_23e2;                   -- 12300
   Index_3 := 12_3e+2;                  -- 12300
   Index_1 := 2#10111#;                 -- Binary number
   Index_2 := 8#377#;                   -- Octal number
   Index_3 := 16#1FF#e1;                -- Hexadecimal number
   Index_1 := 12#A4#;                   -- Base 12 number

end InitEx;




-- Result of execution

-- Index_1 =         144
-- Index_2 =       32245
-- Index_3 =         288
-- This_Is_A_Long_Variable_Name =          0

以上程序示例,其中声明并使用了一些整型变量和整型常量。第7行和第8行现在你应该很熟悉了,但是当我们到达第10行到第13行时,我们看到有一些新的东西。因为它们的声明中有保留字constant,所以DOZEN和GROSS是整数类型常量。常量和变量之间的唯一区别是常量在程序执行期间不能更改。如果你正确地分析你的程序,这是Ada可以帮助你做的事情之一,因为如果你在程序执行过程中试图改变DOZEN的值,Ada会给你一个错误消息,你会立即消除一个bug。

注意,GROSS是以DOZEN定义的,从常数GROSS初始化时赋值。同样地,常数TWO在接下来的两行中用BIG_NO来定义。很明显,常量必须在声明时有一个初始化值赋给它。

 

还有两个定义

第12行和第13行在Ada编译器将忽略的数值中包含下划线。你可以把它们放在任何你喜欢的地方,使数字文字更可读,但你不能在每个数字之间放一个以上的下划线。在本例中,下划线位置的选择不当并没有增加读取数字的难度,而是说明了数字的位置。第12行和第13行省略了INTEGER一词,这使得这些常量的类型与其他两行略有不同,但在理解或理解这样做的理由之前,我们还需要进一步学习。

第17行到第25行,在程序的可执行部分,应该很容易让你理解,所以它们将留给你自己学习。

 

声明其它常量

第27到29行给出了使用指数表示法声明字面值的示例。指数可以用“E”的任意一种形式表示,它后面的数字对于整型文字来说必须是正数。第30行到第33行给出了使用除10以外其它进制表示法的示例。数字的基数在第一个“#”符号之前给出,可以是2到16之间的任何值,基数本身以十进制表示法给出。该值在“#”符号之间给出,后面可以跟一个可选的指数,指数在定义的基中给出。如果没有给出基数,则在本示例程序的第27行到第29行中假设基数为10。

这个程序的可执行部分你应该非常清楚。一定要编译并执行它。

 

---------------------------------------------------------------------------------------------------------------------------

原英文版出处:https://perso.telecom-paristech.fr/pautet/Ada95/a95list.htm

翻译(百度):博客园  一个默默的 *** 的人

posted @ 2021-03-15 19:41  yangjianfeng  阅读(205)  评论(0编辑  收藏  举报