从包中调用 "Ada.float_text_IO.get" 以从控制台读取用户输入
Calling "Ada.float_text_IO.get" from a package to read user input from the console
我想在创建的包文件中使用 Ada.float_text_IO.Get:(.adb)&(.ads) 从主文件中使用以下过程从控制台读取用户输入:
procedure Get(Item : out Num; Width : in Field := 0);
到处都没有例子。帮助:)
这是一个完整的工作示例,其中包括一个包规范 (floatget.ads) 和正文 (floatget.adb) 以及一个单独的程序 (mainfile.adb) 来调用 Read_Floats_From_Console FloatGet包中的函数。
Ada 95 RM section A.10.9 Input-Output for Real Types 表示 Ada.Float_Text_IO.Get 跳过前导空格并从文件中解析各种格式的浮点文字值,如果您使用不带 [=15= 的形式,则可选] 参数然后 Get 将从控制台读取。
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 的请求从控制台读取。
有两种选择:包装过程或重命名过程。
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 文件,将主体代码(实现代码)放入 .adb 文件。
您也可以只在 .ads 和 .adb 文件中放置一个程序或函数,而无需打包。没有body包也可以有规格包
我想在创建的包文件中使用 Ada.float_text_IO.Get:(.adb)&(.ads) 从主文件中使用以下过程从控制台读取用户输入:
procedure Get(Item : out Num; Width : in Field := 0);
到处都没有例子。帮助:)
这是一个完整的工作示例,其中包括一个包规范 (floatget.ads) 和正文 (floatget.adb) 以及一个单独的程序 (mainfile.adb) 来调用 Read_Floats_From_Console FloatGet包中的函数。
Ada 95 RM section A.10.9 Input-Output for Real Types 表示 Ada.Float_Text_IO.Get 跳过前导空格并从文件中解析各种格式的浮点文字值,如果您使用不带 [=15= 的形式,则可选] 参数然后 Get 将从控制台读取。
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 的请求从控制台读取。
有两种选择:包装过程或重命名过程。
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 文件,将主体代码(实现代码)放入 .adb 文件。 您也可以只在 .ads 和 .adb 文件中放置一个程序或函数,而无需打包。没有body包也可以有规格包