Computación I, CI2125

Clase 6. Funciones, Pasaje de Parámetros, y ámbito de variables


Funciones

Las funciones son las estructuras más importantes dentro del lenguaje de programación C (y en general de cualquier lenguaje procedural). Permiten una programación estructurada y simplifican la lectura del código; pero lo más importante es que, una función sencilla que realiza una tarea bien específica, puede ser reutilizada con extrema facilidad en cualquier otro programa.

El uso y construcción de funciones propias es una tarea fácil y eficiente. La construcción de una función involucra dos pasos:

  1. Declaración de la función (prototipo). Esto consiste en declarar la función indicando el nombre, el tipo de retorno que posee, y el número y tipo de argumentos que recibe. Esta declaración puede realizarse o bien en el mismo archivo fuente, o en un header file (típicamente con extensión ".h") e incluirse mediante la directiva #include.
  2. Definición de la función., o implementación del código mismo. Que puede realizarse también en un archivo separado que se incluirá en la línea de compilación.

Ejemplo

/* Programa que imprime una serie de potencias de  2 y -3                                       
*/
 
#include <stdio.h>
 
int power(int x, int n);  /* Prototipo de la función  */
main()
{
  int i;
 
  for(i = 0; i < 10; i++)
    printf("%d %d %d\n", i, power(2,i), power(-3,i));
}
 
/* Definición de la función Power                     */
int power(int x, int n)
{
  int i, p = 1;
 
  for(i=1; i <= n; i++)
    p = p * x;
  return p;

}

 

Puntos a Notar

  1. Para llamar una función se escribe su nombre seguido por una lista de argumentos encerrados entre paréntesis.
  2. Una función retorna un resultado del tipo declarado al definir la función; por eso puede ser empleada en cualquier expresión donde sea válida una variable del tipo retornado. En nuestro caso, cada printf llama dos veces a la función power().
  3. Los nombres de los argumentos, así como el de las variables son locales a las funciones. El primer valor pasado se corresponde con el primer argumento de la función, es segundo valor con el segundo argumento, y así.
  4. return ... devuelve el valor calculado. La expresión retornada debe ser del tipo declarado. Si la función posee retorno void, significa que no retorna nada, lo mismo ocurre para funciones que poseen argumento void.

 

Pasaje de Parámetros

En general, en cualquier lenguaje de programación de alto nivel, se permiten dos maneras de pasaje de argumentos: por valor y por referencia, uno soportado en forma estándar y el otro a través de una forma alternativa.

Cuando un argumento se pasa por valor, la función llamada recibe una copia del argumento, pudiendo modificarla libremente sin alterar el valor original.

Cuando un argumento se pasa por referencia, más que el valor mismo del argumento, lo que se pasa es la dirección de memoria donde ese valor está almacenado. Por lo tanto, la función llamada puede modificar el valor original directamente.

La forma de pasajes de argumentos estándar del lenguaje C es realizar este pasaje por valor. Si, en cambio, el argumento pasado es un arreglo, lo que en realidad se pasa a la función llamada es la dirección de memoria del primer elemento del arreglo.

/* Ejemplo de tipos de pasaje de argumentos  */
#include <stdio.h>
void Permuta(int v1, int v2);
void PermutaArray(int v12[]);
main()
{
  int x=1, y=2;
  int a[] = {1,2};
 
  printf("Antes:   x=%d, y=%d\n",x,y);
  Permuta(x,y);
  printf("Después: x=%d, y=%d\n",x,y);
 
  printf("Antes:   a={%d,%d}\n",a[0],a[1]);
  PermutaArray(a);
  printf("Después: a={%d,%d}\n",a[0],a[1]);
}
/* Permuta dos variables???   */
void Permuta(int x, int y)
{
  int aux;
  aux = x;
  x=y;
  y=aux;
}
/* Permuta dos elementos de un arreglo???   */
void PermutaArray(int x[])
{
  int aux;
  aux = x[0];
  x[0]=x[1];
  x[1]=aux;
}

Ambito o Alcance de las Variables

Según el lugar donde son declaradas puede haber dos tipos de variables.

     Globales: las variables permanecen activas durante todo el programa. Se crean al iniciarse éste y se destruyen de la memoria al finalizar. Pueden ser utilizadas en cualquier función.

     Locales: las variables son creadas cuando el programa llega a la función en la que están definidas. Al finalizar la función desaparecen de la memoria.

     Si dos variables, una global y una local, tienen el mismo nombre, la local prevalecerá sobre la global dentro de la función en que ha sido declarada.

     Dos variables locales pueden
tener el mismo nombre siempre que estén declaradas en funciones diferentes.

Ejemplos

 

/* Uso de variable con distintos ámbitos  */
#include <stdio.h>
void Func(void);
int VarX = 25;      /* Variable global    */
 
void main()
{
  printf("Valor de VarX: %d\n", VarX);
  Func();
  printf("Valor de VarX: %d\n", VarX);
}
 
void Func()
{
  int VarX = 40;  /* Local a la función, oculta la global*/
  printf("Valor de VarX: %d\n", VarX);
}
 

Ir a Pagina del Curso