1.
Ciclo DO-WHILE
El do-while es una de las estructuras de control de flujo fundamentales en la programación
que maneja la repetición o iteración de un conjunto de instrucciones. Pertenece a la
categoría de ciclos (o bucles) y tiene un rol específico que lo distingue de sus contrapartes
(como el ciclo while o el ciclo for). El do-while es esencialmente un mecanismo para
realizar una acción al menos una vez y luego repetirla mientras se cumpla una condición
preestablecida. Por esta razón, se le clasifica como un ciclo de salida condicionada.
Su propósito principal es garantizar que el cuerpo del ciclo (el bloque de instrucciones a
ejecutar) se ejecute en la primera instancia, sin importar el estado inicial de la condición
que rige la repetición. La verificación de si se debe continuar o no siempre se pospone hasta
el final de cada iteración.
El ciclo se divide conceptualmente en dos partes principales:
El Bloque do (Hacer): Representa la sección de código que se ejecuta
incondicionalmente al comenzar el ciclo. El flujo de control entra aquí de inmediato
y ejecuta todas las instrucciones contenidas. Este es el corazón de la acción
repetitiva.
La Condición while (Mientras): Esta es una expresión lógica que se evalúa a
verdadero (true) o falso (false) después de que el bloque do ha terminado su
ejecución.
o Si la condición es verdadera, el ciclo recibe la instrucción de regresar al
bloque do para una nueva repetición.
o Si la condición es falsa, el ciclo termina, y el programa continúa con la
siguiente instrucción que sigue a la estructura do-while.
La característica de la ejecución mínima garantizada hace que el do-while sea la elección
óptima para escenarios donde la acción del ciclo debe preceder a su propia validación. Dos
aplicaciones son particularmente comunes:
Validación de Entrada de Datos: Es el caso de uso más frecuente. Si un programa
necesita solicitar al usuario un dato que cumpla con ciertas reglas (por ejemplo, un
número positivo, una opción válida de un menú, o una contraseña que coincida con
una confirmación), el do-while es perfecto. Primero, se pide el dato (en el bloque
do); solo después de tener el dato se puede verificar si es correcto (en la condición
while). Si el dato es incorrecto, el ciclo obliga a repetir la solicitud.
Menús Interactivos con Repetición: Se usa para crear menús de aplicaciones donde,
al final de las operaciones, se pregunta al usuario si desea realizar otra acción o
salir. El cuerpo del menú se ejecuta al menos una vez, y la decisión de continuar se
toma al final, lo cual coincide perfectamente con la estructura del do-while.
CARACTERISTICA WHILE DO-WHILE
Tipo de control Entrada condicionada. Salida condicionada.
Evaluación La condición se evalúa al La condición se evalúa al
inicio de cada iteración. final de cada iteración.
Ejecución El cuerpo del ciclo no El cuerpo del ciclo se ejecuta
puede ejecutarse (0 veces) al menos una vez (1 vez),
si la condición es falsa incluso si la condición es
desde el principio. falsa.
Sintaxis while (condicion) { do { ...bloque... }
...bloque... } while (condicion);
Punto y coma No lleva punto y coma Si lleva punto y coma (;) al
después de la condición. final de la condición.
Usabilidad Cuando no estamos Para validación de entradas
seguros de si se necesita la o menús donde necesitas
ejecución y dependemos de obtener una acción antes de
una condición inicial. verificar su validez.
Flujo de control Se comprueba → se ejecuta Se ejecuta → se comprueba
Sintaxis
La sintaxis general es:
C++
do {
// Bloque de instrucciones a ejecutar
// (Se ejecuta al menos una vez)
} while (condicion); // La condición se evalúa después
Ejemplo Práctico:
#include <iostream>
using namespace std;
int main() {
int opcion;
do {
cout << "\n--- MENU ---\n";
cout << "1. Saludar\n";
cout << "2. Despedir\n";
cout << "3. Salir\n";
cout << "Ingrese una opcion: ";
cin >> opcion;
switch (opcion) {
case 1:
cout << "¡Hola! Bienvenido.\n";
break;
case 2:
cout << "¡Adios! Vuelve pronto.\n";
break;
case 3:
cout << "Saliendo del programa.\n";
break;
default:
cout << "Opcion no valida. Intente de nuevo.\n";
}
} while (opcion != 3); // Repetir mientras la opción no sea '3'
return 0;
}
2. Parámetros por Referencia
En programación, cuando se llama a una función, los argumentos se pueden pasar por valor
o por referencia. Al pasar un parámetro por referencia, la función trabaja directamente con
la ubicación de memoria de la variable original, en lugar de hacer una copia de su valor.
Uso del Símbolo Ampersand (&)
Para indicar que un parámetro de una función se pasará por referencia en C++, se utiliza el
operador de referencia, el ampersand (&), justo antes del nombre del parámetro en la
declaración y definición de la función.
Modificación de Variables
El principal beneficio del paso por referencia es que permite a la función llamada modificar
directamente el valor de la variable original pasada desde la función que llama (por
ejemplo, main), algo que no es posible con el paso por valor (donde solo se modifica una
copia local).
Ejemplo Práctico: Intercambio de Valores (Swap)
Un ejemplo clásico es una función para intercambiar los valores de dos variables:
#include <iostream>
using namespace std;
// Función para intercambiar dos enteros por referencia
void intercambiar(int &a, int &b) {
int temp = a; // 'temp' almacena el valor original de 'a'
a = b; // El valor de la variable original 'x' se cambia al valor de 'y'
b = temp; // El valor de la variable original 'y' se cambia al valor de 'x'
}
int main() {
int x = 10;
int y = 20;
cout << "Antes de intercambiar: x = " << x << ", y = " << y << endl;
// Se llama a la función, pasando las variables por referencia
intercambiar(x, y);
cout << "Despues de intercambiar: x = " << x << ", y = " << y << endl;
return 0;
}
Resultado: La función intercambiar modifica directamente x y y en main, logrando que sus
valores se intercambien, gracias al uso de &.
3. Modificación de Vectores (STL std::vector)
En C++, el contenedor dinámico de la Standard Template Library (STL) más utilizado para
manejar colecciones de datos es std::vector. A diferencia de los arrays estáticos, los
vectores pueden cambiar su tamaño en tiempo de ejecución.
Asignación y Actualización de Valores
Los elementos individuales de un vector se acceden y modifican utilizando el operador de
subíndice ([]), de forma similar a los arrays. La asignación de un valor a una posición
específica se llama actualización.
Ejemplo de Actualización:
C++
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> numeros = {10, 20, 30, 40, 50};
// Actualizar el valor en el índice 2 (tercer elemento)
numeros[2] = 99; // 30 se reemplaza por 99
cout << "Valor actualizado en el indice 2: " << numeros[2] << endl;
return 0;
}
Inserción Básica
La forma más común y eficiente de agregar un nuevo elemento a un std::vector es al final
de la colección.
push_back(valor): Agrega el valor al final del vector, aumentando su tamaño en uno. Esta
es la operación de inserción más rápida para un vector, ya que no requiere mover otros
elementos.
Ejemplo de Inserción (al final):
C++
#include <vector>
// ... (resto del código)
int main() {
vector<string> frutas = {"Manzana", "Banana"};
cout << "Tamaño inicial: " << [Link]() << endl; // 2
// Inserción al final
frutas.push_back("Naranja");
frutas.push_back("Pera");
cout << "Tamaño despues de push_back: " << [Link]() << endl; // 4
cout << "Ultima fruta: " << [Link]() << endl; // Pera
return 0;
}
Para realizar inserciones en posiciones intermedias o al inicio de un vector, se utiliza la
función miembro vector::insert(), la cual requiere de iteradores y es una operación más
costosa en tiempo de ejecución, ya que desplaza todos los elementos subsiguientes.