¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
  1. Libros
  2. Desarrollo informático
  3. Las funciones
Extrait - Desarrollo informático Aprenda a diseñar antes de programar
Extractos del libro
Desarrollo informático Aprenda a diseñar antes de programar Volver a la página de compra del libro

Las funciones

Presentación

Cuando un programa es largo, se hace difícil de leer. Es interesante dividirlo en varias partes. Es el objetivo de las funciones.

  • Un programa se puede separar en varios fragmentos. Cada fragmento es una función. Una función principal (main) los llama según sea necesario en la aplicación.

En los ejemplos vistos hasta aquí, hemos llamado a numerosas funciones de la librería estándar (printf(), gets(), strcpy()…).

  1. Una función se puede llamar varias veces. Es una de las grandes características de las funciones: no tener que volver a escribir varias veces el mismo código.

Vamos a llamar varias veces a las funciones de la librería estándar.

  • Se establece una función una única vez. Esto mejora la fiabilidad de las aplicaciones que la utilizan.

  • La «modularización» de un programa permite el reparto de las tareas entre varios desarrolladores. 

Vamos a utilizar el trabajo de los desarrolladores de la librería estándar.

Primeras funciones

1. Sintaxis

Una función tiene:

  • un nombre, seguido por paréntesis;

  • eventualmente argumentos (escritos entre los paréntesis);

  • eventualmente un tipo de valor de retorno (por defecto, la función se debe declarar como void).

2. Cálculo del cuadrado y del cubo de un entero

a. Declaraciones (prototipos) de las funciones

Al inicio del programa figuran las instrucciones:

int cuadrado(int numero);  
int cubo(int); 

Se trata de las declaraciones de las funciones cuadrado() y cubo(). También se llaman prototipos de las funciones.

Estas instrucciones no tienen ningún efecto en la ejecución del programa. Están destinadas al compilador, que las utiliza para comprobar la corrección de las llamadas a estas funciones. Durante la lectura de los prototipos, sabe que las funciones reciben un argumento de tipo int y que devolverán un entero de tipo int.

Ejemplo

  • El nombre de la primera función es cuadrado.

  • numero es un argumento de tipo int.

  • Devuelve un valor de tipo int.

No es necesario indicar el nombre del argumento. Su tipo es suficiente.

Las siguientes instrucciones insertan el código de los archivos stdio.h, stdlib.h y time.h.

#include <stdio.h>  
#include <stdlib.h>  
#include <time.h> 

Estos archivos contienen los prototipos de las funciones de las librerías estándares utilizadas en el programa:

  • stdio.h para printf()

  • stdlib.h...

Paso de argumentos a una función

Esta sección ilustra la importancia de los punteros para transmitir los argumentos a una función. El ejemplo elegido es el desarrollo de una función de cambio de los valores de dos variables de tipo int. En la primera versión, la más natural, la función recibe el valor de los enteros que hay que invertir. Pero no funciona. En la segunda versión, la función recibe la dirección de los enteros que hay que invertir. El resultado esta vez es correcto.

1. Intercambio de dos valores enteros (primera versión)

a. Programa

La función intercambio() recibe como argumento dos enteros. Su objetivo es cambiar los valores contenidos en estas variables.

#include <stdio.h>  
void intercambio(int, int); 

La función intercambio() permuta los valores contenidos en n1 y n2:

void intercambio(int n1, int n2)  
{  
   int permut;  
  
   printf("Antes del intercambio: n1 = %d, n2 = %d\n", n1, n2);  
   permut = n1;  
   n1 = n2;  
   n2 = permut;  
   printf("Después del intercambio: n1 = %d, n2 = %d\n", n1, n2);  
} 

El programa principal llama al método intercambio(), comunicándole las variables i y j:

int main()  
{  
   int i;  ...

Tablas y funciones: media de los valores de una tabla

La función desarrollada en el siguiente programa calcula la media de los valores contenidos en una tabla pasada como argumento.

#include <stdio.h>  
#include <stdlib.h>  
#include <time.h>  
#define DIMENSION 15 

La directiva de precompilación #define sustituye la cadena DIMENSION por la cadena 15 en todos los lugares del código. Es un tipo de replace all que se ejecuta antes de la compilación. Esto permite cambiar solo esta línea para que el programa funcione con una tabla de otra dimensión.

float media(int tab[], int numeroCasillas); 

El primer argumento del prototipo de la función media() se declara como int tab[]. Esta sintaxis significa que este argumento es una dirección de tabla de enteros. Podríamos también declararlo: int* tab

Es posible mantener el nombre de las variables en el prototipo. Pueden servir, como aquí, para clarificar el significado de los argumentos. El prototipo se podría haber escrito: float media(int[], int);

float media(int tab[], int numeroCasillas)  
{  
   int i;  
   float acumulado;  
  
   acumulado= 0;  
   for (i = 0; i < numeroCasillas; i++)  
   {  
       acumulado+= tab[i];  
 ...

Tablas y cadenas: códigos ASCII de los caracteres de una cadena

funccadena() recibe la dirección de una cadena:

void funcCadena(char* cadena);  
  
int main()  
{  
   char cadena[81];  
  
   printf("Escribir una cadena de caracteres: ");  
   gets(cadena);  
  
   funcCadena(cadena);  
   return 0;  
} 

A continuación se muestra el resultado de la ejecución de este programa:

images/a66.png

Argumentos opcionales de la función main: utilización de argc, argv

#include <stdio.h> 

Se puede agregar dos argumentos a la función main() para comunicarse con el sistema operativo:

  • argv es la dirección de una tabla que contiene las cadenas (char*).

  • argc es un entero que indica el número de cadenas contenidas en la tabla.

int main(int argc, char* argv[])  
{  
   char* mensaje;  
  
   if(argc > 1)  
   {  
       mensaje = argv[1];  
   }  
   else  
   {  
       mensaje = "CARBONERIA";  
   }  
  
   printf("CARBONERO %s.\n", mensaje);  
  
   return 0;  
} 

A continuación se muestran los resultados de la ejecución:

images/a67.png

El programa se ejecuta desde la ventana de comandos DOS.

Es posible añadir los argumentos después del nombre de la aplicación, durante la llamada. Estos argumentos se reciben en la tabla de cadenas argv[]. El número de estos argumentos se indica con la variable argc.

La primera celda de la tabla argv[] contiene el nombre de la aplicación. Por lo tanto, argc vale al menos 1.

Aquí, el efecto de la llamada: funcArgcArgv AZUL...

Trabajo práctico: funciones y fracciones

1. Tema

Crear tres funciones:

  • Una función de introducción de datos de dos números de tipo int.

    Esta función muestra:

    Introduzca el numerador:

    Introduzca el denominador:

    En cada una de las peticiones, el usuario introduce un entero.

  • Una función de cálculo de la suma de dos fracciones.

    Esta función recibe como argumentos:

    El numerador y el denominador de la primera fracción.

    El numerador y el denominador de la segunda fracción.

    Permite calcular el numerador y el denominador de la fracción suma.

  • Una función que muestra una fracción.

    Esta función recibe como argumentos:

    El numerador y el denominador de la fracción.

Escribir un programa principal que:

  • permite introducir dos fracciones (con control del denominador);

  • suma las dos fracciones;

  • muestra el resultado.

2. Funciones y fracciones: proposición de corrección

  • El objetivo de la función introduceValor() es rellenar dos enteros, por lo tanto, modificarlos. Debe recibir las direcciones.

  • Los cuatro primeros argumentos de la función suma() son los numeradores y denominadores de las fracciones que hay que sumar. No queremos modificarlos. No es necesario transmitir su dirección. Por el contrario, la función calcula y modifica los dos últimos argumentos. Pasamos su dirección.

  • La función de visualización visualizar()...

Trabajo práctico: funciones y cadenas

1. Objetivo

Aquí se trata de desarrollar algunas funciones de gestión de cadenas de caracteres, para formar una librería de funciones de herramientas.

2. Tema

Retomar los ejercicios del TP del capítulo Las cadenas de caracteres. Escribir funciones para cada una de las funcionalidades estudiadas:

1.

recuento de una letra pasada como argumento;

2.

eliminación de una letra pasada como argumento;

3.

inversión de cadena;

4.

posición del primer y último carácter no blanco de una cadena;

5.

ubicar una subcadena en una cadena.

3. Funciones y cadenas: proposición de corrección

a. Ejercicio 1

La función cuentaLetras():

  • recibe la dirección de la cadena que se ha de estudiar y el valor (el código ASCII) de la letra que se ha de contar;

  • devuelve el resultado del recuento.

int cuentaLetras(char* fila, char letra);  
  
int main()  
{  
   char fila[81];  
   char letra;  
  
   printf("Escribir una fila (máximo 80 caracteres):\n");  
   gets(fila);  
   letra = ‘o';  
  
   printf("\nNúmero de ‘%c': %d.\n", letra, cuentaLetras(fila, letra)); 
   return 0;  
}  
  
int cuentaLetras(char* fila, char letra)  
{  
   int contador;  
   char* inicio;  
  
   contador = 0;  
   inicio = strchr(fila, letra);  
  
   while (inicio!= 0)  
   {  
       contador++;  
       inicio++;  
       inicio = strchr(inicio, letra);  
   }  
  
   return contador;  
} 

A continuación se muestra el resultado de la ejecución de este programa:

images/a70.png

b. Ejercicio 2

La función eliminarLetras() recibe la dirección de la cadena que se va a estudiar y el valor (el código ASCII) de la letra que se va a eliminar.

void eliminarLetras(char* fila, char letra); 

int main()  
{  
   . . .  
   eliminarLetras(fila...