2011-12-21 12 views
10

No puedo obtener este programa para compilar porque no parece imprimir variables enteras junto con cadenas en el método Put_Line. He revisado el código fuente en línea y funciona cuando lo hacen, así que, ¿dónde me estoy equivocando? Gracias por tu ayuda.¿Cómo se generan enteros utilizando el método 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;` 

Respuesta

9

El problema es que usted está utilizando & con cadenas y números enteros. Pruebe uno de los siguientes:

Reemplazar Number dentro del parámetro de opción de venta con Integer'Image(Number)

O romper el Put_Line en los componentes que desea; por ejemplo:

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

¿Por qué 'New_Line (1);' en lugar de simplemente 'New_Line;'? –

+0

Respuesta realmente clara.Gracias :) –

+0

@Keith - Honestamente: no recuerdo si el valor predeterminado era 1, o incluso si existía el valor predeterminado, pero sí recuerdo que había un parámetro. – Shark8

2

Prueba esto:

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

Creo que esta es la mejor solución hasta ahora a menos que el autor necesite dar salida a números en un formato específico como ceros a la izquierda, precisión decimal y similares. Aquí es claro qué tipos se utilizan y qué procedimientos se llaman. – mulander

+0

Se debe tener en cuenta el [personaje principal] (http://www.adaic.org/resources/add_content/standards/05rm/html/RM-3-5.html), mencionado [aquí] (http: // stackoverflow .com/a/8596634/230513). – trashgod

+1

Ese personaje principal puede parecer un dolor; pero piense en tener que mostrar signos en formato de columna de formato monoespaciado (para números con signo) ... es posiblemente más fácil y más corto tomar el primer + 1..último de la cadena que el prefijo a '' o '-' condicionalmente en el signo del valor dado – Shark8

5

Eres ya tienen with y use cláusulas de Ada.Integer_Text_IO, pero no estás de utilizarlo.

cambiar esta situación:

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

a esto:

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

(No me suelo poner múltiples sentencias en una sola línea, pero en este caso tiene sentido.)

Tenga en cuenta que Integer'Image antepone enteros no negativos a un espacio, algo que siempre me ha parecido enormemente molesto; Ada.Integer_Text_IO.Put no hace eso (a menos que lo solicite).

Usted podría definen sobrecargado "&" funciones, algo como esto:

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

lo que haría que su llamada original Put_Line válido, pero el múltiplo Put llamadas son probablemente mejor estilo.

+0

¿Por qué es preferible utilizar varias líneas 'Put'? Proceder de un estilo c-background 'printf' es más preferible, seguido de concatenación. Luego está el problema de concurrencia que presenta múltiples llamadas a 'Put '. Parece excesivo evocar una tarea para imprimir sobre un problema tan pequeño cuando aparece el comportamiento observado que 'Put' ya tiene un mecanismo similar detrás de él – Assimilater

+0

Ada no tiene' printf', y una solución tipo 'printf' es difícil de hacer -seafe La concatenación no funciona con enteros (a menos que sobrecargue el operador '" & "'). Si desea un formato especial (relleno, base numérica, etc.), puede aplicarlo en cada llamada 'Pon '. El nombre 'Put' se eligió deliberadamente como corto para que las llamadas múltiples no sean excesivamente detalladas. ¿Qué problemas de concurrencia introduce 'Put '? –

+0

Múltiples tareas de salida a la consola, no hay garantía de que no habrá un cambio de contexto entre las llamadas a 'Put'. Tipo de un ejemplo clásico de problemas de concurrencia y la necesidad de herramientas de exclusión mutua como mutexes y semáforos utilizados en clases de sistema operativo ... – Assimilater

0

Sobre la base de la respuesta (y un comentario en otra pregunta) de Keith Thompson, aquí es un programa completo de Ada que pueden cadenas de salida y enteros con &, utilizando Put_Line, pero sin los espacios que Integer'Image de otro modo Prefijo:

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; 
Cuestiones relacionadas