Ada-您如何从单行输入中读取数组?

时间:2018-12-08 19:28:25

标签: ada

我的问题很简单,我输入的内容如下:

0   0   0   1   1   1  -1  -1  -1   1

我需要将这些值存储到数组中,但我无法弄清楚。这就是我到目前为止所拥有的...

with Ada.Text_IO; use Ada.Text_IO;

procedure Main is
    type arr is array(1..10) of Integer;
    Data : arr;
begin
    for I in 1..arr'Length loop
        Data(I) := Integer'Value(Get_Line);
    end loop;
end Main;

我知道这是错误的,很明显为什么这不起作用。我正在尝试将多个值存储到单个整数中,我需要一种对输入进行迭代或一次加载所有值的方法。您将如何在Ada中做到这一点?

3 个答案:

答案 0 :(得分:5)

您可以使用Get_Line将整个行作为字符串获取,然后使用Ada.Integer_Text_IO来解析字符串:

[74]
[156, 89]
[153, 13, 133, 40]
[150]
[474, 277, 113]
[181, 117]
[15, 87, 8, 11]

之后,您可以将值加载到循环中的数组中,也可以随意加载。

示例输出:

with Ada.Text_IO; use Ada.Text_IO;
with Ada.Integer_Text_IO; use Ada.Integer_Text_IO;

procedure Hello is
    Line : String := Get_Line;
    Value : Integer;
    Last : Positive := 1;
begin

    while Last < Line'Last loop
        Get(Line(Last..Line'Last),Value,Last);
        Put_Line(Value'Image);  -- Save the value to an array here instead
        Last := Last + 1;    -- Needed to move to the next part of the string
    end loop;

end Hello;

编辑:添加一个更通用的递归选项。这将从STDIN中读取一行,然后将值递归连接到一个数组中。它使用辅助堆栈在GNAT中进行操作。

$gnatmake -o hello *.adb
gcc -c hello.adb
gnatbind -x hello.ali
gnatlink hello.ali -o hello
$hello
 0
 0
 0
 1
 1
 1
-1
-1
-1
 1

答案 1 :(得分:2)

如果您知道有10个元素需要阅读,则可以这样简单地完成操作:

with Ada.Text_IO; use Ada.Text_IO;
with Ada.Integer_Text_IO; use Ada.Integer_Text_IO;

procedure Hello is
   A: array (1..10) of Integer;
begin
   for V of A loop
      Get(V);
   end loop;
   for I in A'Range loop
      Put(I, 5);
      Put(": ");
      Put(A(I), 5);
      New_Line;
   end loop;
end Hello;

如果您实际上不知道要提前阅读多少个元素,请更新问题。

答案 2 :(得分:1)

即使已经回答了这个问题,我也想对Jere的回答进行一些改进。

使用End_Of_File而不是异常终止递归更像是Ada。另外,它使程序更清晰。

此外,使用尾调用递归代替普通递归可以使编译器执行一些优化。

function Get_Ints(input : in File_Type) return Integer_Array is
    function Get_Ints_Rec(accumulator : in Integer_Array) return Integer_Array is
        value : Integer;
    begin
        if End_Of_File(input) then
            return accumulator;
        else
            begin
               Get(input, value);
            exception
               when Data_Error => -- problem when reading
                  if not End_Of_Line(input) then
                     Skip_Line(input);
                  end if;
                  return Get_Ints_Rec(acc);
            end;
            return Get_Ints_Rec(accumulator & (1 => value));
        end if;
    end Get_Ints_Rec;

    acc : constant Integer_Array(1 .. 0) := (others => 0);
begin
    return Get_Ints_Rec(acc);
end Get_Ints;