2011-12-21 29 views
10

Tôi không thể lấy chương trình này để biên dịch vì nó dường như không in các biến số nguyên cùng với các chuỗi trong phương thức Put_Line. Tôi đã xem xét mã nguồn trực tuyến và nó hoạt động khi họ làm điều đó vì vậy tôi đang đi sai. Cảm ơn bạn đã giúp đỡ.Làm cách nào để xuất số nguyên bằng cách sử dụng phương thức 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;` 

Trả lời

9

Vấn đề là bạn đang sử dụng & với chuỗi và số nguyên. Hãy thử một trong các cách sau:

Thay Number bên trong tham số của đặt với Integer'Image(Number)

Hoặc phá vỡ các Put_Line vào các thành phần mà bạn muốn; ví dụ:

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

Tại sao 'New_Line (1);' thay vì chỉ 'New_Line;'? –

+0

Câu trả lời thực sự rõ ràng.Cảm ơn :) –

+0

@Keith - Thành thật mà nói: Tôi không nhớ nếu mặc định là 1, hoặc thậm chí nếu mặc định tồn tại, nhưng đã nhớ có một tham số. – Shark8

2

Hãy thử điều này:

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

Tôi tin rằng đây là giải pháp tốt nhất cho đến nay trừ khi tác giả cần xuất số ở định dạng cụ thể như số 0 đứng đầu, độ chính xác thập phân và tương tự. Rõ ràng ở đây những loại đang được sử dụng và thủ tục nào được gọi. – mulander

+0

Một tài khoản phải có [ký tự dẫn đầu] (http://www.adaic.org/resources/add_content/standards/05rm/html/RM-3-5.html), được đề cập [ở đây] (http: // stackoverflow .com/a/8596634/230513). – trashgod

+1

Nhân vật hàng đầu đó có vẻ như là một nỗi đau; nhưng hãy suy nghĩ về việc phải hiển thị các dấu hiệu trong định dạng cột đơn cách (đối với các số đã ký) ... thì dễ dàng hơn và ngắn hơn để lấy +1 đầu tiên.last của chuỗi hơn tiền tố a '' hoặc '-' có điều kiện trên dấu của giá trị đã cho. – Shark8

5

Bạn đã có withuse khoản cho Ada.Integer_Text_IO, nhưng bạn không thực sự sử dụng nó.

Thay đổi này:

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

này:

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

(Tôi thường sẽ không đặt nhiều câu lệnh trên cùng một dòng, nhưng trong trường hợp này nó có ý nghĩa.)

Lưu ý rằng Integer'Image thêm vào các số nguyên không âm với khoảng trắng, thứ mà tôi luôn thấy rất khó chịu; Ada.Integer_Text_IO.Put không làm điều đó (trừ khi bạn yêu cầu).

Bạn thể xác định quá tải "&" chức năng, một cái gì đó như thế này:

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

mà sẽ làm cho gốc Put_Line cuộc gọi của bạn hợp lệ, nhưng nhiều Put gọi là phong cách có lẽ tốt hơn.

+0

Tại sao nhiều dòng 'Đặt' thích hợp hơn? Xuất phát từ một kiểu chữ 'printf' nền c là thích hợp nhất, tiếp theo là nối. Sau đó, có nhiều sự cố đồng thời mà nhiều cuộc gọi đến 'Đưa ra' giới thiệu. Có vẻ quá nhiều để gợi lên một nhiệm vụ in quá nhỏ một vấn đề khi quan sát hành vi xuất hiện rằng 'Put' có một cơ chế tương tự đã đứng sau nó – Assimilater

+0

Ada không có' printf', và một giải pháp 'printf' giống như khó tạo ra -sàn. Ghép nối không hoạt động với các số nguyên (trừ khi bạn quá tải toán tử '" & "'). Nếu bạn muốn định dạng đặc biệt (đệm, căn cứ số, vv), bạn có thể áp dụng nó trong mỗi lệnh gọi 'Đặt'. Cái tên 'Put' được chọn là cố tình để ngắn nên nhiều cuộc gọi không quá chi tiết. Những vấn đề đồng thời nào mà 'Put' đưa ra? –

+0

Nhiều tác vụ xuất ra bàn điều khiển, không có sự đảm bảo sẽ không có sự chuyển đổi ngữ cảnh giữa các cuộc gọi thành 'Đặt'. Loại ví dụ cổ điển về các vấn đề tương tranh và nhu cầu về các công cụ loại trừ lẫn nhau như mutexes và semaphores được sử dụng trong các lớp học hệ điều hành ... – Assimilater

0

Dựa trên câu trả lời (và một bình luận trong một câu hỏi khác) từ Keith Thompson, đây là một chương trình Ada đầy đủ mà có thể cho ra các chuỗi và số nguyên với &, sử dụng Put_Line, nhưng không có chỗ mà Integer'Image sẽ khác thêm vào trước:

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; 
Các vấn đề liên quan