Programando Paso a Paso

  • Herramientas Necesarias: 

Las principales herramientas necesarias para escribir un programa en C++ son las siguientes:


  • Un equipo ejecutando un sistema operativo.
  • Un compilador de C++.
  • Windows: MingW (GCC para Windows) 
  • Linux (u otros UNIX): g++

  • Un editor cualquiera de texto, o mejor un entorno de desarrollo (IDE)
  • Windows:
  • Bloc de notas (no recomendado)
  •  Editor Notepad++
  • DevCpp (incluye MingW)
  • Code::Blocks
  • Linux (u otros UNIX):
  • Kate
  •  KDevelop
  • Code::Blocks
  • SciTE

  • Tiempo para Practicar

  • Adicional
  1. Saber Inglés
  2. Haber conocido o estado familiarizado con C u otro lenguaje.


Librerías


Algunas Librerías estándar: 

- <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 mas 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(auto_ptr).
- <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 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++.



Tipos de datos


  • C++ tiene los siguientes tipos fundamentales:

  • Caracteres: char (también es un entero), wchar_t.

  • Enteros: short intintlong intlong long int.

  • Números en coma flotantefloatdoublelong double.

  • Booleanos: bool.

  • Vacío: void.





Ahora veamos algunas consideraciones antes de mostrar un sencillo ejemplo donde se explica cada uno de sus elementos:




  • ."cout", Este se usa para la salida de datos en pantalla
  •  "cin", es para guardar datos,numeros,lo que ponemos en las variables. 

  • Para las variables no se deben usar sentencias propias del programa, estas están reservadas



  • C++ detecta minusculas y mayusculas, asi que para los comandos que se escriban hay que tener en cuenta esto.


  • todo programa hecho Tiene un Inicio, Declaración de variables , Serie de instrucciones y un Fin. 


Un ejemplo de programa en C++, el clásico Hola mundo


// Esta cabecera permite usar los objetos que encapsulan los descriptores stdout y stdin: cout(<<) y cin(>>)
#include <iostream>
 
using namespace std;
 
int main()
{
    cout << "Hola mundo" << endl;
    return 0; 
}

*Al usar la directiva #include estamos diciéndole al compilador que busque e interprete todos los elementos definidos en el archivo que acompaña la directiva (en este caso, iostream). 
*Para evitar sobrescribir los elementos ya definidos al ponerles igual nombre, se crearon los espacios de nombres o namespace del singular en inglés. En este caso hay un espacio de nombres llamado std, que es donde se incluyen las definiciones de todas las funciones y clases que conforman la biblioteca estándar de C++. 
*Al incluir la sentencia using namespace std le estamos diciendo al compilador que usaremos el espacio de nombres std por lo que no tendremos que incluirlo cuando usemos elementos de este espacio de nombres, como pueden ser los objetos cout y cin, que representan el flujo de salida estándar (típicamente la pantalla o una ventana de texto) y el flujo de entrada estándar (típicamente el teclado).
-La definición de funciones es igual que en C, salvo por la característica de que si main no va a recoger argumentos, no tenemos por qué ponérselos, a diferencia de C, donde había que ponerlos explícitamente, aunque no se fueran a usar. Queda solo comentar que el símbolo<< se conoce como operador de inserción, y grosso modo está enviando a cout lo que queremos mostrar por pantalla para que lo pinte, en este caso la cadena "Hola mundo" . 
-El mismo operador << se puede usar varias veces en la misma sentencia, de forma que gracias a esta característica podremos concatenar el objeto endl al final, cuyo resultado será imprimir un retorno de línea.
-Por último tomaremos una secuencia de caracteres del teclado hasta el retorno de línea (presionando ENTER), llamando al método get del objeto cin.


Sentencias


Sentencia if

La instrucción if es, por excelencia, la más utilizada para construir estructuras de control de flujo.
SINTAXIS
Primera Forma
Ahora bién, la sintaxis utilizada en la programación de C++ es la siguiente:


if (condicion)
   {
       Set de instrucciones
   }


siendo "condicion" el lugar donde se pondrá la condicion que se tiene que cumplir para que sea verdadera la sentencia y así proceder a realizar el "set de instrucciones" o código contenido dentro de la sentencia.


Segunda Forma
Ahora veremos la misma sintaxis pero ahora le añadiremos la parte "Falsa" de la sentencia:


if (condicion)
   {
       Set de instrucciones    //PARTE VERDADERA
   }
else
   {
       Set de instrucciones 2  //Parte FALSA
   }


La forma mostrada anteriormente muestra la union de la parte "VERDADERA" con la nueva secuencia la cual es la parte "FALSA" de la sentencia de decision "IF" en la cual esta compuesta por el:

else
   {
     Set de instrucciones 2  //Parte FALSA
   }

la palabra "else" o "De lo contrario" indica al lenguaje que de lo contrario al no ser verdadera o no se cumpla la parte verdadera entonces realizara el "set de instrucciones 2".


EJEMPLOS DE SENTENCIAS IF...

Ejemplo 1:
if(numero == 0) //La condicion indica que tiene que ser igual a Cero
    {
      cout<<"El Numero Ingresado es Igual a Cero";
    }


Ejemplo 2:
if(numero > 0) // la condicion indica que tiene que ser mayor a Cero
    {    
      cout<<"El Numero Ingresado es Mayor a Cero";
    }
     

Ejemplo 3:
if(numero < 0) // la condicion indica que tiene que ser menor a Cero
    {    
      cout<<"El Numero Ingresado es Menor a Cero";
    }
     

Ahora uniremos todos estos ejemplos para formar un solo programa mediante la utilización de la sentencia "Else" e introduciremos el hecho de que se puede escribir en este espacio una sentencia if ya que podemos ingresar cualquier tipo de código dentro de la sentencia escrita después de un Else.

Ejemplo 4:
if(numero == 0) //La condicion indica que tiene que ser igual a Cero
   {
     cout<<"El Numero Ingresado es Igual a Cero";
   }
else
   {
      if(numero > 0) // la condicion indica que tiene que ser mayor a Cero
      {    
          cout<<"El Numero Ingresado es Mayor a Cero";
      }
      else
      {
         if(numero < 0) // la condicion indica que tiene que ser menor a Cero
         {    
           cout<<"El Numero Ingresado es Menor a Cero";
         }
      }
    }


Sentencia switch



Switch
 es otra de las instrucciones que permiten la construcción de estructuras de control. A diferencia de if, para controlar el flujo por medio de una sentencia switch se debe de combinar con el uso de las sentencias case y break.
  • Notas: cualquier número de casos a evaluar por switch así como la sentencia default son opcionales. La sentencia switch es muy útil en los casos de presentación de menús.

Sintaxis:
switch (condición)
{
    case primer_caso:
         bloque de instrucciones 1
    break;

    case segundo_caso:
         bloque de instrucciones 2
    break;

    case caso_n:
         bloque de instrucciones n
    break;

    default: bloque de instrucciones por defecto
}

Ejemplo 1
switch (numero)
{
    case 0: cout << "numero es cero";
}

Ejemplo 2
switch (opcion)
{
    case 0: cout << "Su opcion es cero"; break;
    case 1: cout << "Su opcion es uno"; break;
    case 2: cout << "Su opcion es dos";
}

Ejemplo 3
switch (opcion)
{
    case 1: cout << "Su opcion es 1"; break;
    case 2: cout << "Su opcion es 2"; break;
    case 3: cout << "Su opcion es 3"; break;
    default: cout << "Elija una opcion entre 1 y 3";
}


Sentencias de iteración


Sentencias For


for(contador; final; incremento)
{
    Codigo a Repetir;
}

donde:
  1. contador es una variable numérica
  2. final es la condición que se evalua, o sea, el valor final para contador
  3. incremento es el valor que se suma o resta al contador

Ejemplo 1:
for(i=1; i<=10; i++)
{
    cout<<"Hola Mundo";   
}

-Esto indica que el contador "i" inicia desde 1 y finaliza cuando el contador "i" sea menor o igual a 10 ( en este caso llegará hasta 10) e "i++" realiza la sumatoria por unidad lo que hace que el for y el contador se sumen. repitiendo 10 veces "HOLA MUNDO" en pantalla.

Ejemplo 2:
for(i=10; i>=0; i--)
{
    cout<<"Hola Mundo";   
}

-Este ejemplo hace lo mismo que el primero, salvo que el contador se inicializa a 10 en lugar de 1; y por ello cambia la condición que se evalua así como como que el contador se decrementa en lugar de ser incrementado.


Sentencia while


while(condicion)
{
    código a Repetir
}


donde:
  1. condición es la expresión a evaluar

Ejemplo 1:
int contador = 0;
 
while(contador<=10)
{
    contador=contador+1;
    cout<<"Hola Mundo";
}

-El contador Indica que hasta que este llegue a el total de 10 entonces se detendrá y ya no se realizará el código contenido dentro de la sentencia while, de lo contrario mientras el "contador" sea menor a 10 entonces el código contenido se ejecutará desplegando hasta 10 veces "Hola Mundo" en pantalla.



Sentencia do - while


-La sentencia do es usada generalmente en cooperación con while para garantizar que una o más instrucciones se ejucuten al menos una vez. Por ejemplo, en la siguiente construcción no se ejecuta nada dentro del ciclo while, el hecho es que elcontador inicialmente vale cero y la condición para que se ejecute lo que está dentro del while es "mientras el contador sea mayor que diez". Es evidente que a la primera evaluación hecha por while la condición deja de cumplirse.

int contador = 0;
 
while(contador > 10)
{
    contador ++;
    cout<<"Hola Mundo";
}


-Al modificar el segmento de código anterior usando do tenemos:

int contador = 0;
 
do
{
    contador ++;
    cout<<"Hola Mundo";
}
while(contador > 10);

-Observe cómo en el caso de do la condición es evaluada al final en lugar de al principio del bloque de instrucciones y, por lo tanto, el código que le sigue al do se ejecuta al menos la primera vez.



funciones 


-Las funciones son un conjunto de instrucciones que realizan una tarea específica. En general toman ciertos valores de entrada, llamados parámetros y proporcionan un valor de salida o valor de retorno; aunque en C++, tanto unos como el otro son opcionales, y pueden no existir.
En C++ es obligatorio usar prototipos. Un prototipo es una declaración de una función. Consiste en una presentación de la función, exactamente con la misma estructura que la definición, pero sin cuerpo y terminada con un ";". La estructura de un prototipo es:
[extern|static] <tipo_valor_retorno> [<modificadores>] <identificador>(<lista_parámetros>); 
En general, el prototipo de una función se compone de las siguientes secciones:
  • Opcionalmente, una palabra que especifique el tipo de almacenamiento, puede ser extern ostatic. Si no se especifica ninguna, por defecto será extern. No te preocupes de esto todavía, de momento sólo usaremos funciones externas, lo menciono porque es parte de la declaración.
  • El tipo del valor de retorno, que puede ser void, si no necesitamos valor de retorno. En C++ es obligatorio indicar el tipo del valor de retorno.
  • Modificadores opcionales. Tienen un uso muy específico, de momento no entraremos en este particular, lo veremos en capítulos posteriores.
  • El identificador de la función. Es costumbre, muy útil y muy recomendable, poner nombres que indiquen, lo más claramente posible, qué es lo que hace la función, y que permitan interpretar qué hace el programa con sólo leerlos. 
  • Una lista de declaraciones de parámetros entre paréntesis. Los parámetros de una función son los valores de entrada (y en ocasiones también de salida). Para la función se comportan exactamente igual que variables, y de hecho cada parámetro se declara igual que una variable. Una lista de parámetros es un conjunto de declaraciones de parámetros separados con comas. Puede tratarse de una lista vacía. En C++ este procedimiento se considera obsoleto, se usa simplemente "func()".


Por ejemplo:
int Mayor(int a, int b);

Un prototipo sirve para indicar al compilador los tipos de retorno y los de los parámetros de una función, de modo que compruebe si son del tipo correcto cada vez que se use esta función dentro del programa, o para hacer las conversiones de tipo cuando sea necesario.
En el prototipo, los nombres de los parámetros son opcionales, y si se incluyen suele ser como documentación y ayuda en la interpretación y comprensión del programa. El ejemplo de prototipo anterior sería igualmente válido si se escribiera como:

int Mayor(int, int); 

Esto sólo indica que en algún lugar del programa se definirá una función "Mayor" que admite dos parámetros de tipo int y que devolverá un valor de tipo int. No es necesario escribir nombres para los parámetros, ya que el prototipo no los usa. En otro lugar del programa habrá una definición completa de la función.
Normalmente, los prototipos de las funciones se declaran dentro del fichero del programa, o bien se incluyen desde un fichero externo, llamado fichero de cabecera.


                                   Funciones void

-Bajo ciertas circunstancias se deseará escribir funciones que no regresen valor alguno (esto sería algo parecido a escribir procedures en Pascal) y para ello podemos declarar a la función como void. La palabra reservada void es utilizada para declarar funciones sin valor de retorno y también para indicar que una función específica no requiere de parámetros. Por ejemplo, la función pausa() que se verá en seguida, no devolverá valor alguno y la misma no requiere de parámetros.



// esta función requiere de la librería iostream
void pausa(void)
{
    cout << "Por favor presione <Enter> HOLA...";
    cin.get();
    cin.ignore(255, '\n');  // rechazar caracteres introducidos antes de <Enter>
}


Notas: se debe de aclarar que el uso de la palabra void dentro de los parentesis es opcional al momento de declarar una función. Asi, la función pausa() podría haberse declarado como void pausa(), y la misma puede invocarse como: pausa();.




Arrays 

Los arrays permiten agrupar datos usando un único identificador. Todos los elementos de un array son del mismo tipo, y para acceder a cada elemento se usan índices.
Sintaxis:

<tipo> <identificador>[<núm_elemen>][[<núm_elemen>]...];

Los corchetes en negrita no indican un valor opcional: deben aparecer, por eso están en negrita. La sintaxis es similar que para las cadenas, de hecho, las cadenas no son otra cosa que arrays de caracteres (tipo char).

Un detalle muy importante es que los valores para el número de elementos deben ser constantes enteras. Nunca se puede usar una variable para definir el tamaño de un array.
Se pueden usar tantas dimensiones (índices) como queramos, el límite lo impone sólo la cantidad de memoria disponible.
Cuando sólo se usa un índice se suele hablar de vectores, cuando se usan dos, de tablas. Los arrays de tres o más dimensiones no suelen tener nombres propios.
Ahora podemos ver que las cadenas de caracteres son un tipo especial de arrays. Se trata en realidad dearrays de una dimensión de objetos de tipo char.
Los índices son números enteros, y pueden tomar valores desde 0 hasta <número de elementos>-1. Esto es muy importante, y hay que tener mucho cuidado, porque no se comprueba si los índices son válidos. Por ejemplo:

int Vector[10];

Creará un array con 10 enteros a los que accederemos como Vector[0] a Vector[9].
Como índice podremos usar cualquier expresión entera.



Estructuras

Al contrario que los arrays, las estructuras nos permiten agrupar varios datos, que mantengan algún tipo de relación, aunque sean de distinto tipo, permitiendo manipularlos todos juntos, usando un mismo identificador, o cada uno por separado.
Las estructuras son llamadas también muy a menudo registros, o en inglés records. Tienen muchos aspectos en común con los registros usados en bases de datos. Y siguiendo la misma analogía, cada objeto de una estructura se denomina a menudo campo, o field.
Sintaxis:

struct [<identificador>] {
   [<tipo> <nombre_objeto>[,<nombre_objeto>,...]];
} [<objeto_estructura>[,<objeto_estructura>,...];

El identificador de la estructura es un nombre opcional para referirse a la estructura.
Los objetos de estructura son objetos declarados del tipo de la estructura, y su inclusión también es opcional. Sin bien, aún siendo ambos opcionales, al menos uno de estos elementos debe existir.
En el interior de una estructura, entre las llaves, se pueden definir todos los elementos que consideremos necesarios, del mismo modo que se declaran los objetos.
Las estructuras pueden referenciarse completas, usando su nombre, como hacemos con los objetos que ya conocemos, y también se puede acceder a los elementos definidos en el interior de la estructura, usando el operador de selección (.), un punto.
Una vez definida una estructura, es decir, si hemos especificado un nombre para ella, se puede usar igual que cualquier otro tipo de C++. Esto significa que se pueden declarar más objetos del tipo de estructura en cualquier parte del programa. Para ello usaremos la forma normal de declaración de objetos, es decir:

[struct] <identificador> <objeto_estructura>
   [,<objeto_estructura>...];

En C++ la palabra struct es opcional en la declaración de objetos, al contrario de lo que sucede en C, en el que es obligatorio usarla.
Ejemplo:

struct Persona {
   char Nombre[65]; 
   char Direccion[65]; 
   int AnyoNacimiento; 
} Fulanito; 

Este ejemplo define la estructura Persona y declara a Fulanito como un objeto de ese tipo. Para acceder al nombre de Fulanito, por ejemplo para visualizarlo, usaremos la forma:

cout << Fulanito.Nombre;