Tema 5 (parte 1)

Anuncio
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
Descargar