150 likes | 364 Views
Acciones y funciones 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.
E N D
Acciones y funciones 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 fragmentos de un programa que se usan más de una vez dentro del mismo programa o que se repiten en distintos programas.
Funciones: declaraciones y definiciones Una función es un conjunto de instrucciones al que se asig-na un nombre. Este grupo de instrucciones se ejecuta cada vez que se invoca su nombre. La declaración de una función especifica: • su nombre • el número de parámetros • el tipo de dato de cada parámetro • el tipo del valor que devuelve Ejemplo: double distancia (double x, double y);
La información contenida en la declaración de una función se denomina prototipo. Es la interfaz que la función pre-senta al resto de las funciones. Si otras funciones desean utilizarla, basta con que conozcan su prototipo y adapten las llamadas al mismo, es decir, pasen el número de argu-mentos especificado con los tipos adecuados. Las variables que se usan en la declaración o en la definición de una función se denominan parámetros. El término argumentos se reserva para los valores que se dan a los parámetros en las llamadas a una función. La definición de una función consiste en la declaración junto con el cuerpo de la función, es decir, las instruc-ciones que contiene.
Ejemplo: double distancia (double x, double y) { double dist = (x - y); if ( dist < 0 ) dist = -dist; return dist; } La instrucción return devuelve a la función que invocó a "distancia" el control del programa junto con el valor de la distancia entre x e y.
Paso de argumentos por: valor o referencia Para que una función con parámetros pueda ejecutarse, debe recibir valores para sus parámetros. El número y tipo de los valores deben concordar con el número y tipo de los parámetros. Recordemos que los valores que aparecen en la llamada de una función se denominan argumentos. Los parámetros son los identificadores utilizados en la definición de la función. Estos identificadores sólo están disponibles mientras se ejecuta la función. En el siguiente ejemplo main llama a la función distancia con la siguiente lista de argumentos (p1, p2). El parámetro x recibe el argumento p1 y el parámetro y el argumento p2.
#include <iostream> using namespace std; double distancia (double x, double y); int main (void) { double p1 = 2.3, p2 = -33.3, d = distancia(p1, p2); cout << d << endl; system("pause"); } double distancia (double x, double y) { double dist = (x-y); if ( dist < 0 ) dist = -dist; return dist; }
Al llamar a una función, main le entrega el control. La si-guiente instrucción que se ejecuta es la primera instruc-ción de la función. La función devuelve el control a main mediante su instrucción return. double distancia (double x, double y) { double dist = (x-y); if ( dist < 0 ) dist = -dist; return dist; } La función que llama puede ignorar el valor devuelto por la función llamada. En este caso, main lo guarda en la varia-ble d y lo escribe en la pantalla. d = distancia(p1, p2);
Existen dos formas depasar argumentos a una función: Por valor: las instrucciones de la función no operan con el argumento que se les pasa, sino con una copia local del mismo que se elimina una vez ejecutada la función. El argumento no queda alterado como resultado de la ejecu-ción de la función. Por referencia: las instrucciones de la función operan directamente con el argumento que se les pasa. Lo habitual es que las funciones hagan copias locales de sus argumentos, i.e., el paso de argumentos por valor. Para conseguir que una función opere sobre una variable y no sobre una copia de la misma, hay que pasarle su dirección. Los cambios que se hagan sobre los datos a través de su dirección persistirán después de la ejecución de la función.
#include <iostream> using namespace std; void intercambio (double& a, double& b); int main (void) { double x=2.3, y=-33.3; cout << "x = " << x << " y = " << y << endl; intercambio(x, y); cout << "x = " << x << " y = " << y << endl; system("pause"); } void intercambio (double& a, double& b) { double temp; temp = a; a = b; b = temp; }
Los parámetros de la acción intercambio son referencias a variables de tipo double. Cuando se realiza el paso de ar-gumentos por referencia se copia la dirección de los argu-mentos en los parámetros de modo que las variables x y aapunten a la misma dirección de memoria, y las variables b e yapunten a la misma dirección de memoria. Esto es, los parámetros de la acción (las variables a y b) son refe-rencias a las variables utilizadas como argumentos en la llamada (las variables x e y). Los parámetros que se pasan por referencia se marcan con el símbolo & detrás del tipo en la primera línea de la defini-ción de una acción y en su prototipo, pero no en el cuerpo de la acción ni en las llamadas a ésta.
Acciones y Funciones Las funciones se caracterizan porque sólo aceptan argumen-tos que se pasan por valor y siempre devuelvenun valor. • Toda definición de una función contiene al menos una ins-trucción del tipo return expresion. • Las funciones generan expresiones (es decir, datos). Las acciones se caracterizan porque no devuelven ningún valor, y aceptan argumentos que se pasan por valor o por referencia. • Las acciones modifican el estado del programa o produ-cen efectos.
Recursividad Una definición es recursiva si el concepto definido forma parte de la definición. Por ejemplo, la potencia de un número se puede definir de forma recursiva. Sea b un número entero y e un número entero mayor o igual que 2. Se define b elevado a e como: • b multiplicado por b elevado a e-1, si e > 2; • b multiplicado por b, si e = 2.
#include <iostream> using namespace std; int pot(int base, int exponente); int main (void) { int b=2, e=3; cout << pot(b,e) << endl; system("pause"); } int pot (int base, int exponente) { if (exponente == 2) return (base*base); else return (base * pot(base, exponente-1)); }
Vamos a analizar la siguiente llamada "pot(2,3)". La función definida ejecuta la instrucción return (2 * pot(2,2)); El control no se devuelve a main debido a la nueva llamada a “pot” en el argumento de return. Esta segunda llamada ejecuta la instrucción return (2*2); Esta instrucción sí devuelve el control, pero no a main, sino a pot(2,3). Esta última función, a su vez, devuelve el control a main en la instrucción return (2*4);
#include <iostream> using namespace std; int pot(int base, int exponente); int main (void) { int x=2, e=3; cout << pot(x,e) << endl; system("pause");} int pot (int base, int exponente) { int res, i; if (exponente == 2) res = base*base; else { res = base; for (i=1; i < exponente; i++) res *= base; } return res; }