2.4 Archivos de encabezado (Opcional)

(*) Los contenidos desarrollados en este artículo no son fundamentales para comprender el contenido posterior del curso, y pueden saltearse o leerse más adelante.
 

Un tipo de datos que veremos más adelante, pero que utilizaremos para este ejemplo es el tipo struct. Una variable de tipo struct puede contener varios valores simultáneamente, en diferentes campos. Así por ejemplo, podemos definir el tipo de datos fecha que contiente tres datos: año, mes y día; todos de tipo int:
 

struct fecha
{
       int dia;
       int mes;
       int anio;
};


Una variable puede definirse del tipo fecha, y permite acceder a los tres valores indicados. Las variables de tipo struct, las veremos luego en la sección 3.7
Utilizando esta estructura, podemos crear la función pascua, que recibe como parámetro una fecha y devuelve la fecha de pascua correspondiente al año de la fecha ingresada.



fecha pascua(fecha);


Para realizar el cálculo de la fecha, seguiremos el algoritmo de Butcher:




fecha pascua(fecha dp)
{
       int a,b,c,d,e,f,g,h,i,k,l,m,n;
       fecha p;
       if (dp.anio>1583)
       {
             a = dp.anio%19;
             b = dp.anio/100;
             c = dp.anio%100;
             d = b/4;
             e = b%4;
             f = (b+8)/25;
             g = (b-f+1) / 3;
             h = (19*a + b - d - g + 15 )% 30;
             i = c/4;
             k = c%4;
             l = (32 + 2*e + 2 * i - h - k) %7;
             m = (a + 11*h + 22*l) /451;
             n = h + l - 7*m + 114;
             p.mes = n/31;
             p.dia = 1 + n%31;
             p.anio = dp.anio;
       }
       else
       {
             p.dia = 1;
             p.mes = 1;
             p.anio = dp.anio;
       }
       return p;
}



Una vez definida esta función, podemos utilizarla en cualquier programa que la necesite. Un programa muy sencillo podría ser el siguiente:



void main()
{
       fecha dia, diapascua;
       cout<<"ingrese dia mes y año:";
       cin >>dia.dia;
       cin >>dia.mes;
       cin >>dia.anio;

       diapascua = pascua(dia);

       cout <<"pascua es el día: ";
       cout << diapascua.dia <<" del mes "<<diapascua.mes<<endl;

}


Este programa pide al usuario que ingrese una fecha, y le indica en qué fecha se festeja la Pascua en ese año. El programa utiliza la función, pero no tiene porqué saber cómo realiza el cálculo de dicha fecha, le basta conocer qué parámetros recibe y qué valores devuelve la función. Si quien elabora la función quiere que esta sirva luego para otros programamadores, deberá crearla en archivos separados, que pueden luego ser llamados por los programas.

El primer archivo es el archivo de encabezados, que debe incluir el prototipo de la función a compartir. (En este caso, también la definición de la estructura.) Este archivo es el que deberá ser incluido en todos los programas que quieran utilizar la función. Para identificarlo, se le agrega la extensión .h (por header, encabezado en inglés)

Archivo fechas.h:



struct fecha
{
       int dia;
       int mes;
       int anio;
};

fecha pascua(fecha);



Al archivo con la definición de la función, se rcomienda asignarle el mismo nombre que al encabezado, pero con la extensión habitual .cpp.

Archivo fechas.cpp:




#include "stdafx.h"
#include"fechas.h"

fecha pascua(fecha dp)
{
       int a,b,c,d,e,f,g,h,i,k,l,m,n;
       fecha p;
       if (dp.anio>1583)
       {
             a = dp.anio%19;
             b = dp.anio/100;
             c = dp.anio%100;
             d = b/4;
             e = b%4;
             f = (b+8)/25;
             g = (b-f+1) / 3;
             h = (19*a + b - d - g + 15 )% 30;
             i = c/4;
             k = c%4;
             l = (32 + 2*e + 2 * i - h - k) %7;
             m = (a + 11*h + 22*l) /451;
             n = h + l - 7*m + 114;
             p.mes = n/31;
             p.dia = 1 + n%31;
             p.anio = dp.anio;
       }
       else
       {
             p.dia = 1;
             p.mes = 1;
             p.anio = dp.anio;
       }
       return p;
}



Como dijimos, este archivo debe incluir la línea

   #include"fechas.h"

En esta línea se le indica al compilador que incluya el archivo anterior, imprescindible para entender la función y la estructura utilizadas. Cuando se trata de un archivo creado por el usuario, el nombre del archivo va entre comillas ("  ") y el archivo debe estar en la misma carpeta que el archivo del programa principal. Si en lugar de comillas, se lo marca con los signos menor y mayor (<    >), el compilador entiende que se trata de archivos estándar de las bibliotecas de C++ y los busca en las carpetas correspondientes.

Archivo prueba.cpp: 
 

#include "stdafx.h"
#include <iostream>
using namespace std;
#include "fechas.h"
void main()
{
       fecha dia, diapascua;
       cout<<"ingrese dia mes y anio:";
       cin >>dia.dia;
       cin >>dia.mes;
       cin >>dia.anio;
       diapascua = pascua(dia);
       cout <<"pascua es el día: " <<diapascua.dia <<" del mes "<<diapascua.mes<<endl;
}



 Al escribir el programa en el archivo prueba.cpp, se debe agregar también el #include correspondiente al archivo de encabezado, para que el compilador pueda interpretar correctamente la función y la estructura utilizadas.

También se debe incluir el archivo fechas.cpp en el proyecto, o de lo contrario no se podrá ejecutar:


En el proyecto se deben agregar los archivos de encabezados (fechas.h) y de código fuente con la definición de funciones (fechas.cpp). 

 Esta posibilidad de crear las funciones en archivos separados es fundamental para permitir la reutilización de software sin tener que estar copiando y pegando el código en todos los programas. Al estar en un único archivo, cualquier modificación posterior a fechas.cpp, se deberá hacer en este único archivo.
Incluso se puede compilar el archivo de definición de funciones y compartirlo ya compilado. De esta manera cualquier programador que quiera utilizar la función, podrá hacerlo pero no podrá ver ni modificar su código fuente.

No hay comentarios:

Publicar un comentario