16

我无法编译该程序,因为它似乎没有在 Put_Line 方法中打印整数变量和字符串。我在网上查看了源代码,当他们这样做时它就可以工作,所以我哪里出错了。谢谢你的帮助。

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

procedure MultiplicationTable is

    procedure Print_Multiplication_Table(Number :in Integer; Multiple :in Integer) is
        Result : Integer;   
    begin
        for Count in 1 ..Multiple
        loop
            Result := Number * Count;
            Put_Line(Number & " x " & Count & " = " & Result);
        end loop; 
    end Print_Multiplication_Table;
    Number  :   Integer;
    Multiple    :   Integer;

begin
    Put("Display the multiplication of number: ");
    Get(Number);
    Put("Display Multiplication until number: ");
    Get(Multiple);
    Print_Multiplication_Table(Number,Multiple);
end MultiplicationTable;`
4

4 回答 4

13

问题是您将 & 与字符串和整数一起使用。尝试以下方法之一:

Number在 put 的参数内替换为Integer'Image(Number)

或者分解Put_Line成你想要的组件;前任:

-- Correction to Put_Line(Number & " x " & Count & " = " & Result);
Put( Number );
Put( " x " );
Put( Count );
Put( " = " );
Put( Result);
New_Line(1);
于 2011-12-21T20:10:33.070 回答
5

您已经有了withanduse子句 for Ada.Integer_Text_IO,但实际上并没有使用它。

改变这个:

Put_Line(Number & " x " & Count & " = " & Result);

对此:

Put(Number); Put(" x "); Put(Count); Put(" = "); Put(Result); New_Line;

(我通常不会在一行中放置多个语句,但在这种情况下它是有道理的。)

请注意,Integer'Image在非负整数前面加上空格,我一直觉得这很烦人;Ada.Integer_Text_IO.Put不这样做(除非你要求它)。

可以定义重载"&"函数,如下所示:

function "&"(Left: String; Right: Integer) return String is
begin
    return Left & Integer'Image(Right);
end "&";

function "&"(Left: Integer; Right: String) return String is
begin
    return Integer'Image(Left) & Right;
end "&";

这将使您的原始Put_Line通话有效,但多次Put通话可能是更好的风格。

于 2011-12-21T21:29:05.033 回答
4

试试这个:

Put_Line(Integer'Image(Number) & " x " & Integer'Image(Count) & " = " & Integer'Image(Result));
于 2011-12-21T20:09:15.427 回答
0

基于 Keith Thompson 的答案(以及另一个问题中的评论),这是一个完整的 Ada 程序,它可以输出带有&、 using的字符串和整数Put_Line,但没有空格,Integer'Image否则会在前面添加:

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

procedure Main is

function lstrip(S: String) return String is
begin
    if S(S'First) = ' ' then
        return S(S'First+1 .. S'Last);
    else
        return S;
    end if;
end;

function "&"(Left: String; Right: Integer) return String is
begin
    return Left & lstrip(Integer'Image(Right));
end "&";

function "&"(Left: Integer; Right: String) return String is
begin
    return lstrip(Integer'Image(Left)) & Right;
end "&";

begin
   Put_Line("x=" & 42);
end Main;
于 2017-12-17T20:01:25.267 回答