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;`
問題は、文字列と整数で&を使用していることです。次のいずれかを試してください。
Putのパラメータ内のNumber
を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);
Ada.Integer_Text_IO
にはすでにwith
句とuse
句がありますが、実際には使用していません。
これを変える:
Put_Line(Number & " x " & Count & " = " & Result);
これに:
Put(Number); Put(" x "); Put(Count); Put(" = "); Put(Result); New_Line;
(通常、1行に複数のステートメントを配置することはありませんが、この場合は意味があります。)
Integer'Image
は、負でない整数の前にスペースを付けることに注意してください。これは、私がいつも非常に煩わしいと感じていたものです。 Ada.Integer_Text_IO.Put
はそれを行いません(あなたがそれを求めない限り)。
あなたcouldオーバーロードされた"&"
関数を次のように定義します。
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
呼び出しの方がおそらく優れたスタイルです。
これを試して:
Put_Line(Integer'Image(Number) & " x " & Integer'Image(Count) & " = " & Integer'Image(Result));
Keith Thompsonからの回答(および別の質問のコメント)に基づいて、&
を使用し、Put_Line
を使用して、Integer'Image
を使用して文字列と整数を出力できる、完全なAdaプログラムを次に示します。 ] _それ以外の場合は先頭に追加します:
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;