Как вывести целые числа, используя метод Put_Line? - PullRequest
12 голосов
/ 21 декабря 2011

Я не могу заставить эту программу компилироваться, потому что она, кажется, не печатает целочисленные переменные вместе со строками в методе 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 ]

10 голосов
/ 22 декабря 2011

Проблема в том, что вы используете & со строками и целыми числами.Попробуйте выполнить одно из следующих действий:

Замените 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);
5 голосов
/ 22 декабря 2011

У вас уже есть предложения with и use для 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, вероятно, будут лучше.

3 голосов
/ 22 декабря 2011

Попробуйте это:

Put_Line(Integer'Image(Number) & " x " & Integer'Image(Count) & " = " & Integer'Image(Result));
0 голосов
/ 17 декабря 2017

Основываясь на ответе (и комментарии в другом вопросе) Кейта Томпсона, здесь представлена ​​полная программа Ada, которая может выводить строки и целые числа с &, используя 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;
...