martes, 18 de febrero de 2014

Funciones en el Lenguaje C

Introducción


Una función es una rutina o conjunto de sentencias que realiza una determinada labor. En C todas las funciones devuelven un valor, que por defecto es un entero. Las funciones admiten parámetros (argumentos), que son datos que le pasan a la función las sentencias que la llaman.

La sintaxis habitual en la definición de una función es:
tipo identificador (lista_de_parámetros)
lista_de_declaración_de_los_parámetros
{
 bloque_de_código
}
donde:
- tipo  es el tipo de datos devuelto por la función;
identificador es el nombre de la función. Debe ser un identificador valido;
lista_de_parámetros es una lista de variables, separadas por comas, que conforman los datos que le pasamos a la función.
- bloque_de_código suele tener la estructura:
definición de variables locales;
cuerpo de la función;
return;
El tipo es opcional. Si lo omitimos la función por defecto devuelve un entero. Muchas veces el valor devuelto por la función es ignorado en el programa. La lista de argumentos es también opcional. Un ejemplo es la función main() que, en principio, no tiene argumentos. Podemos escribir como ejemplo:

hola()
{
 printf("hola\n");
}

que simplemente es una función que cuando es llamada imprime en pantalla un mensaje de saludo.

Cuando el programa al ejecutarse alcanza la llave de cierre '}' de la función, ésta finaliza y devuelve el control al punto del programa que la llamó. 

Retorno de valores

Cuando la función finaliza hemos dicho que se devuelve un valor. Este valor en principio no está definido, es decir, puede devolver cualquier cosa. Para obligar a la función a retornar un determinado valor se utiliza la sentencia return, seguida del valor a retornar. Como todas las sentencias en C se debe acabar con un ';'. Por ejemplo:

lista()
{
 return 1;
}

devuelve el entero 1 cada vez que es llamada. En C podemos devolver cualquier tipo de datos de los llamados escalares. Los tipos de datos escalares son los punteros, tipos numéricos y el tipo carácter. En C no se pueden devolver vectores (array) ni estructuras.

Paso de parámetros a una función

Utilizando la lista de argumentos podemos pasar parámetros a una función. En esta lista se suele colocar un conjunto de identificadores, separados por comas, que representan cada uno de ellos a uno de los parámetros de la función. Obsérvese que el orden de los parámetros es importante. Para llamar a la función habrá que colocar los parámetros en el orden en que la función los espera.

Cada parámetro puede tener un tipo diferente. Para declarar el tipo de los parámetros añadiremos entre el paréntesis ')' y la llave '{' una lista de declaraciones, similar a una lista de declaraciones de variables. Es habitual colocar cada par metro en una línea, tabulados hacia la derecha. Así:

imprime(numero, letra)
int numero;
char letra;
{
 printf("%d, %c\n", numero, letra);
}

es una función que admite dos variables, una entera y otra de tipo carácter.

En los lenguajes de programación estructurada hay dos formas de pasar variables a una función:
  • por referencia, o
  • por valor
Cuando la variable se pasa por referencia, la función puede acceder a la variable original. Este enfoque es habitual en lenguajes como el Pascal. En C, sin embargo, todos los parámetros se pasan por valor. La función recibe una copia de los parámetros y variables, y no puede acceder a las variables originales. Cualquier modificación que efectuemos sobre un parámetro no se refleja en la variable original. Esto hace que no podamos alterar el valor de la variable por equivocación.

Sin embargo, en determinadas ocasiones necesitaremos alterar el valor de la variable que le pasamos a una función. Para ello en el C se emplea el mecanismo de los punteros.

Declaración y comprobación de tipos

Al igual que para las variables, cuando una función se va a usar en un programa, o cuando una función se define en otro fichero (funciones externas), se debe declarar antes del lugar donde se define. La declaración de una función consiste en especificar el tipo de datos que va a retornar la función. Esto es obligatorio cuando vamos a usar una función que no devuelve un entero. Además, en la declaración se puede especificar el número de argumentos y su tipo. Una declaración típica de función es:

tipo identificador( lista_de_argumentos_con_tipo );

Esto avisa al compilador de que la función ya existe, o que la vamos a definir después.

La lista de argumentos con tipo difiere de la lista de argumentos antes presentada en que el tipo de cada argumento se coloca dentro de la lista, antes de su correspondiente identificador, como hacíamos en la definición de variables. Por ejemplo:

 char imprime(int numero, int letra);

declara una función que devuelve un carácter y tiene dos parámetros, un entero y un carácter.

La lista de argumentos permite al compilador hacer comprobación de tipos, ya que el tipo y numero de argumentos debe coincidir en la declaración, definición y llamada a una función.

Este tipo de especificación del tipo de argumentos también se puede emplear en la definición de las funciones, aunque lo contrario no es posible. Así, el programa:

#include <stdio.h>

char imprime(int numero, char letra); /* Declara la función "imprime" */

main()
{
 char caracter;

 caracter = imprime(100, 'a');

 return;
}

/*
   Define una función que imprime un entero y un carácter.
   Devuelve el mismo carácter de entrada.
*/
char imprime(int numero, char letra)
{
 printf("%d, %c\n", numero, letra);

 return letra;
}

incluye otra definición válida y más compacta para la función imprime que hemos empleado anteriormente.

Ejemplos

  • Función sin argumentos que no devuelve nada
Este programa llama a la función borra_pantalla que despeja la pantalla mediante la orden clrscr() (clear screen) y muestra el mensaje "la pantalla está limpia". Por supuesto, es de nula utilidad pero sirve para empezar.

#include <stdio.h>
#include <conio.h>

void borra_pantalla();

main()
{
 borra_pantalla(); /* Llamamos a la función */
}

void borra_pantalla()  /* No se debe poner punto y coma aquí */
{
 clrscr();
 printf( "La pantalla está limpia\n" );

 return;     /* No hace falta devolver ningún valor, 
         mucha gente ni siquiera pone este return */
}


  • Función con argumentos, no devuelve ningún valor
En este ejemplo la función compara toma dos números, los compara y nos dice cuál es mayor.

#include <stdio.h>

void compara( int, int);

main()
{
 int num1, num2;

 printf( "Introduzca dos números: " );
 scanf( "%i %i", &num1, &num2 );

 compara( num1, num2 ); /* Llamamos a la función con sus dos argumentos */
}

void compara( int a, int b )     /* Pasamos los parámetros a y b a la función */
{
 if ( a>b )
  printf( "%i es mayor que %i\n" , a, b );
 else
  printf( "%i es mayor que %i\n", b, a );

 return;
}
  • Función con argumentos que devuelve un valor
Este ejemplo es como el anterior pero devuelve como resultado el mayor de los dos números.

#include <stdio.h>

main()
{
 int num1, num2;
 int resultado;

 printf( "Introduzca dos números: " );
 scanf( "%i %i", num1, num2 );

 resultado = compara( num1, num2 ); /* Almacenamos en resultado el valor 
         que devuelve la función */

 printf( "El mayor de los dos es %i\n", resultado );
}

int compara( int a, int b )     /* Metemos los parámetros a y b a la función */
{
 int mayor;  /* Esta función define su propia variable; 
       esta variable sólo se puede usar aquí */
 if ( a>b )
  mayor = a;
 else
  mayor = b;

 return mayor;
}

En este ejemplo podíamos haber hecho también:

 printf( "El mayor de los dos es %i\n", compara( num1, num        2 ) );

De esta forma nos ahorramos tener que definir la variable resultado.

0 comentarios:

Publicar un comentario

Aprende a Programar tus propias aplicaciones