28/09/2002 19:22 28/09/2002 19:22 28/09/2002 19:22 Divide y venceras Divide y venceras en Ada Tema 5 with . . . ; -- Uso de otros algoritmos procedure Problema_Principal is function Subproblema_1 return Tipo is begin ... end Subproblema_1; Problema principal Subprogramas Javier Miranda, Francisco Guerra jmiranda@iuma.ulpgc.es fguerra@iuma.ulpgc.es Subproblema 1 (función) *1 Parámetros Formales (Nombre_Parámetro_1 : modo Tipo_Parámetro_1; Nombre_Parámetro_2 : modo Tipo_Parámetro_2; ...) Parámetros Reales (Valor_Parámetro_1, Valor_Parámetro_2, ...) *4 *3 28/09/2002 19:22 Funciones Modos de parámetros procedure Ejemplo_Función is A, B, C : Integer; function Cuadrado -- Sustantivo asociado al resultado (X : in Integer) -- Entrada return Integer -- Salida is -- Zona de declaraciones begin return X * X; end Cuadrado; begin A := Cuadrado (3); B := Cuadrado (A); C := 3 * Cuadrado (4) - 2 * Cuadrado (B - 4); end Ejemplo_Función; *5 28/09/2002 19:22 Paso de parámetros Parámetros de entrada Parámetro_Formal : in Tipo 28/09/2002 19:22 *2 Parámetros de salida Parámetro_Formal : out Tipo E.T.S.I. Telecomunicación Universidad de Las Palmas de Gran Canaria procedure Subproblema_2 is begin ... end Subproblema_2 begin ... end Problema_Principal; Subproblema 2 (procedimiento) Parámetros de entrada-salida Parámetro_Formal : in out Tipo *6 28/09/2002 19:22 procedure Ejemplo_Procedimiento is P, Q : Integer := 5; procedure Sumar -- Verbo asociado a la acción (Sumando_1 : in Integer; -- Entrada Sumando_2 : in Integer; -- Entrada Suma : out Integer) is -- Salida begin Suma := Sumando_1 + Sumando_2; end Sumar; begin Sumar (2 + P, 37, Q); end Ejemplo_Procedimiento; *7 28/09/2002 19:22 procedure Ejemplo_Procedimiento is P, Q : Integer := 5; procedure Sumar (Sumando_1 : in Integer; Sumando_2 : in Integer; Suma : out Integer) is . . . begin Sumar (2+P, 37, Q); -- Posicional Sumar (Sumando_1 => 2+P, -- Nombrado Sumando_2 => 37, Suma => Q); end Ejemplo_Procedimiento; * 10 Métodos de paso de parámetros procedure Ejemplo_Procedimiento_Bis is P : Integer := 5; Métodos para establecer la asociación: Posicional Nombrado Métodos de paso de parámetros: Por valor Por referencia Parámetros por omisión procedure Incrementar (X : in out Integer) is Auxiliar : Integer := X + 1; begin X := Auxiliar; end Incrementar; begin Incrementar (P); end Ejemplo_Procedimiento_Bis; *8 28/09/2002 19:22 Asociación de parámetros 28/09/2002 19:22 Procedimientos Procedimientos 28/09/2002 19:22 28/09/2002 19:22 Parámetros por omisión procedure Ejemplo3_Procedimiento is P : Integer := 5; procedure Incrementar (X : in out Integer; Cantidad : in Positive := 1) is begin X := X + Cantidad; end Incrementar; begin Incrementar (P); Incrementar (X => P, Cantidad => 12); end Ejemplo3_Procedimiento; *9 Estilo -gnatg Interfaz function Nombre ( . . . ); return T_Nombre_Tipo; procedure Verbo ( . . . ); Cuerpo function Nombre (...) return T_Nombre_Tipo is begin end Nombre; procedure Verbo (...) is begin end Verbo; * 11 * 12 28/09/2002 19:22 Interfaz package Ejemplo is function Nombre ( . . . ); return T_Nombre_Tipo; procedure Verbo ( . . . ); end Ejemplo; Uso del paquete with Ejemplo; procedure Uso_Ejemplo is begin end Uso_Ejemplo; Anidación y ámbito 28/09/2002 19:22 Paquetes Cuerpo package body Ejemplo is function Nombre (...) return T_Nombre_Tipo is begin end Nombre; A B C D procedure Verbo (...) is begin end Verbo; end Ejemplo; E F G * 13 28/09/2002 19:22 procedure A is function B is procedure C is ... end C; ... end B; procedure D is procedure E is procedure F is ... end F; procedure G is ... end G; ... end E; ... end D; ... end A; 28/09/2002 19:22 Sobrecarga de operadores = + * * 14 Recursión Fact (3) = 6 function Factorial (N : in Positive) 3 * Fact (2) = 6 return Positive is begin if N = 0 then 2 * Fact (1) = 2 return 1; else return N * Factorial (N - 1); end if; 1 * Fact (0) = 1 end Factorial; procedure Ejemplo_Sobrecarga is A, B, C : Integer; X, Y, Z : Float; R, S, T : T_Tipo; function * (Factor_1 : in T_Tipo; Factor_2 : in T_Tipo) return T_Tipo is begin ... end * begin C := A * B; Z := X * Y; T := R * S; end Ejemplo_Sobrecarga; 1 * 16 xor > abs rem >= not ** Operadores de Ada 28/09/2002 19:22 Ejemplo de Sobrecarga and or < <= & / mod * 17 function ''+'' (X,Y: in T_Complejo) return T_Complejo is begin function ''*'' (A,B: T_Vector return Integer is begin end ''+''; end ''*''; 25/09/02 1