1
2 Acciones y funciones
2.1 Concepto
Una acción o una función es un conjunto de instrucciones agrupadas
a las que se da un nombre que permite referirse a ellas globalmente.
La utilización de acciones y funciones hace que los programas sean
mucho más cortos y sencillos.
Suele ser útil construir acciones y funciones para representar frag-
mentos de un algoritmo que se usan más de una vez dentro de un
mismo algoritmo o que se repiten en distintos algoritmos.
2
2.2. Acciones y funciones
Ejemplo de definición de una función:
función distancia(x, y: real): real
devuelve (x2
+ y2
)1/2
;
ffunción
Cuando un algoritmo utiliza una acción o una función decimos que el algoritmo
llama (o invoca) a la acción o a la función correspondiente.
Tanto las definiciones de las acciones y funciones como las llamadas a éstas en los
algoritmos deben especificar sus parámetros. Los parámetros representan los da-
tos que manipula el algoritmo implementado por la acción o la función correspon-
diente.
Ejemplos de llamadas:
x := distancia(1,2);
y := distancia(3,4);
3
l orden de los parámetros es importante. Los parámetros utilizados en las llamadas a
na función o a una acción deben escribirse en el mismo orden que los parámetros de
u definición.
(x,y) = (x2
– y2
)1/2
f(3,2) = 51/2
f(2,3) = (-5)1/2
Vamos a distinguir dos tipos de parámetros:
. Parámetros formales o simplemente parámetros: son los que se utilizan
en la definición de una función o de una acción.
. Parámetros reales o argumentos: son los utilizados en las llamadas a una
función o a una acción.
n el ejemplo anterior “x” e “y” son parámetros formales, mientras 3 y 2 son
arámetros reales.
ada llamada a una función o a una acción tiene unos parámetros reales distintos.
:= f(3,2) → los parámetros reales de esta llamada a la función f son 3 y 2.
:= f(5,4) → los parámetros reales de esta llamada a la función f son 5 y 4.
4
Los parámetros pueden clasificarse de acuerdo con otros criterios. A continuación
introducimos una segunda clasificación:
1. Parámetros de entrada (ent): representan datos que necesita conocer el algo-
ritmo. Su valor no se modifica durante la ejecución del algoritmo.
2. Parámetros de salida (sal): representan los resultados del algoritmo. El algo-
ritmo modifica su valor durante la ejecución de manera que reflejen los resul-
tados obtenidos.
3. Parámetros de entrada y salida (ent/sal): representan datos cuyo valor ini-
cial es necesario para el algoritmo, pero cuyo valor queda modificado duran-
te la ejecución de éste.
Las acciones utilizan parámetros de estos tres tipos: entrada, entrada/salida y
salida.
Las funciones sólo utilizan parámetros de entrada y se caracterizan porque
siempre devuelven un valor.
5
2.3. Definición de funciones
Las funciones se caracterizan porque sólo tienen parámetros de entrada y siempre
devuelven un valor.
En la definición de las funciones se especifica el tipo de valores que puede tomar
cada parámetro y el tipo de valor que devuelve la función. Toda definición de una
función contiene al menos una instrucción del tipo “devuelve expresión”.
función Mínimo(x, y: entero): entero
var r: entero fvar
si x < y entonces
r := x;
si no
r := y;
fsi
devuelve r;
ffunción
6
función Factorial(n: entero): entero
var r, i: entero fvar
r:=1;
si n > 1 entonces
para i:=2 hasta n hacer
r := r*i;
fpara
fsi
devuelve r;
ffunción
Ejemplos de llamadas correctas a estas funciones:
algoritmo Minimo y tabla de factoriales
var x, y, k, n: entero fvar
Escribir(“Introduzca dos enteros: “); LeerEntero(x); LeerEntero(y);
Escribir(“El mínimo es: “); EscribirEntero(Mínimo(x,y));
Escribir(“Introduzca un entero: “); LeerEntero(n);
para k:=0 hasta n hacer
Escribir(“El factorial de “); Escribir(k); Escribir(“ es “);
Escribir(Factorial(k)); Escribir(‘n’);
fpara
falgoritmo
7
2.4. Definición de acciones
En la definición de las acciones se indica para cada parámetro si es de entrada
(ent), salida (sal) o entrada/salida (ent/sal), el nombre del parámetro y el tipo
de valores que puede tomar.
acción saludo( )
Escribir(“Hola. ¿Qué tal?“);
facción
acción escribir_resultado(ent resultado: real)
Escribir(“El resultado es “); EscribirReal(resultado);
facción
acción leer_real_positivo(sal x: real)
LeerReal(x);
mientras ( x < 0 ) hacer
LeerReal(x);
fmientras
facción
8
acción intercambiar(ent/sal x, y: real)
var auxiliar: real fvar
auxiliar := x;
x := y;
y := auxiliar;
facción
Ejemplos de llamadas correctas a estas acciones:
algoritmo
var x, y: real fvar
x=2; y=3;
saludo( );
escribir_resultado(x+y);
leer_real_positivo(y);
Escribir(“x = “); EscribirReal(x); Escribir(“ y = “); EscribirReal(y);
intercambiar(x,y);
Escribir(“x = “); EscribirReal(x); Escribir(“ y = “); EscribirReal(y);
falgoritmo
9
Ejemplo: Algoritmo que utiliza acciones y funciones.
algoritmo Máximo par de una lista de N números positivos.
const N: entero = 10 fconst
var x, máximo: real; i, contador : entero fvar
máximo:=0.0; contador=0;
para i:=1 hasta N hacer
leer_real_positivo(x);
si par(x) entonces
contador := contador + 1;
máximo := max(máximo,x)
fsi
fpara
si (contador > 0) entonces
Escribir(“El máximo número par introducido es “); Escribir(máximo);
si no
Escribir(“No se ha introducido ningún número par.”);
fsi
falgoritmo
10
acción leer_real_positivo(sal número: real)
LeerReal(número);
mientras número < 0 hacer
LeerReal(número);
fmientras
facción
función max(a, b: real): real
var resultado: entero fvar
si a > b entonces
resultado := a;
si no
resultado := b;
fsi
devuelve resultado;
ffunción
función par(a: real): booleano
devuelve ( RealAEntero(a) mod 2 = 0);
ffunción
11
Acciones y funciones en C
Las acciones y funciones se definen después del programa principal (i.e., main).
En C se distinguen dos tipos de parámetros, en lugar de los tres tipos (entrada,
salida y entrada-salida) que se consideran en la notación algorítmica.
1. Parámetros que se pasan por valor: la función o acción trabaja con una copia
de ellos y no modifica su valor.
2. Parámetros que se pasan por variable o referencia: la acción trabaja con una
referencia (tipo&) a la variable original y modifica realmente su valor. Estos
parámetros se marcan con el símbolo & detrás del tipo en la primera línea de
la definición de una acción y en su prototipo.
El prototipo de una acción o función se coloca en la cabecera del programa, antes
de la definición de main. Los prototipos de las distintas acciones y funciones que
se usan en un programa se escriben en líneas separadas y se recomienda que apa-
rezcan en el mismo orden que las definiciones de las acciones y funciones.
12
Definición de funciones
Es necesario preceder la definición de una función con una declaración del tipo de
valor que devuelve la función. La expresión “devuelve exp;” que aparece siempre
en el cuerpo de una función, se traduce por “return exp;”. Las variables locales se
definen en primer lugar, antes que las instrucciones de la función.
función Mínimo(x, y: real): real
var resultado: real fvar
si x < y entonces resultado := x si no resultado := y fsi
devuelve resultado
ffunción
double Minimo(double x, double y) {
double resultado;
if (x < y) {resultado = x;} else {resultado = y;}
return resultado;
}
El prototipo de una funcción se obtiene sustituyendo “{“ por “;” en la primera línea
de su definición:
double Minimo(double x, double y);
13
función Factorial(n: entero): entero
var r, i: entero fvar
r:=1;
si n > 1 entonces
para i:=2 hasta n hacer
r:=r*i;
fpara
fsi
devuelve r;
ffunción
int Factorial(int n) {
int r=1, i;
if (n > 1) {
for (i=2; i <= n; i++) {
r = r*i;
}
}
return r;
}
14
#include <stdlib.h>
#include <iostream>
using namespace std;
int factorial(int n); /* Prototipo*/
int main (void) {
int i, N;
cout << “Este programa escribe la tabla de los N primeros factoriales” << endl;
cout << “Introduzca N: “;
cin >> N;
for (i=0; i<N; i++) {
cout << “El factorial de “ << i << “ es “ << factorial(i) << endl; } /* Llamada */
system(“pause”);
}
int factorial(int n) { /* Definición */
int r=1, i;
if (n > 1) {
for (i=2; i <= n; i++) { r = r*i; }
}
return r;
}
15
Definición de acciones
En la definición de una acción se utiliza la palabra clave void para indicar que no
devuelve ningún valor.
acción escribir_resultado(ent resultado: real)
Escribir(“El resultado es “); EscribirReal(resultado);
facción
void escribir_resultado(double resultado) {
cout << “ El resultado es “ << resultado;
}
Los parámetros que se pasan por variable o referencia se indican utilizando el sím-
bolo & después de su tipo en la cabecera de la acción y en su prototipo, pero no en
el cuerpo de la acción ni en las llamadas a ésta.
acción leer_real_positivo(sal x: real)
Escribir(“Numero positivo: ”); Leer(x);
mientras ( x < 0 ) hacer
Escribir(“Numero positivo: ”);
Leer(x);
fmientras
void leer_real_positivo(double& x) {
cout << “Numero positivo: ”; cin >> x;
while (x<0) {
cout << “Numero positivo: “; cin << x;
}
}
16
Los parámetros que se pasan por variable o referencia se indican utilizando el sím-
bolo & después de su tipo en la cabecera de la acción y en su prototipo, pero no en
el cuerpo de la acción ni en las llamadas a ésta.
acción intercambiar(ent/sal x, y: entero)
var auxiliar: entero fvar
auxiliar := x; x := y; y := auxiliar;
facción
void intercambiar(int& x, int& y) {
int auxiliar;
auxiliar = x; x = y; y = auxiliar;
}
Las variables locales se definen en primer lugar, antes que las instrucciones de la
ac-
ción.
El prototipo de una acción se obtiene sustituyendo “{“ por “;” en la primera línea de
su definición:
void intercambiar(int& x, int& y);
17
Si una acción no tiene parámetros se indica colocando la palabra clave void en
lugar
de éstos en su definición.
acción saludo( )
Escribir(“Hola. ¿Qué tal?“);
facción
void hello(void) {
cout << “Hola!”;
}
18
Utilización de las acciones y funciones
Las funciones o acciones pueden ser utilizadas en la función principal (i.e., main) de
un programa o en otras acciones y funciones definidas dentro del programa siempre
que sus prototipos se hayan declarado antes de la definición de main.
Cuando esto ocurre se dice que existe una llamada a la función o acción correspon-
diente. Una llamada a una función o acción simplemente contiene el nombre de la
función o acción seguido de los parámetros reales a los que se quiere aplicar.
Ilustramos la utilización de acciones y funciones con una implementación en C del
algoritmo que calcula el máximo número par de una lista de N números positivos.
#include <stdlib.h>
#include <iostream>
#define N 10
using namespace std;
/* Prototipos de las funciones y acciones utilizadas en el programa. */
void leer_real_positivo(double& x);
bool par(double x);
double max(double x, double y);
19
int main(void) {
double numero, maximo=0.0;
int i, contador=0;
for (i=1; i <= N; i++) {
leer_real_positivo(numero);
if ( par(numero) ) {
contador++;
maximo = max(maximo, numero);
}
}
if (contador > 0) {
cout << “El maximo numero par introducido es “ << maximo << endl;
} else {
cout << “No se ha introducido ningún número par.” << endl;
}
system(“pause”);
}
20
void leer_real_positivo(double& x) {
cout << endl << “Introduzca un numero positivo: “;
cin >> x;
while ( x<0 ) {
cout << endl << “Introduzca un numero positivo: “;
cin >> x;
}
}
bool par(double x) {
return ( (int)x % 2 == 0 );
}
double max(double x, double y) {
double resultado;
if ( x>y ) {
resultado=x;
} else {
resultado=y;
}
return resultado;
}

Acciones funciones

  • 1.
    1 2 Acciones yfunciones 2.1 Concepto Una acción o una función es un conjunto de instrucciones agrupadas a las que se da un nombre que permite referirse a ellas globalmente. La utilización de acciones y funciones hace que los programas sean mucho más cortos y sencillos. Suele ser útil construir acciones y funciones para representar frag- mentos de un algoritmo que se usan más de una vez dentro de un mismo algoritmo o que se repiten en distintos algoritmos.
  • 2.
    2 2.2. Acciones yfunciones Ejemplo de definición de una función: función distancia(x, y: real): real devuelve (x2 + y2 )1/2 ; ffunción Cuando un algoritmo utiliza una acción o una función decimos que el algoritmo llama (o invoca) a la acción o a la función correspondiente. Tanto las definiciones de las acciones y funciones como las llamadas a éstas en los algoritmos deben especificar sus parámetros. Los parámetros representan los da- tos que manipula el algoritmo implementado por la acción o la función correspon- diente. Ejemplos de llamadas: x := distancia(1,2); y := distancia(3,4);
  • 3.
    3 l orden delos parámetros es importante. Los parámetros utilizados en las llamadas a na función o a una acción deben escribirse en el mismo orden que los parámetros de u definición. (x,y) = (x2 – y2 )1/2 f(3,2) = 51/2 f(2,3) = (-5)1/2 Vamos a distinguir dos tipos de parámetros: . Parámetros formales o simplemente parámetros: son los que se utilizan en la definición de una función o de una acción. . Parámetros reales o argumentos: son los utilizados en las llamadas a una función o a una acción. n el ejemplo anterior “x” e “y” son parámetros formales, mientras 3 y 2 son arámetros reales. ada llamada a una función o a una acción tiene unos parámetros reales distintos. := f(3,2) → los parámetros reales de esta llamada a la función f son 3 y 2. := f(5,4) → los parámetros reales de esta llamada a la función f son 5 y 4.
  • 4.
    4 Los parámetros puedenclasificarse de acuerdo con otros criterios. A continuación introducimos una segunda clasificación: 1. Parámetros de entrada (ent): representan datos que necesita conocer el algo- ritmo. Su valor no se modifica durante la ejecución del algoritmo. 2. Parámetros de salida (sal): representan los resultados del algoritmo. El algo- ritmo modifica su valor durante la ejecución de manera que reflejen los resul- tados obtenidos. 3. Parámetros de entrada y salida (ent/sal): representan datos cuyo valor ini- cial es necesario para el algoritmo, pero cuyo valor queda modificado duran- te la ejecución de éste. Las acciones utilizan parámetros de estos tres tipos: entrada, entrada/salida y salida. Las funciones sólo utilizan parámetros de entrada y se caracterizan porque siempre devuelven un valor.
  • 5.
    5 2.3. Definición defunciones Las funciones se caracterizan porque sólo tienen parámetros de entrada y siempre devuelven un valor. En la definición de las funciones se especifica el tipo de valores que puede tomar cada parámetro y el tipo de valor que devuelve la función. Toda definición de una función contiene al menos una instrucción del tipo “devuelve expresión”. función Mínimo(x, y: entero): entero var r: entero fvar si x < y entonces r := x; si no r := y; fsi devuelve r; ffunción
  • 6.
    6 función Factorial(n: entero):entero var r, i: entero fvar r:=1; si n > 1 entonces para i:=2 hasta n hacer r := r*i; fpara fsi devuelve r; ffunción Ejemplos de llamadas correctas a estas funciones: algoritmo Minimo y tabla de factoriales var x, y, k, n: entero fvar Escribir(“Introduzca dos enteros: “); LeerEntero(x); LeerEntero(y); Escribir(“El mínimo es: “); EscribirEntero(Mínimo(x,y)); Escribir(“Introduzca un entero: “); LeerEntero(n); para k:=0 hasta n hacer Escribir(“El factorial de “); Escribir(k); Escribir(“ es “); Escribir(Factorial(k)); Escribir(‘n’); fpara falgoritmo
  • 7.
    7 2.4. Definición deacciones En la definición de las acciones se indica para cada parámetro si es de entrada (ent), salida (sal) o entrada/salida (ent/sal), el nombre del parámetro y el tipo de valores que puede tomar. acción saludo( ) Escribir(“Hola. ¿Qué tal?“); facción acción escribir_resultado(ent resultado: real) Escribir(“El resultado es “); EscribirReal(resultado); facción acción leer_real_positivo(sal x: real) LeerReal(x); mientras ( x < 0 ) hacer LeerReal(x); fmientras facción
  • 8.
    8 acción intercambiar(ent/sal x,y: real) var auxiliar: real fvar auxiliar := x; x := y; y := auxiliar; facción Ejemplos de llamadas correctas a estas acciones: algoritmo var x, y: real fvar x=2; y=3; saludo( ); escribir_resultado(x+y); leer_real_positivo(y); Escribir(“x = “); EscribirReal(x); Escribir(“ y = “); EscribirReal(y); intercambiar(x,y); Escribir(“x = “); EscribirReal(x); Escribir(“ y = “); EscribirReal(y); falgoritmo
  • 9.
    9 Ejemplo: Algoritmo queutiliza acciones y funciones. algoritmo Máximo par de una lista de N números positivos. const N: entero = 10 fconst var x, máximo: real; i, contador : entero fvar máximo:=0.0; contador=0; para i:=1 hasta N hacer leer_real_positivo(x); si par(x) entonces contador := contador + 1; máximo := max(máximo,x) fsi fpara si (contador > 0) entonces Escribir(“El máximo número par introducido es “); Escribir(máximo); si no Escribir(“No se ha introducido ningún número par.”); fsi falgoritmo
  • 10.
    10 acción leer_real_positivo(sal número:real) LeerReal(número); mientras número < 0 hacer LeerReal(número); fmientras facción función max(a, b: real): real var resultado: entero fvar si a > b entonces resultado := a; si no resultado := b; fsi devuelve resultado; ffunción función par(a: real): booleano devuelve ( RealAEntero(a) mod 2 = 0); ffunción
  • 11.
    11 Acciones y funcionesen C Las acciones y funciones se definen después del programa principal (i.e., main). En C se distinguen dos tipos de parámetros, en lugar de los tres tipos (entrada, salida y entrada-salida) que se consideran en la notación algorítmica. 1. Parámetros que se pasan por valor: la función o acción trabaja con una copia de ellos y no modifica su valor. 2. Parámetros que se pasan por variable o referencia: la acción trabaja con una referencia (tipo&) a la variable original y modifica realmente su valor. Estos parámetros se marcan con el símbolo & detrás del tipo en la primera línea de la definición de una acción y en su prototipo. El prototipo de una acción o función se coloca en la cabecera del programa, antes de la definición de main. Los prototipos de las distintas acciones y funciones que se usan en un programa se escriben en líneas separadas y se recomienda que apa- rezcan en el mismo orden que las definiciones de las acciones y funciones.
  • 12.
    12 Definición de funciones Esnecesario preceder la definición de una función con una declaración del tipo de valor que devuelve la función. La expresión “devuelve exp;” que aparece siempre en el cuerpo de una función, se traduce por “return exp;”. Las variables locales se definen en primer lugar, antes que las instrucciones de la función. función Mínimo(x, y: real): real var resultado: real fvar si x < y entonces resultado := x si no resultado := y fsi devuelve resultado ffunción double Minimo(double x, double y) { double resultado; if (x < y) {resultado = x;} else {resultado = y;} return resultado; } El prototipo de una funcción se obtiene sustituyendo “{“ por “;” en la primera línea de su definición: double Minimo(double x, double y);
  • 13.
    13 función Factorial(n: entero):entero var r, i: entero fvar r:=1; si n > 1 entonces para i:=2 hasta n hacer r:=r*i; fpara fsi devuelve r; ffunción int Factorial(int n) { int r=1, i; if (n > 1) { for (i=2; i <= n; i++) { r = r*i; } } return r; }
  • 14.
    14 #include <stdlib.h> #include <iostream> usingnamespace std; int factorial(int n); /* Prototipo*/ int main (void) { int i, N; cout << “Este programa escribe la tabla de los N primeros factoriales” << endl; cout << “Introduzca N: “; cin >> N; for (i=0; i<N; i++) { cout << “El factorial de “ << i << “ es “ << factorial(i) << endl; } /* Llamada */ system(“pause”); } int factorial(int n) { /* Definición */ int r=1, i; if (n > 1) { for (i=2; i <= n; i++) { r = r*i; } } return r; }
  • 15.
    15 Definición de acciones Enla definición de una acción se utiliza la palabra clave void para indicar que no devuelve ningún valor. acción escribir_resultado(ent resultado: real) Escribir(“El resultado es “); EscribirReal(resultado); facción void escribir_resultado(double resultado) { cout << “ El resultado es “ << resultado; } Los parámetros que se pasan por variable o referencia se indican utilizando el sím- bolo & después de su tipo en la cabecera de la acción y en su prototipo, pero no en el cuerpo de la acción ni en las llamadas a ésta. acción leer_real_positivo(sal x: real) Escribir(“Numero positivo: ”); Leer(x); mientras ( x < 0 ) hacer Escribir(“Numero positivo: ”); Leer(x); fmientras void leer_real_positivo(double& x) { cout << “Numero positivo: ”; cin >> x; while (x<0) { cout << “Numero positivo: “; cin << x; } }
  • 16.
    16 Los parámetros quese pasan por variable o referencia se indican utilizando el sím- bolo & después de su tipo en la cabecera de la acción y en su prototipo, pero no en el cuerpo de la acción ni en las llamadas a ésta. acción intercambiar(ent/sal x, y: entero) var auxiliar: entero fvar auxiliar := x; x := y; y := auxiliar; facción void intercambiar(int& x, int& y) { int auxiliar; auxiliar = x; x = y; y = auxiliar; } Las variables locales se definen en primer lugar, antes que las instrucciones de la ac- ción. El prototipo de una acción se obtiene sustituyendo “{“ por “;” en la primera línea de su definición: void intercambiar(int& x, int& y);
  • 17.
    17 Si una acciónno tiene parámetros se indica colocando la palabra clave void en lugar de éstos en su definición. acción saludo( ) Escribir(“Hola. ¿Qué tal?“); facción void hello(void) { cout << “Hola!”; }
  • 18.
    18 Utilización de lasacciones y funciones Las funciones o acciones pueden ser utilizadas en la función principal (i.e., main) de un programa o en otras acciones y funciones definidas dentro del programa siempre que sus prototipos se hayan declarado antes de la definición de main. Cuando esto ocurre se dice que existe una llamada a la función o acción correspon- diente. Una llamada a una función o acción simplemente contiene el nombre de la función o acción seguido de los parámetros reales a los que se quiere aplicar. Ilustramos la utilización de acciones y funciones con una implementación en C del algoritmo que calcula el máximo número par de una lista de N números positivos. #include <stdlib.h> #include <iostream> #define N 10 using namespace std; /* Prototipos de las funciones y acciones utilizadas en el programa. */ void leer_real_positivo(double& x); bool par(double x); double max(double x, double y);
  • 19.
    19 int main(void) { doublenumero, maximo=0.0; int i, contador=0; for (i=1; i <= N; i++) { leer_real_positivo(numero); if ( par(numero) ) { contador++; maximo = max(maximo, numero); } } if (contador > 0) { cout << “El maximo numero par introducido es “ << maximo << endl; } else { cout << “No se ha introducido ningún número par.” << endl; } system(“pause”); }
  • 20.
    20 void leer_real_positivo(double& x){ cout << endl << “Introduzca un numero positivo: “; cin >> x; while ( x<0 ) { cout << endl << “Introduzca un numero positivo: “; cin >> x; } } bool par(double x) { return ( (int)x % 2 == 0 ); } double max(double x, double y) { double resultado; if ( x>y ) { resultado=x; } else { resultado=y; } return resultado; }