Sie sind auf Seite 1von 28

FUNCIONES

Karim Guevara Puente de la Vega


kguevara72@gmail.com UNSA, 2012

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.

Declaracin de una funcin

En C++ es obligatorio usar prototipos. La estructura de un prototipo es:


<alm> <tipo> func(<lista de declaracin de parmetros>);

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);

Llamada a una funcin

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);

Definicin de una funcin

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; }

Parmetros por valor y referencia

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); }

Parmetros por valor y referencia

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; ... }

Parmetros por valor y referencia

Por referencia: se pasan las referencias a las variables.


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); // ERROR }

Punteros como parmetros de funciones

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?

Punteros como parmetros de funciones

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;

void funcion(int *q) { *q += 50; q++; cout << Puntero q: "<<q<<endl; }

Funciones que devuelven referencias


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.

Funciones que devuelven referencias

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]; }

Parmetros con valores por defecto

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.

Parmetros con valores por defecto

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 {. . . }

Los argumentos por defecto empiezan a asignarse empezando por el ltimo.


int funcion1(int a, int b=0, int c=1); ... funcion1(12, 10); // Legal, el valor para "c" es 1 funcion1(12); // Legal, los valores para "b" y "c" son 0 y 1 funcion1(); // Ilegal, el valor para "a" es obligatorio

Uso de apuntadores como parmetros de funciones


void paso(int a, int b, int c) { cout<<Valores pasados a la funcin: <<a<< <<b<< <<c<<endl; a=1; b=2; c=3; cout<<Valores dentro de la funcin: <<a<< <<b<< <<c<<endl; }
void main(void) { int uno=0, dos=0, tres=0; paso(uno, dos, tres); cout<<Valores en el programa principal: <<a<< <<b<< <<c<<endl; }

Salida:
000 123 000

Uso de apuntadores como parmetros de funciones


void paso(int *a, int *b, int *c) { cout<<Valores pasados a la funcin: <<*a<< <<*b<< <<*c<<endl; *a=1; *b=2; *c=3; cout<<Valores dentro de la funcin: <<*a<< <<*b<< <<*c<<endl; } void main(void) { int uno=0, dos=0, tres=0; paso(&uno, &dos, &tres); cout<<Valores en el programa principal: <<a<< <<b<< <<c<<endl; }

Salida: 000 123 123

Uso de apuntadores como parmetros de funciones - Ejemplo


struct fecha { short dd, mm, aa; }*hoy; void main() { hoy = new fecha; cout<<Introducir fecha: ; cin>>hoy->dd; cin>>hoy->mm; cin>>hoy->aa; escribir(hoy); } void escribir(fecha *f) { cout<<Dia: <<f->dd; cout<<Mes:<<f->dd; cout<<Ao:<<f->aa; }

Funciones que regresan apuntadores


char *duplica(char *origen) { char *destino = new char[strlen(origen)]; if (destino) for (int i=0; destino[i] = origen[i]; i++) ; return (destino); } void main() { char *cadena; cadena = duplica(Exito con C++); cout<<cadena; }

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

Una funcin es recursiva cuando se define en funcin

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

Ejemplo: calculo del factorial de un nmero

n! = n * (n-1) * (n-2) * ... * 1


int factorial(int n) { if (n == 0) return 0; else if (n >= 1) return n*factorial(n-1); return 1; }

Funciones recursivas- Ejemplo


void Permutaciones(char * cad, int p) {
char c; int i, j; int n = strlen(cad);

void Permutaciones(char *, int l=0); void int main() { char palabra[] = "ABCD"; Permutaciones(palabra); }

for(i = 0; i < n-p; i++) {


if(n-p > 2) Permutaciones(cad, p+1);

else cout << cad <<endl;


c = cad[p];

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

Asignacin de 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

Llamadas a travs de un puntero a funcin:

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();

Punteros a funciones Ejemplo1


int Muestra1(); int Muestra2(); int Muestra3(); int Muestra4(); void main() { int (*pf1)(); int num; do { cout << "Introduce un nmero entre 1 y 4, " << "0 para salir: "; cin >> num; switch(num) { case 1: pf1 = Muestra1; break; case 2: pf1 = Muestra2; break; case 3: pf1 = Muestra3; break; case 4: pf1 = Muestra4; break; } pf1(); } while(num != 0); }

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; }

Punteros a funciones Ejemplo1


int Muestra1(int); int Muestra2(int); int Muestra3(int); int Muestra4(int);

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

Das könnte Ihnen auch gefallen