Programación C: módulos, dividiendo el programa en partes

Siguiente entrega de la serie de artículos de programación en C. En esta ocasión para introducir al tema de los módulos. Dividir un código fuente por módulos permite facilitar mucho la resolución de problemas, reutilización del código y mantenimiento, ya que se dividen las líneas en partes que hacen una tarea específica.

Y es que todo gran problema es mucho más fácil de atacar si lo divides en pequeños problemas que puedas controlar de un mejor modo. Lo mismo ocurre en el código fuente de los programas. Recuerda: ¡divide y vencerás!

Para más información sobre la estructura de un código, puedes volver a leer el artículo que dediqué a ello.

¿Para qué sirve usar módulos?

Como ya he comentado, si en vez de un macro código unificado divides el problema en varios módulos podrás obtener una serie de ventajas:

  • Facilita el diseño de cada una de las partes o módulos, ya que serán códigos más simples. Aunque luego en conjunto sea un programa complejo.
  • Cada módulo se puede escribir de forma independiente, permitiendo que varios programadores puedan trabajar simultáneamente en un mismo programa, dividiendo la carga de trabajo entre los miembros del grupo de desarrolladores.
  • La depuración se puede llevar a cabo en cada módulo, lo que facilita las cosas.
  • El mantenimiento de cada módulo por separado será mucho más sencillo para un mantenedor.
  • El estudio por parte de terceros, si el código es abierto, también es más sencillo.
  • Se pueden usar módulos concretos como bibliotecas para reutilizarlos en otros programas.

Programa principal y funciones

En un programa C se tiene una o varias funciones, que ya deberías saber qué son. Una de esas funciones es main(), es decir, la principal, la que inicia el programa. El resto de funciones se llaman desde ésta o desde el interior de otras funciones. Esto quiere decir que la estructura del programa sería:

  • Función main(): el programa principal desde donde se llama o invocan otras funciones del programa. Esas funciones pueden estar en el mismo fichero de código fuente que main o en otros. Incluso, puedes toparte con códigos con funciones antes o después de main() sin problema.
  • Función: además de la principal también encontrarás otras funciones. Son subprogramas, partes dentro del programa principal. Es decir, la forma de crear esos módulos. Además, tienes que saber que existen dos tipos de funciones:
    • Sin paso de parámetros: no reciben parámetros o valores, en vez de eso se solicitan dentro de la propia función, se realizan los cálculos oportunos y se imprime el resultado. Sin devolver valores.
//Ejemplo de programa con paso y sin paso de parámetros en funciones
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

double dato=0.0; 
double resultado=0.0;
void raiz (double numero);    

int main()     //Función main sin paso de parámetros
{
    raiz(9);     
    raiz(-144);
    printf("Introduzca un número: ");
    scanf("%lf", &dato);
    raiz(dato);
    return 0;
}

void raiz(double numero)     //Con paso de parámetros, concretamente uno double
{
    numero = abs(numero);     
    resultado = sqrt(numero);
    printf("La raíz cuadrada es: %.2lf \n\n", resultado);
}
    • Con paso de parámetros: son las más populares, y reciben uno o más valores o parámetros. Pueden ser un entero, un real o un carácter. Los parámetros pueden ser:
      • Formales o ficticios (se encuentran en la definición de la función):
//Ejemplo de ficticios 
float suma (int x, int y) 
{ 
     int num1, num2; 
     printf("Escribe 2 enteros:"); 
     scanf("%d%d", &num1,&num2); 
}
      • Actuales o reales (se emplean en la llamada de la función):
//Ejemplo de reales
main()
{
     int num1, num2;
     float coma;
     printf("Escribe 2 enteros:");
     scanf("%d%d", &num1,&num2);
     coma=suma(num1,num2);                             //llamada a función suma
}
  • Variables: ya he comentado antes sobre ellas, y pueden ser: locales si van dentro de una determinada función, que solo se cargan en memoria cuando se está ejecutando dicha función; o globales, cuando son usadas por cualquier función y se declaran al principio, junto con las bibliotecas.
  • Llamadas de funciones: sirven para invocar a una función, basta escribir su nombre o identificador seguida de un paréntesis. Por ejemplo funcion(). Eso hará que el programa salte a dicha función y la ejecute. Es decir, el compilador generará un código que se comenzará a ejecutar desde la primera instrucción de main(), y cuando encuentre una llamada a una función saltará a esa parte del código y seguirá ejecutando la primera instrucción de este módulo…
/*Ejemplo de función y llamada de función simple*/

#include <stdio.h>

void dihola(void)                                               //Función donde se ejecuta la lógica del programa
{
 	printf("Hola ArchiTecnologia\n");     //Imprime la cadena de texto
	return;                                                       //Sale de la función
}
 
int main(void) //Función principal
{
	dihola();      //Llamada a la función dihola, es decir, hará que se muestre la cadena de texto
  	 return 0;   //Sel del programa con código = 0 (corecto)
}

Ya comenté en uno de los primeros artículos de la serie de programación en C, que el lenguaje C tiene sus propias funciones predefinidas, y cuyos nombres están reservados. Esas funciones son las que están declaradas dentro de las diferentes bibliotecas (stdio.h, math.h, conio.h, string.h, etc.). Por ejemplo, tan(x), isalpha(c), printf(), gets(), putchar(), etc.

Recursividad de funciones

Por último, me gustaría también hacer una introducción a la recursividad, es decir, cuando una función se llama a sí misma. Por ejemplo:

//Ejemplo de recursividad
#include <stdio.h>
#include <conio.h>

float factorial(int num)
{
     float f;
     if (num==0) f=1;
          else f=num*factorial(num-1);
          return f;
}
main()
{
     float fact;
     int num;
     printf("\n Introduce un número: ");
     scanf("%d", %num);
     fact=factorial(n);
     printf("\n El factorial=%7.2f\n", fact);
     getch(); 
     return 0;
}

Este pequeño snippet es para calcular el factorial. Es un código sencillo, pero donde se puede ver la recursividad de una función. En él se lee un número introducido por el usuario y la variable fact será la que almacene el resultado de la función recursiva una vez finalice. Este tipo de funciones recursivas son muy típicas en programas de factoriales, de series de Fibonacci, etc. Se irá llamando para las diferentes iteraciones hasta que sea necesario…

Dejo para el siguiente artículo el tema de creación de tus propias bibliotecas, que tiene en parte algo que ver con todo esto…

Isaac

Apasionado de la computación y la tecnología en general. Siempre intentando desaprender para apreHender.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

A %d blogueros les gusta esto:

Si continuas utilizando este sitio aceptas el uso de cookies. más información

Los ajustes de cookies de esta web están configurados para "permitir cookies" y así ofrecerte la mejor experiencia de navegación posible. Si sigues utilizando esta web sin cambiar tus ajustes de cookies o haces clic en "Aceptar" estarás dando tu consentimiento a esto.

Cerrar