Как выводить целые числа, используя метод Put_Line?
Я не могу заставить эту программу компилироваться, потому что она не печатает целые переменные вместе со строками в методе 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;`
Ответы
Ответ 1
Проблема в том, что вы используете и со строками и целыми числами.
Выполните одно из следующих действий:
Замените 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);
Ответ 2
У вас уже есть предложения 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
Попробуйте следующее:
Put_Line(Integer'Image(Number) & " x " & Integer'Image(Count) & " = " & Integer'Image(Result));
Ответ 4
Основываясь на ответе (и комментарии в другом вопросе) от Кейта Томпсона, вот полная программа 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;