Funciones

Las funciones son similares a las de cualquier otro lenguaje, pero, tal y como citamos en la introducción, al no ser un lenguaje estructurado por bloques, no es posible declarar funciones dentro de otras funciones.

funtion

Son bloques de código que podemos ejecutar una y otra vez.

Sintaxis de la Función:

tipo NombreFuncion(tipo Data1, tipo Data2, ...){
  cuerpo de la función
  return tipo;
}

Donde:

  • tipo Es un tipo de dato como int o void
  • Data Es el nombre de una variable

Prototipos

Los prototipos de funciones son una característica de C y se suelen declarar al incio del código.

Un prototipo es una declaración que toma la forma:

Sintaxis del Prototipo:

tipo NombreFuncion(tipo Data1, tipo Data2, ...);

Donde:

  • tipo Es un tipo de dato como int o void
  • Data Es el nombre de una variable

Ejemplo:

int fact(int v);
int mayor(int a, int b );
void final();

Argumentos

Los argumentos o parámetros son usados para poder pasar los valores de variables entre funciones.

Si tenemos algo así dentro de main:

...
int x,y;

Funcion(x,y);
...

Entonces el prototipo y la funcion en si podrían ser correspondientemente de estas maneras:

//Prototipo
Tipo Funcion(int x, int y);

//Funcion
Tipo Funcion(int x, int y){
  sentencias
  ...
}

Aunque tambien podrian tener otro nombre los parámetros y funcionaria igual:

//Prototipo
Tipo Funcion(int a, int b);

//Funcion
Tipo Funcion(int a, int b){
  sentencias
  ...
}

Return

Return permite, en primer lugar, salir de la función desde cualquier punto de la misma, y en segundo lugar, devolver un valor del tipo de la función, si ello es necesario (no se devuelve ningún valor si la función es de tipo void).


Paso por Valor y por Referencia

Pasar por Valor

Son cuando se genera una nueva variable dentro de la función, es decir:

  • Lo que se pasa a la funcion es el valor de X
  • Las variables que genera la funcion y las originales, son independientes y ningún cambio en ninguna de ellas afecta a la otra.
Funcion(x,y);

Pasar por Referencia

Son cuando se  envía la dirección de la variable original a la función, es decir:

  • Se proporciona a la función una referencia, la dirección de X.
  • Las variables que genera la funcion y las originales, son dependientes y todo cambio afecta a la otra.
Funcion(&x,&y);

Aquí estaría la función:

tipo Funcion(int *a, int *b){
  sentencias
  ...
}

Recuerda que al hacer usar punteros ya no es necesario usar el & en funciones como scanf:

int funcion(int *vector){
     int i;
     for(i=0; i<n ;i++){
      scanf(“%i”, (vec+i))
     }
}

A diferencia de otros lenguaje, el lenguaje C, sólo permite pasar parámetros a las funciones por valor. Si se desea que los cambios efectuados en una función sobre una variable afecten fuera del alcance de la función, es posible simular un paso por referencia mediante el uso de punteros.

En efecto, si a una función le pasamos como argumento la dirección de una variable, cualquier modificación que se realice en esa dirección, afectará, lógicamente, al valor que tiene la variable original, y con ello, conseguiremos el mismo efecto que un paso por referencia.

Ejemplo:

void Alfa(int *val,float pos){
*val=5;
pos=7.7;
}

void Beta(int val,float *pos){
val=10;
*pos=14.7;
}

int main(void){
int a=6;
float b=9.87;
printf(“Al principio valen a=%d b=%f\n”,a,b);
Alfa(&a,b);

printf(“Después de Alfa valen a=%d b=%f\n”,a,b);
Beta(a,&b);

printf(“Después de Beta valen a=%d b=%f\n”,a,b);
}

Este programa mostrará en pantalla:

  • Al principio valen a=6  b=9.87
  • Después de Alfa valen a=5  b=9.87
  • Después de Beta valen a=5  b=14.7

Ello es, pues a Alfa se le pasa la variable a por “referencia” (se le pasa &a, o sea, un puntero a la variable a), y la variable b por valor, mientras que en Beta sucede al revés.


Arrays y Funciones

Un aspecto a tener muy en cuenta es que C no permite el paso de un array por valor a una función, un array es siempre pasado por “referencia”, pues en la llamada, lo que se pasa es la dirección del primer elemento del array (recuérdese que el nombre de un array es un puntero al primer elemento). Por valor tan solo es posible pasar por valor elementos individuales del array, pero no el array completo.

Recursividad

Una función de C puede llamarse a sí misma. Este proceso recibe el nombre de recursividad. Los ejemplos de recursividad abundan, siendo uno de los más habituales la función factorial:

unsigned Factorial(unsigned num){
if (num==0) return 1;
return num*Factorial(num-1);
}

La recursividad es una poderosa herramienta de programación, sin embargo, presenta dos problemas:

  • La velocidad de ejecución de un algoritmo programado de forma recursiva es mucho más lento que el programado de forma iterativa.
  • La recursividad, si es excesiva, puede ocasionar el desbordamiento de la pila, y con ello, el fallo en la ejecución del programa.

 

 

btn1 btn
btn

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s