Documentos de Académico
Documentos de Profesional
Documentos de Cultura
C++ es algo así como la evolución del lenguaje C. La intención de su creación fue el
extender al exitoso lenguaje de programación C con mecanismos que permitan la
manipulación de objetos. En ese sentido, desde el punto de vista de los lenguajes
orientados a objetos, el C++ es un lenguaje híbrido. La historia de C (predecesor de
C++) parte de un lenguaje anterior, el lenguaje B, escrito por Ken Thompson en 1970
con el objetivo de recodificar el sistema operativo UNIX, que hasta el momento se
había programado en ensamblador. Lo malo del lenguaje ensamblador era que lo ligaba
a una serie de máquinas concretas, por lo que conseguir un lenguaje abstraído de cada
máquina conseguiría una portabilidad del sistema muchísimo mayor. A su vez B fue
inspirado en el BCPL de Martin Richards, diseñado tres años antes.
En 1972 es Dennis Ritchie (de los Laboratorios Bell de AT&T) quien diseña finalmente
C a partir del B de Thompson, aportando un diseño de tipos y estructuras de datos que
consiguen una claridad y eficacia en el lenguaje muy superior. Es un lenguaje que
permite realizar una programación estructurada economizando las expresiones, con
abundancia de operadores y tipos de datos (aunque los básicos sean pocos),
codificando en alto y bajo nivel simultáneamente, reemplazando ventajosamente la
programación en ensamblador y permitiendo una utilización natural de las funciones
primitivas del sistema.
Durante muchos años no existieron reglas estándar para el lenguaje, pero en 1983 se
decide formar un comité con el objetivo de crear el estándar ANSI. El proceso dura
seis años y a principios de los 90 el estándar es reconocido por la ISO (Organización
Internacional de Estándares) y comienza a comercializarse con el nombre ANSI C.
1
C++ es una extensión de C. El siguiente hecho fundamental en la evolución de C++
es sin duda la incorporación de la librería STL años más tarde, obra de Alexander
Stepanov y Andrew Koening. Esta librería de clases con contenedores y algoritmos
genéricos proporciona a C++ una potencia única entre los lenguajes de alto nivel.
Debido al éxito del lenguaje, en 1990 se reúnen las organizaciones ANSI e ISO para
definir un estándar que formalice el lenguaje. El proceso culmina en 1998 con la
aprobación del ANSI C++.
Finalizaremos esta sección con el famoso "Hola Mundo" en C++, puedes comparar la
diferencia entre ambos códigos y determinar las nuevas características que tiene C++
sobre C.
Define y diga su función de: sdtio, iostream, using namespace std, cout, ;, /* */.
2
código, lo cual permite identificar todo con mayor rapidez. Existen dos tipos de
comentarios en el lenguaje:
Comentarios multi-línea
Comentar código es una muy buena práctica para todos y facilitarnos la vida con
nuestras aplicaciones. Cuando termines aquí, tomate un pequeño descanso y
continuemos con la sección de estructura de un programa en C++.
Me parece que la mejor forma de no perder el interés de este tema, aburriéndolos con
muchos conceptos y teorías, es mediante un ejemplo (a todos nos gusta la práctica).
Veamos entonces nuestro primer programa en C++, que, aunque no es muy extenso
ni complicado ni tampoco hace gran cosa, nos ayudará a establecer unas bases que
resultarán muy útiles para los siguientes ejemplos que irán apareciendo durante el
resto del curso. No te preocupes si no comprendes nada al principio, pues me
encargaré de irte enseñando cada cosa y así estaremos mejor, si no entiendes algo o
crees que me faltó explicar alguna cosa, dímelo,
El programa que vamos a realizar simplemente le dará a una variable el valor del
resultado de sumar 5 + 5, cabe resaltar que en pantalla no se muestra nada por lo que
la ejecución del programa será prácticamente instantánea.
3
Este es nuestro programa:
Indique que sucede en el programa línea a línea, usa tus propias palabras de acuerdo a
tu entendimiento, luego lee abajo
Línea 4:
Contiene una llave abriendo "{", en C++, se usan las llaves tanto para indicar el
comienzo como el final de cada función, sea cual sea, es decir sea la función main o
cualquiera que tu hayas inventado, debe comenzar con una llave abriendo y terminar
con una cerrando (tiene sentido ¿no?). Es por esto, que esta llave se encuentra ahí,
indicando el inicio de nuestra función main.
Línea 5:
Esta línea, contiene la declaración de una variable llamada numero, presta especial
atención a esta línea, pues es muy sensible a errores al momento de codificar, esta
línea contiene primero el tipo de nuestra variable, en este caso es entera (int) pero
podría ser alguna de las que mencione anteriormente o cualquier otra, lógicamente
valida. Esta línea es sensible, porque tanto en C como en C++ los nombres de las
variables son sensibles a las mayúsculas y a las minúsculas, es decir, para C o C++ la
variable numero y la variable Numero, son dos variables totalmente distintas o la
4
variable Numero y la variable NuMeRo, debes tener cuidado en no mezclar mayúsculas
y minúsculas, así que acostúmbrate a escribir normalmente en minúsculas. Otro detalle
de esta tercera línea es el punto y coma ";" en C y C++ el punto y coma indican el
final de una sentencia (no una sentencia de muerte o algo así, ¡no te distraigas!), una
sentencia es una línea de código, en la cual se realiza algún tipo de operación,
asignación, comparación o declaración (fíjate! todas terminan en "cion") por ejemplo la
línea 5, 7 y 8, son líneas de sentencia. Así que cada que realices cualquier operación
en una línea, esta debe termina con punto y coma, de lo contrario tendrás errores en
tu código. Ten en cuenta que la línea 3, no es una sentencia, pues aunque allí se está
aparentemente declarando a la función main, no es así, pues el int que hay antes del
main() nos indica el tipo de valor que debe retornar nuestra función, mas no
exactamente el tipo que es nuestra función, por esto no se usa el punto y coma en la
línea 3 (ojo! no estoy diciendo que cuando se declare una función no se use punto y
coma, no te enredes con esto, en la línea 1 simplemente se está implementando la
función main, más adelante lo comprenderás, confía en mi).
Línea 6:
No tiene nada especial, es simplemente un campo vacío, no genera ningún tipo de
cambio para el compilador, pero nos permite ordenar un poco nuestro código. Quizá si
eres curioso intenta eliminar todos los saltos de línea dejando todo el código en una
sola línea y veras que pasa (nada malo te lo aseguro), así confirmaras tú mismo lo que
dije acerca de los espacios en blanco.
Que sucede
Línea 7:
Esta línea contiene una operación, por lo tanto, es una línea de sentencia (mira que
termina con punto y coma), en esta línea, estamos dándole o, mejor dicho, asignándole
un valor a la variable numero, que ahora tendrá el valor de la operación matemática 5
+ 5 es decir, la variable numero valdrá 10. Ahora que hablo de asignación, quiero
explicarte algo que en ocasiones suele confundir y es que en C++ hay dos operadores
similares pero no idénticos que son el igual "=" y el doble igual "==", en C++ el igual
solo "=" se usa para asignación, es decir para darle a una variable el valor de otra o el
valor de una operación especifica como por ejemplo 5 + 5, mientras que el operador
de doble igual "==" se usa para comparación, es decir para comparar si el valor de una
variable es igual a otro, por ejemplo: escribir numero = 5 + 5; es válido, pero escribir
numero == 5 + 5; nos genera un error de sintaxis, las acciones que realiza cada
operación son distintas, la primera, le asigna el valor que tenga el resultado de 5 + 5
(osea 10) a la variable "numero" mientras que la segunda verifica si el valor de la
variable "numero" es igual o no a 10. Si no entiendes bien esto último, no te
preocupes, más adelante lo veremos con más detalle. Recuerda que recién estamos
comenzando, así que no te preocupes si no entiendes mucho, te aseguro que al
finalizar este curso sabrás bien todo esto.
Línea 8:
Es otra línea de sentencia, y esta nos indica por medio del return lo que la función
debe retornar, en este caso, nos está diciendo que la función main(), deberá retornar
5
cero cada vez que termine, en realidad la función main podría retornar cualquier cosa
o incluso nada (void), podría retornar cualquier tipo de variable o incluso la variable
numero misma, pero se ha establecido por acuerdo que siempre debería retornar 0,
pues dado el caso en que retorne otro valor estando la sentencia return 0; dentro de
ella, esto implicaría que hay algún error en la ejecución del programa. Aquí está la
importancia de poner al main retornando un valor de tipo int.
Línea 9:
Finalmente, nuestra línea 7 contiene la llave cerrando, esto nos indica que es el fin de
la función main y por tanto el fin de la ejecución de nuestro programa (donde termina
el main, termina todo), cada que nuestro compilador llega a la llave de cierre de la
función main, dará por concluido el proceso de nuestra aplicación, por lo tanto,
cualquier línea que esté por debajo de esta llave de cierre no será ejecutada, a menos
que se indique lo contrario dentro de la función main.
Como podrás imaginar C++ posee una buena cantidad de tipos de datos, sin embargo,
de una manera más general, algunos de estos son más sencillos simples de usar que
otros. Veamos:
Los tipos nativos de C++, son los tipos de datos "fáciles de usar" es decir, como
veremos un poco más adelante en la sección de tipos primitivos. Los tipos primitivos
como su nombre lo da a entender, son los tipos de datos más básicos y simples del
sistema de tipos de C++ y por ello es bastante fácil usarlos.
Cabe mencionar que C++ es un lenguaje orientado a objetos y posee una cantidad
enorme de librerías o bibliotecas que podemos usar, estas librerías nos proporcionan
una serie de tipos de datos adicionales que son de enorme utilidad, sin embargo estos
tipos ya no son tipos de datos primitivos sino que son tipos complejos y por ende van
a poseer una serie de campos y funcionalidades adicionales que no posee un tipo
primitivo pero no te preocupes por esto, en la sección de librerías o bibliotecas de C+
+ hablaré un poco de cómo se usan éstas y los tipos que proporcionan. Luego en la
sección de objetos y clases hablaré con más detalle al respecto.
En un nivel más lógico, una variable ocupa un espacio de memoria para contener sus
valores durante la ejecución de un programa. Cada variable debe pertenecer a un tipo
determinado dando también el tamaño del espacio de memoria ocupado por la variable,
y el modo en que se manipulará esa memoria.
De momento veremos los tipos fundamentales (básicos), que son: void, char, int, float
y double; en C++ se incluye también el tipo bool. También existen ciertos
modificadores, que permiten ajustar ligeramente ciertas propiedades de cada tipo; los
6
modificadores pueden ser: short, long, signed y unsigned, y pueden combinarse
algunos de ellos.
También, hay algunas palabras que son reservadas del lenguaje, es decir tus variables
no podrán tener estos nombres (no creo que tengas problemas con esto,
especialmente si escribes en español). Las palabras son las siguientes:
FechaNacimiento
variable12
nombre_variable
contador
ACUMULADOR
12variable
float
register
variable nueva
nueva-variable
bool: El tipo de dato bool, tiene un tamaño de 8 bits y un rango entre 0 y 1, en pocas
palabras es cero o es uno (falso o verdadero). Este tipo de dato, es comúnmente usado
7
en condicionales o variables que solo pueden tomar el valor de falso o verdadero. Las
variables de tipo bool no suelen llevar modificadores, pues son innecesarios, ya que su
rango es solo 0 y 1.
int: El tipo de dato int, tiene un tamaño de 32 bits y un rango entre -2.147.483.648 y
2.147.483.647. Este tipo de dato, es usado para números enteros (sin cifras
decimales). A continuación, algunas combinaciones con los modificadores:
double: El tipo de dato double tiene un tamaño de 64 bits, es usado para números de
menos de 15 cifras decimales. Tiene un rango entre 2,22507*(e^-308) hasta
1,79769*(e^308).
char: Las variables del tipo char, son digamos las variables problema del lenguaje C y
C++, puesto que tienen una gran cantidad de restricciones y complicaciones, bastante
molestas. Las variables de tipo char, en C y C++ son consideradas vectores y como
quizá sabrás a los vectores se les debe declarar un tamaño máximo, entre corchetes "[
]" lo cual restringe un poco al no saber qué tamaño podría llegar a tener una cadena
de caracteres, y aunque hay formas de evadir esto, es bastante complicado. Es
recomendable usar las variables de tipo string para las cadenas de caracteres,
incluidas en la librería string.h que son bastante fáciles de usar.
INSTRUCCIONES DE ASIGNACIÓN
Una instrucción de asignación, como su nombre bien lo dice, es una línea de código,
que le asigna a una variable cualquiera un valor cualquiera, preferiblemente adecuado
al tipo de dato o a las necesidades de dicha asignación. Una asignación tiene la
siguiente sintaxis: nombre_variable = valor, con esto le estamos diciendo a nuestro
programa que la variable llamada "nombre_variable", tendrá ahora como nuevo valor a
"valor". Así entonces, por ejemplo, al escribir contador = 0; estamos diciendo que la
variable contador, tendrá como nuevo valor 0, es de tener en cuenta que al realizar
una asignación, si la variable tenía algún otro valor antes de esto, dicho valor se
perderá y cambiaría por el nuevo que le hemos ordenado.
8
asignaciones entre variables de diferente tipo (numérico), esto genera una advertencia
porque puede causar perdida en la precisión de los datos, por ejemplo al pasar de float
a int.
Las variables son posiciones en memoria donde estarán guardados los diferentes
valores que le damos o que toman durante la ejecución los datos que usamos y
normalmente estarán disponibles a lo largo de la ejecución de nuestro programa. Para
asignar valores a una variable en una gran variedad de lenguajes que incluye a C++
se usa el operador "=" seguido del valor que le daremos a la variable (no todos usan
el "=" para esto). Veamos un ejemplo completo con todos los posibles usos que le
damos a una variable.
En el código anterior hemos visto las múltiples formas en que se puede declarar una
variable, cómo asignarle un valor, incluso vimos que es posible asignarle el valor de
una variable a otra, o realizar operaciones entre los valores de variables y asignar el
resultado a una variable nueva, vimos que es posible usar el valor de una misma
variable y cambiar su propio valor (res = res*2).
Los datos constantes, mal llamadas por algunos "variables constantes" (realmente no
son variables) tienen un valor fijo durante toda la ejecución del programa, es decir,
este valor no cambia ni puede ser cambiado a lo largo de la ejecución de nuestro
9
programa. Las constantes son muy útiles para especificar el tamaño de un vector y
para algunas otras cosas, como facilidad de uso y confiabilidad del código. Para
declarar una constante, se hace después de declarar las librerías y antes de las
funciones, la sintaxis es la siguiente:
En C++ se pueden definir constantes de dos forma, ambas válidas para nosotros. La
primera es por medio del comando #define nombre_constante valor y la segunda es
usando la palabra clave const, veamos ahora cada una de estas formas en detalle.
Notemos que ha sido bastante fácil, sin embargo, no todo es bueno. Realmente al usar
la instrucción #define en C++ no estamos creando una constante realmente, estamos
creando una expresión y por tal motivo hay algunas cosas que se complican, veamos:
10
ejemplo:
Ejemplo de uso de const en C++ para declarar constantes
Notemos que de igual forma ha sido bastante fácil y mejor aún ha sido mucho más
intuitivo y sencillo para nosotros. Se puede ver que la declaración es muy similar a la
de una variable cualquiera y que ya no tenemos complicaciones al intentar añadir la
instrucción endl para agregar el salto de línea. Veamos que realmente la variable no
puede cambiar:
En general, la definición de variable y constante nos da una muy buena idea de cuándo
usar una u otra. Básicamente, si un valor puede cambiar en cualquier momento
(aunque la probabilidad de que eso suceda sea baja) entonces deberá ser una variable,
en lugar de una constante.
Un ejemplo para soportar lo anterior sería el nombre del usuario. Podríamos pensar
que un nombre no va a cambiar, y es probable que no lo haga. Sin embargo, nada nos
asegura que así sea, pues, aunque es improbable es posible. Adicionalmente, nuestro
programa puede cambiar de usuario y por ende su nombre podría variar mientras el
programa se ejecuta. Por lo tanto, NO debería ser una constante.
Por otro lado, hay valores que no van a cambiar a lo largo del tiempo. Por ejemplo, la
velocidad de la luz se ha acordado siempre como la misma, así que debería ser una
constante para evitar que sea cambiada de cualquier modo durante la ejecución del
programa. Valores como el número PI, el código de estado de una página no existente
(404), son valores que son convenciones existentes y que NO deberían cambiar, por lo
cual se los declara como constantes.
if (velocidad == 299792458)
11
A que diga
if (velocidad == VELOCIDAD_LUZ)
Pues en el segundo caso, queda muy claro que estamos comparando la variable
velocidad con la de la luz que es una constante. Por supuesto, anteriormente
tendríamos que haber declarado la constante VELOCIDAD_LUZ con su respectivo
valor (tal como se explicó anteriormente).
La entrada y salida de datos en C++ es simple (al menos para los casos más
comunes). Con esto hago una comparación entre C++ y Java, pues leer una entrada
del usuario por teclado en C++ es bastante simple mientras que en Java implica una
serie de conceptos adicionales que la hacen un tanto más complicada. Por suerte para
nosotros en esta sección veremos cómo leer por teclado en C++, en otras palabras,
asignar a una variable el valor que el usuario escriba por el teclado. Adicional a esto
veremos también cómo mostrar texto por pantalla en C++, es decir, salida de datos.
Vamos a comenzar primero con aprender a mostrar texto por pantalla en C++. Este
orden se debe a que cuando queremos pedirle algún dato al usuario primero debemos
hacerle saber lo que queremos que ingrese y para hacérselo saber debemos mostrarle
un mensaje con las indicaciones, por tal motivo es importante primero saber mostrar
texto en pantalla en C++ y luego a leer texto por teclado en C++.
Mostrar texto por pantalla en C++ es muy simple. Para imprimir una salida de texto
en C++ se hace uso de la instrucción cout<< es importante tener en cuenta que la
instrucción cout siempre va acompañada de << para controlar el flujo de datos que
sale. No te fijes mucho en ellos, solo ten siempre presente que cout viene
acompañado de << para tener cout<< como resultado.
El ejemplo que acabas de ver es bastante sencillo, excepto por un detalle. Si ejecutar
este código en tu pantalla aparecerá un mensaje diciendo "Hola Mundo Desde ACA.".
Tal como habrás notado el operador << se usa para concatenar (unir) dos cadenas de
texto por eso el resultado es el obtenido. Luego se usa endl indicando el final de la
línea lo cual crea un salto de línea. No es obligatorio, pero es recomendable.
12
En este ejemplo de salida por pantalla hemos visto que también es posible usar la
instrucción cout para mostrar en pantalla el valor de las variables así sean numéricas
o cadenas de texto. También vimos que podemos concatenar los valores de esas
variables entre sí y también concatenarlas con otros valores directamente (espacios,
puntos, símbolos, etc.).
Ya tenemos claro cómo mostrar texto por pantalla en C++ ahora haremos uso de este
concepto y veremos cómo leer texto por teclado en C++. Veamos:
Tal como mencioné hace un momento, la lectura de datos en C++ es bastante simple.
Leer datos por teclado en C++ se hace usando el comando cin >> es importante
notar el uso de los dos signos >> que son usados para controlar el flujo de datos. No
te preocupes mucho por ellos, solo ten en cuenta que cada vez que vaya a usar la
instrucción cin debes agregarle >> para quedar con un cin>>. Una manera muy
sencilla de recordar esta instrucción es que in significa entrar y como estamos
programando en C++ le añadimos la letra C al comienzo quedando así cin>> (sin
olvidar los >>).
Veamos unos ejemplos simples para leer datos en C++. Recuerda como dije más
arriba que lo ideal para leer datos es indicarle al usuario qué es lo que esperamos que
ingrese por lo que en estos ejemplos usaremos también lo recién aprendido (mostrar
texto por pantalla).
13
Ejemplo 2 de lectura de datos en C++
Existen diferentes tipos de condicionales, cada uno tiene una utilidad y funcionalidad
diferente, que consideran diferentes situaciones que se pueden llegar a presentar
durante la ejecución de un algoritmo. Depende entonces del conocimiento que
tengamos acerca de cada uno de los condicionales saber determinar correctamente
cuando es necesario implementar uno u otro. Tenemos a nuestra disposición los
siguientes tipos de condicionales en C++:
Condicional If en C++
Condicional if-else en C++
Condicional Switch en C++
Como mencioné anteriormente, cada uno de estos condicionales tiene ciertas
características que lo hacen útil para algunos casos específicos, a lo largo de los
contenidos de esta sección veremos cada uno de estos al detalle, aprendiendo durante
el proceso los componentes de un condicional, sintaxis de los condicionales y esas
características particulares que permiten decidir cuál usar en qué momento, veremos
también el concepto de condicionales anidados, y algunas otras cositas
14
posteriormente podrás regresar a esta sección para aprender a implementar un
condicional en C++ de manera mucho más fácil y adecuada.
Los condicionales if, son una estructura de control condicional, que nos permiten
tomar cierta decisión al interior de nuestro algoritmo, es decir, nos permiten
determinar qué acciones tomar en dada condición, por ejemplo, determinar si un
numero cualquiera es mayor que 10 y de acuerdo a esto mostrar un mensaje.
En resumen, un condicional if es una estructura que nos posibilita definir las acciones
a ejecutar si se cumple cierta condición.
Para comprender mejor cómo funciona el condicional if, una muy buena forma es
partiendo de un ejemplo. Supongamos que queremos verificar si el resultado de una
suma ingresada por el usuario es correcto o no. Para este ejemplo, el condicional if, es
el encargado de verificar si el resultado ingresado corresponde o no a la respuesta
correcta de la suma. El condicional if, funciona verificando la condición ingresada y de
acuerdo a su valor de verdad (falso o verdadero) lleva a cabo o no una serie de
instrucciones.
Espero haber sido claro, sino, no te preocupes, pues veremos ya mismo algunos
ejemplos para entender todo mejor.
La sintaxis de un condicional if, es bastante simple e incluso creo que intuitiva. Vamos
entonces a ver rápidamente como es la estructura para ir luego a unos ejemplos y
quedar bien claros. Veamos:
Vamos ahora a ver línea por línea el anterior código para comprender todo y quedar
claros. Posteriormente veremos un ejemplo con valores reales.
Línea 1:
En esta línea está prácticamente todo lo esencial del condicional, aquí le hemos dicho
al interior del argumento del condicional if, cual es la condición que se debe cumplir
para que se ejecute el primer bloque de instrucciones, esta línea es en efecto esencial
ya que nos da la pauta para que el algoritmo determine si ejecutará o no el bloque de
instrucciones al interior de las llaves.
Línea 2:
En la línea 2 tenemos una llave abriendo "{" lo cual como seguramente ya sabrás
indica que allí comienza el bloque de instrucciones que se ejecutarán si se cumple la
condición dada. Esta llave no es del todo obligatoria, sin embargo, si no la ponemos
15
solo se ejecutará dentro de nuestro ciclo la primera línea inmediatamente posterior a
la declaración del condicional, de modo que, si deseamos que se ejecuten varias líneas
dentro de nuestro condicional, debemos usar las llaves
Línea 3 a 7:
En estas líneas es donde estarán todas las operaciones que queramos llevar a cabo en
caso de cumplirse la condición, este bloque podrá tener la cantidad de líneas
necesarias incluso, como veremos más adelante dentro de estas podría haber uno o
más condicionales en su interior, así que podrías tener lo que se conoce como
condicionales anidados (ya veremos eso más adelante).
Línea 8:
En esta línea hacemos uso de la llave cerrando "}", una vez más como seguramente ya
sabrás esta nos indica que allí termina el bloque del condicional y se dará por
terminada la ejecución de este para continuar ejecutando el resto del programa.
Línea 9 a 11
Estas líneas contienen la estructura restante del algoritmo, quise ponerlas allí, para
que quede claro que sin importar si la condición se cumple o no, el algoritmo siempre
va a ejecutar estas líneas, es decir las líneas que se encuentran después de la llave de
cierre de un condicional, siempre se ejecutarán sin importar si la condición se cumpla
o no.
Solución Ejemplo 1:
Debemos entonces determinar cuál va a ser nuestra condición a evaluar, en este
ejemplo, la condición debe ser que la respuesta ingresada, sea igual al resultado de la
suma, veamos entonces como realizar esto:
10. Condicional if else en C++. Declaración uso y sintaxis del if else en C++
Los condicionales if-else, son una estructura de control, que nos permiten tomar
cierta decisión al interior de nuestro algoritmo, es decir, nos permiten determinar qué
acciones tomar dada o no cierta condición, por ejemplo, determinar si la contraseña
16
ingresada por el usuario es válida o no y de acuerdo a esto darle acceso al sistema o
mostrar un mensaje de error.
En resumen, un condicional if-else es una estructura que nos posibilita definir las
acciones que se deben llevar a cabo si se cumple cierta condición y también
determinar las acciones que se deben ejecutar en caso de que no se cumpla.
Para comprender mejor cómo funciona el condicional if-else, una muy buena forma es
partiendo de un ejemplo. Imaginemos que, en nuestro programa, deseamos
implementar un sistema de logeo de usuario, comprobando si la información
suministrada coincide con unos los valores correctos y en este caso mostrar un
mensaje de bienvenida, y en caso de que no, se mostrará un mensaje de error. Como
podemos imaginar, es entonces necesario hacer que nuestro algoritmo, tome una
decisión, de acuerdo a los valores ingresados por el usuario, y definir los dos casos
posibles en caso de fallo o en caso de que no. Es para esto que sirve el condicional if-
else, nos permite definir una condición que se debe cumplir y de acuerdo a su
cumplimiento o no tomar una acción correspondiente. Espero haber sido claro, sino, no
te preocupes, pues veremos ya mismo algunos ejemplos para entender todo mejor.
Vamos ahora a ver línea por línea el anterior código para comprender todo y quedar
claros. Posteriormente veremos un ejemplo con valores reales.
Línea 1:
En esta línea está prácticamente todo lo esencial del condicional, aquí le hemos dicho
al interior del argumento del condicional if, cual es la condición que se debe cumplir
para que se ejecute el primer bloque de instrucciones, esta línea es en efecto esencial
ya que nos da la pauta para que el algoritmo determine que bloque de instrucciones
ejecutar.
Línea 2:
En la línea 2 tenemos una llave abriendo "{" lo cual como seguramente ya sabrás
indica que allí comienza el bloque de instrucciones que se ejecutarán si se cumple la
condición dada. Esta llave no es del todo obligatoria, sin embargo, si no la ponemos
17
solo se ejecutará dentro de nuestro condicional la primera línea inmediatamente
posterior a la declaración del condicional, de modo que, si deseamos que se ejecuten
varias líneas dentro de nuestro condicional, debemos usar las llaves
Línea 3 a 7:
En estas líneas es donde estarán todas las operaciones que queramos llevar a cabo en
caso de cumplirse la condición, este bloque podrá tener la cantidad de líneas
necesarias incluso, como veremos más adelante dentro de estas podría haber uno o
más condicionales en su interior, así que podrías tener todo un condicional dentro de
un condicional dentro de otro condicional... y así sucesivamente.
Línea 8:
En esta última línea hacemos uso de la llave cerrando "}", una vez más como
seguramente ya sabrás esta nos indica que allí termina el bloque del condicional y se
dará por terminada la ejecución de este para continuar ejecutando el resto del
programa, cabe notar que esta línea dará paso a la ejecución del bloque de
instrucciones del else, en caso de que la condición dada no se haya cumplido.
Línea 9 a 16
Estas líneas contienen la estructura else, que es la que indica que existe un bloque de
instrucciones que se debe ejecutar en caso de que la condición dada no se cumpla.
Este bloque al igual que el del condicional if, se abre y se cierra con llaves, recuerda
que estas pueden ser opcionales, sin embargo, siempre recomiendo usarlas como una
buena práctica de programación.
Solución Ejemplo 1:
18
11. Condicional switch en C++. Declaración uso y sintaxis de switch en C++
Los condicionales Switch, son una estructura de control condicional, que permite
definir múltiples casos que puede llegar a cumplir una variable cualquiera, y qué
acción tomar en cualquiera de estas situaciones, incluso es posible determinar qué
acción llevar a cabo en caso de no cumplir ninguna de las condiciones dadas.
19
Vamos ahora a ver línea por línea el anterior código para comprender todo y quedar
claros. Posteriormente veremos un ejemplo con valores reales.
Línea 1:
Aquí, tenemos la declaración del condicional switch, estamos diciendo que lo que
viene a continuación es esto, entre los paréntesis, el switch recibe la variable que
vamos a usar para comparar en cada uno de los casos.
Línea 2:
En la línea 2 tenemos una llave abriendo "{" lo cual como hemos visto en secciones
anteriores, indica que allí comienzan los bloques de instrucciones que se ejecutarán
para cada caso.
Línea 3:
En esta línea tenemos una parte vital del condicional switch, aquí tenemos definido un
caso posible que puede cumplir nuestra variable, la sintaxis es simple, usamos la
instrucción "case" para indicar que allí comienza un caso, luego indicamos el valor que
puede tomar la variable, puede ser un numero, una cadena de caracteres o lo que
necesitemos, de esto se siguen dos puntos ":" y después de estos ponemos la o las
instrucciones a ejecutar para este caso, como ejemplo, podríamos tener algo como
esto :
Línea 4:
Esta línea contiene la instrucción break, es una instrucción simple, pero fundamental al
interior del condicional Switch, esta instrucción indica que hasta allí va el bloque de
instrucciones del caso inmediatamente anterior a este, de este modo evitamos que el
algoritmo ejecute los demás casos, a modo de ejercicio, podrías intentar ejecutar el
código del ejemplo que veremos más adelante y quitar las instrucciones break, con
esto podrás comprobar que si el usuario ingresa por ejemplo un 1, se ejecutarán todos
los casos, es por esto que el break es fundamental.
Línea 5 a 8
Estas líneas contienen una repetición de las instrucciones de las líneas 3 y 4,
evidentemente cada una contiene un caso distinto, ten en cuenta que se pueden definir
todos los casos que sean necesarios al interior del switch.
Líneas 9, 10 y 12
20
Estas líneas como deberías saber ya, contienen diferentes comentarios aclarativos
sobre el código, en caso de que no comprendas adecuadamente estas líneas, te
recomiendo visitar la sección de comentarios.
Línea 11
Esta línea cambia un poco con respecto a las anteriores, sin embargo conserva la
misma esencia, en vez de poner el comando "case", usamos el comando "default", y
luego los 2 puntos ":", notemos que no se pone ningún valor a evaluar, pues esta es la
acción que se ejecuta en caso de que no lleguemos a entrar en ninguno de los casos.
Línea 13:
En esta línea hacemos uso de la llave cerrando "}", una vez más como seguramente ya
sabrás esta nos indica que allí termina el bloque del condicional y se dará por
terminada la ejecución de este para continuar ejecutando el resto del programa.
Solución Ejemplo 1:
Primero, determinemos los casos a ejecutar, tenemos tres casos posibles (suponiendo
que nuestro menú está compuesto por 3 opciones) el caso 1 para la opción 1, el dos
para la 2 y así sucesivamente. Nuestro caso por defecto (default) sería el caso de
error, que sucede cuando no se ingresa alguna de las 3 opciones. Veamos entonces
como hacer esto:
21
Efectivamente, los condicionales switch de hecho todos los condicionales en sí, son
extremadamente útiles pues permiten definirle a nuestro software múltiples vías de
ejecución contemplando así todas las posibilidades durante la ejecución. Me gustaría
hacer una leve aclaración, el condicional switch encuentra su utilidad al momento de
tener más de una posibilidad de valores para una variable cualquiera, evidentemente si
nuestra variable solo puede adquirir un valor útil para nosotros, nuestra alternativa
inmediata debería ser un if o un if-else, no un switch que resulta un poco más
engorroso de escribir, sin embargo cuando tenemos varias posibilidades es mejor un
switch que tener condicionales anidados o un condicional después de otro.
12. Los bucles o ciclos en C++. Declaración, uso y sintaxis de un ciclo en C++
Los ciclos o también conocidos como bucles, son una estructura de control esencial al
momento de programar. Tanto C como C++ y la mayoría de los lenguajes utilizados
actualmente, nos permiten hacer uso de estas estructuras. Un ciclo o bucle permite
repetir una o varias instrucciones cuantas veces lo necesitemos, por ejemplo, si
quisiéramos escribir los números del uno al cien no tendría sentido escribir cien líneas
mostrando un numero en cada una, para esto y para muchísimas cosas más, es útil un
ciclo, permitiéndonos hacer una misma tarea en una cantidad de líneas muy pequeña y
de forma prácticamente automática.
Existen diferentes tipos de ciclos o bucles, cada uno tiene una utilidad para casos
específicos y depende de nuestra habilidad y conocimientos poder determinar en qué
momento es bueno usar alguno de ellos. Tenemos entonces a nuestra disposición los
siguientes tipos de ciclos en C++:
Como mencioné anteriormente, cada uno de estos ciclos tiene ciertas características
que lo hacen útil para algunos casos específicos, a lo largo de los contenidos de esta
sección veremos cada uno de estos al detalle, aprendiendo durante el proceso los
componentes, sintaxis y esas características particulares que permiten decidir cuál
usar en qué momento, veremos también el concepto de contador y acumulador que
parte de la existencia de los ciclos
22
Te recuerdo, que aunque intentaré profundizar bastante en cada concepto, lo haré
enfocándome hacia el uso de los ciclos en el lenguaje C++ y no tanto hacia la parte de
la lógica de los ciclos en particular, si tienes problemas con la correcta comprensión
de la lógica y utilidad de cualquier tipo de ciclo o de los ciclos en general, te invito a
que primero leas la sección de Fundamentación de los Ciclos, en dicha sección podrás
comprender correctamente el funcionamiento de un ciclo y posteriormente podrás
regresar a esta sección para aprender a implementar los ciclos en C++
13. Ciclo for en C++. Estructura, sintaxis y uso de un ciclo for en C++
Los ciclos for son lo que se conoce como estructuras de control de flujo cíclicas o
simplemente estructuras cíclicas, estos ciclos, como su nombre lo sugiere, nos
permiten ejecutar una o varias líneas de código de forma iterativa, conociendo un
valor especifico inicial y otro valor final, además nos permiten determinar el tamaño
del paso entre cada "giro" o iteración del ciclo.
En resumen, un ciclo for es una estructura de control iterativa, que nos permite
ejecutar de manera repetitiva un bloque de instrucciones, conociendo previamente un
valor de inicio, un tamaño de paso y un valor final para el ciclo.
Línea 1:
En esta línea está prácticamente todo lo esencial de un ciclo for. La sintaxis es simple,
tenemos una variable de control llamada i que es tipo entero (int), cabe notar que la
variable se puede llamar como nosotros lo deseemos y puede ser del tipo de queramos
23
también, sin embargo en la mayoría de los casos se usa la "i" como nombre y el entero
como tipo, pero somos libres de modificar esto a nuestro gusto. Esta variable "i" se le
asigna un valor inicial que puede ser cualquier número correspondiente al tipo de dato
asignado.
Posteriormente lo que haremos será especificar hasta donde irá nuestro ciclo por
medio del valor final, ten en cuenta que cada uno de estos componentes es separado
por un punto y coma ";", también es importante saber que la condición final puede ser
cualquier cosa, mayor, menor, mayor o igual, menor o igual, sin embargo no tiene
sentido que la condición sea por ejemplo un igual, pues nuestra variable de control
siempre va a cambiar entre valores, menores o mayores que el valor final deseado, si
fuera un igual no tendríamos un error de sintaxis, pero nuestro for básicamente no
haría nada de nada. Finalmente, el ultimo componente de esta primera línea es el
tamaño del paso, este componente se especifica aumentando en la cantidad deseada la
variable de control.
Línea 2:
En la línea 2 tenemos una llave abriendo "{" lo cual como seguramente ya sabrás
indica que allí comienza el bloque de instrucciones que se ejecutaran cada vez que el
ciclo de un "giro". Esta llave no es del todo obligatoria, sin embargo, si no la ponemos
solo se ejecutará dentro de nuestro ciclo la primera línea inmediatamente posterior a
la declaración del ciclo, de modo que, si deseamos que se ejecuten varias líneas
dentro de nuestro ciclo, debemos usar las llaves
Línea 3 a 7:
En estas líneas es donde estarán todas las operaciones que queramos llevar a cabo de
manera iterativa durante la ejecución del ciclo, este bloque podrá tener la cantidad de
líneas necesarias incluso, como veremos más adelante dentro de estas podría haber
uno o más ciclos, así que podrías tener todo un programa dentro de un ciclo.
Línea 8:
En esta última línea hacemos uso de la llave cerrando "}", una vez más como
seguramente ya sabrás esta nos indica que allí termina el bloque del ciclo for y se dará
por terminada la ejecución de este para continuar ejecutando el resto del algoritmo.
Vamos a retomar el ejemplo anterior, donde deseábamos sacar los números pares
entre el numero 50 y el 100, es un ejemplo sencillo con el que nos aseguraremos de
haber comprendido bien lo anterior:
Solución Ejemplo 1:
Como pudimos ver anteriormente, tenemos entonces que el valor inicial para nuestro
ciclo es el numero 50 y el valor final es el 100, además, dado que necesitamos los
números pares vamos a ir de dos en dos, así que el tamaño del paso va a ser 2,
24
teniendo estos 3 componentes identificados, estamos listos para crear nuestro ciclo
for así:
Ahora veremos otro ejemplo sencillo en cual veremos que el ciclo for también puede
iterar disminuyendo el valor del contador, para comprender esto, lo que haremos será
imprimir por pantalla una cuenta regresiva desde el número diez hasta el cero,
veamos:
Solución Ejemplo 2:
Para este caso, debido a que queremos ir de un número mayor a uno más pequeño, por
lo tanto, para este ejemplo el valor inicial será 10 y el valor final será cero. Adicional,
el tamaño de paso será de 1 negativo, es decir, -1, así:
Para este ejemplo haremos algo un poco más complejo. El ejemplo consiste en contar
al interior de un ciclo for, cuántos números entre el 0 y el 10.000 son múltiplos del 13.
Para ello haremos uso del operador % (modulo) que obtiene el residuo de una división
y también usaremos un pequeño condicional para verificar que el modulo sea cero al
dividir por 13.
Solución Ejemplo 3:
Para este caso el valor inicial será 0 y el valor final será 10000. Adicional, el tamaño
de paso será de 1. Al interior del ciclo, en cada iteración verificaremos si el número en
el que estamos es divisible por trece o no y en caso afirmativo aumentaremos el
contador en una unidad así:
25
Este ciclo for nos permitirá saber que existen 770 múltiplos del 13 en los números del
0 al 10000.
En efecto los ciclos for, son bastante útiles, sin embargo, desde el punto de vista de la
eficiencia, es recomendable evitarlos en la medida de lo posible, siempre que vayas a
usar un ciclo for, deberías preguntarte primero si es totalmente necesario o si existe
una manera más efectiva de hacerlo.
14. Ciclo while en C++. Estructura y sintaxis. Cómo y para qué usar un ciclo while en C+
+
Los ciclos while son también una estructura cíclica, que nos permite ejecutar una o
varias líneas de código de manera repetitiva sin necesidad de tener un valor inicial e
incluso a veces sin siquiera conocer cuándo se va a dar el valor final que esperamos,
los ciclos while, no dependen directamente de valores numéricos, sino de valores
booleanos, es decir su ejecución depende del valor de verdad de una condición dada,
verdadera o falso, nada más. De este modo los ciclos while, son mucho más efectivos
para condiciones indeterminadas, que no conocemos cuando se van a dar a diferencia
de los ciclos for, con los cuales se debe tener claro un principio, un final y un tamaño
de paso.
Para comprender mejor el funcionamiento del ciclo while, pongamos un buen ejemplo,
imaginemos que por algún motivo, queremos pedirle a un usuario una serie de
números cualquiera y que solo dejaremos de hacerlo cuando el usuario ingrese un
número mayor a 100. Como vemos, aquí no podríamos utilizar un ciclo for, pues no
tenemos ni idea de cuándo al usuario se le va a ocurrir ingresar un número mayor que
100, es algo indeterminado para nosotros, sin embargo, el ciclo while nos permite
ejecutar una acción de forma infinita hasta que se cumpla alguna condición específica,
en nuestro caso sería que el numero ingresado sea mayor a 100. De modo que si el
usuario nos ingresa de manera sucesiva los siguientes numero 1,50,99, 49, 21, 30, 100
..., nuestro programa no finalizara, pues ninguno de estos números es mayor que 100,
sin embargo si nos ingresara el numero 300, el programa finalizaría inmediatamente.
La sintaxis de un ciclo while es incluso más simple y "legible" que la del ciclo for en
C++, pues simplemente requerimos tener clara una condición de parada. En realidad,
en la mayoría de los lenguajes de alto nivel la manera de escribir un ciclo while (la
26
sintaxis) es incluso muy similar, así que con tan solo tener bien clara una condición de
finalización para el ciclo tendremos prácticamente todo hecho.
Línea 1:
Línea 2:
En la línea 2 tenemos una llave abriendo "{" lo cual como sabemos indica que allí
comienza un bloque de instrucciones que se ejecutaran cada vez que el ciclo de un
"giro". Esta llave no es del todo obligatoria, sin embargo si no la ponemos solo se
ejecutara dentro de nuestro ciclo while la primera línea inmediatamente posterior a la
declaración del ciclo, de modo que si deseamos que se ejecuten varias líneas dentro
de nuestro ciclo, debemos usar las llaves
Línea 3 a 7:
En estas líneas es donde estarán todas las operaciones que queramos llevar a cabo de
manera iterativa durante la ejecución del ciclo, este bloque podrá tener la cantidad de
líneas necesarias incluso, como veremos más adelante dentro de estas podría haber
uno o más ciclos, así que podrías tener todo un programa dentro de un ciclo.
Línea 8:
En esta última línea hacemos uso de la llave cerrando "}", una vez más como
seguramente ya debemos saber esta nos indica que allí termina el bloque del ciclo
while y se dará por terminada la ejecución de este para continuar ejecutando el resto
del algoritmo.
Ejemplo 1: Pedir números por pantalla hasta que alguno sea mayor a 100
27
Vamos a retomar el ejemplo anterior, donde queremos hacer que nuestro programa le
pida a un usuario una serie de números cualquiera y que solo dejaremos de hacerlo
cuando el usuario ingrese un número mayor a 100, una vez más es un ejemplo sencillo
con el que nos aseguraremos de haber comprendido bien todos los conceptos
anteriores:
Solución Ejemplo 1:
Para solucionar esto, debemos tener clara cuál va a ser la condición que se debe
cumplir para que el ciclo este pidiendo el numero contantemente, el ciclo se va a
detener solo cuando el numero ingresado sea mayor que 100, así que la condición para
que se siga ejecutando es que el numero sea menor a 100, ¿Comprender la lógica?, es
simple si para que se detenga el numero debe ser mayor a 100, entonces para
seguirse ejecutando el numero debe ser menor o igual a 100, veámoslo entonces
En efecto los ciclos while, son bastante útiles, sin embargo, desde el punto de vista de
la eficiencia al igual que con los ciclos for, es recomendable evitarlos en la medida de
lo posible, siempre que vayas a usar un ciclo while o cualquier tipo de ciclo en
realidad, deberías preguntarte primero si es totalmente necesario o si existe una
manera más efectiva de hacerlo. Evidentemente habrá situaciones en las que será casi
que imprescindible usar el ciclo, pues por algo existen, esta entonces en nuestra
habilidad determinar cuándo usarlos y mejor aún como usarlos de manera efectiva.
15. Ciclo do-while en C++. Estructura y sintaxis. Cómo y para qué usar un ciclo do-while
en C++
Los ciclos do-while son una estructura de control cíclica, los cuales nos permiten
ejecutar una o varias líneas de código de forma repetitiva sin necesidad de tener un
valor inicial e incluso a veces sin siquiera conocer cuándo se va a dar el valor final,
hasta aquí son similares a los ciclos while, sin embargo el ciclo do-while nos permite
añadir cierta ventaja adicional y esta consiste que nos da la posibilidad de ejecutar
primero el bloque de instrucciones antes de evaluar la condición necesaria, de este
modo los ciclos do-while, son más efectivos para algunas situaciones específicas.
Para comprender mejor el funcionamiento del ciclo while, usemos de nuevo el ejemplo
de la sección anterior sobre el ciclo while. Imaginemos entonces que por algún motivo,
28
queremos pedirle a un usuario una serie de números cualquiera y que solo dejaremos
de hacerlo cuando el usuario ingrese un número mayor a 100.
Como vimos anteriormente, esto se puede hacer por medio de un ciclo while, pero
vamos ahora a ver como lo podemos hacer usando un ciclo do-while mejorando así un
poco nuestro algoritmo, evitando ciertos comandos, tal como se dijo con el ciclo while,
en efecto aquí estamos en la situación de no tener ni idea de cuándo al usuario se le
va a ocurrir ingresar un número mayor que 100, pues es algo indeterminado para
nosotros, sin embargo el ciclo while y en efecto el do-while nos permite ejecutar
cierta acción de forma infinita hasta que se cumpla alguna condición específica, en
nuestro caso sería que el numero ingresado sea mayor a 100. De modo que, si el
usuario nos ingresa de manera sucesiva los siguientes números 1,50,99, 49, 21, 30,
100 ..., nuestro programa no finalizara, pues ninguno de estos números es mayor que
100, sin embargo, si nos ingresara el número 300, el programa finalizaría
inmediatamente.
La sintaxis de un ciclo do-while es un tanto más larga que la del ciclo while en C++,
sin embargo, no se hace más complicado, de hecho, con tan solo tener bien clara una
condición de finalización para el ciclo tendremos prácticamente todo terminado.
Vamos entonces a ver línea por línea el anterior código para comprender todo y
quedar claros. Posteriormente veremos el ejemplo planteado anteriormente y su
solución.
Línea 1:
Esta línea es por decirlo así, la parte novedosa del ciclo do-while, esta expresión no
evalúa ninguna condición ni nada, simplemente da paso directo al bloque de instrucción
y luego permite la evaluación de la condición.
Línea 2:
En la línea 2 tenemos una llave abriendo "{" lo cual como sabemos indica que allí
comienza un bloque de instrucciones que se ejecutaran cada vez que el ciclo de un
"giro". Esta llave no es del todo obligatoria, sin embargo, si no la ponemos solo se
ejecutará dentro de nuestro ciclo la primera línea inmediatamente posterior a la
instrucción do, de modo que, si deseamos que se ejecuten varias líneas dentro de
nuestro ciclo, debemos usar las llaves. En lo personal, es preferible poner siempre las
llaves sin importar cuantas líneas se vayan a ejecutar, es una buena práctica de
programación y te puede evitar dolores de cabeza
Línea 3 a 7:
En estas líneas es donde estarán todas las operaciones que queramos llevar a cabo de
manera iterativa durante la ejecución del ciclo, este bloque podrá tener la cantidad de
líneas necesarias incluso, como veremos más adelante dentro de estas podría haber
uno o más ciclos, así que podrías tener todo un programa dentro de un ciclo.
29
Línea 8:
En esta última línea hacemos uso de la llave cerrando "}", una vez más como
seguramente ya debemos saber esta nos indica que allí termina el bloque de
instrucciones que se ejecutarán de manera cíclica y se dará por terminada la ejecución
de este para continuar ejecutando el resto del algoritmo.
Línea 9:
Ejemplo 1: Pedir números por pantalla hasta que alguno sea mayor a 100
Vamos a retomar el ejemplo anterior, donde queremos hacer que nuestro programa le
pida a un usuario una serie de números cualquiera y que solo dejaremos de hacerlo
cuando el usuario ingrese un número mayor a 100, una vez más es un ejemplo sencillo
con el que nos aseguraremos de haber comprendido bien todos los conceptos
anteriores, vamos a ver cómo hacer lo mismo con dos tipos de ciclos diferentes (el
while y el do-while), sin embargo, vamos a ver como con uno es más eficiente que con
el otro:
Solución Ejemplo 1:
Para solucionar esto, debemos tener clara cuál va a ser la condición que se debe
cumplir para que el ciclo este pidiendo el numero constantemente. El ciclo se va a
detener solo cuando el numero ingresado sea mayor que 100, así que la condición para
que se siga ejecutando es que el número sea menor a 100, ¿Comprender la lógica?, es
simple si para que se detenga el numero debe ser mayor a 100, entonces para
seguirse ejecutando el numero debe ser menor o igual a 100, veámoslo entonces
Nota: Como podrás comprobar, ambos códigos hacen lo mismo, haciendo uso del ciclo
while o del ciclo do while, sin embargo, con el ciclo do-while, hemos obtenido un
beneficio interesante, primero que todo hemos podido evitar tener que inicializar la
variable numero, segundo también pudimos eliminar las líneas repetidas donde se
30
pedía el numero por fuera del ciclo y luego al interior del ciclo, aquí lo hicimos solo al
interior, pues la condición se evaluaba mucho más abajo.
En efecto los ciclos do-while, son bastante útiles, sin embargo, como con cualquier
ciclo desde el punto de vista de la eficiencia al igual que con los ciclos for, es
recomendable evitarlos en la medida de lo posible, siempre que vayas a usar un ciclo
do-while o cualquier tipo de ciclo en realidad, deberías preguntarte primero si es
totalmente necesario o si existe una manera más efectiva de hacerlo. Evidentemente
habrá situaciones en las que será casi que imprescindible usar el ciclo, pues por algo
existen, está entonces en nuestra habilidad determinar cuándo usarlos y mejor aún
como usarlos de manera efectiva.
Antes de comenzar, quisiera aclarar que los ciclos anidados NO son en sí una
estructura de control, son de hecho un conjunto de estructuras de control anidadas,
con anidadas me refiero a que una está dentro de la otra. De este modo un ciclo
anidado (de hecho, debería ser ciclos anidados, en plural: P) no es más que uno o más
ciclos dentro de otro y de hecho no tenemos límite alguno para la cantidad de ciclos
anidados.
En conclusión, los ciclos anidados no son una estructura de control por sí mismos, son
un indicativo de que quizá deberíamos plantear la solución a algún problema si nos
vemos obligados a usar ciclos anidados y más aún si es más de uno, sin embargo,
debemos saber que a veces son indispensables.
Los ciclos anidados suelen usarse para llenar matrices (un vector de varias
dimensiones) donde un ciclo recorre cada fila y otro cada columna o viceversa
(depende de lo que necesitemos). De este modo entonces el ciclo externo empieza por
la columna cero y el interno llena cada casilla de la columna cero y luego de la uno y
las dos y así...
Notemos que entonces el ciclo externo (el de las columnas) no avanza a la siguiente
hasta que el ciclo interno no llene todas las casillas de esa columna (lo cual tiene
sentido, pues debe llenarse en orden).
31
Como puedes ver entonces, es bastante simple, solo hay que notar algunas cosas
interesantes: la primera y más importante es que la variable de control debe ser
distinta en cada ciclo, fíjate que el ciclo externo usa la variable 'i' como variable de
control mientras que el ciclo interno usa la 'j'. También debes notar que en el bloque
interno de instrucciones podrías poner otro ciclo de cualquier tipo y al interior de este
otro y así sucesivamente, cambiando el nombre de la variable de control (usar 'k' por
ejemplo) para evitar mal funcionamiento. Finalmente debes saber que, aunque son
ciclos anidados no dejan de ser ciclos independientes en realidad, así que puedes
poner las instrucciones que desees al interior de cualquier de ellos.
32
Ejemplo de ciclos anidados en C++
En este primer ejemplo vamos a llenar una matriz de 10x10 (diez filas y diez
columnas) con los números del 1 al 100 (1x1 hasta 10x10).
En efecto los ciclos anidados son muy interesantes y también útiles para múltiples
situaciones, pero debes recordar que el tema de la eficiencia es un poco delicado, es
recomendable evitarlos, aunque no temerles, pues hay casos en los que son
fundamentales e indispensables. Cuando vayas a usar un ciclo anidado detente un par
de minutos y piensa si es realmente necesario usarlo o si puede haber una manera
más efectiva de conseguir el mismo resultado; repito: habrá casos en los que sea
indispensable usarlos, así que no les temas pues en algún momento será
imprescindible usar un hermoso ciclo anidado, pues por alguna razón el lenguaje nos
permite crearlos. Así que será nuestra experiencia y pericia la que nos dirá cuando es
realmente necesario usarlos.
17. Estructuras de datos en C++. Uso, manejo y ventajas. Arreglos, vectores, matrices y
demás
Las estructuras de datos en C++ se pueden entender como un tipo de dato compuesto
(no complejo). Las estructuras de datos permiten almacenar de manera ordenada una
serie de valores dados en una misma variable. Las estructuras de datos más comunes
son los vectores o arreglos y las matrices, aunque hay otras un poco más diferentes
como son el struct y las enumeraciones.
33
En esta serie de contenidos aprenderemos de éstas con detalle. Las estructuras de
datos han sido creadas para solucionar una gran variedad de problemáticas que no
eran solucionables (o al menos no muy fácilmente) con los tipos de datos primitivos.
Tal como mencioné hace un momento las estructuras de datos se pueden ver como
una agrupación o estructuración para una serie de tipos de datos primitivos (aunque
también pueden poseer tipos de datos complejos) que pueden ser fácilmente utilizadas
e identificadas.
Sin la existencia de las estructuras de datos sería imposible o bastante complicado por
ejemplo conocer y manejar todos los números de identificación, nombres y direcciones
de todos los usuarios de un sistema (que normalmente serían muchísimos) pero ahora
con las estructuras de datos es muy simple definir una serie de posiciones en memoria
para cada valor que deseamos guardar o definir un orden o valores específicos para
cada campo y accediendo a ellos generalmente por medio de una única variable, todo
esto es sencillo hacerlo con el uso de las estructuras de datos y sin desperdiciar
recursos.
Los arrays, arreglos o vectores son una estructura que nos permite solucionar este
tipo de problemas. Para explicar mejor de lo que hablo, pongamos un ejemplo:
Imaginemos que queremos crear un programa con el cual podamos de algún modo
almacenar los títulos y los autores de diferentes libros. El usuario es el encargado de
suministrar la información de cada libro, así entonces, dado que es el usuario quien lo
hace, nosotros no tenemos manera alguna de saber cuántos libros va querer él
ingresar por medio de nuestro programa. El caso principal es que queremos almacenar
en la memoria el título y el autor de TODOS y cada uno de los libros. Entonces ¿cómo
crees que podrías hacer esto? Con lo que sabemos hasta hora, se nos podrían ocurrir
un par de cosas. Veamos:
34
valores anteriores y habremos perdido la información del primero, de manera que esta
solución no es válida.
Pensando un poco más en esto, se nos ocurre una forma de almacenar la información
de cada libro, podríamos crear un par de variables distintas para cada libro. Pero de
inmediato nos damos cuenta que si por ejemplo al usuario se le cruzara por la cabeza
ingresa información para 10 libros tendríamos entonces ¡20 variables distintas!, 2 por
cada libro, no es mucho, pero si se le ocurriera ingresar 1000 libros, ¿estarías
dispuesto a declarar 2000 variables? De modo que esta alternativa es incluso peor que
la anterior y seguimos aún sin solucionar nuestro problema.
¡Pues bien!, tal y como mencioné antes, los arrays o los vectores han venido para
ayudarnos en múltiples circunstancias similares a esta. Dado que un array, arreglo o
vector es capaz de almacenar múltiples valores en una misma variable, tenemos el
elemento perfecto para almacenar la información de todos los libros, podremos crear
un vector de un tamaño cualquiera capaz de contener en sí los nombres de los autores
y otro con los títulos de los libros o alternativamente podríamos crear una matriz de
dos columnas que contenga en la primera columna los autores y en la segunda los
títulos; ambas soluciones son válidas y vamos a ver ambas, usando vectores en esta
sección y usando matrices en la sección de matrices.
Muy bien, ahora que sabemos la gran utilidad de los arrays, vectores o arreglos para
nosotros, aprendamos más acerca de estos, veamos como declarar un vector, array o
arreglo, como recorrer un vector y algunos ejemplos de esto.
Para declarar un vector en C++, se deben seguir las mismas normas básicas que se
siguen para declarar una variable cualquiera, con un pequeño cambio en la sintaxis.
Para declarar un vector, arreglo o como lo quieras llamar, necesitaremos saber el tipo
de los datos que irán al interior de este, es decir, serán números enteros, o números
decimales o cadenas de texto, etc. necesitamos también, como siempre, un nombre
para el vector y un tamaño máximo. La sintaxis para declarar un vector en C++ es la
siguiente:
tipo_de_dato nombre_del_vector[tamanio];
Tenemos entonces, tal como mencioné antes, que, para declarar un vector en C++,
debemos definirle un tipo de los datos, sea entero, float, string, etc., debemos darle un
nombre y al interior de los corchetes "[]" debemos poner el tamaño máximo que
tendrá el vector, es decir la cantidad máxima de datos que podrá contener (recuerda
que en C++ esto es necesario hacerlo). Veamos un ejemplo en el cual pondré la
declaración de varios vectores de diferentes tipos y tamaños en C++.
35
Declaración de un Array o Vector en C++
Línea 1
Esta línea contiene la declaración de un vector llamado my_vector1, el cual contendrá
un máximo de 10 elementos de tipo entero.
Línea 2
Esta línea contiene la declaración de un vector llamado my_vector2, el cual contendrá
un máximo de 25 elementos de tipo float.
Línea 3
Esta línea contiene la declaración de un vector llamado my_vector3, el cual contendrá
un máximo de 500 elementos de tipo string.
Línea 4
Esta línea contiene la declaración de un vector llamado my_vector4, el cual contendrá
un máximo de 1000 elementos de tipo booleano.
Línea 5
Esta línea contiene la declaración de un vector llamado my_vector5, el cual contendrá
un máximo de 2 elementos de tipo char.
Ya que está claro cómo se declara un vector, vamos a ver cómo inicializarlo, es decir
inicializar un vector en C++ o en otras palabras darle valores a un vector.
Aquí hemos declarado un vector de tipo string tamaño 5 y lo hemos inicializado con
diferentes valores, es necesario notar que cada valor va entre comillas dobles ""
puesto que son strings. El valor inicial corresponde a la casilla o índice 0 y tiene el
valor de "5", el índice 1 el valor es "hola" y el índice 4 el valor es "adiós", es
importante notar que el primer índice de n array o vector no es el UNO, sino que es el
CERO.
36
Aquí hemos declarado un vector de tipo int y no especificamos su tamaño, si el tamaño
no se especifica entre los corchetes, el vector tendrá como tamaño el número de
elementos incluidos en la llave, para este caso es 9.
Dadas las características de C++, es fácil pensar que es factible crear o declarar un
vector de un tamaño cualquiera y posteriormente inicializarlos de forma habitual como
se muestra en este código, sin embargo, hacer esto es un error, si declaramos un
vector y no lo inicializamos inmediatamente, no es posible inicializarlo de la forma que
hemos visto, es decir entre llaves cada valor, como en la línea 2 del código anterior.
La única forma de inicializar el vector, o, mejor dicho, darle valores a cada una de sus
casillas, es hacerlo uno por uno, es decir darle un valor a la casilla cero a la uno y a la
2 (para un vector de tamaño 3). Por defecto, al declarar un vector sin ser inicializado,
cada una de las casillas de este vector toma como valor el valor por defecto del tipo
de variable, para el caso de los enteros (int) es -858993460. Así entonces para
asignar valores a cada casilla lo hacemos así:
Es importante notar en este código, que el número que va entre corchetes ya no indica
tamaño (pues vector2 ya está declarado) sino que indica el índice o el número de la
casilla con la cual estaremos operando (recordemos que el primer índice es cero y no
uno), en el código anterior, habíamos declarado un vector de tamaño 3, por lo cual
debíamos asignar valores a los índices 0, 1 y 2.
Es muy común el caso en el que tenemos un vector con una enorme cantidad de
elementos, sin embargo, de todos estos, solo nos interesa uno en especial y corremos
37
con la suerte de saber cuál es su índice, sabiendo el índice de un elemento en un array
es bastante sencillo obtener el valor de este:
Como podemos ver, para acceder a un valor específico conociendo el índice del
elemento, solo basta con escribir dicho índice entre los corchetes "[ ]", recuerda que
el índice comienza desde cero, así por lo tanto en un vector de 5 elementos (como el
del ejemplo), el último elemento está en el índice 4 y el primer elemento del array en
el índice 0.
Para obtener todos los datos que se encuentran al interior de un vector, es necesario
recorrer el array o vector, para recorrerlo, se usa casi siempre un ciclo for, en
algunos casos más específicos un ciclo while, pero generalmente el ciclo for es el
ideal para esto, dado que conocemos el tamaño del array. La lógica de este
procedimiento es la siguiente, el ciclo for comenzara desde cero e ira hasta el tamaño
del vector, de modo que la variable de control que generalmente llamamos "i", será la
que va a ir variando entre cero y el tamaño del array, de esta forma al poner la i al
interior de los corchetes, estaremos accediendo al valor de cada casilla del vector y
podremos hacer lo que sea necesario con dicho valor, veamos:
Vamos a ver de forma resumida en qué consiste y que hace cada una de estas líneas
Línea 1:
Tenemos en la primera línea la declaración de un vector que contiene las edades de
12 personas, notemos que entre los corchetes no se puso ningún numero, pues no es
necesario, ya que el vector tendrá el tamaño según la cantidad de elementos que
declaremos entre las llaves, evidentemente si pusiéramos un 12 entre los corchetes,
no habría ningún problema.
38
Línea 2:
En la segunda línea, tenemos la declaración del límite del ciclo o en otras palabras el
tamaño del array. El tamaño de un array se puede calcular de varias formas, aquí lo
obtenemos calculando el tamaño del array entero, dividido por el tamaño del primer
elemento de dicho array, para más detalles de esto, verifica la información sobre
el operador sizeof.
Línea 3 a 6:
Desde la tercera línea hasta la sexta, tenemos entonces un ciclo for que comienza en
cero y termina en el límite (es importante notar que la condición usada es
estrictamente menor "<" y no menor o igual "<="), al interior de este ciclo, es donde
accedemos a cada uno de los elementos del vector por medio de la sintaxis explicada
anteriormente
Línea 5:
La quinta línea es quizá la más vital, aunque sin las demás no tendríamos nada. En esta
línea, estamos accediendo a cada uno de los elementos del array de edades, un
elemento por cada vuelta que da el ciclo, accedemos a cada elemento poniendo entre
los corchetes la variable i, que es la que está cambiando a medida que el ciclo va
girando, así estaremos accediendo a todos los elementos e imprimiéndolos por pantalla
El problema es simple, queremos crear un programa con el cual podamos guardar los
títulos y los autores de diferentes libros sin perder ninguno de ellos. El usuario es el
encargado de suministrar la información de cada libro. Vamos a suponer que el usuario
solo podrá ingresar un máximo de 5 libros, para así tener un tamaño de vector fijo.
Veamos entonces como se haría esto:
Hay que considerar que el tipo de dato que estamos usando para los vectores de
titulos y autores es char por lo tanto debes ingresar un único caracter cuando pruebes
el algoritmo, pues de lo contrario el comportamiento será un poco extraño (aunque
tiene su explicación). A continuación, haremos este mismo ejemplo, pero usando
cadenas de texto completas (strings) para poder ingresar sin problemas más de una
letra.
Ejemplo 1 mejorado
Vamos a solucionar el mismo problema, pero esta vez lo haremos bien. Vamos a
utilizar cadenas de texto completas (string) de modo que al ingresar un titulo o un
autor podamos poner textos completos:
39
Muy bien, tal como dije en el ejemplo anterior ahora ya podemos ingresar más de un
caracter para el título y los autores (tal y como debe ser) y nuestro algoritmo funciona
aún mejor. Puedes ver que los únicos cambios necesarios fueron importar la librería
string y poner los tipos de datos como string en vez de char y eso solucionó por
completo nuestro problema. Ten en cuenta que en versiones antiguas de compiladores
usar la funcion cin para leer strings genera un error así que asegurate de usar una
versión reciente o usa entonces la función getline
Ejemplo perfeccionado
40
Como puedes apreciar, hemos reemplazado las líneas que usaban cin para leer los
datos por la función getline(...) que recibe como primer argumento el flujo de entrada
de cin y como segundo argumento la variable en la que queremos poner el valor.
Pues bien, creo que es todo de momento con los arrays, arreglos o vectores en C++
de momento, espero más adelante añadir unos videos tutoriales con más explicaciones
y ejemplos de este tema, además de añadir varios ejemplos más aquí mismo. De
momento, espero que toda esta información haya sido de tu utilidad.
Ahora que ya conocemos todo bien acerca de los arrays, arreglos o vectores,
podremos hablar acerca de Matrices que en realidad no son tan diferentes a lo que ya
he explicado, por lo que seguramente la sección de matrices no sea tan extensa como
ésta. Pues bien, sigamos con nuestro curso de C++ y dirijámonos a la sección
de Matrices en C++.
EJERCICIOS
void main(){
char Espera;
printf("Programa de prueba de borrado de pantalla");
printf("\nPulsa intro");
scanf("%c",&Espera);
system("cls");
printf("Ha funcionado!, Hasta pronto.\n");
}
41
printf("\nHasta luego.\n\n");
}
- Programa que muestre los divisores de un numero introducido por el usuario.
- Programa que calcule los N términos de la serie Fibonacci
void main(){
printf("Bienvenido al programa para calcular la progresion de Fibonacci.\n\n");
int veces, primer=0,segun=1,proximo,r;
char borrado;
printf("Introduzca el numero de terminos: ");
scanf("%d",&veces);
scanf("%c",&borrado);
system("cls");
printf("He aqui la sucesion de %d terminos: \n",veces);
for(int i=0;i<=veces;i++){
r=primer+segun;
primer=segun;
segun=r;
printf("\n\t\t\t\t%d",r);
}
printf("\n\nGracias por utilizar este programa.\n\n");
}
42
int i,num,fact=1;
printf("Bienvenido al programa para calcular factoriales.\n");
printf("\nEscriba un numero entero: ");
scanf("%d",&num);
for(i=num;i>1; i--){
fact=fact*i;
}
printf("\nEl factorial de %d es %d\n",num,fact);
}
int main(void)
{
char c;
printf("Introduzca un carácter:");
scanf("%c",&c);
switch (c)
{
case 'a':
printf ("Es vocal\n");
break;
case 'e':
printf ("Es vocal\n");
break;
case 'i':
printf ("Es vocal\n");
break;
case 'o':
printf ("Es vocal\n");
break;
case 'u':
printf ("Es vocal\n");
break;
default:
printf ("No es vocal\n");
break;
}
system("PAUSE");
return 0;
}
- D
- D
- D
-
18. H
https://www.programarya.com/Cursos/C++/Estructuras-de-Datos/Matrices
43
19. H
20. H
21. hF
22. F
44