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 otros algoritmos procedure Problema_Principal is function Subproblema_1 Las funciones siempre return Tipo is devuelven un valor begin ... Los procedimientos no están obligados end Subproblema_1; *2 ¿Cómo elijo el nombre de mis subprogramas? Guía de estilo: Se recomienda que el identificador de las funciones sea un sustantivo y el de los procedimientos contengan un verbo a devolver un valor, pero veremos en procedure Subproblema_2 is este tema que también pueden hacerlo 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; 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); 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)); Valor_Mayor := Maximo (A => Numero_1 * 3, B => Numero_2); Put_Line (“Ahora el mayor vale “ & Integer’Image (Valor_Mayor)); end Calcular; • Asociación por nombre … := Maximo (A => Numero_1 * 3, B => Numero_2); *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) 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 ptilizar la asociación por nombre *9 procedure Calcular_Siguiente is X Sumar (Sumando_1 => Resultado_1, Sumando_2 => 30, Suma => Resultado_2); end Calcular_Suma; * 10 Ejemplo 3 (Parámetro de entrada por omisión) Ejemplo 2: Parámetro de entrada y salida Incrementar procedure Sumar (Sumando_1 : in Integer; Sumando_2 : in Integer; Suma : out Integer) is begin Suma := Sumando_1 + Sumando_2; end Sumar; procedure Calcular_Siguiente is procedure Incrementar (X : in out Integer) is Auxiliar : Integer := X + 1; begin X := Auxiliar; end Incrementar; X Cantidad Incrementar Numero : Integer := 10; begin Incrementar (Numero); procedure Incrementar (X : in out Integer; Cantidad : in Positive := 1) is begin X := X + Cantidad; end Incrementar; Numero : Integer := 10; begin Incrementar (Numero); Incrementar (Numero, 5); Incrementar (X => Numero); end Calcular_Siguiente; * 11 Incrementar (X => Numero); Incrementar (X => Numero, Cantidad => 15); end Calcular_Siguiente; * 12 2 Anidación Igual que podemos poner bucles dentro de bucles, los procedimientos y funciones pueden contener otros procedimientos y funciones A B C D E F G Visibilidad 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; El punto en que pongamos las declaraciones de nuestras variables nos permite controlar su visibilidad (o sea, desde dónde podemos utilizarlas) procedure Suma (Valor : in Integer) is begin Resultado := Resultado + Valor; end B; Visibilidad De Resultado * 13 Indice : Natural := 0; begin while Indice < 100 loop Suma (Indice); end loop; end Ejemplo; * 14 Ejercicios Sobrecarga Ada nos permite que varios procedimientos se llamen igual (siempre que al menos se diferencien en el tipo de parametros) procedure Escribir (Numero : in Integer) is 1. 2. begin ... end Escribir; 3. procedure Escribir (Numero : in Float) is 4. begin end Escribir; procedure Escribir (Frase procedure Ejemplo is Resultado : Integer := 0; Visibilidad De Resultado 5. 6. : in String) is begin ... end Escribir; * 15 Escribe el cuerpo de los procedimientos de la transparencia anterior. Escribe el cuerpo de tres procedimientos “Leer” que sirvan para leer desde teclado un número entero, y un número real. 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). Escribe una función que, mediante bucles, calcula el factorial de un número entero Escribe una función que diga si un número es primo 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. * 16 3