2011-12-21 6 views
10

Put_Lineメソッドの文字列とともに整数変数を出力しないように見えるため、このプログラムをコンパイルできません。私はソースコードをオンラインで見てきました。ご協力いただきありがとうございます。問題は、あなたが文字列と整数で&を使用していることであるPut_Lineメソッドを使用して整数を出力する方法は?

Put_Line(Integer'Image(Number) & " x " & Integer'Image(Count) & " = " & Integer'Image(Result)); 

答えて

9

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;` 
+0

'New_Line;ではなく' New_Line(1);が必要なのはなぜですか? –

+0

本当に明確な答え。ありがとう:) –

+0

@Keith - 正直言って:私はデフォルトが1だったかどうか、またはデフォルトが存在していても覚えていませんでしたが、パラメータがあったことを覚えていました。 – Shark8

2

はこれを試してみてください。 次のいずれかを試してみてください。

Integer'Image(Number)

とプットのパラメータ内Numberを交換するか、あなたがしたいコンポーネントにPut_Lineを破ります。例:

-- Correction to Put_Line(Number & " x " & Count & " = " & Result); 
Put(Number); 
Put(" x "); 
Put(Count); 
Put(" = "); 
Put(Result); 
New_Line(1); 
+1

これは、著者が先行ゼロ、小数精度などの特定の形式で数値を出力する必要がない限り、これまでのところ最良のソリューションだと思います。どのタイプが使用されているか、どのプロシージャが呼び出されているかが明確になっています。 – mulander

+0

[先頭の文字](http://www.adaic.org/resources/add_content/standards/05rm/html/RM-3-5.html)を説明する必要があります。[here](http:// stackoverflow .com/a/8596634/230513)。 – trashgod

+1

その主役は痛みのように見えるかもしれません。記号付きの円柱形式(符号付き数字用)の記号を表示しなければならないと考える...文字列の最初の+ 1.を取り込むことは間違いなく、条件付きで接頭辞「a」または「 - 」よりも簡単です指定された値の符号。 – Shark8

5

あなたは既にAda.Integer_Text_IOためwithuse句を持っている、しかし、あなたが実際にそれを使用していません。

変更この:これに

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はそれをしません(あなたがそれを求めない限り)。

あなたこのよう"&"機能、何かを過負荷に定義することができます。

Put_Line呼び出しが有効になるだろう
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の呼び出しは、おそらくより良いスタイルです。

+0

なぜ複数の 'Put'行が望ましいのですか? 'printf'形式のc-バックグラウンドが最も適しており、続いて連結されています。それでは、 'Put'を複数回呼び出すと並行性の問題が発生します。観察された挙動が「Put」の背後に既にあるのと同様のメカニズムがあるように見えるときに、小さな問題で印刷するための仕事を思い起こさせると思われます。 – Assimilater

+0

Adaには 'printf'と' printf'のような解決策がありません - 安全です。あなたが ''& "'演算子をオーバーロードしない限り、連結は整数では機能しません。特殊な書式(パディング、数値ベースなど)が必要な場合は、それぞれの 'Put'コールでそれを適用できます。 「Put」という名前は意図的に短く選択され、複数のコールが過度に冗長でないようにしました。 Putにはどのような並行性の問題がありますか? –

+0

複数のタスクをコンソールに出力すると、 'Put'への呼び出しの間にコンテクストの切り替えがないという保証はありません。並行性の問題の古典的な例と、OSクラスで使用されるmutexやsemaphoresなどの相互排他ツールの必要性 – Assimilater

0

キース・トンプソンからの回答のビル(および他の問題のコメントが)、ここではその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; 
関連する問題