Ada-如何从一行输入读取数组?

Ada-如何从一行输入读取数组?,ada,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 Da

我的问题很简单,我有这样的输入

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中如何执行此操作?

您可以使用Get\u Line将整行作为字符串,然后使用Ada.Integer\u Text\u IO解析字符串:

使用Ada.Text_IO;使用Ada.Text\u IO; 使用Ada.Integer\u Text\u IO;使用Ada.Integer\u Text\u IO; 你好 行:字符串:=获取行; 值:整数; 最后:正:=1; 开始 而Last 示例输出:

$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
编辑:添加更通用的递归选项。这将从STDIN中读取一行,并将值递归地连接到一个数组中。它使用次要堆栈在GNAT中执行此操作

使用Ada.Text_IO;使用Ada.Text\u IO; 使用Ada.Integer\u Text\u IO;使用Ada.Integer\u Text\u Io; 你好 -需要一个数组返回类型 类型整数\数组是整数的数组正范围; -递归函数 函数Get_Ints返回整数数组为 值:整数; 开始 -使用整数\文本\ IO从STDIN读取; GetValue; -递归合并 返回整数数组的1=>Value&Get\u int; 例外 -我发现了不同版本的不同异常 -对于GNAT,所以使用其他方法覆盖所有版本 当其他人=> -这里使用Ada2012语法。如果不使用Ada2012 -然后在某个地方声明空变量 -然后把它还给这里 返回空:整数_数组1..0; 结束通话; 结果:整数数组:=获取整数; 开始 喂,世界!; 将_LineInteger'ImageResult'长度放入; 对于结果循环的E PutInteger'ImageE&; 端环; 结束问候;
您可以使用Get_Line将整行作为字符串获取,然后使用Ada.Integer_Text_IO解析字符串:

使用Ada.Text_IO;使用Ada.Text\u IO; 使用Ada.Integer\u Text\u IO;使用Ada.Integer\u Text\u IO; 你好 行:字符串:=获取行; 值:整数; 最后:正:=1; 开始 而Last 示例输出:

$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
编辑:添加更通用的递归选项。这将从STDIN中读取一行,并将值递归地连接到一个数组中。它使用次要堆栈在GNAT中执行此操作

使用Ada.Text_IO;使用Ada.Text\u IO; 使用Ada.Integer\u Text\u IO;使用Ada.Integer\u Text\u Io; 你好 -需要一个数组返回类型 类型整数\数组是整数的数组正范围; -递归函数 函数Get_Ints返回整数数组为 值:整数; 开始 -使用整数\文本\ IO从STDIN读取; GetValue; -递归合并 返回整数数组的1=>Value&Get\u int; 例外 -我发现了不同版本的不同异常 -对于GNAT,所以使用其他方法覆盖所有版本 当其他人=> -这里使用Ada2012语法。如果不使用Ada2012 -然后在某个地方声明空变量 -然后把它还给这里 返回空:整数_数组1..0; 结束通话; 结果:整数数组:=获取整数; 开始 喂,世界!; 将_LineInteger'ImageResult'长度放入; 对于结果循环的E PutInteger'ImageE&; 端环; 结束问候;
如果您知道有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;

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

如果您知道要阅读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;

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

即使这已经得到了回答,我还是想对Jere的答案做一些改进

更像是使用文件的End_而不是异常终止递归。此外,它使程序更清晰

此外,使用尾部调用递归而不是常规递归允许编译器执行一些优化

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;
夏娃 n虽然这个问题已经得到了回答,但我想对Jere的回答做一些改进

更像是使用文件的End_而不是异常终止递归。此外,它使程序更清晰

此外,使用尾部调用递归而不是常规递归允许编译器执行一些优化

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;


这真的是最简单的方法吗?我觉得我正在做的事情不应该这么复杂…这真的是最简单的方法吗?我觉得我正在做的事情不应该这么复杂…是的,我的假设是,因为他们使用stdin作为他们问题的一部分,实际输入将是一个随机数的整数。如果不是,这是更好的方法。是的,在我的问题中,输入总是10个值,谢谢你的帮助。思考之后,我想出了一个使用递归的更简单的解决方案。我在最后编辑了我的回答。是的,我的假设是,因为他们使用标准输入法作为他们问题的一部分,实际输入是一个随机数的整数。如果不是,这是更好的方法。是的,在我的问题中,输入总是10个值,谢谢你的帮助。思考之后,我想出了一个使用递归的更简单的解决方案。我在最后编辑了上面的回复。你的更新方法与所看到的指南相符。请注意,您可以有选择地处理异常,例如,当需要时出现数据错误|结束错误…时。您更新的方法符合所看到的指导。请注意,您可以有选择地处理异常,例如,当需要时出现数据错误|结束错误…我喜欢这样。我无法让它在我的系统上使用标准输入。有什么建议吗?快速示例:它看起来像在线编译器上的一个问题,或者像最近的另一个SO问题中的一个换行符问题,我不确定。在您的测试中,我可以很好地读取包含多个整数的单行,但我必须添加Skip_lineinput;在得到整数后,如果我想读多行。整数文本IO应该忽略行尾,如中所述,这很奇怪,我将进一步研究它。我猜还有一个换行问题。这在我试过的linux系统上也失败了。经过左右测试,我大约100%确定这是一个新问题。在Linux计算机上读取带有Windows换行符的文件时,代码失败。在我的电脑上,使用unix新行阅读和从stdin阅读一样有效。这段代码在Windows上也起作用。我编辑了这个问题的解决方案,但对这个解决方案不太满意。我喜欢它。我无法让它在我的系统上使用标准输入。有什么建议吗?快速示例:它看起来像在线编译器上的一个问题,或者像最近的另一个SO问题中的一个换行符问题,我不确定。在您的测试中,我可以很好地读取包含多个整数的单行,但我必须添加Skip_lineinput;在得到整数后,如果我想读多行。整数文本IO应该忽略行尾,如中所述,这很奇怪,我将进一步研究它。我猜还有一个换行问题。这在我试过的linux系统上也失败了。经过左右测试,我大约100%确定这是一个新问题。在Linux计算机上读取带有Windows换行符的文件时,代码失败。在我的电脑上,使用unix新行阅读和从stdin阅读一样有效。这段代码在Windows上也起作用。我编辑了这个问题的解决方案,但对这个解决方案不太满意。