呼叫" Ada.float_text_IO.get"从包中读取控制台的用户输入

时间:2015-11-07 18:54:28

标签: ada

我想在主文件创建的包文件中使用Ada.float_text_IO.Get :(。adb)&(。ads),使用以下过程从控制台读取用户输入:

procedure Get(Item : out Num; Width : in Field := 0);

任何地方都没有例子。帮助:)

2 个答案:

答案 0 :(得分:2)

这是一个完整的工作示例,其中包含一个包规范(floatget.ads)和body(floatget.adb)以及一个单独的程序(mainfile.adb),用于调用FloatGet包中的Read_Floats_From_Console函数。

Ada 95 RM section A.10.9 Input-Output for Real Types表示Ada.Float_Text_IO.Get跳过前导空格并从文件中解析各种格式的浮点字面值,可选地,如果您使用不带File : in File_Type;参数的表单,则可选将从控制台读取。

floatget.ads包规范的内容:

-- floatget.ads
--
-- FloatGet package specification defining procedure to read floats
-- from console

package FloatGet is
   procedure Read_Floats_From_Console;
end FloatGet;

floatget.adb包体的内容:

-- floatget.adb
--
-- FloatGet package body using Ada.Float_Text_IO.Get to read floats
-- from console

with Ada.Text_IO; use Ada.Text_IO;
with Ada.Float_Text_IO;

package body FloatGet is

   procedure Read_Floats_From_Console is
      Val       : Float;
      Sum       : Float := 0.0;
      N         : Integer := 0;
   begin

   Put_Line("Enter float values, one per line. Press CTRL-D when done.");

   Read_Loop:
      loop
         exit Read_Loop when End_Of_File;

         begin
            Ada.Float_Text_IO.Get (Val);
         exception
            when Data_Error =>
               Put_Line ("ERROR: Invalid float format");
               exit Read_Loop;
         end;
         Put ("Read value = ");
         Ada.Float_Text_IO.Put (Val);
         Put (", ");
         Ada.Float_Text_IO.Put (Val, Fore => 3, Exp => 0);
         Put (", ");
         Ada.Float_Text_IO.Put (Val, Aft => 2, Exp => 0);
         New_Line;
         Sum := Sum + Val;
         N := N + 1;
      end loop Read_Loop;

      Put_Line ("Number of values = " & Integer'Image(N));
      Put ("Sum of values = ");
      Ada.Float_Text_IO.Put (Sum, Exp => 0);
      New_Line;
   end Read_Floats_From_Console;

end FloatGet;

mainfile.adb的内容:

-- mainfile.adb
--
-- Main program calls FloatGet.Read_Floats_From_Console
--
-- Compilation: gnatmake floatget mainfile
--
-- Usage: ./mainfile
--
with FloatGet;

procedure MainFile is
begin
   FloatGet.Read_Floats_From_Console;
end MainFile;

如何编译...(在Ubuntu 14.04上使用gnat 4.8.4,4.9.3,5.2.0进行测试)

$ gnatmake floatget mainfile

示例运行说明了几个有效的浮点值...

$ ./mainfile
Enter float values, one per line. Press CTRL-D when done.
1
Read value =  1.00000E+00,   1.00000,  1.00
-1
Read value = -1.00000E+00,  -1.00000, -1.00
42
Read value =  4.20000E+01,  42.00000, 42.00
-42
Read value = -4.20000E+01, -42.00000, -42.00
.3
Read value =  3.00000E-01,   0.30000,  0.30
-.3
Read value = -3.00000E-01,  -0.30000, -0.30
2.0e3
Read value =  2.00000E+03, 2000.00000, 2000.00
-2.0e3
Read value = -2.00000E+03, -2000.00000, -2000.00
-16#1C.#e-1
Read value = -1.75000E+00,  -1.75000, -1.75
2#.11#e6
Read value =  4.80000E+01,  48.00000, 48.00
... Press CTRL-D here ...
Number of values =  10
Sum of values = 46.25000

这个例子并不依赖任何特定于gnat的东西,所以应该使用任何Ada 95编译器,尽管我目前无法使用gnat之外的其他编译器进行测试。

编辑简化为仅根据OP的请求从控制台读取。

答案 1 :(得分:1)

有两种选择:包装程序或重命名程序。

with Ada.Text_IO;
with Ada.Float_Text_IO;

procedure Main is

   package My_Float_Text_IO is
      procedure Get_1 (Item : out Float; Width : Ada.Text_IO.Field := 0);
      procedure Get_2 (Item : out Float; Width : Ada.Text_IO.Field := 0) renames Ada.Float_Text_IO.Get;
   end;

   package body My_Float_Text_IO is
      procedure Get_1 (Item : out Float; Width : Ada.Text_IO.Field := 0) is
      begin
          Ada.Float_Text_IO.Get (Item, Width);
      end;
   end;

   F : Float;

begin

   My_Float_Text_IO.Get_1 (F);
   My_Float_Text_IO.Get_2 (F);

end;

将规范代码放入.ads文件和body cody(实现代码)到.adb文件中。 您也可以在没有包的情况下将一个过程或函数放在.ads和.adb文件中。你也可以有一个没有身体包装的规格包。