deas 2015

En esta oportunidad vamos a codificar un programa que nos permita determinar la suma, resta, multiplicación y división de 2 números enteros.
Para comenzar debemos saber que el programa tendrá que hacer 2 cosas:
  • Leer dos números enteros que el usuário debe ingresar e
  • Imprimir la suma, resta, multiplicación y División en la pantalla

Comenzando

Primer Paso:

En este primer paso, codificamos lo siguiente:
  • Llamado a la Biblioteca Standard iostream
  • Utilizamos el comando "using namespace std" para indicarle al compilador la definición de la estructura del código que estamos escribiendo y el escopo que estamos utilizando.
  • Declaración de la class Calcular

Segundo Paso:

Continuando, codificamos lo siguiente:
  • Declaración de los dos números enteros que estarán contenidos en las variables a y b
  • Controlamos el acceso a las siguientes funciones utilizando public:
  • Creamos la función Ingrese
  • Creamos la función Sume
  • Creamos la función Reste
  • Creamos la función Multiplique
  • Creamos la función Divida

Tercer Paso:

Continuando, codificamos esto:
  • Nuestra função main; para indicarle al compilador que el programa comienza a ejecutarse desde aquí!
  • Creamos un objeto llamado PrimeraSuma llamado con la class Calcular
  • A través del objeto PrimeraSuma que en este momento esta alienado a la class  llamamos a la función Ingrese
  • Lo mismo hacemos con la función Sume, Reste, Multiplique y divide para que realize la operación de los dos numeros y nos lo muestre en pantalla!:
Ahora probemos nuestro aplicativo y hagamos que la magia funcione!: He ingresado los numeros 5 y 8, veamos:








Ahora que hemos llegado hasta aquí, no olvidemos de practicar más y más hasta fijar estos conocimientos; luego pasa al siguiente episodio de este interesante tutorial!





Sobrecarga de Funciones en C++

En C++, dos funciones diferentes pueden tener el mismo nombre siempre y cuando sus parámetros sean diferentes; ya sea porque tienen un número diferente de parámetros, o porque cualquiera de sus parámetros es de un tipo diferente. Osea con sobrecarga nos estamos refiriendo a la posibilidad de tener dos o más funciones con el mismo nombre pero con funcionalidad diferente, Por ejemplo:
En este ejemplo, hay dos funciones llamadas con el mismo nombre operar, pero una de ellas tiene dos parámetros del tipo int, mientras que la otra los tiene del tipo double. El compilador sabe a cuál llamar en cada caso al examinar los tipos pasados como argumentos cuando se llaman a las funciones. Si se llama con dos argumentos int, llamará a la función que tiene los dos parámetros int y si se llama con dos double llamará a la que tiene los dos double.
En este ejemplo, ambas funciones tienen comportamientos bastante diferentes, la versión int multiplica sus argumentos, mientras que la versión double los divide. Esto generalmente no es una buena idea. Por lo general, se espera que dos funciones con el mismo nombre, tengan, al menos un comportamiento similar, pero este ejemplo demuestra que es totalmente posible que no lo hagan. Dos funciones sobrecargadas (es decir, dos funciones con el mismo nombre) tienen definiciones completamente diferentes; estas son para todos los propósitos, diferentes funciones, que solo tienen el mismo nombre.
Tenga en cuenta que una función no puede sobrecargarse sólo por su tipo de devolución. Al menos uno de sus parámetros debe tener un tipo diferente.



En este capítulo hemos dado énfasis al tema de SobreCarga de funciones y como es que este recurso nos ayuda. Esto y otras cosas usted aprenderá aqui en este site bastante completo. No dejemos de practicar para conseguir nuestros objetivos. Les recomiendo que sigan mis links donde he colocado varios ejemplos básicos y complejos; sí, repítanlos para aprenderlos bien.



Recursividad en C++

La recursividad es la propiedad que tienen las funciones para llamarse a sí mismas. Es útil para realizar tareas tales como: Clasificar elementos ó calcular el factorial de los números. Por ejemplo, para obtener el factorial de un número (n!) la fórmula matemática sería:
n! = n * (n-1) * (n-2) * (n-3)... * 1   
Más concretamente, 5! (factorial de 5) sería:
5! = 5 * 4 * 3 * 2 * 1 = 120
Y una función recursiva en C++ también podría calcular eso y seria:
Observe cómo en la función factorial incluímos una llamada a sí misma, pero sólo si el argumento pasado era mayor que 1, ya que de lo contrario, la función realizaría un bucle recursivo infinito y una vez que llegara a 0 continuaría multiplicándose por todos los números negativos (lo que probablemente provoque un desbordamiento de la pila en algún punto durante el tiempo de ejecución).


En esta capítulo hemos dado énfasis al tema de funciones y como son declaradas antes de su definición. Todo para poder darle más legibilidad al código; esto y otras cosas usted aprenderá aqui en este site bastante completo. No dejemos de practicar para conseguir nuestros objetivos. Les recomiendo que sigan mis links donde he colocado varios ejemplos básicos y complejos; sí, repítanlos para aprenderlos bien.


Declarando Funciones en C++

En C++, los identificadores solo se pueden usar en expresiones una vez que se han declarado. Por ejemplo, alguna variable x no se puede usar antes de declararse con una instrucción, por ejemplo:
int x;
Lo mismo se aplica a las funciones, las funciones no pueden invocarse antes de declararse. Es por eso que, en todos los ejemplos anteriores de funciones, las funciones siempre se definieron antes que la función main, que es la función desde donde se llamaron a las otras funciones. Si main se definió antes que las otras funciones, esto romperia la regla de que las funciones se declaran antes de ser utilizadas y por lo tanto, no se compilarían. La declaración incluirá todos los tipos implicados (el tipo de retorno y el tipo de sus argumentos), utilizando la misma sintaxis que se utiliza en la definición de la función, pero reemplazando el cuerpo de la función(el bloque de enunciados) con un punto y coma final.
La lista de parámetros no necesita incluir los nombres de los parámetros, sino solo sus tipos. Sin embargo, los nombres de los parámetros se pueden especificar, pero son opcionales y no es necesario que coincidan necesariamente con los de la definición de la función. Por ejemplo, una función llamada protofuncion con dos parámetros int se puede declarar con cualquiera de estas declaraciones:

int protofuncion(int first, int second);
int protofuncion(int, int);
De todos modos, incluir un nombre para cada parámetro siempre mejora la legibilidad de la declaración: Este ejemplo no es un ejemplo de eficiencia. Probablemente usted pueda escribir una version de este programa con la mitad de las líneas de código. De todos modos, este es un ejemplo que ilustra como se pueden declarar las funciones antes de su definición. Las siguientes líneas:
void impar (int a);
void par (int a);
declaran el prototipo de las funciones. Ellas ya contienen todo lo necesario para llamarlos: su nombre, los tipos de argumento y su tipo de devolución (void en este caso). Con estas declaraciones de prototipos en su lugar, se pueden llamar antes de que esté completamente definidas, lo que permite, por ejemplo, colocar la función desde donde se las llama (main) antes de la definición real de estas funciones. Pero declarar funciones antes de definirlas no sólo es útil para reorganizarlas dentro del código. En algunos casos, como este en particular, se requiere al menos de una de las declaraciones, porque "par impar" están siendo llamadas mutuamente; hay una llamada a "par" en "impar" y una llamada a "impar" en "par". Y no hay forma de estructurar el código para que "impar" se defina antes de "par" y "par" antes de "impar".

En esta capítulo hemos dado énfasis al tema de funciones y como son declaradas antes de su definición. Todo para poder darle más legibilidad al código; esto y otras cosas usted aprenderá aqui en este site bastante completo. No dejemos de practicar para conseguir nuestros objetivos. Les recomiendo que sigan mis links donde he colocado varios ejemplos básicos y complejos; sí, repítanlos para aprenderlos bien.


Valores Predeterminados en los Parámetros en C++

En C++, las funciones también pueden tener parámetros opcionales, para las cuales no se requieren argumentos en la llamada, de tal manera que, por ejemplo una función con tres parámetros puede ser llamada con sólo dos. Para eso, la función debe incluir un valor predeterminado para su ultimo parámetro, que será usado por la función cuando se llama con menos argumentos. Por ejemplo:

En este ejemplo, hay dos llamadas a la función dividir. En el primero:
dividir (12)
La llamada solo pasa un argumento a la función, aunque la función tenga dos parámetros. En este caso, la función asume que el segundo parámetro es 2(observe la definición de la función, que declara su segundo parámetro como int b=2). Por lo tanto, el resultado es 6.

En la segunda llamada:
dividir (20,4)
La llamada pasa dos argumentos a la función. Por lo tanto, el valor predeterminado para (int b=2) se ignora y b toma el valor pasado como argumento, es decir 4, produciendo un resultado de 5.

En esta parte como ustedes pueden darse cuenta, estamos aprendiendo a pasar argumentos a traves de las funciones de una manera bastante detallada para que ustedes mis queridos lectores puedan entender y memorizar cada parte de este valioso tutorial. Sólo siempre voy a repetir: No dejemos de practicar para conseguir nuestros objetivos. Les recomiendo que sigan mis links donde he colocado varios ejemplos básicos y complejos; sí, repítanlos para aprenderlos bien.



Funciones inline

Las funciones inline ó en línea son una función de mejora de C++ para aumentar el tiempo de ejecución de un programa. Las funciones pueden ser instruidas al compilador para que estén en línea inline, de modo que el compilador pueda reemplazar esa definición de función donde sea que se llamen. El compilador reemplaza la definición de funciones inline en línea en tiempo de compilación en lugar de referir definición de funciones en tiempo de ejecución.
Para entender mejor: cuando llamamos a una función generalmente se causa una cierta sobrecarga (apilamiento, argumentos, saltos, etc...) y, por lo tanto, para funciones muy cortas; suele ser mucho más eficiente insertar el código de la función exactamente donde se llama a la función en lugar pues de realizar el proceso de llamar a la función de manera formal. 
Para esto pues es que aparece el especificador inline el cual lo que hace es informar al compilador: que la extensión inline es preferible en lugar del mecanismo de llamada de función habitual específica. Esto no cambia para nada el comportamiento de una función, sino simplemente es utilizado para SUGERIR al compilador que el código generado por el cuerpo de  la función debería insertarse en cada punto de la función donde es llamada, en lugar de invocarse con una llamada regular a esta función. Por ejemplo, la función concatenate puede declararse inline como:
inline string concatenate (const string& a, const string& b)
{
   return a+b;
}
Esto informa al compilador que cuando se llama a concatenate, el programa prefiere que la función se expanda alineada inline, en lugar de realizar una llamada regular.
Pero tenga en cuenta que la mayoría de los compiladores ya optimizan el código para generar funciones alineadas inline cuando observa una oportunidad que también mejora la eficiencia. Por lo tanto, este especificador simplemente indica al compilador que se prefiere alineadamente inline esta función, aunque el compilador es libre de no alinearlas y optimizarlas al contrario. En C++, la optimización es una tarea delegada al copilador, que es libre de generar cualquier tipo decódigo siempre y cuando el comportamiiento rersultante sea el especificado por el código.


Un tema no menos importante en nuestra caminata, no dejemos de practicar para conseguir nuestros objetivos. Les recomiendo que sigan mis links donde he colocado varios ejemplos básicos y complejos; sí, repítanlos para aprenderlos bien.





Argumentos pasados Por Valor y Por Referencia

En las funciones vistas anteriormente, los argumentos siempre han sido pasados por el valor, esto significa que: al llamar a una función, lo que se pasa a la función son los valores de estos argumentos en el momento de la llamada, que se copian en las variables representadas por los parámetros de la función. Por ejemplo, tomar:
int x=5, y=3, z;
z = addition (x,y);
En este caso, la función addition esta pasando 5 y 3, que son copias del valor de x e y. Estos valores (5 y 3) se usan para inicializar las variables establecidas como parámetros en la definición de la función; pero cualquier modificación que se haga en estas variables dentro de la función no tendrá efecto sobre el valor de las variables y ni fuera de ella, todo esto debido a que no se pasaron a ninguna función en la llamada, tan solo eran copias de sus valores en ese momento.





Sin embargo, en ciertos casos, puede ser útil acceder a una variable externa desde dentro de una función. Para hacer eso, los argumentos se pueden pasar por referencia, en lugar de por su valor. Por ejemplo, la función duplicar en este código, duplica el valor de sus tres argumentos, haciendo que las variables utilizadas como argumentos realmente sean modificadas por la llamada. 
Para obtener acceso a sus argumentos, la función los declara como referencias. En C++, las referencias se indican con un signo de & a continuación del tipo del parámetro, como en los parámetros tomados por duplicado en el ejemplo anterior.
Cuando se pasa una variable por referencia, lo que se pasa ya no es su copia, sino exactamente la variable en sí, la variable identificada por el parámetro de la función, asociándose de algún modo con el argumento pasado a la función y a cualquier modificación en sus correspondientes variables locales dentro de la función, todo esto reflejadas en las variables pasadas como argumentos en la llamada. Veamos un ejemplo básico:





 De hecho, ab y c se convierten en alias de los argumentos pasados en la llamada a la funcion (x,y e z) y cualquier cambio en a dentro de la funcion está realmente modificando la variable "x" fuera de la función. Cualquier cambio en b modifica "y" y cualquier cambio en c modifica "z". Es por eso que cuando, en el ejemplo, la funcion duplicar modifica los valores de las variables a,b y c los valores de xy y z se ven afectados.
Si en lugar de definir duplicar como:
void duplicar (int& a, int& b, int& c)
Se definiese sin los signos ampersand como:
void duplicar (int a, int b, int c)
Entonces las variables. no se pasaran por referencia, sino porvalor, creando en su lugar copias de sus valores. En este caso, la salida del programa habria sido los valores de "x","y" y "z" sin modificarse (es decir 1,3 y 7).

Consideraciones de Eficiencia y referencias const

LLamar a una función con parámetros tomados con valor hace que se hagan copias de los valores. Esta es una operación eficiente para tipos fundamentales como int, pero si el parámetro es de un tipo compuesto grande, puede ocasionar cierta sobrecarga. Por ejemplo, considere la siguiente función:
string concatenate(string a, string b)
{
   return a+b;
} 
Esta función toma dos cadenas strings como parámetros (por valor) y devuelve el resultado de concatenarlas. Al pasar los argumentos por valor, la función obliga a b a ser copias de los argumentos pasados a la función cuando se la llama. Y si se trata de cadenas strings largas, puede esto significar copiar grandes cantidades de datos solo para la llamada a la función. Pero, esta copia se puede evitar en gran medida si ambos parámetros se pasan como referencias:
string concatenate (string& a, string& b)
{
  return a + b;
}
Los argumentos por referencia no requieren de una copia. La función opera directamente (alias de) en la string pasada como argumento, y a lo máximo puede significar la transferencia de determinados punteros para la función. En este sentido, la version de referencia de la función concatenate es más eficiente que la version que toma valores, ya que no necesita copias cadenas voluptuosas para copiar. Por otro lado, las funciones con parametros de referencia generalmente son percibidas como funciones que modifican los argumentos pasados, porque es para eso que los parámetros de referencia son realmente. La solución es para la función de garantizar que sus parámetros de referencia no vayan a ser modificados por esta función. Esto se puede hacer calificando los parámetros como constantes:
string concatenate (const string& a, const string& b)
{
     return a+b;
}
Al calificarlos como const, la función está prohibida para modificar los valores de a y de b, pero puede realmente accesar sus valores como referências (alias de los argumentos), sin tener que hacer copias de las strings.
Por lo tanto, las referencias const proporcionan funcionalidad similar a pasar argumentos por valor, pero aumentan la eficiencia para parámetros de tipos grandes. Es por eso que son extremamente populares en C++ para los argumentos de los tipos de compilación. Sin embargo, tenga en cuenta que para la mayoría de los tipos fundamentales, no existe una diferencia notable en eficiencia y en algunos casos las referencias de const pueden ser incluso menos eficientes.




Un tema bastante importante en nuestra caminata, no dejemos de practicar para conseguir nuestros objetivos. Les recomiendo que sigan mis links donde he colocado varios ejemplos básicos y complejos; sí, repítanlos para aprenderlos bien.

El Valor "return" de main

Usted puede haber notado que el tipo de retorno de main es int, pero la mayoría de los ejemplos en este capítulo no retornó ningún valor desde main.
Bueno, hay un inconveniente: si la ejecución de main termina normalmente sin encontrar una declaración de retorno return, el compilador deduce que la función termina con una declaración de devolución implícita.
return 0;
Cuando main devuelve cero (explicita o implícitamente), el retorno lo interpreta como que el programa finalizó correctanente. Otros valores pueden ser devueltos por main, y algunos entornos dan acceso a ese valor a la persona que llama de alguna manera aunque este comportamiento no es necesariamente portátil entre las plataformas. Estos valores para main que están organizados para ser interpretados de la misma manera en todas las plataformas son: 
Valor    Descripción
0    
       El programa tuvo Éxito.
EXIT_SUCCESS   
       El programa tuvo Éxito.
  El valor esta definido en el encabezado<cstdlib>.
EXIT_FAILURE    
       El programa falló.
Este valor esta definido en el encabezado<cstdlib>.
Por que el implícito return 0 para la declaración main es una excepción engañosa, algunos autores consideran que es una buena practica escribir explicitamente el enunciado.



Bueno ahora estamos preparados para practicar bien con ejemplos creados por nosotros mismos. Los invito a visitar algunos ejemplos que he creado para iniciantes. Voy a subirlos en breve y por este blog estaré postando; no descuiden su practica para fijar conocimientos bastante importantes como este!

Cuando nos encontramos en una situación donde se requiere que la declaración comience con un tipo, todo perfecto, pero ¿y si la función no tiene parámetros o no devolverá ningún valor? En este caso, la palabra clave a utilizar es void que es un tipo especial para representar la ausencia de valor. Por ejemplo este caso puede presentarse en una función que simplemente imprime un mensaje y esta puede no necesitar devolver ningún valor.
void también puede ser usado en la lista de parámetros de la función para especificar explicitamente lo que la función toma en los parámetros actuales cuando es llamada. Por ejemplo mostrarMensaje se pudo también haber declarado de la siguiente manera:
void mostrarMensaje (void)
{
cout <<"Yo soy una función" << "\n";
}
El uso de void en la lista de parámetros es opcional; un par de paréntesis vacíos es aceptable y preferible. 
Entonces que quede claro que algo que en ningún caso es opcional son los paréntesis que siguen el nombre de la función, ni en su declaración ni al llamarlo. E incluso cuando la función no tome parámetros, al menos un par de paréntesis vacíos se adjuntará al nombre de la función. Vea como se llamó a mostrarMensaje en el ejemplo anterior:
mostrarMensaje();
Los paréntesis son los que diferencian las funciones de otros tipos de declaraciones o argumentos. Lo siguiente, no llamaría a la función:
mostrarMensaje;



Aprendido esto pasamos a la siguiente sesión mis curiosos lectores; si hay algo que no les esta gustando en el site o creen que debería considerar; les agradeceria que me lo hagan saber con un comentário!

Una función nos permite estructurar programas en segmentos de código para que se realicen tareas individuales. Mas claro, una función es un bloque de código que realiza alguna operación dentro de un programa.
En C++ una función no es más que un grupo de declaraciones a las que se les da un nombre y se les puede llamar desde algún punto del programa. 
La sintaxis más común para definir una función es:
//sintaxis común de función C++
tipo nombre (parametros) {statements}
Dónde:
  • tipo es el tipo del valor devuelto por la función.
  • nombre es el identificador por el cual se puede llamar a la función.
  • Parámetros (todos los que sean necesarios): cada parámetro se parece mucho a una declaración de variable regular (por ejemplo: int x) y de hecho actúa dentro de la función como una variable regular que es local para la función. El propósito de los parámetros es permitir pasar argumentos a la función desde la ubicación desde donde se le llama.
  • Statements es el cuerpo de la función. Es un bloque de instrucciones rodeado de llaves {} que especifica qué hace realmente la función.
Echemos un vistazo a un ejemplo práctico:
[tab] [content title="Uso de Funciones en C ++"] [/content] [/tab]
Este programa se divide en dos funciones: addition y main. Recuerde que no importa el orden en que se definan, un programa en C++ siempre comienza llamando a main. De hecho, main es la única función llamada automáticamente y el código de cualquier otra función solo se ejecuta si su función se llama desde main (directa ó indirectamente).
En el ejemplo anterior, main comienza declarando la variable  de tipo int y luego de esto realiza la primera llamada a la función addition. La llamada a una función sigue una estructura muy similar a su declaración. En el ejemplo anterior, la llamada a addition se puede comparar con su definición unas líneas antes.












Los parámetros en la declaración de la función tienen una correspondencia clara con los argumentos pasados en la llamada a la función. La llamada pasa dos valores, que son 5 y 3 a la función; estos corresponden a los parámetros a y b  declarados para la función addition.
En el punto en el que se llama a la función desde main, el control pasa a la función addition: aquí ya la ejecución de main se detiene y sólo se reanudará una vez que la función addition finalice. En el momento de la llamada a la función, el valor de ambos argumentos (5 y 3) son copiados para las variables locales int aint b dentro de la función.
Luego, dentro de addition se declara otra variable local (int r) y mediante la expresión r = a + b, el resultado de la suma se asigna a r; que para este caso (a es 5 y b es 3), significa que 8 se adiciona a r.
La declaración final dentro de la función:
return r;
Finaliza la función addition; y se devuelve el control al punto desde donde se llamó a la función, en este caso a la función main. En este momento preciso, el programa reanuda su curso en main retornando exactamente al mismo punto donde fué interrumpido por llamada a addition. Pero, adicionalmente, como addition tiene un tipo de devolución; la llamada se evalúa como si tuviera un valor y este valor es especificado en la declaración de devolución que finalizó con la suma: en este caso particular, el valor de la variable local r, que al momento de la declaración de devolución tenía un valor de 8.
Por lo tanto, la llamada a addition es una expresión con el valor devuelto por la función y en este caso, ese valor 8 se asigna a z. Es como si toda la llamada a la función (addition(5,3)) hubiera sido reemplazada por el valor que devuelve (es decir, 8).
Entonces main simplemente imprime este valor llamando:
cout << "The result is " << z;
En realidad, se puede invocar una función varias veces dentro de un programa y naturalmente su argumento no esta limitado solo a los literales:
Similar a la función addition en el ejemplo anterior, este ejemplo define una función de resta ó substracción que simplemente devuelve la diferencia del valor de esos dos parámetros. Esta vez, main llama a esta función varias veces, lo que demuestra más formas posibles de llamadas teniendo en cuenta que cada llamada de función es en sí misma una expresión que se evalúa a medida que el valor retorna. Una vez más, usted puede pensar de este como si la llamada a la función ha sido reemplazada por el valor devuelto:
z = substraccion (7,2);
cout << "El primer resultado es " << z;
Si reemplazamos la llamada de la función por el valor retirando (es decir,5) tendríamos:
z = 5;
cout << "El primer resultado es " << z;
Con el mismo procedimiento, podríamos interpretar:
cout << "El segundo resultado es "<< substraccion (7,2);
como:
cout << "El segundo resultado es " << 5;
Ya que 5 es el valor devuelto por substaccion(7,2).
En el caso de:
cout << "El tercer resultado es " << substraccion(x,y);
Los argumentos pasados en substraccion son variables en lugar de literales. Eso también es válido y funciona muy bien. La función se llama con los x y y que tienen en el momento de la llamada valores de 5 y 3 respectivamente y devuelven 2 como resultado.
En el cuarto párrafo todo es nuevamente similar:
z = 4 + substraccion(x,y);
La única adición es que ahora la llamada a la función también es un operando de una operación de suma. Nuevamente, el resultado es el mismo como si la función llamada fuese reemplazada por este resultado: 6. Tenga en cuenta que gracias a la propiedad conmutativa de las adiciones, lo anterior se puede también escribir como:
z = substraccion(x,y) + 4;
Con exactamente el mismo resultado. Tenga en cuenta también que el punto y coma no necesariamente vá después de la llamada a la función, sino como siempre, al final de la declaración completa.
Nuevamente, por lógica podríamos ver fácilmente de nuevo a esta, reemplazando las llamadas de función por su valor devuelto:
z = 4 + 2; //igual que z = 4 + substraccion(x,y);
z = 2 + 4; //igual que z = substraccion(x,y) + 4; 


Ahora que hemos llegado hasta aquí, no olvidemos de practicar más y más hasta fijar estos conocimientos; luego pasa al siguiente episodio de este interesante tutorial!

Una declaración simple de C ++ es cada una de las instrucciones individuales que se hacen en un programa, como aquellas declaraciones de variables y expresiones que se vieron en capítulos anteriores. Siempre terminan con un punto y coma (;) y son ejecutadas en el mismo orden en que aparecen dentro del programa. Pero los programas no se limitan a una secuencia lineal de enunciados. Durante su proceso, un programa puede repetir segmentos de código, tomar decisiones y dividirse. Justamente para ese propósito C ++ proporciona instrucciones de control de flujo, que sirven para especificar lo que debe hacer nuestro programa, cuándo y bajo qué circunstancias. Las instrucciones pueden ser de dos tipos: Instrucción Simple cuando es compuesta por una sola instrucción terminada con punto y coma (;) o una instrucción compuesta cuando es determinada por un grupo de enunciados (cada uno de ellos terminado por su propio punto y coma), pero todos agrupados en un bloque, encerrados entre llaves: "{ }"; algo así:

{ instruccion1; instruccion2; instruccion3; } 

Todo el bloque se considera una sola instrucción (compuesta de múltiples sub-instrucciones).

Instrucciones de Condición: if y else

La palabra clave if se usa para ejecutar una instrucción o bloque, si, y solo si, se cumple una condición. Su sintaxis es:

if (condicion) instruccion

Aquí, la condicion es la expresión que se está evaluando. Si esta condicion es verdadera, la instruccion se ejecuta y en caso sea falsa, la instruccion no se ejecuta (simplemente se ignora) y el programa continúa justo después de la Instruccion de Condición. Por ejemplo, el siguiente fragmento de código imprime el mensaje "x es 100", sí y sólo si el valor almacenado en la variable x es de hecho 100:

if (x == 100)
 cout << "x es 100";
En este ejemplo, si x no es exactamente 100, la afirmación se ignora y no se imprime nada. Si desea incluir más de una declaración para que se ejecute cuando se cumpla la condición, estas declaraciones se incluirán dentro de llaves ({}) formando un bloque, veamos un ejemplo:

if(x==100)
{
    cout << "x es ";
    cout << x;
}

Veamos esto en la práctica!:

Las sentencias con la instrucción if también pueden especificar qué sucede cuando la condición no se cumple, usando la palabra clave else para introducir una sentencia alternativa. Su sintaxis es:

if (condicion) instruccion1 else instruccion2

donde declaracion1 se ejecuta en caso de que la condición sea verdadera, y en caso de que no lo sea, se ejecuta declaracion2. Para ver este caso, veamos un ejemplo:

if (x == 100)
   cout << "x es 100";
else
cout << "x no es 100";

Esto debería imprimir x es 100, si de hecho x tiene un valor de 100, pero si no es así, y solo si no lo es, imprime x no es 100 en su lugar. Veamos esto con un ejemplo:
Várias estructuras if else pueden concatenarse con la intención de verificar un rango de valores. Veamos:

if (x > 0)
   cout << "x es positivo";
else if (x < 0)
   cout << "x es negativo";
else 
   cout << "x es 0";
Esto imprime x es positivo, negativo o cero al concatenar dos estructuras if-else.De nuevo, también habría sido posible ejecutar más de una declaración individual agrupándolos en bloques entre llaves: {}. En la práctica:
[tab] [content title="Uso de If"] [/content] [/tab] [tab] [content title="Uso de if/else"] [/content] [/tab] [tab] [content title="Uso de if/else mejorado"] [/content] [/tab]

Sentencias de Iteración (loops ó Bucles)

Los bucles Loops repiten una declaración un cierto número de veces, o mientras se cumple una condición.

El Loop Bucle While

El tipo más simple de bucle Loop es el bucle While. Su sintaxis es:
while (expression) statement
El loop bucle while simplemente repite la instrucción mientras que la expresión es verdadera. Si después de cualquier ejecución del enunciado, la expresión ya no es verdadera, el ciclo finaliza y el programa continúa justo después del ciclo. Por ejemplo, echemos un vistazo a una cuenta regresiva usando un bucle loop while:
//Declaraciones y controles de flujo
#include <iostream>
using namespace std;

int main()
{
    int n = 10;
    while(n > 0)
    {
        cout << n << ",";
        --n;
    }
    cout << "despegue!\n";
}
La primera instrucción en main establece en n un valor de 10. Este es el primer número en la cuenta regresiva. Luego comienza el ciclo while: si este valor cumple la condición n > 0 (que n es mayor que cero), el bloque que sigue a la condición se ejecuta y se repite mientras la condición (n >  0) permanezca siendo cierto.Todo el proceso del programa anterior se puede interpretar de acuerdo con el siguiente guión (comenzando en el principal):
  1. n tiene asignado un valor,
  2. La condición de tiempo esta marcada (n > 0). En este punto hay dos posibilidades:
    • La condición es verdadera: La instrucción se ejecuta y vamos al paso 3
    • La condición es falsa: se ignora la instrucción y el programa continua a desarrollarse después de ella; o sea nos vamos al paso 5.
  3. Se ejecuta la declaración:   
    cout << n << ", ";
        --n; 
    (se imprime el valor de n y se disminuye n en 1)
  4. Fin del bloque. Se regresa automáticamente al paso 2.
  5. Continua el programa justo después del bloque. Se imprime despegue! y termina el programa.
Una cosa a considerar utilizando el loop while es que el ciclo debe finalizar en algún punto y por lo tanto el enunciado se deberá modificar en su condición de alguna manera para forzar a que este se vuelva falso en algún momento; de lo contrario, el bucle loop continuará dando vueltas para siempre!. 
En este ejemplo anterior, el bucle incluye --n, que disminuye el valor de la variable n de uno en uno; esto eventualmente hará que la condición (n > 0 ) sea falsa después de un cierto número de iteraciones del loop bucle.
Para ser más específico, después de 10 iteraciones, n se convierte en 0, haciendo que la condición ya no sea verdadera y acabe por dar por terminado el ciclo while.
Tenga en cuenta que la complejidad de este bucle es de total conocimiento para una computadora, por lo que la cuenta regresiva se realiza instantaneamente, sin ningún retraso entre los elementos del conteo (si quiere aprofundarse más, consulte sleep_for para mayores referencias en este asunto). 

El Loop Bucle do-while

Un bucle muy similar es el bucle do-while, cuya sintaxis es:

do declaracion while (condicion);
Este loop bucle se comporta como un ciclo while, excepto que la condición se evalúa después de la ejecución de la instrucción en lugar de antes, garantizando al menos una ejecución de la instrucción, incluso si la condición nunca se cumple. Por ejemplo, el siguiente programa de ejemplo hace eco de cualquier texto que el usuario introduzca hasta que el usuario se despida:

//Declaraciones y controles de flujo
#include <iostream>
#include <string>
using namespace std;

int main()
{
    string str;
    do {
        cout << "Ingrese un texto: ";
        getline (cin, str);
        cout << "Usted ha ingresado: " << str << '\n';
    } while (str != "goobye");
}





Generalmente se prefiere el bucle do-while sobre un bucle while siempre y cuando la sentencia deba ejecutarse al menos una vez, como por ejemplo cuando la condición que se verifica al final del bucle se determina dentro de la declaración. En el ejemplo anterior, la entrada del usuario dentro del bloque es lo que determinará si el ciclo finaliza.Y así, incluso si el usuario desea finalizar el ciclo lo antes posible al ingresar adiós, el bloque en el ciclo debe ejecutarse al menos una vez para solicitar la entrada, y la condición puede, de hecho, solo determinarse después que es ejecutada.

El Loop Bucle for

El bucle for está diseñado para iterar varias veces. Su sintaxis es:
for (inicializacion; condicion; incremento) declaracion;
Al igual que el ciclo while, este ciclo repite la instrucción mientras que la condición sea verdadera. Pero, además, el bucle for proporciona ubicaciones específicas donde puede contener una inicialización y una expresión de incremento, ejecutada antes de que el bucle comience por primera vez, y después de cada iteración, respectivamente. 
Por lo tanto, es especialmente útil usar variables de contador como condición.
Funciona de la siguiente manera:
  1. La inicialización se ejecuta. En general, esto declara una variable de contador y establece un valor inicial. Esta se ejecuta una sola vez, al comienzo del ciclo.
  2. La condición es evaluada y checada. Si esta es verdadera, el ciclo continua, de lo contrario el ciclo finaliza y y la declaracion es omitida, yendo entonces directamente al paso 5. 
  3. declaracion es ejecutada. Como de costumbre, puede ser una sola declaracion ó un bloque encerrado entre llaves.
  4. Se ejecuta el incremento y el ciclo vuelve al paso 2.
  5. El ciclo termina: la ejecución continúa con la siguiente instrucción después de ella.
Aquí ejemplificamos el ejemplo de cuenta regresiva utilizando el bucle loop for:

//Declaraciones y controles de flujo
#include <iostream>
using namespace std;

int main()
{
    for (int n = 10; n > 0; n--)
    {
        cout << n << ", ";
    }
    cout << "Despegue!\n";
}
Los tres campos en un bucle for son opcionales. Se pueden dejar vacíos, pero en todos los casos se requieren signos de punto y coma entre ellos. 
Por ejemplo, para (; n <10;) es un bucle sin inicialización o aumento (equivalente a un bucle while); y para (; n <10; ++ n) es un ciclo con incremento, pero sin inicialización (tal vez porque la variable ya se había inicializado antes del ciclo). Un bucle sin condición es equivalente a un bucle con una condición verdadera (es decir, un bucle infinito).
Debido a que cada uno de los campos se ejecuta en un momento particular del ciclo de vida de un bucle, puede resultar útil ejecutar más de una expresión individual como cualquiera de inicialización, condición o declaración. Desafortunadamente, estas no son declaraciones y tampoco expresiones simples, por lo tanto no pueden ser reemplazadas por un bloque.  Como expresiones, pueden sin embargo hacer uso del operador de coma (,): este operador es un separador de expresiones y puede separar múltiples expresiones donde generalmente solo se espera una.




Por ejemplo, al usarla, sería posible que un bucle for maneje dos variables de contador, inicializando y aumentando ambas, tipo esto:

for (n=0, i=100; n!=i; ++n,--i )
{
   //cualquier cosa aquí!
}
Este ciclo se ejecutará 50 veces si ni n ni i se modifican dentro del ciclo:
n comienza con un valor de 0,  y i con 100, la condición es n != i (es decir, que n no es igual a i). Como n aumenta en uno, y i disminuye en uno en cada iteración, la condición del ciclo se volverá falsa después de la iteración 50, cuando tanto n como i sean iguales a 50. [tab] [content title="Ejemplo 1"] Escribir en pantalla los números del 1 al 10 con el ciclo for
//contar del 1 al 10 con for
#include <iostream>
using namespace std;

int main()
{
    int x;
    for (x = 1; x <= 10; x++)
        cout << x << "\n";
    return 0;
}
[/content] [content title="Ejemplo 2"] Escribir los números del 1 al 10 comenzando por el número que el usuário indique
//contar del numero que se ingrese al 10 con for
#include <iostream>
using namespace std;

int main()
{
    int x;
    int numero; //numero igresado por el usuário
    cout << "Ingrese un número menor que 10:";
    cin >> numero;
    for (x = numero;x <= 10; x++)
        cout << x << "\n";
    return 0;
}
[/content] [content title="Ejemplo 3"] En este conteo todo comenzará en el 1 y terminará en el numero que el usuario ingrese!
//contar del numero que se ingrese al 10 con for
#include <iostream>
using namespace std;

int main()
{
    int x;
    int numero; //numero igresado por el usuário
    cout << "Ingrese un número menor que 10:";
    cin >> numero;
    for (x = numero;x <= 10; x++)
        cout << x << "\n";
    return 0;
}
[/content] [/tab]




Rango para el Loop Bucle For

El bucle Loop for tiene otra sintaxis, que se usa exclusivamente con rangos:
for ( declaracion : range ) sentencia;
Este tipo de bucle for itera sobre todos los elementos en el rango, donde declaracion declara alguna variable capaz de tomar el valor de un elemento en este rango. Los rangos son secuencias de elementos, que incluyen matrices, contenedores y cualquier otro tipo que soporte las funciones de inicio y fin; la mayoría de estos tipos aún no se han introducido en este tutorial, pero ya estamos familiarizados con al menos un tipo de rango: cadenas ó srtrings, que son secuencias de caracteres.
Ejemplifiquemos esto:
//Declaraciones y controles de flujo
#include <iostream>
#include <string>
using namespace std;

int main()
{
    string str {"Hello"};
    for (char c: str)
    {
        cout << "[" << c << "]";
    }
    cout << '\n';
}
Observe que lo que precede a los dos puntos (:) en el ciclo for es la declaración de una variable char (los elementos en una cadena son de tipo char). Luego usamos la variable c en el bloque de enunciados para representar el valor de cada uno de los elementos en el rango.
Este ciclo es automático y no requiere la declaración explícita de ninguna variable de contador. Los bucles basados en rangos generalmente también usan la deducción de tipo para el tipo de elementos con auto. Normalmente, el ciclo anterior de rango también se puede escribir como:
for (auto c : str)
   cout << "[" << c << "]";
Aquí, el tipo de c se deduce automáticamente como el tipo de elementos en str.

Saltos en Declaraciones

Los saltos en las declaraciones permiten alterar el flujo de un programa al realizar saltos a ubicaciones específicas.

Declaración de interrupción Break

La declaración de interrupción break quiebra el ciclo de un bucle loop, incluso si la condición para su final no se cumple. Se puede usar para finalizar un ciclo infinito o para forzarlo a terminar antes de su final natural. Por ejemplo, detengamos la cuenta atrás antes de su final natural:
//Ejemplo de Break en bucle:
#include <iostream>
using namespace std;

int main()
{
    for (int n = 10; n > 0; n--)
    {
        cout << n << ",";
        if (n == 3)
        {
            cout << " cuenta abortada!";
            break;
        }
    }
}
Declaración de Interrupción
Declaración continue
La instrucción continue hace que el programa saltee el resto del ciclo en la iteración actual, como si se hubiera alcanzado el final del bloque de instrucciones, haciendo que salte al comienzo de la siguiente iteración. 
Por ejemplo, salteemos el número 5 en nuestra cuenta atrás:
//Ejemplo de continue en bucles loop
#include <iostream>
using namespace std;

int main()
{
    for(int n = 10; n > 0; n--)
    {
        if (n == 5) continue;
        cout << n << ", ";
    }
    cout << "despegue!\n";
}

Declaración goto

goto permite realizar un salto absoluto a otro punto en el programa. Este salto incondicional ignora los niveles de anidación y no causa ningun avanza automático de la pila. Por lo tanto, es una característica para usar con cuidado, y se recomienda dentro del mismo bloque de decisiones, especialmente en la presencia de variables locales.El punto de destino se identifica mediante la etiqueta ó label, que se utiliza entonces como un argumento para la declaración de goto. La etiqueta label está hecha de un identificador de identidad seguido de la colon (:).
El goto es una combinación de la característica de bajo nivel, con el uso de casos particulares en los sistemas de planificación de parámetros de alto nivel, de niveles de uso común con C ++. Pero, justo como un ejemplo, aquí esta la nueva version de nuestro cuenta de tiempo de bucle usando goto:
//Ejemplo de goto en bucles loop
#include <iostream>
using namespace std;

int main()
{
    int n = 10;
milabel:
    cout << n << ", ";
    n--;
    if (n > 0) goto milabel;
    cout << "despegue!\n";
}

Sentencia de Condición: switch

La sintaxis de la instrucción switch es un bit peculiar. Su propósito es comprobar un valor entre un número de posibles declaraciones. Es algo similar a la concatenación de declaraciones con if-else, pero limitado a constantes expresiones. 
Su sintaxis más típica es:
switch (expression)
{
  case constante1;
    grupo-de-declaraciones-1;
    break;
  case constante2;
    grupo-de-declaraciones-2;
    break;
  .
  .
  .
  default:
    default-grupo-de-declaraciones 
}
Funciona de la siguiente manera: 
switch evalúa la expresión y comprueba si es equivalente a constante1; si es así, ejecuta grupo-de-declaraciones-1 hasta que encuentre la sentencia break. Cuando encuentra esta declaración de interrupción, el programa salta al final de toda la instrucción de conmutación (la llave de cierre).Si la expresión no era igual a constante1, entonces se compara con constante2. Si es igual a esto, ejecuta grupo-de-declaraciones-2 hasta que se encuentre un corte break, entonces salta al final de switch.
Finalmente, si el valor de expresión no coincide con ninguna de las constantes previamente especificadas (puede haber un número de ellas), el programa ejecuta las instrucciones incluidas después de la etiqueta default: si existiese (dado que es opcional).
Los dos fragmentos de código siguientes tienen el mismo comportamiento, lo que demuestra el equivalente if-else de una instrucción switch:
La sentencia switch tiene una sintaxis algo peculiar, esta es heredada de los primeros compiladores de C, ya que utiliza etiquetas en lugar de bloques. En el uso más típico (mostrado arriba), esto significa que las declaraciones de interrupción son necesarias después de cada grupo de declaraciones para una etiqueta en particular. Si no se incluye el salto, todas las instrucciones que siguen al caso (incluidas las que están debajo de cualquier otra etiqueta) también se ejecutan, hasta que se alcanza el final del bloque de cambio o una declaración de salto (como un break).
Si el ejemplo anterior careciera de la declaración de interrupción break después del primer grupo para el caso uno, el programa no saltaría automáticamente al final del bloque switch después de imprimir "x es 1" y en su lugar continuaría ejecutando las declaraciones en el caso dos (imprimiendo también x es 2). Luego continuaría haciéndolo hasta que se encuentre una declaración de interrupción o el final del bloque de conmutación. Esto hace innecesario encerrar las declaraciones para cada caso entre llaves {}, y también puede ser útil para ejecutar el mismo grupo de declaraciones para diferentes valores posibles. Veamos un ejemplo:

switch(x){
  case 1:
  case 2:
  case 3:
    cout << "x es 1, 2 ó 3";
    break;
  default:
    cout << "x no es 1, 2 ó 3";
}
Observe que el switch se limita a comparar su expresión evaluada con las etiquetas labels que son expresiones constantes. No es posible usar variables como etiquetas o rangos, porque no son expresiones constantes válidas de C ++. Para comprobar los rangos o valores que no son constantes, es mejor utilizar concatenaciones de if y otras declaraciones.
[tab] [content title="Uso de Switch"] [/content] [/tab]
Hasta este momento hemos aprendido la base de lo que es la programación en C++; un cimiento bastante fuerte para quien quiere comenzar a programar. Eso sí; no crean que esto es todo. Ahora es necesario practicar para no quedar en el camino!.

Con la tecnología de Blogger.