Transparencias del tema 5

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