19/04/2024
# Tags
#C++ #Programación

Funciones V – Librerías

Crea tus propias librerías

Hasta este momento hemos utilizado librerías incorporadas en el lenguaje, las cuales como se ha mostrado superfluamente, son cientos y abarcan múltiples áreas y objetivos.

Sin embargo, a pesar de todas las librerías que incorpora la distribución de nuestro compilador, siempre existirá la necesidad de crear nuestras propias librerías, ya sea para uso personal, para compartir con el equipo de desarrollo, o incluso, para ofrecerlas a terceros.

Observación.

A diferencia de lo que hemos hecho hasta ahora, en esta ocasión será necesario trabajar con un editor que nos permita trabajar con proyectos con más de 2 archivos.

Dependiendo el sistema que utilices habrá variantes para incorporar una librería a tu Proyecto, sin embargo todas trabajan de forma similar.

En nuestro caso te sugiero utilizar GBOnline que te permite utilizar múltiples archivos para un proyecto, guardarlos y ejecutarlos, todo en línea, solo es necesario iniciar sesión con tu red social preferida.

Proceso para crear una librería.

Crear nuestra propia librería es un procedimiento relativamente simple, primero describo el procedimiento general para que lo puedas visualizar.

  1. Primero debemos crear las funciones que contendrá nuestra librería, en la parte superior debemos declarar las cabeceras (prototipos) de las funciones implementadas.
  2. El archivo creado se debe guardar con extensión mibiblioteca.h Se deberá guardar en la carpeta include del compilador o en la carpeta donde se guardan todos los programas.
    Otra opción es que si solo se desea usar mibiblioteca.h una única vez, se puede guardar el archivo en la misma carpeta del código que queramos compilar. Dependiendo de este ultimo paso tendremos:
  3. Llamar a la biblioteca en el programa. Deberemos colocar en la cabecera del programa, junto a la llamada de otras bibliotecas:
    #include <milibreria.h> 
    //Cuando el archivo milibreria.h se encuentre en la carpeta include de nuestro compilador.
    #include "milibreria.h"  
    //Cuando el archivo milibreria.h esté en el mismo directorio que el archivo que queremos compilar.
  4. Uso de las funciones de la biblioteca: Finalmente ya podemos usar las funciones de milibreria.h sin necesidad de copiar el código de las funciones que utilizaremos.

Ejemplo

Generaremos una biblioteca que contenga funciones para realizar conversiones entre los sistemas numéricos decimal a binario, decimal a hexadecimal y decimal a octal. Para implementar estas funciones me he basado en código existente.

Es importante que observes que recurrimos a algo común en la programación y que he mencionado casi al principio, no reinventes la rueda, si ya existe código que haga lo que necesitas implementar, es más inteligente tomarlo y adaptarlo a tus necesidades.

Lo que resulta relevante es que entiendas como funciona. Además es la mejor manera de aprender un lenguaje, pues conocerás técnicas, «trucos» e instrucciones que probablemente desconozcas o que utilizas de otra forma

En este punto es necesario mencionar que una cosa es tomar algo de la comunidad y otra apropiarte del trabajo de otros: Siempre da el crédito correspondiente a quien debes. No es «malo» tomar, malo es no reconocer ni acreditar la procedencia de lo que tomaste.

A continuación verás el código de nuestra librería.

// cpp_64_libreria.h
// Este programa forma parte del tutorial de introducción al lenguaje C++
// http://a.ehack.info/leguaje-c-introduccion/
// Se definen funciones de diversas conversiones con el fin de ejemplificar leguaje-c-introduccion
// definición y uso de bibliotecas.
// 2018, Por http://about.me/carlosgbr
// Versión 1
// Compilado en https://www.onlinegdb.com/online_c++_compiler
#include <iostream>
using namespace std;
// Prototipos de función
// decimalABinario - Convierte la entrada a un número con formato Binario
// entrada: numeroDecimal, debe ser un númro entero
// salida: Devuelve un valor long, con el número equivalente en formato binario
long decimalABinario(long numeroDecimal);
// decimalAHexadecimal - Convierte la entrada a un número con formato Hexadecimal
// entrada: numeroDecimal, debe ser un númro entero
// salida: Devuelve un valor string, con la cadena equivalente en formato Hexadecimal
string decimalAHexadecimal(long numeroDecimal);
// decimalAOctal - Convierte la entrada a un número con formato Octal
// entrada: numeroDecimal, debe ser un númro entero
// salida: Devuelve un valor int, con el número equivalente en formato Octal
long decimalAOctal(long numeroDecimal);
// conversionNumerica - Esta función nos permite un vistazo rápido al uso de las
// funciones contenidas en esta biblioteca.
int conversionNumerica();
// Función de Prueba
int conversionNumerica()
{
    int numero = 0;
    cout << "Introduce un numero entero: ";
    cin >> numero;
    if (numero < 0){
        return 0;
    } else {
        cout << "Binario: " <<  decimalABinario(numero) << endl;
        cout << "Hexadecimal: " <<  decimalAHexadecimal(numero) << endl;
        cout << "Octal: " <<  decimalAOctal(numero) << endl;
    }
    return 0;
}
// remainder -- Devuelve el remanente de punto flotante de numerador/denominador
// (redondeado al más cercano):
// remainder = numer - rquot * denom
// Adaptado de https://stackoverflow.com/questions/25158255/decimal-to-binary-conversion-c
// En donde, rquot es el resultado de: numerador/denominador, redondeado hacia
// el valor integral más cercano (con casos a a punto medio redondeados hacia el
// número par).
long decimalABinario(long numeroDecimal)
{
    long remainder;
    long i=1;
    long total=0;
    while(numeroDecimal!=0)
    {
        remainder = numeroDecimal%2;
        numeroDecimal /= 2;
        total += remainder*i;
        i *= 10;
    }
    return total;
}
// Adaptado de https://stackoverflow.com/questions/29759404/decimal-to-hexadecimal-conversion-code-in-c
string decimalAHexadecimal(long numeroDecimal)
{
    string s = "";
    long rem;
    while (numeroDecimal > 0)   // Haz esto mientras el cociente sea mayor que 0.
    {
      rem = numeroDecimal % 16; // Obtener el resto.
      if (rem > 9)
      {
        // Mapea el carácter dado que el resto es mayor que 9.
        switch (rem)
        {
          case 10: s = "A" + s; break;
          case 11: s = "B" + s; break;
          case 12: s = "C" + s; break;
          case 13: s = "D" + s; break;
          case 14: s = "E" + s; break;
          case 15: s = "F" + s; break;
        }
      }
      else
      {
        s = char(rem + 48) + s; // Convierte enteros (0-9) a código ASCII.
                     // x + 48 es el código ASCII para x dígito (si 0 <= x <= 9)
      }
      numeroDecimal = numeroDecimal/16;
     }
     if (s == "") // si el número fuera 0, la cadena permanecerá vacía
       return "0";
     else
       return s;
}
// Adaptado de https://www.programiz.com/cpp-programming/examples/octal-decimal-convert
long decimalAOctal(long numeroDecimal)
{
    long rem,
    i = 1,
    numeroOctal = 0;
    while (numeroDecimal != 0)
    {
        rem = numeroDecimal % 8;
        numeroDecimal /= 8;
        numeroOctal += rem * i;
        i *= 10;
    }
    return numeroOctal;
}

Como puedes apreciar, no debes reparar en documentar, la documentación es todo. El tiempo que te ahorres no documentando, lo pagarás con creces conforme mejores tus habilidades de programación y mantengas el hábito de no hacerlo.

Programa Principal.

Ahora ya podemos desplegar nuestro programa principal sin preocuparnos de cómo hacer una conversión, solo nos debemos preocupar por hacer lo que queremos presentar a nuestro usuario final.

Como puedes observar en el encabezado, hacemos una llamada a nuestra librería, igual que cualquier otra librería incorporada en el lenguaje.

// cpp_65_libreria.cpp
// Este programa forma parte del tutorial de introducción al lenguaje C++
// http://a.ehack.info/leguaje-c-introduccion/
// Ejemplo para llamar bibliotecas definidas por el usuario.
// Requiere conversion.h
// 2018, Por http://about.me/carlosgbr
// Versión 1
// Compilado en https://www.onlinegdb.com/online_c++_compiler
#include <iostream>
#include "conversion.h"
using namespace std;
int main()
{
    int numeroDecimal = 0;
    cout<<"Este programa realiza la conversión de un número decimal en su ";
    cout<<"equivalente en los 3 sistemas numéricos más conocidos. " << endl;
    cout<<"Escribe un número entero a convertir: ";
    cin >> numeroDecimal;
    cout<<"El número: " << numeroDecimal << " base 10, equivale a: " << endl;
    cout<<"El número: " << decimalABinario(numeroDecimal) << " base 2" << endl;
    cout<<"El número: " << decimalAOctal(numeroDecimal) << " base 8" << endl;
    cout<<"El número: " << decimalAHexadecimal(numeroDecimal) << " base 16" << endl;
    return 0;
}

Como puedes apreciar, las librerías son un recurso que nos permite generar programas más limpios, separando aspectos que nos son necesarios en el programa principal en repositorios que puedes actualizar u optimizar sin necesidad de tocar el programa principal (siempre y cuando se respeten las entradas y salidas)

Compilando nuestra librería

Finalmente ilustraré el proceso de desarrollo, compilación y ejecución de este ejercicio utilizando el compilador en línea que hemos estado utilizando a lo largo de este tutorial.

  1. Ingresa a https://www.onlinegdb.com/online_c++_compiler#
  2. Inicia sesión ya sea utilizando tu cuenta de Facebook, Twitter o Github, normalmente este paso no es necesario cuando pruebas programas unitarios, pero en este caso que necesitamos generar un Proyecto, será necesario.
  3. Crea un nuevo archivo utilizando el botón «New File», nómbralo conversion.h
  4. Puedes observar que aparecen 2 pestañas indicando que nuestro proyecto tiene 2 archivos, conversion.h que acabamos de crear y «Source Code» que es donde va nuestro programa principal.
  5. En la pestaña conversion.h copia y pega, o escribe el código del programa cpp_64_libreria.h
  6. Cambia a la pestaña principal (main.cpp) y copia y pega, o escribe el código del programa cpp_65_libreria.cpp
  7. Ejecuta el programa, deberás tener una salida parecida a la que muestro en la imagen.
1. Ingresa al editor (Clic para ampliar)
1. Ingresa al editor (Clic para ampliar)
2. Inicia Sesión (Clic para ampliar)
2. Inicia Sesión (Clic para ampliar)
Logueate (Clic para ampliar)
Logueate (Clic para ampliar)
Logueate (Clic para ampliar)
Logueate (Clic para ampliar)
Logueate (Clic para ampliar)
Logueate (Clic para ampliar)
6. Pon el código en el archivo respectivo (Clic para ampliar)
6. Pon el código en el archivo respectivo (Clic para ampliar)

Observaciones finales

A continuación te presento algunos conceptos que es conveniente conozcas de forma enunciativa, cuando empieces a desarrolla aplicaciones, tendrás que usar con frecuencia estos y otros términos, en este momento con que sepas que existen es suficiente.

Ahora ya inicias una nueva etapa en la que el desarrollo de tus programas no están formados por un solo archivo como hasta ahora venía ocurriendo. De hecho en un desarrollo incluso de tamaño reducido es común que se requieran muchos archivos, no solo de código fuente, sino de otros tipos.

Cuando trabajas con un Entorno de Desarrollo Integrado (EID) es común que primero definas un Proyecto, un proyecto es el nombre con el que se agrupa todo nuestro desarrollo. El proyecto puede estar formado por archivos de código fuente (.cpp), recursos (.res), librerías propias o del sistema (.h), etc.

La forma en que se presenten los recursos y el acceso a los mismos depende del EID utilizado, pero todos siguen la misma lógica, conociendo uno, podrás utilizar cualquiera con la familiarización necesaria, por su puesto.


Ethical Hack

Referencias

Fuente Imágenes

  • «Todas las demás imágenes de esta sección»: by Nala Systems

Código Fuente

Licencia de Creative Commons
Funciones V en C++ by by Roberto C. González is licensed under a Creative Commons Reconocimiento-NoComercial-CompartirIgual 4.0 Internacional License.
Funciones V – Librerías

Funciones IV – Prototipos

Funciones V – Librerías

Funciones VI – main()

Leave a comment

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