4. 2. Creación y uso de bibliotecas

Programación
EPN
2015 – B
4. 2. Creación y uso de bibliotecas
Junto con los compiladores de C++, se incluyen ciertos archivos llamados bibliotecas, más
comúnmente, librerı́as. Las bibliotecas contienen el código objeto de muchos programas
que permiten hacer cosas comunes, como leer del teclado, escribir en la pantalla, manejar
números, realizar funciones matemáticas, etc.
Las bibliotecas están clasificadas por el tipo de trabajos que hacen. Hay bibliotecas de
entrada y salida, matemáticas, de manejo de memoria, de manejo de textos, etc. Existe
una gran cantidad de librerı́as disponibles y cada una con una función especı́fica.
Nota: Existe una discusión sobre el nombre de estos archivos. Por una parte se
considera que el nombre adecuado de estos archivos es de biblioteca. Sin embargo, son
mayormente conocidos estos archivos como librerı́as. El error proviene del nombre en
inglés, que es library. Este término se traduce como biblioteca, y no como librerı́a. De
este modo a lo largo de esta sección se las llamará de cualquiera de las dos formas.
Hay un conjunto de bibliotecas (o librerı́as) muy especiales, que se incluyen con todos
los compiladores de C++, son las librerı́as (o bibliotecas) ANSI o estándar. También
hay librerı́as que no son parte del estándar pero en esta sección sólo usaremos algunas
bibliotecas (o librerı́as) ANSI.
Nota: Las librerı́as facilitan enormemente el trabajo a la hora de programar. Hay que
recordar que antes de hablar de librerı́as es necesario conocer los conceptos fundamentales
y otros temas importantes.
¿Qué son exactamente las librerı́as?
En C++, se conocen como librerı́as (o bibliotecas) a cierto tipo de archivos que podemos
importar o incluir en nuestro programa. Estos archivos contienen las especificaciones de
diferentes funcionalidades ya construidas y utilizables que podremos agregar a nuestro
programa, como por ejemplo leer del teclado o mostrar algo por pantalla.
Al poder incluir estas librerı́as con definiciones de diferentes funcionalidades podremos
ahorrarnos gran cantidad de recursos. Imaginemos por ejemplo que cada vez que necesitemos leer por teclado debamos entonces crear una función que lo haga (algo realmente
complejo). Al poder contar con las librerı́as en C++, podremos hacer uso de una gran
variedad de funciones que nos facilitarán la programación y aumentarán la modularidad
de nuestros códigos.
Las librerı́as no son únicamente archivos externos creados por terceros, también es
posible crear nuestras propias librerı́as y utilizarlas en nuestros programas. Las librerı́as
pueden tener varias extensiones diferentes, las más comunes son: .lib, .bpl, .a, .dll, .h y
algunas más ya no tan comunes.
Conclusión: Las librearı́as son archivos (no siempre externos) que nos permiten llevar
a cabo diferentes tareas sin necesidad de preocuparnos por cómo se hacen sino simplemente entender cómo usarlas. Las librearı́as en C++ permiten hacer nuestros programas
más modulares y reutilizables, facilitando además crear programas con funcionalidades
bastante complejas en unas pocas lı́neas de código.
1
Programación
EPN
2015 – B
Sintaxis para declarar librerı́as en C++
La declaración de librerı́as se debe hacer al principio de todo nuestro código, antes de
la declaración de cualquier función o lı́nea de código, debemos indicarle al compilador
que librerı́as usar, para el saber que términos estarán correctos en la escritura de nuestro
código y cuáles no. La sintaxis es la siguiente:
#include <n o m b r e d e l a l i b r e r i a >
o alternativamente
#include ‘ ‘ n o m b r e d e l a l i b r e r i a ’ ’
Cualquiera de las dos formas es válida en C++. Hay que tener en cuenta que siempre
el nombre de la librerı́a debe ir entre “ y ” o entre < y >. En el código se pueden declarar
todas las librerı́as que se necesiten, aunque en realidad no tienen sentido declarar una
librerı́a que no se va a usar en el programa, sin embargo no existe lı́mite para esto.
Librerı́as Estándar de C++ (Standard Template Library o STL)
A continuación aparecen algunas de las librerı́as de uso más común de C++ y que forman
parte de las librerı́as estándar de este lenguaje.
fstream: Flujos hacia/desde ficheros. Permite la manipulación de archivos desde el
programa, tanto leer como escribir en ellos.
iosfwd: Contiene declaraciones adelantadas de todas las plantillas de flujos y sus
typedefs estándar. Por ejemplo ostream.
iostream: Parte de la STL que contiene los algoritmos estándar, es quizá la más
usada e importante (aunque no indispensable).
list: Parte de la STL relativa a contenedores tipo list: listas doblemente enlazadas.
math: Contiene los prototipos de las funciones y otras definiciones para el uso y
manipulación de funciones matemáticas.
memory: Utilidades relativas a la gestión de memoria, incluyendo asignadores y
punteros inteligentes.
new: Manejo de memoria dinámica.
numeric: Parte de la librerı́a numérica de la STL relativa a operaciones numéricas.
ostream: Algoritmos estándar para los flujos de salida.
queue: Parte de la STL relativa a contenedores tipo queue (colas de objetos).
stdio: Contiene los prototipos de las funciones, macros, y tipos para manipular datos
de entrada y salida.
stdlib: Contiene los prototipos de las funciones, macros, y tipos para utilidades de
uso general.
string: Parte de la STL relativa a contenedores tipo string; una generalización de
las cadenas alfanuméricas para albergar cadenas de objetos. Muy útil para el uso de las
cadenas de caracteres, pues elimina muchas de las dificultades que generan los char.
2
Programación
EPN
2015 – B
typeinfo: Mecanismo de identificación de tipos en tiempo de ejecución.
vector: Parte de la STL relativa a los contenedores tipo vector; una generalización
de las matrices unidimensionales.
forward list Útil para implementar con gran facilidad listas enlazadas simples.
iterator: Proporciona un conjunto de clases para iterar elementos.
regex: Proporciona fácil acceso al uso de expresiones regulares para la comparación
de patrones.
thread: Útil para trabajar programación multihilos y crear múltiples hilos en nuestra
aplicación.
¿Cómo declarar una librerı́a en C++?
Veamos a continuación como se harı́a la declaración de unas cuantas librerı́as conocidas.
Recordar que ese pueden declarar todas las librerı́as necesarias y siempre debe hacerse al
comienzo del código fuente
#include
#include
#include
#include
‘ ‘ iostream ’ ’
‘ ‘ string ’ ’
<math . h>
<c o n i o . h>
using namespace s t d ;
La lı́nea del using namespace std; nos ayuda a declarar un espacio de nombres que
evita tener que usarlo cada vez que accedemos a alguna función especı́fica de una librerı́a.
Teniendo este namespace declarado podemos llamar por ejemplo al comando cout<<, que
pertenece a la librerı́a iostream, sin embargo, sin este namespace serı́a std::cout<<.
Acerca del namespace std
Todas las librerı́as estándar de C++ contienen una declaración del espacio de nombres std,
es decir, todas las librerı́as que hacen parte del estándar de C++ colocan entidades dentro
de este espacio de nombres.
Por esta razón cuando declaramos el uso del espacio de nombres std por medio de using
namespace std; podemos evitar estar escribiendo std::cout o std::cin en nuestro código.
El espacio de nombres std como tal no es una librerı́a sino simplemente un namespace,
por esta razón no reemplaza la declaración de las librerı́as del código, simplemente facilita
la escritura de éste al momento de usar las entidades de las librerı́as estándar. Sin embargo
si se va a hacer uso de una o varias librerı́as estándar de C++ es recomendable declarar
el namespace std, para no tener que estar constantemente escribiendo cosas similares a
std::cin, dado que únicamente se puede acceder a la entidades de las librerı́as estándar
por medio del espacio nombre std.
Veamos algunos ejemplos simples del uso de librerı́as o bibliotecas en C++.
3
Programación
EPN
2015 – B
Ejemplo 1
Podemos ver que el uso de la librerı́a stdlib.h posee una gran variedad de funcionalidades.
Para este ejemplo usaremos la función rand que nos permite generar un número aleatorio.
#include < s t d l i b . h>
#include <i o s t r e a m >
using namespace s t d ;
int main ( )
{
cout << ‘ ‘ Se va a g e n e r a r un numero a l e a t o r i o . . . \ n ’ ’ ;
cout << ‘ ‘ El numero generado e s : ’ ’ ;
cout << rand ( ) ; // Se g e n e r a y s e muestra en p a n t a l l a
return 0 ;
}
En el anterior código se han hecho uso de dos librerı́as: iostream y stdlib. La librerı́a
o biblioteca iostream nos permitirá hacer uso del cin y el cout para obtener o imprimir
valores por pantalla, respectivamente mientras stdlib nos dará acceso a la función rand
que generará por nosotros un número cualquiera.
Ejemplo 2
En el siguiente ejemplo vemos el uso de la librerı́a string.h que permite básicamente crear
y manipular muy fácilmente cadenas de caracteres
#include <s t r i n g . h>
#include <i o s t r e a m >
using namespace s t d ;
int main ( )
{
cout << ‘ ‘ Hola ! Por f a v o r i n g r e s e su nombre . . . \ n ’ ’ ) ;
s t r i n g cadena = ‘ ‘ Hola ’ ’ ;
// Se l e da un v a l o r i n i c i a l a l s t r i n g
s t r i n g nombre ; // Esta cadena c o n t e n d r a e l nombre
c i n >> nombre ; // Se l e e e l nombre
cadena = cadena + nombre ; // Se j u n t a n usando ‘ ‘+ ’ ’
cout << ( cadena ) ; // Se muestra e l r e s u l t a d o f i n a l .
return 0 ;
}
Se ha mostrado un mensaje solicitando el nombre al usuario y luego usando string
hemos creado un saludo que incluya el nombre del usuario.
4
Programación
EPN
2015 – B
Ejemplo 3
En este ejemplo se usa la biblioteca vector, iterator y list, para crear un lista doblemente
enlazada, agregar algunos elementos en ella (incluido un vector) y recorrerla.
#include <i o s t r e a m >
#include < l i s t >
#include <v e c t o r >
using namespace s t d ;
int main ( )
{
l i s t <int> m i L i s t a ; // Creamos
l i s t <int > : : i t e r a t o r i t ;
for ( int i =10; i <=50; i = i +10)
{
m i L i s t a . push back ( i ) ;
}
// Se a g r e g a un 10 20 30 40 50 a l a l i s t a
i t = miLista . begin ( ) ;
// Se e s t a b e l c e e l i t e r a d o r a l comienzo de l a l i s t a
i t ++;
//Movemos e l i t e r a d o r una p o s i c i o n ( ahora estamos en 20)
// Se i n s e r t a un 11 en l a p o s i c i o n d e l 10 11 20 30 40 50
miLista . i n s e r t ( it , 1 1 ) ;
miLista . i n s e r t ( it , 3 , 1 8 ) ;
//En l a a c t u a l p o s i c i o n d e l 20 i n s e r t a m o s un 18 t r e s v e c e s
// 10 11 18 18 18 20 30 40 50
// Creamos un v e c t o r que p o s e e r a dos e l e m e n t o s con v a l o r de 19
v e c t o r <int> myvector ( 2 , 1 9 ) ;
// I n s e r t a m o s e s e v e c t o r en l a l i s t a ,
// enviando l o s i t e r a d o r e s d e l p r o p i o v e c t o r
m i L i s t a . i n s e r t ( i t , myvector . b e g i n ( ) , myvector . end ( ) ) ;
// 10 11 18 18 18 19 19 20 30 40 50
cout << ‘ ‘ Mi l i s t a c o n t i e n e l o s i g u i e n t e : ’ ’ ;
for ( i t=m i L i s t a . b e g i n ( ) ; i t != m i L i s t a . end ( ) ; i t ++)
5
Programación
EPN
2015 – B
{
cout << ’ ’ << ∗ i t ;
// Se muestra e l v a l o r a l c u a l e s t a apuntando
}
return 0 ;
}
El resultado final de la ejecución de este código mostrará por pantalla “Mi lista contiene
lo siguiente: 10 11 18 18 18 19 19 20 30 40 50”, que es el resultado final de la inserción.
¿Cómo crear mi propia librerı́a?
Ejercicio:
1. Crear un archivo llamado milibreria.h en el que esté implementada la función multiplica acorde con la siguiente cabecera:
double m u l t i p l i c a ( double a , double b )
donde al introducir dos números reales devuelva la suma de éstos.
2. Crear un programa principal donde se incluya la librerı́a anterior y donde sea llamada
la función multiplica.
3. Implementar las funciones con las siguientes cabeceras en la misma librerı́a e invocarlas en el programa principal:
double suma ( double a , double b )
double r e s t a ( double a , double b )
double d i v i d e ( double a , double b )
6