Funciones

Una función es una sección de código en C que tiene un nombre, es independiente, que ejecuta una tarea específica y que opcionalmente regresa un valor al programa que la llama.

Una función tiene un nombre. Cada función tiene un nombre único. Con ese nombre, en cualquier otra parte del programa, se pueden ejecutar los enunciados contenidos en la función. A esto se le conoce como la llamada de la función. Una función puede ser llamada desde el interior de otra función.

Una función es independiente. Una función puede ejecutar su trabajo sin interferencias de, y sin interferir con, otras partes del programa.

Una función ejecuta una tarea específica. Esta es la parte fácil de la definición. Una tarea es un trabajo concreto que un programa debe ejecutar como parte de su operación general, como enviar una línea de texto a la pantalla, inicializar algunas variables, calcular una raíz cúbica, etc.

Una función puede regresar un valor al programa que la llama. Cuando el programa llama a una función, se ejecutan los enunciados que contiene. Éstos, en caso de que se desee, pueden pasar información de regreso al programa que la llama.

Ejemplo:

#include <stdio.h>
long cubo(long x);
int main(void)
{
   long entrada, respuesta;
   printf("Teclea un valor entero: ");
   scanf("%ld", &entrada);
   respuesta = cubo(entrada);
   printf("El cubo de %ld es %ld.", entrada, respuesta);
}
long cubo(long x)
{
   long resultado;
   resultado = x * x * x;
   return (resultado);
}

Un programa en C no ejecuta los enunciados de una función sino hasta que ésta es llamada por otra parte del programa. Cuando una función es llamada, el programa puede enviar la información para la función en forma de uno o más argumentos. Un argumento es un dato del programa que es necesario para que la función ejecute su tarea. Luego los enunciados de la función se ejecutan, realizando la tarea para la cual fueron diseÒados. Cuando terminan los enunciados de la función, la ejecución regresa a la misma posición en el programa de donde fue llamada la función. Las funciones pueden enviar información de regreso al programa en forma de un valor de retorno.

Un prototipo de función proporciona al compilador la descripción de una función que será definida más adelante en el programa. El prototipo incluye un tipo de retorno, que indica el tipo de variable que regresará la función. También incluye el nombre de la función, que deberá describir lo que hace la función. El prototipo también contiene el tipo de las variables de los argumentos que serán pasados a la función. Opcionalmente puede contener los nombres de las variables que serán pasadas. Un prototipo siempre termina con un punto y coma.

Una definición de función es, de hecho, la función. La definición contiene el código que será ejecutado. La primera línea de la definición de función, llamada encabezado de función, debe ser idéntica al prototipo de función, a excepción del punto y coma. Un encabezado de función no debe terminar en punto y coma. Adicionalmente, aunque los nombres de variables de los argumentos son opcionales en el prototipo, deben ser incluidos en el encabezado de función. A continuación del encabezado se encuentra el cuerpo de la función, que contiene los enunciados que se ejecutarán con la función. El cuerpo de la función debe estar encerrado entre dos llaves. Si el tipo de retorno de la función es cualquier otro diferente a void, se debe incluir en un return enunciado que regrese un valor que se ajuste al tipo de retorno.

Ejemplos de Prototipos:

double cuadrado (double numero);
void print_report (int reportNumber);

Ejemplos de definición de función:

double cuadrado (double numero)
{
   return (numero * numero);
}

void print_report(int reportNumber)
{
   if(reportNumber == 1)
   puts("Imprimiendo reporte 1");
   else
   puts("En pausa...");
}

Usando funciones en los programas en C se puede practicar la programación estructurada, en la cual las tareas individuales del programa se ejecutan por secciones independientes de código de programa.

Existen dos razones importantes por las cuales es importante la programación estructurada:
  • Es más fácil escribir un programa estructurado, ya que los problemas complejos de programación son divididos en varias tareas más pequeÒas y más simples. Cada tarea se ejecuta por una función, en la cual el código y las variables se encuentran aislados del resto del programa. Se puede avanzar más rápido resolviendo uno a la vez con estas tareas relativamente simples.
  • Es más fácil depurar un programa estructurado. Si el programa tiene un error (algo que hace que trabaje de manera equivocada), un diseÒo estructurado facilita el aislamiento del problema en una sección específica de código (una función específica).

Una ventaja relacionada con la programación estructurada es el tiempo que se puede ahorrar. Si se escribe una función para ejecutar una tarea determinada en un programa, rápida y fácilmente puede usarse en otro programa que necesite ejecutar la misma tarea. Incluso si el nuevo programa necesita realizar una tarea ligeramente diferente, muchas veces se encuentra que modificar una función que se ha creado anteriormente es más fácil que escribir una nueva a partir de cero. Considérese qué tanto se han usado las funciones printf() y scanf(), aún cuando nunca se ha visto el código que las compone. Si las funciones han sido creadas para hacer una sola tarea, es muy fácil usarlas en otros programas.