Escolar Documentos
Profissional Documentos
Cultura Documentos
TEMA 8: Funciones
Fundamentos de Informtica (Ingeniera Tcnica Industrial)
8.2. Funciones.
8.2.1. Definicin, llamada, argumentos formales y argumentos actuales. 8.2.2. El tipo de una funcin y la sentencia return. 8.2.3. Prototipos de funciones. 8.2.4. Tipo void.
8.3. Paso de argumentos a funciones por valor. 8.4. Paso de argumentos a funciones por referencia.
8.4.1. Paso de argumentos por referencia en C++.
Subprogramas en C: Funciones
Algunos lenguajes de programacin tienen dos tipos de Subprogramas (procedimientos y funciones). Los Subprogramas en lenguaje C son slo del tipo funciones. Un programa en C est estructurado en funciones.
De hecho, main() es una funcin, es la funcin principal.
Las Funciones en Programacin son similares a las funciones matemticas, pudiendo tener argumentos o parmetros. Ejemplo:
Definicin de una funcin en matemticas: f(x) = x + 5; f es el nombre de la funcin que tiene un argumento formal: x. La funcin f, una vez definida, puede usarse o llamarse en algunas expresiones: y = f(4) + 1;
Para descubrir el valor de f(4) hay que sustituir el argumento formal x por el valor 4 (argumento actual), f(4) = 4+5 = 9, de donde obtenemos que y = 9 + 1 = 10. Se dice que la funcin f devuelve el valor 9.
Las Funciones en Programacin son ms generales que las funciones matemticas: Pueden tener argumentos de cualquier tipo y pueden incorporar estructuras de control.
Subprogramas en C: Funciones
Las Funciones en Programacin tambin tienen todos los elementos vistos en las funciones matemticas:
Definicin: Donde se define su nombre, los argumentos que va a tener (nombre, nmero y tipo) y lo que la funcin debe hacer o cmo calcular el valor que devuelve la funcin.Tambin se define el tipo del valor que se devuelve (tipo de la funcin). Argumentos formales: Son los argumentos que se ponen en la definicin de una funcin. Llamada a una funcin: Es la instruccin donde se invoca o se utiliza la funcin. Argumentos actuales: Son los argumentos utilizados en la llamada.
x){ + 5;
5
}
Valor que devuelve la funcin
int main(){ int a,b; printf("\n- Introduzca un nmero: "); scanf("%i",&a); b = f(a) + a - f(5); a = f(b+1); printf("\n- Valores: %i, %i y %i.", a, b, f(a-b)); return 0; }
Observaciones:
ArgumentosFormales: Es una lista con la declaracin de todos los argumentos formales, separados por comas. Puede estar vaca. TipoDevuelto: Es el tipo del valor que la funcin va a devolver. Bloque_de_instrucciones: Es la implementacin de la funcin. Pueden declararse variables LOCALES a la funcin. Puede contener la sentencia return para devolver el valor que corresponda.
Formato: return <expresin>; Esta sentencia puede aparecer varias veces. En cuanto se ejecute una sentencia return la funcin termina, devolviendo el valor que haya en esa sentencia return. El valor devuelto debe ser del tipo especificado (TipoDevuelto).
Ejemplos de Funciones
/* Factorial de n (n!). Devuelve -1 si hay error */ long int Factorial (int n){ long int factorial=1; Nmero de partes de m if (n<0) elementos que se pueden tomar return -1; /* Error */ de un conjunto de n elementos: else { for ( ; n>1; n--) n n! m factorial = factorial * n; = Cn = m return factorial; m!( n m)! } } /* Nmeros Combinatorios. Devuelve -1 si n<m */ long int Combinatorios(int m, int n){ if (n<m) return -1; return Factorial(n) / (Factorial(m) * Factorial(n-m)); }
Variables LOCALES: Son aquellas que se declaran dentro de una funcin. Las variables de sus argumentos formales son locales. Slo tienen sentido y slo pueden usarse dentro de esa funcin. Su nombre es totalmente independiente de las variables locales de otras funciones, incluyendo la funcin main().
Observe las variables n de las funciones anteriores: Se llaman igual pero son variables distintas: Tienen distinto mbito (visibilidad), distinto significado, distinta utilidad...
Observaciones:
Tipo_Argumentos_Formales: Es una lista con la declaracin de todos los argumentos formales, separados por comas. Pueden ponerse slo los tipos (sin el nombre de las variables). Prototipo, declaracin de una funcin o cabecera (header): Sirve para especificar o declarar que existe una funcin con cierto nmero y tipo de argumentos y que devuelve cierto tipo de datos. Esos datos son los nicos imprescindibles para poder utilizar la funcin (para poder llamarla). El prototipo no define el proceso que se realiza, el cual se especifica en la definicin de la funcin. Por supuesto, el prototipo de una funcin debe ser coherente con la cabecera de su definicin, dondequiera que sta sea definida.
Ejemplo: Prototipo de la funcin Combinatorios: long int Combinatorios (int m, int n);
9
El orden de las funciones ya no es importante, ya que todas podrn utilizar a todas las dems, puesto que estn todos los prototipos declarados previamente. Esta segunda forma es ms laboriosa pero evita errores en el orden de las funciones. Adems, el tener todos los prototipos juntos simplifica localizar las caractersticas de cada funcin.
10
Estas funciones pueden contener la sentencia return, pero sin ir seguida de una expresin. En cuanto se ejecuta la sentencia return, la funcin termina su ejecucin (sin devolver nada, por supuesto). Este uso de la sentencia return es desaconsejado, especialmente en programadores principiantes, debido a que complica la comprensin de la funcin al poder existir varias formas de que sta finalice.
void Linea (unsigned n, char ch){ unsigned i; for (i=1; i<=n; i++) putchar(ch); putchar('\n');
La palabra void tambin se usa cuando una funcin no tiene argumentos. Ejemplo: int func1(void){...
Si los ARGUMENTOS FORMALES se MODIFICAN dentro de la FUNCIN, NO se MODIFICARN los ARGUMENTOS ACTUALES: SON VARIABLES DISTINTAS ! 12
Observe que la llamada func(x,y) no efecta ninguna operacin con el valor que devuelve la funcin func, por lo que ese valor se pierde (pero el programa no genera ningn error). En este ejemplo, como los argumentos pasan por valor y la funcin no hace nada especial, esta llamada es absurda y no modifica en nada la ejecucin del programa. 13
cambiar).
Sin embargo, a veces resulta muy til modificar, en una funcin, variables de los argumentos actuales. Esto se consigue usando el Paso de Argumentos POR REFERENCIA:
Esto es otra forma de conseguir que una funcin devuelva valores (aparte de usando return). Adems, de esta forma una funcin puede devolver tantos valores como se deseen (cada uno en un argumento distinto). En lenguaje C, TODOS los pasos de argumentos son por VALOR. Se llama Paso de Argumentos POR REFERENCIA a una tcnica que permite a una funcin modificar variables utilizadas como argumentos actuales. Primero explicaremos cmo aplicar esta tcnica en C estndar y posteriormente veremos cmo aplicarla en C++, que es ms simple (y equivalente). 14
En C estndar
TCNICA para usar un paso de argumentos por REFERENCIA: 1. En la Definicin de la Funcin: Usar el Operador de Indireccin * (asterisco) delante del argumento formal correspondiente. Se usar el operador * cada vez que la variable del argumento formal sea utilizada, tanto en la declaracin de la variable (entre los parntesis de la funcin) como en el cuerpo de la funcin. No debe confundirse con el operador de multiplicacin.
Ejemplo: void Func1 (int *a) { *a = *a+7; }
(la variable del arg. formal se incrementa)
2. En la Llamada a la Funcin: Usar el Operador de Direccin & (ampersand) delante de la variable para la que se desea el paso de arg. por referencia.
Ejemplo: Func1(&a); (la variable a pasa por referencia)
Recuerde que el operador & indica, por tanto, que dicha variable puede verse modificada por la funcin.
Esta es la razn por la que se usa el operador & en las variables ledas por la funcin scanf(): Como sabe, esta funcin lee un valor y modifica la variable en cuestin asignndole el valor ledo. 15
En C estndar
16
Paso de args. POR REFERENCIA: En C++ En C++ En C++, la TCNICA de paso de argumentos por REFERENCIA se simplifica:
1. En la Definicin de la Funcin: Sencillamente hay que marcar qu argumentos tendrn un paso de argumentos por referencia. Esto se hace aadiendo al tipo del argumento el signo &.
Ej.: void Func1(int& x){ x = x + 3; } (el arg. x pasa por referencia)
2. En la Llamada a la Funcin: El argumento actual en un paso de arg. por referencia se usa normalmente (como en un paso por valor).
Ej.: a=1; Func1(a); (la variable a pasa por referencia, pero no se indica nada) Tras esa llamada, la variable a valdr 4.
En un paso de arg. por referencia el argumento actual debe ser obligatoriamente una variable.
17
En C++
Paso de args. POR REFERENCIA: Otro Ejemplo en C++ Ejemplo: Qu salida produce el siguiente programa?
En C++
#include<stdio.h> /* Intercambio de valores entre dos variables */ void swap (int& x, int &y){ int aux=x; x = y; y = aux; } int main(){ int x=1, y=2, z=3; swap(x,y); swap(y,z); printf("\n- Valores: %i, %i y %i.", x, y, z); getchar(); return 0; } Resultado:
- Valores: 2, 3 y 1.
19
En C++
void Potencia2y3 (int N, int& cuadrado, int& cubo){ cuadrado = N * N; cubo = cuadrado * N; } Ejemplo de Ejecucin:
Llamada:
... int a, a2, a3;
... printf ("\n- Introduzca un nmero: "); scanf("%i",&a); Potencia2y3(a,a2,a3); printf("\n- Valores: %i, %i y %i.", a, a2, a3); Potencia2y3(a2,a,a3); printf("\n- Valores: %i, %i y %i.", a, a2, a3); ...
20
#include <stdio.h> int a; /* Esta es una variable global */ int func1 (int a){ return a*a; } int func2 (int x){ int a=1; return a+x; } int func3 (int x){ return a+x; } int main(){ int x=3; a = x - 1; x=func1(a); a=func2(x); x=func3(a); printf("\n-Valores: %i y %i.",x,a); return 0; } Salida: - Valores: 10 y 5.
21
Funciones: Ejemplos
Escribir una funcin para obtener cierto dgito de un nmero entero, que puede ser negativo. /***** ***** ***** ***** ***** Devuelve el dgito i-simo del nmero N. Se cuentan de derecha a izquierda empezando en 0. Devuelve -1 si N no tiene suficientes dgitos. ***** ***** ***** ***** *****/
int Digit (unsigned i, long N){ if (N==0 && i==0) return 0; N = N / (long) pow(10,i); if (N==0) return -1; } return N%10;
Funcin de math.h
Divisin SIN decimales. Equivalente a lo siguiente (con j como unsigned): for (j=1;j<=i;j++) N = N / 10;
22
Funciones: Ejemplos
Escribir una funcin que acepte dos caracteres como argumentos y que devuelva en el tercer argumento la suma de esos dos caracteres (como nmero entero positivo).
Ejemplo: Para '9' y '5' (que son caracteres) calculara el valor 14 (como nmero entero positivo). La funcin devolver (con return) cero si todo fue bien y uno si algn carcter no contiene dgitos numricos.
/***** ***** ***** ***** ***** Suma caracteres, convirtindolos a enteros. Devuelve: 0 si todo fue bien y 1 si algn carcter no es numrico. ***** ***** ***** ***** *****/ int SumaChars (char ch1, char ch2, unsigned& suma){ if (ch1<'0' || ch1>'9' || ch2<'0' || ch2>'9') return 1; /* ch1 o ch2 no son nmeros */ suma = (ch1 - '0') + (ch2 - '0'); return 0;
23
Estructura de un Programa en C
1. Comentarios: En primer lugar se deben incluir unos comentarios aclarando qu hace el programa, requisitos, autor, fecha... y cuantas observaciones deseen hacerse. 2. Inclusin de las Bibliotecas:
Las del sistema (como stdio.h, math.h, etc.) van entre ngulos: <...>. Las creadas por el programador van entre comillas dobles: "...".
3. Declaraciones Globales: Variables y constantes globales (con const), constantes simblicas del preprocesador (con #define) y definicin de tipos de datos (con typedef).
Los comentarios explicando cada declaracin son muy importantes. Como norma general, NO DEBEN USARSE VARIABLES GLOBALES.
4. Prototipos de las Funciones. 5. Implementacin de las Funciones, incluida main(), que puede ponerse la primera o la ltima. Las dems funciones deberan
ponerse en el mismo orden que sus prototipos para localizarlas fcilmente.
Antes de cada funcin debe incluirse un comentario indicando qu hace la funcin, significado de sus argumentos, requisitos que deben cumplir stos y cualesquiera otras observaciones que deban tenerse en cuenta para usar dicha funcin. Es buena medida separar cada funcin con una lnea de asteriscos como comentario. Si se escriben antes las funciones que son llamadas por otras, poniendo main() al final, los prototipos no son estrictamente necesarios.
24