martes, 22 de agosto de 2017

Sentencias de c++

Sentencias de c++

1  Sinopsis
Las sentencias ("Statements") especifican y controlan el flujo de ejecución del programa. Si no existen sentencias específicas de selección o salto, el programa se ejecuta de forma secuencial en el mismo orden en que se ha escrito el código fuente (es el que podríamos considerar orden "natural" de ejecución).
En este capítulo explicaremos los distintos tipos de sentencias que existen en C++, pero antes ofreceremos una descripción formal de las mismas señalando qué se entiende por sentencia.
§2  Definición
Una expresión es una secuencia de operadores; operandos; elementos de puntuación y palabras clave, que especifican una computación. Tiene sentido computacional en sí misma y equivale a una frase en el lenguaje normal. Entre sus características distintivas están las de poder producir un resultado y posibles efectos laterales. Ejemplo:
extern x;        // No produce un valor
y = 22;          // Produce un valor
z = i++;         // Valor + efectos laterales

Cualquier expresión finalizada en un punto y coma ; forma una sentencia:
< expresión >;
C++ ejecuta las sentencias evaluando la expresión. Todos los efectos colaterales de la evaluación son tenidos en cuenta antesde ejecutar la próxima sentencia. La mayoría de sentencias C++ son asignaciones o llamadas a funciones.
Un caso especial es la sentencia nula; consiste en un punto y coma (;) aislado. Una sentencia nula no hace nada, pero puede ser necesaria en situaciones en que la sintaxis del lenguaje espere una sentencia pero nuestro programa no necesita hacer nada.
Nota: como la mayoría de las cosas de C++, la definición anterior tiene su excepción. Existe un tipo especial de sentencia, las directivas de preproceso  en las que el punto y coma puede omitirse. Este tipo de sentencias no ejecuta una computación de tiempo de ejecución sino de compilación (realizan modificaciones sobre el fuente). Entre las que sí ejecutan una computación en runtime también existe una, las etiquetas directas, que no terminan en punto y coma sino en dos puntos :  (ver a continuación )
§2  Clasificación
Dada la definición anterior, resulta evidente que pueden existir infinitas sentencias distintas, e innumerables criterios para su clasificación. Una de las posibles, que además coincide con la clasificación del Estándar, distingue las siguientes clases de sentencia:
  • De etiqueta
  • De expresión
  • Compuestas
  • De selección
  • De iteración
  • De salto
  • De declaración
  • Bloques de intento
Además de las anteriores, por sus características especiales podríamos considerar las siguientes clases adicionales:
  • Sentencias de preproceso
  • Sentencias ensamblador
§2.1  Sentencias de etiqueta
En C++ existen tres clases de sentencias etiquetadas: las etiquetas directas ( 4.10.1a), las sentencias case ( 4.10.1b) y las default ( 4.10.1c), estas últimas se utilizan en conjunción con las sentencias switch.
§2.2  Sentencias de expresión
Podríamos decir que son las que no pertenecen a ninguno de los otros grupos y que, en la práctica, son las más abundantes. Generalmente son asignaciones o invocaciones de funciones. Ejemplo:
pint = &x;
foo(c);
§2.3  Sentencias compuestas
Las sentencias compuestas, también denominadas bloques ( 1.3.1) se utilizan en aquellas situaciones en que la sintaxis espera una sentencia pero se necesita usar varias. Ejemplo:
if (first) ++x;
else {
   --x; z = a;
}
En caso de cumplirse la condición hay que incrementar x, lo que puede hacerse en una sola sentencia, pero si la condición resulta falsa, se precisan dos computaciones. Para que se comporten como una sola frente a else, se recurre a englobarlas en un bloque entre llaves { ... }. Las sentencias dentro del bloque se comportan como una sola y constituyen un ámbito léxico. Los identificadores definidos en su interior eclipsan a los exteriores y las variables automáticas creadas en él son destruidas al salir del ámbito.
§2.4  Sentencias de selección
Las sentencias de selección o de control de flujo, pueden decidir entre varios cursos de acción distintos en función de ciertos valores. Existen dos tipos de estas sentencias de selección: if...else ( 4.10.2) y switch ( 4.10.2).
Ejemplos:
switch ( foo() ) {
    case 0: case 1:
       if (first) break;
       else ++x;
    case 2:
       ...
    default:
       break;
}
§2.5  Sentencias de iteración
Las sentencias de iteración permiten repetir un conjunto de sentencias ejecutando un bucle.  En C++ existen tres formas de iteraciones: los bucles while ( 4.10.3), do…while ( 4.10.3) y for ( 4.10.3).
Ejemplo:
while (first) {
   ...
   for (int x = 1; x < y; ++x) {
      ...
      do {                  // begin second
         ...
         ...
      } while (second);     // end second
      ...
   }      // end for
   ...
}         // end first
§2.6  Sentencias de salto
Las sentencias de salto permiten transferir el control del programa de forma incondicional. Existen cuatro de estas sentencias: break ( 4.10.4), continue ( 4.10.4), ( 4.10.4) y return ( 4.10.4).
Ejemplo:
while (foo) {
    start:
    if (some) break;
    ...
    if (first) goto start;
    ...
    if (second) continue;
    ...
    if (! any) return;
    ...
}
Nota: en ocasiones es posible utilizar el mecanismo de excepciones C++ como mecanismo de salto multinivel ( 1.6).
§2.7  Sentencias de declaración
Este tipo de sentencias introducen uno o más identificadores en un bloque. Ejemplo:
void foo (int x, y z) {
   float f = 3.14;
   char c;
   int x;
   ...
}
El asunto es tratado extensamente en el capítulo "Declaraciones y definiciones" ( 4.1.2).
§2.8  Bloques de intento
Estas sentencias deben estar seguidas de una sentencia catch y tienen la forma:
try {
   ...
}
Son utilizadas por el mecanismo de excepciones C++ y han sido expuestas con detalle en el capítulo correspondiente ( 1.6)
§2.9  Sentencias de preproceso
Como se ha indicado, constituyen un tipo muy especial, tanto en su sintaxis como en su comportamiento. No representan una computación en tiempo de ejecución (runtime), sino de compilación, ya que su efecto es realizar modificaciones sobre el código fuente [1]. Su sintaxis también es especial; no requieren el punto y coma de terminación y comienzan siempre con el símbolo #  ( 4.9.10).
§2.10  Sentencias ensamblador
C++ dispone de la opción de poder escribir directamente instrucciones en lenguaje ensamblador junto con el resto del código fuente. Para esto dispone de una palabra clave específica: asm.
La palabra asm indica que la cadena literal que sigue será incluida en el código objeto en la posición indicada.
La sintaxis empleada depende del compilador. En el caso de C++Builder, es la siguiente:
asm <opcode> <operandos> <; o NL>
Ejemplo
asm pop dx;
asm push ebx;
asm call @@std@%basic_ostream$c19std@%char_traits$c%%@put$qc;
asm add esp,8;
asm push ebx;
Se permite que varias instrucciones ensamblador pueden ser agrupadas en un solo bloque precedido por el indicador asm. Ejemplo:
asm {
  mov ax, 0x0e07;
  xor bx, bx;
  int 0x10;
}

La sintaxis empleada por el compilador C++ GNU para Windows utilizado por Dev-C++ no utiliza la sintaxis de Intel, sino la de AT&T.
Ejemplo [2]:
int AdrIO;            // variable global
static char ValIO;    // variable global

void foo() {
  __asm("mov _AdrIO, %dx") ;  // cargar un registro de 16 bits
  __asm("mov _ValIO, %al") ;  // cargar un registro de 8 bits
  __asm("mov %ax,%dx") ;      // mover contenido registro AX a DX
Nota: no olvidar incluir el guión bajo ("underscore") precediendo los nombres de variables globales.
Ni que decir tiene que cualquier código ensamblador insertado mediante asm, es específico, y por tanto dependiente, de la plataforma sobre la que se ejecutará el programa. Este tipo de sentencias deben reducirse al máximo si queremos facilitar la portabilidad del código.
  Temas relacionados
  • Estructura lógica de un programa: Sentencias y Expresiones ( 1.3.1)
  • Sintaxis de las sentencias C++ 
  • Sintaxis de las expresiones C++ 

[1]  En este sentido, las funciones y clases genéricas (plantillas), también pueden ser consideradas como sentencias que tienen efecto sobre el código fuente 
[2]  Ejemplo tomado de Dev-C++ 5 Help File.


Comentarear en c++

Comentarear en c++

  1. con "//" todo lo que se escriba después de esto en una línea será un comentario
  2. "/*" con esto se abre el comentario y todo lo que se escriba después incluyendo
    otras líneas serán comentarios hasta que se cierre "*/" en bloque de comentarios


Compilador de C++

Compilador de c++

 Un compilador es un programa informático que traduce un programa escrito en un lenguaje de programación a otro lenguaje de programación, generando un programa equivalente que la máquina será capaz de interpretar. Usualmente el segundo lenguaje es lenguaje de máquina, pero también puede ser un código intermedio (bytecode), o simplemente texto. Este proceso de traducción se conoce como compilación.1
Un compilador es un programa que permite traducir el código fuente de un programa en lenguaje de alto nivel, a otro lenguaje de nivel inferior (típicamente lenguaje de máquina). De esta manera un programador puede diseñar un programa en un lenguaje mucho más cercano a como piensa un ser humano, para luego compilarlo a un programa más manejable por una computadora.

Cómo funciona

El proceso de traducción se compone internamente de varias etapas o fases, que realizan distintas operaciones lógicas. Es útil pensar en estas fases como en piezas separadas dentro del traductor, y pueden en realidad escribirse como operaciones codificadas separadamente aunque en la práctica a menudo se integren juntas.

Fase de análisis

Análisis léxico

El análisis léxico constituye la primera fase, aquí se lee el programa fuente de izquierda a derecha y se agrupa en componentes léxicos (tokens), que son secuencias de caracteres que tienen un significado. Además, todos los espacios en blanco, líneas en blanco, comentarios y demás información innecesaria se elimina del programa fuente. También se comprueba que los símbolos del lenguaje (palabras clave, operadores, etc.) se han escrito correctamente.
Como la tarea que realiza el analizador léxico es un caso especial de coincidencia de patrones, se necesitan los métodos de especificación y reconocimiento de patrones, se usan principalmente los autómatas finitos que acepten expresiones regulares. Sin embargo, un analizador léxico también es la parte del traductor que maneja la entrada del código fuente, y puesto que esta entrada a menudo involucra un importante gasto de tiempo, el analizador léxico debe funcionar de manera tan eficiente como sea posible.

Análisis sintáctico

En esta fase los caracteres o componentes léxicos se agrupan jerárquicamente en frases gramaticales que el compilador utiliza para sintetizar la salida. Se comprueba si lo obtenido de la fase anterior es sintácticamente correcto (obedece a la gramática del lenguaje). Por lo general, las frases gramaticales del programa fuente se representan mediante un árbol de análisis sintáctico.
La estructura jerárquica de un programa normalmente se expresa utilizando reglas recursivas. Por ejemplo, se pueden dar las siguientes reglas como parte de la definición de expresiones:
Cualquier identificador es una expresión.
Cualquier número es una expresión.
Si expresión1 y expresión2 son expresiones, entonces también lo son:
expresión1 + expresión2
expresión1 * expresión2
( expresión1 )
Las reglas 1 y 2 son reglas básicas (no recursivas), en tanto que la regla 3 define expresiones en función de operadores aplicados a otras expresiones.
La división entre análisis léxico y análisis sintáctico es algo arbitraria. Un factor para determinar la división es si una construcción del lenguaje fuente es inherentemente recursiva o no. Las construcciones léxicas no requieren recursión, mientras que las construcciones sintácticas suelen requerirla. No se requiere recursión para reconocer los identificadores, que suelen ser cadenas de letras y dígitos que comienzan con una letra. Normalmente, se reconocen los identificadores por el simple examen del flujo de entrada, esperando hasta encontrar un carácter que no sea ni letra ni dígito, y agrupando después todas las letras y dígitos encontrados hasta ese punto en un componente léxico llamado identificador. Por otra parte, esta clase de análisis no es suficientemente poderoso para analizar expresiones o proposiciones. Por ejemplo, no podemos emparejar de manera apropiada los paréntesis de las expresiones, o las palabras begin y end en proposiciones sin imponer alguna clase de estructura jerárquica o de anidamiento a la entrada.

Análisis semántico

La fase de análisis semántico revisa el programa fuente para tratar de encontrar errores semánticos y reúne la información sobre los tipos para la fase posterior de generación de código. En ella se utiliza la estructura jerárquica determinada por la fase de análisis sintáctico para identificar los operadores y operandos de expresiones y proposiciones.
Un componente importante del análisis semántico es la verificación de tipos. Aquí, el compilador verifica si cada operador tiene operandos permitidos por la especificación del lenguaje fuente. Por ejemplo, las definiciones de muchos lenguajes de programación requieren que el compilador indique un error cada vez que se use un número real como índice de una matriz. Sin embargo, la especificación del lenguaje puede imponer restricciones a los operandos, por ejemplo, cuando un operador aritmético binario se aplica a un número entero y a un número real.2 Revisa que los arreglos tengan definido el tamaño correcto.

Fase de síntesis

Consiste en generar el código objeto equivalente al programa fuente. Sólo se genera código objeto cuando el programa fuente está libre de errores de análisis, lo cual no quiere decir que el programa se ejecute correctamente, ya que un programa puede tener errores de concepto o expresiones mal calculadas. Por lo general el código objeto es código de máquina relocalizable o código ensamblador. Las posiciones de memoria se seleccionan para cada una de las variables usadas por el programa. Después, cada una de las instrucciones intermedias se traduce a una secuencia de instrucciones de máquina que ejecuta la misma tarea. Un aspecto decisivo es la asignación de variables a registros.

Generación de código intermedio

Después de los análisis sintáctico y semántico, algunos compiladores generan una representación intermedia explícita del programa fuente. Se puede considerar esta representación intermedia como un programa para una máquina abstracta. Esta representación intermedia debe tener dos propiedades importantes; debe ser fácil de producir y fácil de traducir al programa objeto.
La representación intermedia puede tener diversas formas. Existe una forma intermedia llamada «código de tres direcciones» que es como el lenguaje ensamblador de una máquina en la que cada posición de memoria puede actuar como un registro. El código de tres direcciones consiste en una secuencia de instrucciones, cada una de las cuales tiene como máximo tres operandos. Esta representación intermedia tiene varias propiedades:
Primera.- Cada instrucción de tres direcciones tiene a lo sumo un operador, además de la asignación, por tanto, cuando se generan estas instrucciones, el traductor tiene que decidir el orden en que deben efectuarse las operaciones.
Segunda.- El traductor debe generar un nombre temporal para guardar los valores calculados por cada instrucción.
Tercera.- Algunas instrucciones de «tres direcciones» tienen menos de tres operandos, por ejemplo, la asignación.

Optimización de código

La fase de optimización de código consiste en mejorar el código intermedio, de modo que resulte un código máquina más rápido de ejecutar. Esta fase de la etapa de síntesis es posible sobre todo si el traductor es un compilador (difícilmente un intérprete puede optimizar el código objeto). Hay mucha variación en la cantidad de optimización de código que ejecutan los distintos compiladores. En los que hacen mucha optimización, llamados «compiladores optimizadores», una parte significativa del tiempo del compilador se ocupa en esta fase. Sin embargo, hay optimizaciones sencillas que mejoran sensiblemente el tiempo de ejecución del programa objeto sin retardar demasiado la compilación.

Palabras Reservadas de c++

Palabras reservadas de c++

Las palabras reservadas son identificadores predefinidos que tienen significados especiales y no pueden usarse como identificadores creados por el usuario en los programas.
 
Las palabras reservadas de C++ pueden agruparse en 3 grupos. 

El primero contiene las palabras de C y que C++ como evolución de C también contiene:

auto   const   double   float   int
short   struct   unsigned   break   continue
else   for   long   signed   switch
void   case   default   enum   goto
register   sizeof   typedef   volatile   char
do   extern   if   return  static
union   while

Palabras que no provienen de C y que, por tanto, solo utiliza C++:

asm    dynamic_cast    namespace    reinterpret_cast    try   bool    explicit
new    static_cast   typeid   catch    false    operator    template
typename   class    friend    private    this    using   const_cast    inline
public    throw    virtual   delete    mutable    protected    true    wchar_t

Las siguientes palabras reservadas se han añadido como alternativas para algunos operadores de C++ y hacen los programas más legibles y fáciles de escribir:

and    bitand    compl    not_eq    or_eq    xor_eq   and_eq   bitor    not    or    xor

Librerias de c++

Librerias de c++

Junto con los compiladores de C y C++, se incluyen ciertos archivos llamados bibliotecas mas comúnmente librerías. Las bibliotecas contienen el código objeto de muchos programas que permiten hacer cosas comunes, como leer el 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 y como imaginarás existen muchísimas librerías disponibles y todas con una función especifica.
Nota: Existe una discusión sobre el nombre de estos archivos. Muchos personas consideran que el nombre adecuado es archivos de biblioteca, y estan en lo correcto. Sin embargo, la mayoría llamamos a estos archivos librerías, y también me incluyo entre estos. 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 las llamaré de cualquiera de las dos formas, para estár mas claros.
Hay un conjunto de bibliotecas (o librerías) muy especiales, que se incluyen con todos los compiladores de C y 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 2: Sé que esto pinta aburrido, pero es muy útil y realmente las libreróas nos facilitan enormemente el trabajo de programar. Recuerda que antes de hablar librerías y demás es necesario dominar algunos conceptos de fundamentacion en general y otros temas importantes .Ahora veamos algunas librerías y como es su sintaxis.

¿Qué son exactamente las librerías?

En C++, se conoce 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 entre muchas otras más.
Al poder incluir estas librerías con definiciones de diferentes funcionalidades podremos ahorrarnos gran cantidad de cosas, 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 facilitaran la vida y aumentarán la modularidad de nuestros códigos.
Las librerías no son únicamente archivos externos creados por otros, 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.
En 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.
La declaración de librerías, tanto en C como en C++, 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 estaran correctos en la escritura de nuestro código y cuáles no. La sintaxis es la siguiente: #include <nombre de la librería> o alternativamente #include "nombre de la librería". Cualquiera de las 2 formas es válida en C++ (no estoy seguro si en C sea válido), ten en cuenta que siempre el nombre de la librería debe ir entre " y " o entre < y >. En tu código puedes declarar todas las librerías que quieras aunque en realidad no tienen sentido declarar una librería que no vas a usar en tu programa, sin embargo no existe límite para esto.

Librerías Estandar de C++ (Standar Template Library o STL)

A continuación pondré algunas de las librerías de uso más común de C++ y que forman parte de las librerías estandar de este lenguaje.
  • fstream:
    Flujos hacia/desde ficheros. Permite la manipulación de archivos desde el programar, 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 del a STL que contiene los algoritmos estándar, es quizá la más usada e importante (aunque no indispensable).
  • La biblioteca 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 (auto_ptr).
    "auto_ptr" es una clase que conforma la librería memory y permite un fácil manejo de punteros y su destrucción automaticamente.
  • Biblioteca 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).
  • Librería stdio:
    Contiene los prototipos de las funciones, macros, y tipos para manipular datos de entrada y salida.
  • Librería 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 fácil uso de las cadenas de caracteres, pues elimina muchas d elas dificultades que generan los char
  • 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 C/C++
  • forward_list
    Esta librería es útil para implementar con gran facilidad listas enlazadas simples.
  • list
    Permite implementar listas doblemente enlzadas (listas enlazadas dobles) facilmente.
  • 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.
Nota: Para más información sobre las librerías estandar de C++ y STL puedes ingresar aquí

¿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, recuerda que ese pueden declarar todas las librerías necesarias y siempre debe hacerse al comienzo del código fuente
Con esto debió quedar claro, como declarar librerías C++ al interior de un código fuente. Lo único adicional, es la línea que dice using namespace std; esta línea nos ayuda a declarar un espacio de nombre que evita tener que usarlo cada que accedemos a alguna función especifica de una librería. Teniendo este namespace declarado podemos llamar por ejemplo el comando cout >>, que pertenece a la librería iostream, sin embargo sin este namespace sería std::cout >>, imagina tener que hacer esto cada vez que uses algún comando o función de las librerías, sería bastante tedioso.

Acerca del namespace std

Todas las librerías estándar de C++ contienen una declaración del espacio de nombre std, es decir que todas las librerías que hacen parte del estándar de C++ colocan entidades dentro de este espacio de nombre.
Por esta razón cuando declaramos el uso del espacio de nombre std por medio de "using namespace std;", podemos evitar estar escribiendo std::cout o std::cin, etc en nuestro código.
El espacio de nombre 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 vamos a hacer uso de una o varias librerías estándar de C++ es recomendable que declaremos el namespace std, para no tener que estar constantemente escribiendo cosas similares a las que puse hace unas líneas como std::cin o similares, dado que únicamente se puede acceder a la entidades de las librerías estándar por medio del espacio nombre std.
Muy bien, ahora veamos algunos ejemplos simples del uso de librerías o bibliotecas en C++

Ejemplo 1 de librerías en C++

En el siguiente ejemplo veremos el uso de la librería stdlib.h que posee una gran variedad de funcionalidades, para este ejemplo usaremos la función rand que nos permite generar un número aleatorio.
 
#include <stdlib.h>
#include <iostream>

using namespace std;

int main ()
{
    cout << ("Se va a generar un numero aleatorio ....\n"); 
    cout << ("El numero generado es : ");
    cout << rand(); //Se genera el número con rand y se muestra en pantalla
    return 0;
}
 
En el anterior código hemos 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 de librerías en C++

En el siguiente ejemplo veremos el uso de la librería string.h que nos permite básicamente crear y manipular muy fácilmente cadenas de caracteres
 
#include <string.h>
#include <iostream>

using namespace std;

int main ()
{
    cout << ("Hola! Por favor ingrese su nombre ....\n");
    string cadena = "Hola "; //Se le da un valor inicial al string
    
    string nombre; //Esta cadena contendrá el nombre
    cin >> nombre; //Se lee el nombre
    
    cadena = cadena + nombre; //Se juntan el saludo con el nombre usando "+"
    cout << (cadena); //Se muestra el resultado final.
    return 0;
}
 
Aquí hemos mostrado un mensaje solicitando el nombre al usuario y luego usando string, hemos creado un saludo que incluya el nombre del usuario. "Hola Juan".

Ejemplo 3 para bibliotecas en C++

En este ejemplo usaremos la biblioteca vector, iterator y list, para crear un lista doblemente enlazada, agregar algunos elementos en ella (incluido un vector) y recorrerla.
 
#include <iostream>
#include <list>
#include <vector>

using namespace std;

int main ()
{
 list<int> miLista; //Creamos
 list<int>::iterator it;

 for (int i=10; i<=50; i = i+10)
 {
  miLista.push_back(i);
 }
 //Se agrega un 10 20 30 40 50 a la lista

 it = miLista.begin(); //Se estabelce el iterador al comienzo de la lista
 it++; //Movemos el iterador una posición (ahora estamos en 20)

 //Se inserta un 11 en la posición del 10 11 20 30 40 50
 miLista.insert (it,11);

 miLista.insert (it,3,18);
 //En la actual posición del 20 insertamos un 18 tres veces
 //10 11 18 18 18 20 30 40 50


 //Creamos un vector que poseerá dos elementos con valor de 19
 vector<int> myvector (2,19);

 //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


 cout << "Mi lista contiene lo siguiente:";

 for (it=miLista.begin(); it!=miLista.end(); it++)
 {
  cout << ' ' << *it; //Se muestra el valor al cual está aùntando el iterador
 }

 return 0;
}
 
El resultado final de la ejecución de este código debería 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.
Muy bien. He añadido este par de ejemplo a petición de algunos visitantes del sitio y creo que sí eran muy necesarios, espero que con esto hayas clarificado dudas y afianzado el concepto.
¡¡¡Bueno!!! Es todo lo que necesitas saber sobre librerías, al menos en la lista que te he puesto, están las que vamos a usar para ejemplos y ejercicios y algunas otras de mas. Si deseas información sobre alguna otra o que amplíe la información sobre alguna que ya esta aquí, házmelo saber por medio de la seccion de comentarios.
Ahora vamos a la siguiente sección y metamosle mano a algunos códigos y cómo es su estructura. Da clic en el siguiente contenido llamado Funciones de c++

domingo, 20 de agosto de 2017

Analisis orientado del texto

Analisis orientado del texto 

//problema
 1include <iostream.h>
{ int main () int suma,x,; suma=0; for(x=1;x<=19;x=x+2); { suma=suma+x; { cout<<"suma="<<suma; return 0; }

Biblioteca estandar de plantillas STL

Biblioteca estandar de plantillas  STL


La STL (Standard Template Library) de C++ es una colección genérica de plantillas de clases y algoritmos que permite a los programadores implementar fácilmente estructuras estándar de datos como colas (queues), listas (lists), y pilas (stacks).
La STL de C++ provee a los programadores con lo constructores siguientes, agrupados en tres categorias:
Secuencias (sequences)
  1. C++ Vectors
  2. C++ Lists
  3. C++ Double-Ended Queues
Adaptadores de contenedor (Container Adapters)
  1. C++ Stacks
  2. C++ Queues
  3. C++ Priority Queues
Contenedores asociativos (Associative Containers)
  1. C++ Bitsets
  2. C++ Maps
  3. C++ Multimaps
  4. C++ Sets
  5. C++ Multisets
La idea detras de la STL de C++ es que la parte dificil en el uso de estructuras complejas de datos ya ha sido previamente completada. Por ejemplo, si un programador desea usar un stack de enteros, todo lo que tiene que hacer es escribir el código:
stack<int> myStack;
Con un minimo de esfuerzo, él o ella puede usar la función push() para ingresar enteros al stack; y la función pop() para retirar enteros del stack. A través de la magia de las plantillas de C++, se puede especificar cualquier tipo de dato, no sólo enteros. La clase Stack de la STL provee la funcionalidad genérica de un stack, sin importar el tipo de dato en el stack.

El termino iterar significa (en palabras sencillas) el método o forma que se usa para poder navegar sobre los elementos de una lista específica. Luego, un iterador es como una especie de "puntero especial" que nos permite leer o escribir valores sobre cada uno de los elementos en una lista. Los iteradores pueden ser comparados con los índices que se emplean para leer o escribir valores sobre los elementos de una lista. Igual a lo que sucede con los tipos de datos dentro de un arreglo primitivo en donde para leer o escribir valores sobre los elementos se tiene que prestar atención al tipo de dato, un iterador tiene que ser del tipo de dato que posee la lista. En ese sentido, si tenemos por ejemplo un vector que posee datos de tipo entero (int) entonces el iterador tendrá que ser de tipo entero; si por el contrario se tiene un vector cuyos datos son del tipo cadena (string) entonces el iterador tiene que ser del tipo cadena


Sintaxis

La sintaxis general para la declaración de un iterador es:

NombrePlantilla<tipo>::iterator varid;

Donde,
NombrePlantillaEs el nombre de una STL
tipoEs el tipo usado para la plantilla
 ::iteratorEs el método para obtener el iterador
varidEs el nombre de la variable

Por ejemplo, para obtener un iterador a un vector de tipo int podemos usar la instruccion:

vector <int>::iterator el_iterador;

A manera de ejemplo, vamos a mostrar un programa en el que se usará un iterador de tipo char.
Nota: en el programa se hace uso de los métodos begin para obtener un iterador hacia el inicio del vector, y end para obtener un iterador hacia el final del mismo.
// Demostracion del uso de iteradores
// probado en: Dev-C++ 4.9.9.2
 
#include <cstdlib>
#include <iostream>
#include <vector>
 
using namespace std;
 
int main(int argc, char *argv[])
{
    vector<char> v;
 
    for (int x = 'A'; x <= 'Z'; x++)
        v.push_back(x);
 
    // obtenemos un iterator del tipo char
    vector<char>::iterator it;

    // lectura y despliegue de datos
    cout << "\ndesplegando datos" << endl;
    for( it = v.begin(); it != v.end(); it++ )
        cout << *it << endl;
 
    system("PAUSE");
    return EXIT_SUCCESS;
}

Iteradores reversos

La STL de C++ permite que los elementos de las listas creadas puedan ser navegados en orden "normal", es decir desde el primero hasta el último de los elementos agregados a la lista, y para dichas tareas se usa un iterador normal. También, los elementos pueden navegarse en orden "reverso" y en tales casos se usa un iterador en reverso ( reverse_iterator ). Un ejemplo de reverse_iterator se muestra en el siguiente programa.

Notas:
  • Se debe de observar que para obtener iteradores normales se usan (generalmente) los métodos begin() y end(), mientras que que para obtener iteradores reversos se emplean los métodos rbegin() y rend().
  • Los iteradores reversos se comportan de manera inversa. Por ejemplo, para obtener un iterador que vaya desde el final hasta el inicio de los elementos, se usa la función rbegin() la cual regresará un iterador para procesar la lista desde el último hasta el primero de los elementos. En contraparte, la función begin() regresa un iterador para procesar la lista desde el primero hasta el último de los elementos. Es decir, begin() regresa una referencia hacia el primer elemento, mientras que rbegin() regresa una referencia hacia el último elemento.
// Demostracion del uso de iteradores reversos
// probado en: Dev-C++ 4.9.9.2
 
#include <cstdlib>
#include <iostream>
#include <list>
 
using namespace std;

int test()
{
  list<char> v;

  for (int x = 'A'; x <= 'Z'; x++) v.push_back(x);
  cout << endl;

  out << "orden original" << endl;
  // creamos un iterator normal
  list<char>::iterator i = v.begin();
  while(i != v.end() )
  {
    cout << *i++ << " ";
  }
  cout << endl;

  cout << "orden inverso" << endl;
  // creamos un iterator reverso
  list<char>::reverse_iterator ri = v.rbegin();
  while(ri != v.rend() )
  {
    cout << *ri++ << " ";
  }
  cout << endl;
  return 0;
}


int main(int argc, char *argv[])
{
  test();
  system("PAUSE");
  return EXIT_SUCCESS;
}

Sentencias de c++

Sentencias de c ++ 1  Sinopsis Las  sentencias  ("Statements") especifican y controlan el flujo de ejecución del programa. Si...