Estructuras de Controlc++cicloswhileiteraciónestructuras-de-control

Ciclo While

Aprende a usar el ciclo while para repetir código mientras una condición sea verdadera

OOI Oaxaca9 de febrero de 20266 min read

El ciclo while

El ciclo while ejecuta código mientras una condición sea verdadera. Es útil cuando no sabemos exactamente cuántas iteraciones necesitamos.

while (condición) {
    // Código a repetir
}

Ejemplos básicos

Contar del 1 al 5

int i = 1;
while (i <= 5) {
    cout << i << " ";
    i++;
}
// Salida: 1 2 3 4 5

Sumar hasta que el usuario ingrese 0

int suma = 0;
int numero;

cin >> numero;
while (numero != 0) {
    suma += numero;
    cin >> numero;
}

cout << "Suma total: " << suma << endl;

while vs for

Usar for cuando...Usar while cuando...
Conoces el número de iteracionesNo sabes cuántas veces repetir
Iteras sobre un rangoEsperas una condición específica
Recorres arreglos con índiceLees datos hasta EOF
// for: sabemos que son n elementos
for (int i = 0; i < n; i++) {
    cout << arr[i];
}

// while: no sabemos cuántos datos hay
while (cin >> x) {
    procesar(x);
}

El ciclo do-while

Ejecuta el código al menos una vez, luego verifica la condición:

do {
    // Código a ejecutar
} while (condición);

Ejemplo: Validar entrada

int opcion;
do {
    cout << "Ingresa una opción (1-5): ";
    cin >> opcion;
} while (opcion < 1 || opcion > 5);

cout << "Elegiste: " << opcion << endl;

Diferencia entre while y do-while

int x = 10;

// while: no ejecuta nada (condición falsa desde el inicio)
while (x < 5) {
    cout << "while: " << x << endl;
    x++;
}

// do-while: ejecuta una vez antes de verificar
do {
    cout << "do-while: " << x << endl;
    x++;
} while (x < 5);
// Imprime: do-while: 10

Patrones comunes

Leer hasta fin de archivo (EOF)

int n;
while (cin >> n) {
    cout << n * 2 << endl;
}

Procesar dígitos de un número

int n;
cin >> n;

while (n > 0) {
    int digito = n % 10;
    cout << digito << " ";
    n /= 10;
}
// Si n = 12345, imprime: 5 4 3 2 1

Algoritmo de Euclides (MCD)

int mcd(int a, int b) {
    while (b != 0) {
        int temp = b;
        b = a % b;
        a = temp;
    }
    return a;
}

Búsqueda binaria

int busquedaBinaria(vector<int>& arr, int objetivo) {
    int izq = 0, der = arr.size() - 1;

    while (izq <= der) {
        int mid = izq + (der - izq) / 2;

        if (arr[mid] == objetivo) return mid;
        if (arr[mid] < objetivo) izq = mid + 1;
        else der = mid - 1;
    }

    return -1;
}

Ejemplo: Número de dígitos

int n;
cin >> n;

int digitos = 0;
int temp = abs(n);  // Manejar negativos

if (temp == 0) {
    digitos = 1;
} else {
    while (temp > 0) {
        digitos++;
        temp /= 10;
    }
}

cout << "Tiene " << digitos << " dígitos" << endl;

Ejemplo: Potencia de 2

Verificar si un número es potencia de 2:

int n;
cin >> n;

bool esPotencia = (n > 0);
int temp = n;

while (temp > 1 && esPotencia) {
    if (temp % 2 != 0) {
        esPotencia = false;
    }
    temp /= 2;
}

if (esPotencia) {
    cout << "Es potencia de 2" << endl;
} else {
    cout << "No es potencia de 2" << endl;
}

// Forma más elegante con bits:
// bool esPotencia = (n > 0) && ((n & (n-1)) == 0);

Ejemplo: Conjetura de Collatz

La secuencia de Collatz: si n es par, dividir entre 2; si es impar, multiplicar por 3 y sumar 1.

int n;
cin >> n;

int pasos = 0;
while (n != 1) {
    cout << n << " -> ";
    if (n % 2 == 0) {
        n /= 2;
    } else {
        n = 3 * n + 1;
    }
    pasos++;
}
cout << "1" << endl;
cout << "Pasos: " << pasos << endl;

Ciclos infinitos (con cuidado)

A veces útiles con break:

while (true) {
    int comando;
    cin >> comando;

    if (comando == 0) {
        break;  // Salir del ciclo
    }

    procesar(comando);
}

Errores comunes

1. Ciclo infinito no deseado

// ❌ La condición nunca cambia
int i = 0;
while (i < 10) {
    cout << i;
    // Olvidaste: i++;
}

// ✅ Correcto
int i = 0;
while (i < 10) {
    cout << i;
    i++;
}

2. Condición incorrecta

// ❌ Nunca entra al ciclo
int i = 10;
while (i < 5) {
    cout << i;
    i++;
}

3. Modificar la condición incorrectamente

// ❌ La variable cambia en dirección incorrecta
int i = 0;
while (i < 10) {
    cout << i;
    i--;  // Debería ser i++
}

Ejercicios de práctica

Ejercicio 1

Invierte un número entero.

Ver solución
int n;
cin >> n;

int invertido = 0;
while (n != 0) {
    int digito = n % 10;
    invertido = invertido * 10 + digito;
    n /= 10;
}

cout << invertido << endl;

Ejercicio 2

Encuentra el mayor divisor común de dos números usando el algoritmo de Euclides.

Ver solución
int a, b;
cin >> a >> b;

while (b != 0) {
    int temp = b;
    b = a % b;
    a = temp;
}

cout << "MCD: " << a << endl;

Ejercicio 3

Adivina el número: el programa piensa un número del 1 al 100 y da pistas.

Ver solución
#include <cstdlib>
#include <ctime>

srand(time(0));
int secreto = rand() % 100 + 1;
int intento;
int intentos = 0;

do {
    cout << "Adivina (1-100): ";
    cin >> intento;
    intentos++;

    if (intento < secreto) {
        cout << "Muy bajo" << endl;
    } else if (intento > secreto) {
        cout << "Muy alto" << endl;
    }
} while (intento != secreto);

cout << "¡Correcto! Lo lograste en " << intentos << " intentos." << endl;

Siguiente paso

Aprende sobre Funciones para organizar y reutilizar tu código.