2011-12-21 20 views
10

Nie mogę skompilować tego programu, ponieważ nie wydaje się on drukować zmiennych całkowitych razem z ciągami w metodzie Put_Line. Sprawdziłem kod źródłowy online i działa on, gdy robią to, gdzie jestem źle. Dzięki za pomoc.Jak wyprowadzać liczby całkowite za pomocą metody 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;` 

Odpowiedz

9

Problem polega na tym, że używasz & z łańcuchów i liczb. Spróbuj wykonać jedną z następujących czynności:

Wymień Number wewnątrz parametru wpuść z Integer'Image(Number)

Albo zerwać Put_Line do komponentów, które chcesz; ex:

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

Dlaczego 'New_Line (1);' zamiast po prostu 'New_Line;'? –

+0

Naprawdę czysta odpowiedź.Dzięki :) –

+0

@Keith - Szczerze mówiąc: Nie pamiętałem, czy domyślne było 1, czy nawet jeśli domyślne istniało, ale pamiętałem, że był parametr. – Shark8

2

Spróbuj tego:

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

Uważam, że jest to najlepsze rozwiązanie do tej pory, chyba że autor musi wypisać numery w określonym formacie, takim jak wiodące zera, dokładność dziesiętna i tym podobne. Jest jasne, jakie typy są używane i jakie procedury są wywoływane. – mulander

+0

Należy uwzględnić [główny znak] (http://www.adaic.org/resources/add_content/standards/05rm/html/RM-3-5.html), wspomniany [tutaj] (http: // stackoverflow .com/a/8596634/230513). – trashgod

+1

Ta wiodąca postać może wydawać się bólem; ale pomyśl o konieczności wyświetlania znaków w monospacedowym formacie kolumnowym (dla numerów podpisanych) ... jest to prawdopodobnie łatwiejsze i krótsze, aby pobrać pierwszy + 1.. wynik ciągu niż prefiks a '' lub '-' warunkowo na znak podanej wartości. – Shark8

5

Jesteś już with i use klauzule dla Ada.Integer_Text_IO, ale nie jesteś rzeczywiście go używać.

Zmień to:

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

do tego:

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

(normalnie nie byłoby umieścić wiele instrukcji w jednej linii, ale w tym przypadku ma to sens.)

Zauważ, że Integer'Image tworzy nieujemne liczby całkowite z spacją, coś, co zawsze uważałem za bardzo irytujące; Ada.Integer_Text_IO.Put nie robi tego (chyba, że ​​o to poprosisz).

Ty mógłby określają przeciążone "&" funkcje, mniej więcej tak:

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

co uczyniłoby oryginalny Put_Line wezwanie ważne, ale wielokrotny Put połączenia są prawdopodobnie lepiej styl.

+0

Dlaczego preferuje się wiele linii 'Put'? Pochodzenie z c-tła 'printf'-style jest najkorzystniejsze, a następnie konkatenacja. Następnie pojawia się problem współbieżności z wielokrotnymi wywołaniami wprowadzeń "Put". Wydaje się nadmierne, aby wywołać zadanie drukowania tak małego problemu, gdy zaobserwowane zachowanie pokazuje, że 'Put' ma podobny mechanizm już za nim – Assimilater

+0

Ada nie ma' printf' i 'printf'-like solution trudne do zrobienia -seafe. Konkatenacja nie działa z liczbami całkowitymi (chyba że przeciążono operatora "" i "'). Jeśli chcesz użyć specjalnego formatowania (padding, numeric base itp.), Możesz zastosować go w każdym wywołaniu "Put". Nazwa "Put" została celowo wybrana jako krótka, więc wiele połączeń nie jest zbyt szczegółowych. Jakie problemy ze współbieżnością wprowadza 'Put'? –

+0

Wiele zadań wyjściowych do konsoli, nie ma gwarancji, że nie nastąpi przełączanie kontekstu między wywołaniami "Put". Rodzaj klasycznego przykładu problemów z współbieżnością i potrzeba stosowania narzędzi wykluczających wzajemnie, takich jak muteksy i semafory używane w klasach OS ... – Assimilater

0

Opierając się na odpowiedź (i komentarz w innym pytaniu) od Keith Thompson, tutaj jest pełny program Ada, które mogą ciągi wyjściowe i całkowitymi z &, używając Put_Line, ale bez spacji że Integer'Image przeciwnym razie prepend:

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;