Professional Documents
Culture Documents
1 Sinopsis
C++ no llega al nivel de simplicidad de su antecesor C, pero al igual que aqul, tampoco
dispone de utilidades o funciones para entrada o salida implementadas en el propio lenguaje,
de modo que estas y otras muchas, como manejo de cadenas de caracteres (strings), manejo
de ficheros, funciones matemticas Etc. son implementadas en forma de libreras externas.
Una librera es un conjunto de recursos (algoritmos) prefabricados, que pueden ser utilizados
por el programador para realizar determinadas operaciones ( 1.4.4a). Las declaraciones de
las funciones (prototipos 4.4.1) utilizadas en estas libreras, junto con algunas macros y
constantes predefinidas que facilitan su utilizacin, se agrupan en ficheros de nombres
conocidos que suelen encontrarse en sitios predefinidos. Por ejemplo, en los sistemas UNIX,
en /usr/include. Estos ficheros se suelen llamar "de cabecera", porque es tradicin utilizar las
primeras lneas del programa para poner las directivas #include ( 4.9.10g) que los incluir
en el fuente durante la fase de preprocesado ( 1.4).
2 Clases de libreras
Los compiladores C++ incluyen un amplio repertorio de clases, funciones y macros que
permiten realizar una amplia variedad de tareas, incluyendo entradas/salidas de bajo y alto
nivel; manipulacin de cadenas alfanumricas y ficheros; control de procesos (incluyendo
multiproceso); manejo de memoria; clculos matemticos y un largo etctera.
Para poner un poco de orden, el Estndar C++ define la denominada Librera Estndar [3] que
debe acompaar a cada implementacin del compilador que se adhiera al estndar. Es decir: la
norma determina cuales son, como se llaman y como se utiliza este conjunto de algoritmos que
deben acompaar (como mnimo) a cada implementacin del compilador que quiera llamarse
"Estndar". La ltima versin, ISO/IEC 14882 del ao 1998, especifica que se compone de 32
ficheros de cabecera de nombres fijos y conocidos agrupados segn la funcionalidad de los
algoritmos. Son los siguientes:
Ficheros Funcionalidad/funciones
<algorithm> Parte de la STL que describe los algoritmos ( 5.1.3)
<bitset> Parte de la STL relativa a contenedores tipo bitset ( 5.1.1e1). Set de
valores booleanos.
<complex> Parte de la librera numrica de la STL relativa a los complejos ( ).
<deque> Parte de la STL relativa a contenedores tipo deque; un tipo de colas:
"Double-ended-queue" ( 5.1.1c3).
<exception> Parte de la librera de diagnstico relativa al manejo de excepciones (
1.6)
<fstream> Flujos hacia/desde ficheros.
<functional> Parte de la STL relativa a Objetos-funcin ( 4.9.18f)
<iomanip> Manipuladores.
<ios> Supreclases para manejo de flujos de E/S.
<iosfwd> Contiene declaraciones adelantadas de todas las plantillas de flujos y
sus typedefs estndar. Por ejemplo ostream.
<iostream> Parte del a STL que contiene los algoritmos estndar de E/S.
<istream> Algoritmos estndar de flujos de entrada.
<iterator> Parte de la STL relacionada con iteradores ( 5.1.2), un tipo de puntero
que permite utilizar los algoritmos de la Librera con las estructuras de
datos representadas por los contenedores.
<limits> Descripcin de propiedades dependientes de la implementacin (
1.2.1) que afectan a los tipos fundamentales.
<list> Parte de la STL relativa a contenedores tipo list ( 5.1.1c4); listas
doblemente enlazadas ( 1.8)
<locale> Parte de la STL relativa a la internacionalizacin ( 5.2).
<map> Parte de la STL relativa a contenedores tipo map ( 5.1.1e4).
<memory> Utilidades relativas a la gestin de memoria, incluyendo asignadores (
5.1.5) y punteros inteligentes (auto_ptr).
<new> Manejo de memoria dinmica ( 1.3.2)
<numeric> Parte de la librera numrica de la STL relativa a operaciones numricas
( ).
<ostream> Algoritmos estndar para los flujos de salida.
<queue> Parte de la STL relativa a contenedores tipo queue ( 5.1.1d1); colas
de objetos ( 1.8).
<set> Parte de la STL relativa a contenedores tipo set ( 5.1.1e2).
<sstream> Flujos hacia/desde cadenas alfanumricas.
<stack> Parte de la STL relativa a contenedores tipo stack ( 5.1.1c5); pilas de
objetos ( 1.8).
<stdexcept> Parte de la STL relativa a las clases de las que derivan los objetos
lanzados por las excepciones ocasionadas en los algoritmos de la propia
STL y otras expresiones. Estas clases son utilizadas para reportar
errores detectados durante runtime. Los usuarios tambin pueden
utilizar excepciones para reportar errores en sus propios programas (
1.6.1a).
<streambuf> Parte de la STL relativa al Almacenamiento de flujos de E/S ("Stream
buffers"). Define los tipos que controlan la capa de transporte (
5.3.2f).
<string> Parte de la STL relativa a contenedores tipo string ( ); una
generalizacin de las cadenas alfanumricas para albergar cadenas de
objetos.
<typeinfo> Mecanismo de identificacin de tipos en tiempo de ejecucin (
4.9.14).
<utility> Parte de la STL que contiene elementos auxiliares como operadores y
pares (pairs).
<valarray> Parte de la librera numrica de la STL relativa a manejo de matrices
numricas ()
<vector> Parte de la STL relativa a los contenedores tipo vector; una
generalizacin de las matrices unidimensionales C/C++ ( 5.1.1c1)
Es digno de mencin que aunque generalmente las libreras no aportan ninguna caracterstica
al lenguaje (se supone que son utilidades auxiliares que no forman parte del lenguaje
propiamente dicho), una pequea porcin de la Librera Estndar C++ s aporta caractersticas
que se consideran pertenecientes a este, de forma que deben estar presentes los ficheros de
cabecera correspondientes si se desea usarlas. En concreto se refieren a los siguientes
elementos:
2.2 Librera C
Adems de otras nuevas, cuyo diseo e importancia cambian drsticamente la filosofa del
lenguaje, C++ incluye prcticamente la totalidad de funciones de la primitiva librera estndar C.
A esta librera, mantenida por compatibilidad, la denominamos Librera clsica ( 5.5).
Adems de las que proporciona el Estndar y las complementarias que pueda incluir por su
cuenta el fabricante del compilador, en los proyectos reales se suelen utilizar infinidad de otras
libreras, comerciales o pblicas, que facilitan el trabajo en reas particulares, y en este
sentido, recordar que uno de los pecados que el programador novel debe evitar, es la
tendencia a querer reinventar constantemente la rueda. De forma que el consejo es utilizar en
lo posible libreras que estn probadas y sean fcilmente accesibles. Aunque hay que tener
cuidado, porque determinados proyectos exigen que las libreras utilizadas estn
perfectamente documentadas y en ciertos casos, que se cuente con los fuentes
correspondientes.
Aunque el mundo del software se mueve muy rpidamente y cualquier indicacin al respecto
puede quedar rpidamente anticuada, en la pgina Libreras C/C++ de este manual puede
encontrar una seleccin de ellas. Aqu nos limitaremos a hacer especial mencin a las Libreras
Boost, por su condicin de libres y su alta calidad tcnica. Algunas de ellas han sido adoptadas
por la ltima versin del Estndar (C++11) [8].
3 Componentes
La calidad de un compilador C++ viene determinada en gran medida por la calidad y cantidad
de su RTL; por su grado de adherencia al Estndar [6] y por el grado de soporte que
proporciona para la plataforma concreta a que se destina.
Linux dispone de su propio compilador: GNU Cpp, que comenz siendo un compilador C y
ha evolucionado a un producto que es en realidad un superconjunto de compiladores. No
solo puede compilar cdigo C y C++; tambin otros lenguajes como Ada o Fortran; de
forma que es comn referirse a ellos como GCC ("GNU Compiler Collection"). La buena
noticia es que existen versiones de este compilador para plataformas Windows, de forma
que incluso en este ambiente "Propietario" pueden realizarse desarrollos utilizando
herramientas "Open source" (ver recuadro en 1.4.0a1).
4 Funcionalidad
5 Utilizacin
La utilizacin de la Librera Estndar C++ requiere de dos tipos de condiciones que podramos
describir como formales y conceptuales.
5.1 En cuanto a las primeras (condiciones formales) y habida cuenta que las utilidades
aparecen en forma de funciones, resulta evidente que su utilizacin exige incluirlas en nuestro
programa. Para ello se necesitan tres pasos (en realidad las exigencias son las mismas que
con cualquier otra funcin, la diferencia estriba en la forma en que se realizan los pasos b y c):
a: Incluir en el cdigo fuente las invocaciones a las funciones que estamos utilizando.
Ejemplo:
Puesto que los prototipos ya estn incluidos en los ficheros estndar de cabecera, hay que
indicar al compilador que los incluya [2]. Esto se realiza poniendo en nuestro fuente
(normalmente al principio) una directiva de preprocesado #include ( 4.9.10g) que seala el
fichero de cabecera que se debe aadir. Por ejemplo, si el manual indica que la
funcin printf est definida en el fichero de cabecera stdio.h ponemos en nuestro cdigo:
#include <stdio.h>
En este ltimo caso se dice que las definiciones de las funciones estn en libreras ( 1.4) de
las que existen dos tipos:estticas (.LIB, .OBJ y .BPI) y dinmicas (.DLL). Toda la informacin
que necesita el compilador est contenida en los ficheros de cabecera, por lo que las
operaciones correspondientes son realizadas de forma automtica; con la sola condicin de
que los ficheros y libreras correspondientes sean accesibles al enlazador.
5.2 Respecto a las que hemos denominado "condiciones conceptuales", damos por sentado
que la utilizacin de algoritmos de la Librera exige conocerlos. Pero debemos advertir que
existe una gran diferencia entre las rutinas de la que hemos denominadolibrera clsica y los
recursos de la nueva Librera Estndar de Plantillas STL.
5.2a En general los algoritmos contenidos en la librera clsica realizan tareas muy sencillas
bajo la forma de funciones que, con un cierto nmero de argumentos, realizan la tarea
encomendada. A veces devolviendo un objeto (que puede ser una estructura). Su utilizacin
exige poco ms que repasar esta coleccin de funciones (209 en la ltima versin del
Estndar) hasta encontrar la que mejor se ajusta a nuestras necesidades. Para esto lo mejor es
recurrir a la clasificacin temtica ofrecida en la documentacin que acompaa a los
compiladores antes que a la lista alfabtica de las mismas. A continuacin estudiamos
atentamente su prototipo y la explicacin de funcionamiento que acompaa el manual
(eventualmente incluso con un ejemplo) y ya estamos listos para utilizarla. En el peor de los
casos suelen bastar un par de pruebas hasta que conseguimos ajustar los argumentos de
forma que se consiga el resultado esperado.
Nota: a ttulo de ejemplo, el fichero BCB5RTL.HLP, que contiene la "C Runtime Library
reference" (nombre con que aparece la Librera Clsica en la documentacin de Borland),
contiene dos secciones; la primera, denominada "Categorical Routines and Types Listing",
contiene la clasificacin temtica; la segunda, denominada "Alphabetical Routines and
Types Listing", contiene la relacin alfabtica [5].
Como ltima recomendacin al respecto, sobre todo si pensamos que nuestro programa tendr
una larga vida y/o pensamos portarlo a otras plataformas, aconsejara echar un vistazo a la
seccin de "compatibilidad" que acompaa a la descripcin de cada funcin en la
documentacin de la mayora de compiladores. Suele ocurrir que el compilador ofrezca muchas
ms funciones que las estrictamente Estndar C++, y que estas no estn claramente
separadas del resto, de forma que es posible que elijamos una funcin que resuelve nuestro
problema pero no es portable, en cuyo caso aconsejara evitarlas dentro de lo posible.
Nota: como ejemplo escogido al azar, la funcin max(), que aparece en primer lugar en la
clasificacin temtica de la documentacin Borland C (Runtime Library reference:
"Categorical Routines and Types Listing"), es una funcin ofrecida por este compilador
para el entorno Windows-32 pero no es portable a UNIX ni tampoco pertenece a los
estndares C o C++.
5.2b Para todo el que no se haya asomado antes a la programacin genrica, la utilizacin
de la nueva Librera de Plantillas (STL) exige la asimilacin de un nuevo paradigma; una
nueva forma de pensar que, si se tiene experiencia en programacin tradicional, exige incluso
un "cambio de chip", ya que estas herramientas conforman un mundo enteramente nuevo y
singular.
6 Funciones y macros
Hay que sealar que algunas funciones pueden venir implementadas de dos formas:
como macro y como funcin. Por ejemplo, la funcin isalnum, contenida en <ctype.h>. Esto
significa que adems de estar implementada como una funcin en la correspondiente librera
(que se utiliza con los argumentos sealados en el manual), est definida como una macro de
preprocesado en <ctype.h>, de forma que salvo indicacin contraria al compilador, el
preprocesador transforma la llamada del programador en otra serie de sentencias equivalentes
que utilizan los mismos argumentos. El resultado es que en el cdigo resultante, que luego
pasa al compilador y al enlazador, no existe nada parecido a una llamada a una
funcin isalnum(tcnicamente el proceso es una sustitucin inline de la funcin de
librera, 4.4.6b).
Para evitar que esto ocurra y por consiguiente que la llamada a islanum nunca llegue a
producirse, basta con indefinir la correspondiente directiva. Esto se hace incluyendo al principio
del cdigo, y debajo de la lnea #include <ctype.h>, una lnea de preprocesado adecuada,
en este caso: #undef isalnum, con lo que el #define del preprocesador quedar sin efecto,
con el resultado de que todas las invocaciones a isalnum de nuestro cdigo sern respetadas
por el preprocesador. Ms tarde el enlazador cargar el cdigo de isalnum (que extrae de la
librera) con el resto de nuestro programa, y colocar en cada punto de nuestro cdigo donde
aparezca una invocacin a isalnum, un salto a la direccin adecuada.
En estos casos, el resultado es el mismo en ambas modalidades: como macro (por defecto) o
como funcin de librera. La eleccin de una u otra es cuestin de optimizacin. Para tomar una
decisin es necesario comprobar y valorar dos aspectos:
El tamao del ejecutable que resulta en uno y otro caso. Posiblemente mayor si se
utiliza la funcin muchas veces y se adopta la macro.
La velocidad de ejecucin. Posiblemente mayor si se utiliza la funcin muchas veces
(en bucles muy largos) y se utiliza la macro [1].
Inicio.
[3] En lo sucesivo la designaremos as, con maysculas iniciales, para simbolizar que es una
librera nica y perfectamente especificada.
[4] "Locales" son conjuntos de datos que indican preferencias culturales. Por ejemplo: formas
de representar la hora, las fechas, el "punto" decimal, etc. La utilidad locale de la Librera
Estndar es la forma que tiene C++ de dar soporte a la internacionalizacin de los programas.
[5] Aconsejo descargar la documentacin C++ del "Site" de Borland aunque se trabaje con otro
compilador. Adems de gratuita, es muy completa, bien estructurada y con abundantes
ejemplos.
[7] Este primer grupo constituye un caso especial: En principio una librera es algo que ayuda a
realizar determinadas operaciones con ms facilidad que la ofrecida por los mtodos
implementados en el lenguaje, o que permite hacer algo que no puede hacerse con las
herramientas definidas en l, pero que en rigor no forma parte del lenguaje en s mismo. Sin
embargo C++ ha sido dotado de ciertas extensiones que se han incluido en forma de libreras
(denominadas "de soporte" 1.5.2). De forma que en cierto sentido dichas libreras s forman
parte del lenguaje.
[8] Si quiere una perspectiva de a la evolucin de la Librera Estndar y del estado actual
(2013) de la cuestin respecto su uso, versus libreras externas, puede interesarle el artculo
(en Ingls) de Jeff Cogswell "Comparing the C++ Standard and Boost".
Inicio
|ndice| Copyright 1990-2014 Zator Systems.
Comentarios en C++
Estructura de un Programa
Libreras o Bibliotecas
Tipos de Datos
o
Ciclos o Bucles
o
o
Estructuras de Datos
o
Funciones
#include "iostream"
#include "string"
#include <math.h>
#include <conio.h>
#include <stdlib.h>
#include <iostream>
int main ()
{
cout << ("Se va a generar un numero aleatorio ....\n");
cout << ("El numero generado es : ");
cout << rand(); //Se genera el nmero con rand y se muestra en pantalla
return 0;
}
int main ()
{
cout << ("Hola! Por favor ingrese su nombre ....\n");
string cadena = "Hola "; //Se le da un valor inicial al string
cadena = cadena + nombre; //Se juntan el saludo con el nombre usando "+"
cout << (cadena); //Se muestra el resultado final.
return 0;
}
#include <iostream>
#include <list>
#include <vector>
int main ()
{
list<int> miLista; //Creamos
list<int>::iterator it;
miLista.insert (it,3,18);
//En la actual posicin del 20 insertamos un 18 tres veces
//10 11 18 18 18 20 30 40 50
//Insertamos ese vector en la lista, enviando los iteradores del propio vector
miLista.insert (it,myvector.begin(),myvector.end());
//10 11 18 18 18 19 19 20 30 40 50
return 0;
}