ADA 95教程 示例程序1
为什么包括这一章?
讨论Ada提供的所有构造,然后简单地将您放在一个大型程序中间,并告诉您将它们放在一起,这对您来说是一种真正的磨砺。本章旨在通过简单的例子向您说明如何将这些主题结合起来构建一个有意义的程序。到目前为止,这些示例比我们已经检查过的任何程序都要大,但是它们仍然非常简单,应该很容易让您理解它们在做什么。
字符堆栈
Example program ------> e_c16_p1.ada
-- Chapter 16 - Program 1 package CharStak is procedure Push(In_Char : in CHARACTER); -- In_Char is added to the -- stack if there is room. procedure Pop(Out_Char : out CHARACTER); -- Out_Char is removed from -- stack and returned if a -- character is on stack. -- else a blank is returned function Is_Empty return BOOLEAN; -- TRUE if stack is empty function Is_Full return BOOLEAN; -- TRUE if stack is full function Current_Stack_Size return INTEGER; procedure Clear_Stack; -- Reset the stack to empty end CharStak; package body CharStak is Maximum_Size : constant := 25; Stack_List : STRING(1..Maximum_Size); -- The stack itself, purposely -- defined very small. Top_Of_Stack : INTEGER := 0; -- This will always point to -- the top entry on the stack. procedure Push(In_Char : in CHARACTER) is begin if not Is_Full then Top_Of_Stack := Top_Of_Stack + 1; Stack_List(Top_Of_Stack) := In_Char; end if; end Push; procedure Pop(Out_Char : out CHARACTER) is begin if Is_Empty then Out_Char := ' '; else Out_Char := Stack_List(Top_Of_Stack); Top_Of_Stack := Top_Of_Stack - 1; end if; end Pop; function Is_Empty return BOOLEAN is begin return Top_Of_Stack = 0; end Is_Empty; function Is_Full return BOOLEAN is begin return Top_Of_Stack = Maximum_Size; end Is_Full; function Current_Stack_Size return INTEGER is begin return Top_Of_Stack; end Current_Stack_Size; procedure Clear_Stack is begin Top_Of_Stack := 0; end Clear_Stack; end CharStak;
名为e_c16_p1.ada的程序演示了如何定义自己的堆栈以在程序中使用。堆栈是同质项目的列表,其增长和收缩方式使最后输入的项目始终是第一个删除的项目,因此它通常被称为后进先出(LIFO)列表。为了保持简单,我们只允许堆栈存储字符类型的变量,尽管它可以被定义为存储我们想要的任何类型的变量,甚至数组或记录。
规范包
规范包在第2行到第20行中定义,它为用户提供了使用字符堆栈包所需的所有信息。您将看到,用户不知道堆栈是如何实现的,甚至不知道堆栈可以增长到多大,除非他查看包的主体,如果我们对他隐藏主体,他就无法知道这些信息。他所能做的就是按照我们告诉他的方式使用这个包。在一个真实的系统中,我们必须告诉他堆栈可以增长多大,因为这对他设计软件时可能是有价值的信息,但出于我们的目的,我们不会让他知道最大的大小。当然,我们必须提供一种方法来确保他不能强迫堆栈超过其最大大小。过程Push的定义方式是,如果堆栈已满且字符不适合,那么它就不会被放到列表中。用户必须通过调用函数Is_Full检查堆栈是否已满,如果堆栈上没有额外的空间,该函数将返回布尔值TRUE。
对包规范的仔细研究将揭示,包含了足够的函数和过程来允许有效地使用字符堆栈。包体只是定义了执行规范中定义的工作所需的实际实现。再一次,您应该能够理解包体,因为这里没有任何对您来说是新的或陌生的东西。应该指出的是,这实际上并不是定义堆栈的一种非常有效的方法,因为它仅限于一种类型,但它作为一个示例很好地满足了我们的目的。当我们在本教程的第2部分中研究泛型包时,我们将看到一种更好的方法来定义堆栈,以便它可以与其他类型一起使用。本教程第2部分的第33章包含了重写为通用包的相同程序,它可以用于几乎任何数据类型。您应该编译此文件,以便将其与下一个示例程序结合使用。
如何使用字符堆栈?
Example program ------> e_c16_p2.ada
-- Chapter 16 - Program 2 with Ada.Text_IO, Ada.Integer_Text_IO; use Ada.Text_IO, Ada.Integer_Text_IO; with CharStak; use CharStak; procedure TryStak is Example : constant STRING := "This is the first test."; Another : constant STRING := "This is another test and this should not fit."; procedure Fill_The_Stack(Input_Line : STRING) is begin Clear_Stack; for Index in 1..Input_Line'LAST loop if Is_Full then Put_Line("The stack is full, no more added."); exit; else Push(Input_Line(Index)); end if; end loop; end Fill_The_Stack; procedure Empty_The_Stack is Char : CHARACTER; begin loop if Is_Empty then New_Line; Put_Line("The stack is empty."); exit; else Pop(Char); Put(Char); end if; end loop; end Empty_The_Stack; begin Put_Line(Example); Fill_The_Stack(Example); Empty_The_Stack; New_Line; Put_Line(Another); Fill_The_Stack(Another); Empty_The_Stack; end TryStak; -- Result of execution -- This is the first test. -- .tset tsrif eht si sihT -- The stack is empty. -- -- This is another test and should not fit. -- The stack is full, no more added. -- dna tset rehtona si sihT -- The stack is empty.
示例程序e_c16_p2.ada使用上一个程序中包含的字符堆栈。注意第4行和第5行中的with和use子句。这些命令告诉系统获取CharStak的副本,并使其可用于此程序。定义了两个字符串常量供以后使用,并定义了两个过程来填充堆栈,或向堆栈中一次添加一个字符串,然后一次清空一个字符。主程序在监视器上显示每个字符串常量,然后使用这两个过程反转字符串并在监视器上输出反转的字符串。你应该研究这个程序,直到你了解它是如何工作的,即使程序本身并不像单独编译包的概念那么重要。一定要编译并运行e_c16_p2.ada,看看它是否真正做到了您所期望的。
---------------------------------------------------------------------------------------------------------------------------
原英文版出处:https://perso.telecom-paristech.fr/pautet/Ada95/a95list.htm
翻译(百度):博客园 一个默默的 *** 的人