Divide y venceras Problema principal Subprogramas: procedimientos y funciones Javier Miranda, Luis Hernández, Francisco Guerra Subproblema 1 (función) [email protected] [email protected] [email protected] Subproblema 2 (procedimiento) *1 Divide y venceras en Ada with . . . ; -- Uso de bibliotecas procedure Problema_Principal is function Subproblema_1 return Tipo is begin ... end Subproblema_1; *2 ¿Cómo elijo el nombre de mis subprogramas? Las funciones siempre devuelven un valor Guía de estilo: Se recomienda que el identificador de las funciones sea un sustantivo y el de los procedimientos contengan un verbo Los procedimientos no están obligados a devolver un valor, pero veremos en este tema que también pueden hacerlo procedure Subproblema_2 is begin ... end Subproblema_2 Como las funciones devuelven function Cuadrado ( … ) return Integer … function Maximo ( … ) return Float … function Mayuscula ( … ) return Character … un valor, generalmente necesitaremos procedure Borrar_Pantalla ( … ) … procedure Pedir_Datos (…)… procedure Abrir_Ficheros ( … ) … Resultado : . . .; guardar el resultado en una variable begin Resultado := Subproblema_1; Subproblema_2; end Problema_Principal; *3 Comunicación entre subprogramas: Parámetros Parámetros de entrada A B function Maximo (A : in Integer; B : in Integer) return Integer *4 Comunicación entre subprogramas: Parámetros Tipo del resultado Maximo Parámetros de entrada A B Maximo Devuelvo el resultado de la función *5 function Maximo (A : in Integer; B : in Integer) Tipo del return Integer resultado is Resultado : Integer; begin if A > B then Resultado := A; else Resultado := B; end if; return Resultado; end Maximo; *6 1 Ejemplo Completo with Text_IO; use Text_IO; procedure Calular is function Maximo (A, B : in Integer) return Integer is begin if A > B then return A; La variable Resultado no era realmente necesaria else ya que puedo poner varias sentencias “return” return B; end if; Las declaraciones de variables se pueden end Maximo; poner cerca del comienzo del código Numero_1 : Integer := 10; Numero_2 : Integer := 20; Fíjate que en la llamada a la función puedo Valor_Mayor : Integer; indicar el nombre de los parámetros begin Valor_Mayor := Maximo (Numero_1, Numero_2); Put_Line (“El mayor vale “ & Integer’Image (Valor_Mayor)); Asociación de parámetros En la transparencia anterior acabamos de ver que Ada nos permite dos formas de asociar los parámetros: • Asociación por posición … := Maximo (Numero_1, Numero_2); • Asociación por nombre … := Maximo (A => Numero_1 * 3, B => Numero_2); Valor_Mayor := Maximo (A => Numero_1 * 3, B => Numero_2); Put_Line (“Ahora el mayor vale “ & Integer’Image (Valor_Mayor)); end Calcular; *7 Comunicación entre subprogramas: Modos de parámetros *8 Ejemplo 1: Parámetro de salida procedure Calcular_Suma is Sumando_1 Sumando_2 Suma Sumar entrada (in) salida (out) entrada y salida (in out) procedure Sumar (Sumando_1 : in Integer; Sumando_2 : in Integer; Suma : out Integer) is begin Suma := Sumando_1 + Sumando_2; end Sumar; Numero : Integer := 15; Resultado_1 : Integer; Resultado_2 : Integer; begin Sumar (Numero + 2, 10, Resultado_1); Las funciones solamente pueden tener parámetros de entrada (y devuelven un único valor) Los procedimientos puede tener varios parámetros de entrada, varios de salida y también varios de entrada y salida. Fíjate que en las llamadas a procedimientos también puedo utilizar la asociación por nombre Sumar (Sumando_1 => Resultado_1, Sumando_2 => 30, Suma => Resultado_2); end Calcular_Suma; *9 Ejercicios Ejemplo 2: Parámetro de entrada y salida procedure Calcular_Siguiente is X Incrementar * 10 1. Escribe una función que, mediante bucles, calcula el factorial de un número entero 2. Escribe una función que diga si un número es primo 3. Escribe un procedimiento que recibe una frase, y dos letras y cambia todas las ocurrencias de la primera letra por la segunda y devuelve la frase modificada y el número de veces que ha hecho el cambio. Para comprobar que es correcto, escribe un programa que utilice este procedimiento. 4. Escribe un procedimiento que lea de teclado una línea con un máximo de 80 caracteres, y devuelva la primera frase (o sea, hasta el primer signo de puntuación ---punto, coma o punto y coma). procedure Incrementar (X : in out Integer) is Auxiliar : Integer := X + 1; begin X := Auxiliar; end Incrementar; Numero : Integer := 10; begin Incrementar (Numero); Incrementar (X => Numero); end Calcular_Siguiente; * 11 * 12 2