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.
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.
Crear nuestra propia librería es un procedimiento relativamente simple, primero describo el procedimiento general para que lo puedas visualizar.
#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.
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.
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)
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.
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.
Funciones V en C++ by by Roberto C. González is licensed under a Creative Commons Reconocimiento-NoComercial-CompartirIgual 4.0 Internacional License.
El comando dnsenum es una herramienta de línea de comandos para realizar enumeración de DNS…
En esta entrada te presento 24 de las listas negras más comunes que los servidores…
ZoomIt es una herramienta de anotación y zoom de pantalla para presentaciones técnicas que incluyen…
WinObj es el visor de espacios de nombres de Object Manager definitivo. Es la primera…
Whois realiza el registro de registro para el nombre de dominio o la dirección IP…
VolumeID – Esta utilidad, le permite cambiar los identificadores de los discos FAT y NTFS…