Beruflich Dokumente
Kultur Dokumente
Agenda
Introduccin. Declaracin de una funcin Llamada a una funcin. Definicin de una funcin. Paso de parmetros por valor y referencia. Argumentos de main Funciones recursivas Punteros a funciones
Introduccin
Las funciones son un conjunto de instrucciones que realizan una tarea especfica. En general toman unos valores de entrada, llamados parmetros y proporcionan un valor de salida o valor de retorno; aunque tanto unos como el otro pueden no existir. Al igual que con las variables, las funciones pueden declararse y definirse.
Sirve para indicar al compilador los tipos de retorno y los de los parmetros de una funcin, de modo que compruebe si son del tipo correcto cada vez que se use esta funcin dentro del programa, o para hacer las conversiones de tipo cuando sea necesario. Ejemplo:
int suma(int a, int b); //int suma (int,int);
Se hace desde cualquier punto del programa. Si son del tipo extern, significa que son accesibles desde cualquier punto del programa, aunque se encuentren en otros ficheros fuente del mismo programa. En contraposicin las funciones declaradas "static" slo son accesibles dentro del fichero fuente donde se definen Sintaxis: int x; x=suma(10,5);
Una declaracin es simplemente una presentacin, mientras una definicin contiene las instrucciones con las que realizar su trabajo la funcin. Ejemplo: int suma( int a, int b){ int c; c=a+b; return c; }
Por valor: cuando el control pasa a la funcin, los valores de los parmetros en la llamada se copian a "variables" locales de la funcin.
int suma( int a, int b){ a=a+5; b=b+10; return a+b; } void main( ){ int x=100, y=50; cout<<suma(x,y); cout<<suma(7,8); }
Referencias a variables: las referencias sirven para definir "alias" para una misma variable, se utiliza el operador de referencia (&).
{ . int a; int &r = a; a = 10; cout << r << endl; a = 87; cout << r << endl; ... }
Cuando se pasa un puntero como parmetro por valor de una funcin pasa lo mismo que con las variables. Dentro de la funcin se trabaja con una copia del puntero. Sin embargo, el objeto apuntado por el puntero s ser el mismo. Cmo se pasar un puntero por referencia?
Ejemplo:
void funcion(int *q);
int main() {
int a, *p; a = 100; p = &a; cout << "Variable a: "<<a<<endl; cout << Puntero p: "<<p<<endl; funcion(p); cout << "Variable a: " <<a<<endl; cout << Puntero p: " <<p<<endl; return 0;
Se debe de declarar el valor de retorno como una referencia. Sintaxis: <tipo> &<identificador_funcin>(<lista_parmetros>);
Esto permite que la llamada a una funcin se comporte como un objeto. Se podr por ejemplo asignar valores a una llamada a funcin, o realizar operaciones.
Ejemplo:
int &Funcion(int*, int); void main() { int arreglo[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; Funcion(arreglo, 2)++; Funcion(arreglo, 9) = Funcion(arreglo, 4) + Funcion(arreglo,1) + 10; cout << "Arreglo[2]: " << arreglo[2] << endl; cout << "Arreglo[9]: " << arreglo[9] << endl; }
int &Funcion(int* vector, int indice) { return vector[indice]; }
En C++, cuando se declara una funcin se puede decidir que algunos de sus parmetros sean opcionales. En ese caso tendremos que asignarles valores por defecto. Estos parmetros pueden tomar los valores que se le enven o los valores por defecto que se hayan definido Limitaciones:
Slo los ltimos argumentos de las funciones pueden tener valores por defecto. De estos, slo los ltimos argumentos pueden ser omitidos en una llamada. Los valores por defecto deben especificarse bien en los prototipos, bien en las declaraciones, pero no en ambos.
Ejemplo:
void funcion(int = 1); // Legal void funcion1(int a, int b=0, int c=1); // Legal void funcion2(int a=1, int b, int c); // Ilegal void funcion3(int, int, int=1); // Legal ... void funcion3(int a, int b=3, int c) // Legal {. . . }
Salida:
000 123 000
Argumentos de main
A menudo se requiere especificar valores u opciones a los programas cuando los ejecutamos desde la lnea de comandos. Para tener acceso a los argumentos de la lnea de comandos hay que declararlos en la funcin "main", de las siguientes formas:
int main(int argc, char *argv[]); int main(int argc, char **argv);
Ejemplo:
proejem arg1 arg2 arg3 arg4 argc valdr 5 argv[]= {"C:\programasc\proejem", "arg1", "arg2", "arg3,"arg4}
Funciones recursivas
de si misma. Estas deben estar diseadas especialmente para que sean recursivas, de otro modo podran conducir a bucles infinitos. Cuando se llama a una funcin, se crea un nuevo juego de variables locales, de este modo, si la funcin hace una llamada a si misma, se guardan sus variables y parmetros en la pila. La nueva instancia de la funcin trabajar con su propia copia de las variables locales, cuando esta segunda instancia de la funcin retorna, recupera las variables y los parmetros de la pila.
Funciones recursivas
void Permutaciones(char *, int l=0); void int main() { char palabra[] = "ABCD"; Permutaciones(palabra); }
cad[p] = cad[p+i+1];
cad[p+i+1] = c; if(p+i == n-1) { for(j = p; j < n; j++) cad[j] = cad[j+1]; cad[n] = 0; } }
Punteros a funciones
Sintaxis:
<tipo> (*<identificador>)(<lista_de_parmetros>);
Es importante usar los parntesis para agrupar el identificador, ya que de otro modo estaramos declarando una funcin que devuelve un puntero Ejemplo:
int (*pfuncion1)(); (1) void (*pfuncion2)(int); (2) float *(*pfuncion3)(char*, int); (3) void (*pfuncion4)(void (*)(int)); (4) int (*pfuncion5[10])(int); (5)
Punteros a funciones
Una vez declarado uno de estos punteros, se comporta como una variable cualquiera. Se puede usar como parmetro en funciones, o asignarle valores del mismo tipo
Ejemplo: int funcion(); ... int (*pf1)(); pf1 = funcion; ... int funcion() { return 1; }
Punteros a funciones
Para invocar a la funcin usando el puntero, slo hay que usar el identificador del puntero como si se tratase de una funcin. El puntero se comporta exactamente igual que un "alias" de la funcin a la que apunta.
Ejemplo:
int x = pf1();
int Muestra1() { cout << "Muestra 1" << endl; return 1; } int Muestra2() { cout << "Muestra 2" << endl; return 2; } int Muestra3() { cout << "Muestra 3" << endl; return 3; } int Muestra4() { cout << "Muestra 4" << endl; return 4; }
int Muestra1(int v) { while(v--) cout << Muestra 1" << void main() { endl; int (*pf1[4])(int); int num, valores; return 1; } pf1[0] = Muestra1; pf1[1] = Muestra2; int Muestra2(int v) { pf1[2] = Muestra3; pf1[3] = Muestra4; while(v--) cout << "Muestra 2" << do { endl; cout << "Introduce un nmero entre 1 y 4, ; return 2; cin >> num; cout << "Introduce un nmero entre 1 y 10: "; } cin >> valores; int Muestra3(int v) { if(valores > 0 && valores < 11) while(v--) cout << "Muestra 3" << pf1[num-1](valores); endl; } while(num != 0); return 3; } } int Muestra4(int v) {. . .} //igual que anteriores