2011-12-21 14 views
10

non posso trovare questo programma per la compilazione perché non sembra stampare variabili intere insieme con le stringhe nel metodo Put_Line. Ho guardato il codice sorgente online e funziona quando lo fanno, quindi dove sto andando male. Grazie per l'aiuto.Come esportare numeri interi usando il metodo 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;` 

risposta

9

Il problema è che si sta utilizzando & con le stringhe e numeri interi. Provare una delle seguenti opzioni:

Sostituire Number all'interno del parametro della put con Integer'Image(Number)

o rompere il Put_Line nelle componenti che si desidera; es:

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

Perché 'New_Line (1);' piuttosto che solo 'New_Line; '? –

+0

Risposta davvero chiara.Grazie :) –

+0

@Keith - Onestamente: non ricordavo se il valore predefinito era 1, o anche se il default esisteva, ma ricordavo che c'era un parametro. – Shark8

2

Prova questa:

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

credo che questa sia la soluzione migliore finora meno che l'autore ha bisogno di numeri in uscita in un formato specifico come zeri, precisione decimale e simili. È chiaro qui quali tipi vengono utilizzati e quali procedure vengono chiamate. – mulander

+0

Bisogna tener conto del [protagonista] (http://www.adaic.org/resources/add_content/standards/05rm/html/RM-3-5.html), citato [qui] (http: // StackOverflow .com/a/8596634/230513). – trashgod

+1

Quel protagonista può sembrare un dolore; ma pensare di dover mostrare segni di colonnare formato spaziatura fissa (per-i numeri con segno) ... è senza dubbio più facile e più breve per afferrare il primo + 1..last della stringa di prefisso di un '' o '-' condizionatamente sulla segno del valore dato. – Shark8

5

Sei già with e use clausole per Ada.Integer_Text_IO, ma non si sta usando esso.

Modifica questo:

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

a questo:

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

(normalmente non avrebbe messo più istruzioni su una linea, ma in questo caso ha senso.)

Si noti che Integer'Image antepone gli interi non negativi con uno spazio, cosa che ho sempre trovato molto fastidioso; Ada.Integer_Text_IO.Put non lo fa (a meno che tu non lo chieda).

È potrebbe define sovraccarico "&" funzioni, qualcosa di simile:

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 "&"; 

che renderebbe il vostro Put_Line chiamata originale valido, ma il multiplo Put chiamate sono in stile probabilmente meglio.

+0

Perché sono preferibili più linee 'Put'? Provenendo da un c-background è preferibile lo stile 'printf', seguito dalla concatenazione. Poi c'è il problema di concorrenza che più chiamate a "Put" introduce. Sembra eccessivo evocare un compito per la stampa su un problema così piccolo quando il comportamento osservato sembra che "Put" ha un meccanismo simile già dietro di esso – Assimilater

+0

Ada non ha 'printf', e una soluzione simile a' printf' difficile da rendere -seafe. La concatenazione non funziona con gli interi (a meno che non si sovraccarichi l'operatore "" & ""). Se si desidera una formattazione speciale (padding, base numerica, ecc.), È possibile applicarla in ogni chiamata 'Put'. Il nome "Put" è stato deliberatamente scelto per essere breve in modo che le chiamate multiple non siano eccessivamente prolisse. Quali problemi di concorrenza viene introdotto? –

+0

L'output di più attività sulla console non garantisce che non ci sia un cambio di contesto tra le chiamate a "Put". Un classico esempio di problemi di concorrenza e la necessità di strumenti di mutua esclusione come mutex e semafori usati nelle classi OS ... – Assimilater

0

Costruire sulla risposta (e un commento in un'altra domanda) da Keith Thompson, qui è un programma completo Ada in grado di stringhe di output e interi con &, utilizzando Put_Line, ma senza gli spazi che Integer'Image altrimenti anteporre:

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; 
Problemi correlati