Estructuras de Control y Modularidad

2.05 · Repetitivas: `do-while` (postcondición)

PF-205 ⏱ 90 min ⭐ 120 XP intermedio

🎯 Objetivo de aprendizaje

Al terminar este tema vas a poder:

  1. Explicar la diferencia entre precondición (while) y postcondición (do-while).
  2. Escribir bucles do-while que ejecuten el cuerpo AL MENOS una vez.
  3. Aplicar do-while a menús interactivos profesionales.
  4. Decidir cuándo usar while vs do-while según el problema.
  5. Combinar do-while con switch para construir interfaces de consola robustas.
  6. Validar entradas con do-while cuando la primera lectura siempre se ejecuta.

Este es el bucle "perezoso al revés": ejecuta primero, pregunta después. Es el bucle natural para menús y para reintentos donde sabes que la primera vez se ejecuta.

🧠 Teoría y conceptos — 2.5.1 — La diferencia entre while y do-while

La diferencia entre while y do-while
La diferencia entre while y do-while

La diferencia clave

Mnemotécnica: while = "mientras" (primero pienso, luego hago). do-while = "hazlo, luego piensa si sigues".

Cuándo importa la diferencia

  • Menú interactivo: el menú DEBE mostrarse al menos una vez. → do-while.
  • Validación con reintentos: el usuario DEBE intentar al menos una vez. → do-while (alternativa a while con priming read).
  • Búsqueda de un número: el usuario PUEDE no tener el número. → while.
  • Suma hasta el centinela: el usuario PUEDE no ingresar datos. → while.
Cuaderno físico (obligatorio)

3 ejemplos de tu vida donde haces algo AL MENOS una vez antes de decidir si sigues (esos serían `do-while`).

2.5.2 — Sintaxis, semántica, flujo

Sintaxis, semántica, flujo del do-while
Sintaxis, semántica, flujo del do-while

Sintaxis en C++

do {

// cuerpo del bucle

// ...

} while (condición);  // ← OJO: el punto y coma al final es OBLIGATORIO

Diferencias con `while`:

  1. La condición va al final, después de la llave de cierre.
  2. Hay un punto y coma (;) después del paréntesis de la condición.
  3. El cuerpo va entre do { y } while, no entre while { y }.

Cómo funciona

  1. Se ejecuta el cuerpo (sin evaluar nada antes).
  2. Al terminar, se evalúa la condición.
  3. Si es verdadera, vuelve al paso 1.
  4. Si es falsa, el bucle termina.

Clave: el cuerpo se ejecuta al menos una vez, sin importar la condición.

Diagrama de flujo clásico del do-while

┌─────────────┐

│ INICIO │ ⬭

└──────┬──────┘

│

▼

╱─────────────╲

║ CUERPO ║ ▭ (se ejecuta PRIMERO)

║ (mostrar menú, ║

║ leer datos) ║

╲ ╱

╲─────────────╱

│

▼

◆─────────────◆ ◇ (postcondición)

╱ ╲

¿condición? No ─────►

──────── │

│ │ │

Sí │ │ No │

│ │ │

│ └────────────┼──► (sale del bucle)

│ │

└─────────┐ │

│ │

▼ │

(vuelve al │

cuerpo) │

▼

┌─────────────┐

│ [después │ ▭

│ del bucle] │

└──────┬──────┘

│

▼

┌─────────────┐

│ FIN │ ⬭

└─────────────┘

Lo que muestra el diagrama: el cuerpo se ejecuta PRIMERO, ANTES del rombo. La flecha "Sí" del rombo vuelve al cuerpo, no al inicio. La flecha "No" sale y continúa con lo que sigue al bucle. Esto es lo opuesto al `while` (donde el rombo va antes del cuerpo).

Ejemplo: menú simple

#include <iostream>
using namespace std;
int main() {

int opcion;

do {

cout << "\n=== Menú ===" << endl;
cout << "1. Saludar" << endl;
cout << "2. Despedirse" << endl;
cout << "3. Salir" << endl;
cout << "Opción: ";
cin >> opcion;

switch (opcion) {

case 1: cout << "¡Hola!" << endl; break;
case 2: cout << "¡Adiós!" << endl; break;
case 3: cout << "Saliendo..." << endl; break;
default: cout << "Opción inválida" << endl; break;

}

} while (opcion != 3);
cout << "Programa terminado." << endl;
return 0;

}

Cuaderno físico (obligatorio)

este mismo programa, pero con `while`. Necesitarías un priming read. ¿Cuál versión es más limpia? ¿Por qué?

2.5.3 — Cuándo usar do-while (y cuándo NO)

Cuándo usar do-while (y cuándo NO)
Cuándo usar do-while (y cuándo NO)

Usa do-while cuando:

✅ El cuerpo DEBE ejecutarse al menos una vez (menús, validaciones con reintento obligatorio). ✅ Es más natural leer la entrada PRIMERO y validar DESPUÉS. ✅ Quieres evitar el priming read.

NO uses do-while cuando:

❌ El cuerpo PUEDE no ejecutarse nunca (búsqueda, suma condicional). ❌ La condición es compleja y necesita ser visible desde el principio. ❌ Estás trabajando con Python (no tiene do-while nativo, se simula con while True + break).

Equivalente en Python (no tiene do-while)

Python no tiene do-while, pero se simula con while True + break:

while True:

print("=== Menú ===")

opcion = int(input("Opción: "))

if opcion == 3:

break # Sale del bucle

# ... procesar

Tabla comparativa final

2.5.4 — El patrón menú con do-while + switch

El patrón menú con do-while + switch
El patrón menú con do-while + switch

El patrón definitivo para menús interactivos

Ya vimos esto en el Tema 2.2. Ahora con do-while queda más limpio que while + priming read.

int opcion;

do {

cout << "\n=== MENÚ PRINCIPAL ===" << endl;
cout << "1. Opción A" << endl;
cout << "2. Opción B" << endl;
cout << "3. Salir" << endl;
cout << "Opción: ";
cin >> opcion;

switch (opcion) {

case 1: /* ... */ break;

case 2: /* ... */ break;

case 3: cout << "Adiós" << endl; break;
default: cout << "Inválida" << endl; break;

}

} while (opcion != 3);

Validación con reintento usando do-while

int edad;

do {

cout << "Ingresa tu edad (0-150): ";
cin >> edad;
if (edad < 0 || edad > 150) {
cout << "Edad inválida." << endl;

}

} while (edad < 0 || edad > 150);
**Versus `while` con priming read:** ```cpp int edad; cin >> edad;  // priming read while (edad < 0 || edad > 150) { cout << "Inválida, intenta de nuevo: "; cin >> edad; } ``` Ambas son correctas. `do-while` es más natural para "pedir hasta que sea válido".
Cuaderno físico (obligatorio)

el patrón `do-while + switch` para menús. Memorízalo: vas a usarlo en cualquier programa interactivo.

🤖 IA como copiloto — 🤖 AI Mission 2.5

Prompt 1: "Te voy a pegar un while que usa priming read. NO me lo conviertas. Solo dime: (1) qué hace, (2) si se puede convertir a do-while, (3) qué ventajas tendría. Máximo 100 palabras."

Prompt 2: "Estoy construyendo un menú en C++ que se repite hasta que el usuario elija 'Salir'. Dame la estructura con do-while + switch y 3 opciones. No me corrijas nada, solo escribe el código. Máximo 150 palabras."

🧪 Laboratorio — 🧪 LAB 2.5 — 5 ejercicios con do-while

🛠️ Herramienta recomendada para los diagramas de flujo de este LAB: Para los ejercicios que pidan un diagrama de flujo, usa [draw.io (diagrams.net)](https://app.diagrams.net/) — herramienta gratis, sin registro, que funciona en el navegador. Tiene plantillas con la simbología ANSI/ISO lista (en `General → Flowchart`). Exporta tus diagramas como PNG e insértalos en tu cuaderno digital o entrégalos junto con el código. Otras opciones libres: - [Mermaid](https://mermaid.live/) — diagramas desde código Markdown. Ideal para Git. - [Excalidraw](https://excalidraw.com/) — estilo "dibujado a mano", muy intuitivo. - Dibujar a mano en tu cuaderno — siempre válido, especialmente para trazar el razonamiento.

Ejercicio 1 — Menú simple (básico, 15 min)

Enunciado. Crea un menú con 3 opciones (Saludar, Despedirse, Salir) usando do-while + switch. El menú se repite hasta elegir "Salir".

Rúbrica (10 pts): menú funcional (4 pts) + switch (3 pts) + repetición correcta (3 pts).

Ejercicio 2 — Validación de edad (básico, 15 min)

Enunciado. Crea un programa que pida la edad usando do-while. Si está fuera de [0, 150], vuelve a pedir. Al final, muestra un mensaje según la edad.

Rúbrica (10 pts): validación con do-while (5 pts) + clasificación (3 pts) + mensajes (2 pts).

Ejercicio 3 — Calculadora con menú (intermedio, 25 min)

Enunciado. Construye una calculadora con menú: sumar, restar, multiplicar, dividir, potencia (a^b), salir. Usa do-while + switch. Valida división entre 0.

Rúbrica (10 pts): menú (2 pts) + 5 operaciones (5 pts) + validación (2 pts) + repetición (1 pt).

Ejercicio 4 — Login con reintentos (intermedio, 25 min)

Enunciado. Crea un sistema de login con do-while que pida usuario y contraseña hasta 3 intentos. Si la contraseña es correcta, sale del bucle con éxito. Si se acaban los intentos, muestra "Cuenta bloqueada".

Rúbrica (10 pts): do-while con reintentos (4 pts) + validación (3 pts) + mensajes (2 pts) + salida correcta (1 pt).

Ejercicio 5 — Cajero automático (avanzado, 30 min)

Enunciado. Crea un cajero con menú: consultar saldo, depositar, retirar, salir. Saldo inicial $1000. Valida saldo insuficiente. Usa do-while para que el menú se muestre al menos una vez.

Rúbrica (10 pts): menú con do-while (3 pts) + 4 opciones (4 pts) + validaciones (2 pts) + saldo correcto (1 pt).

🎯 Cierre del tema

Lo que aprendiste hoy:

  • La diferencia entre precondición y postcondición.
  • Sintaxis y semántica del do-while.
  • Cuándo usar do-while vs while.
  • El patrón do-while + switch para menús.
  • Validación con reintentos usando do-while.

Lo que sigue: en el Tema 2.6 — `for` (7h), vas a aprender el bucle más usado en programación: el for. Con él, puedes repetir un número EXACTO de veces sin preocuparte por la inicialización, condición y actualización separadas. Es el bucle "para i desde 1 hasta N".

XP obtenida al completar este tema: 100 base + 20 por LAB + 20 por Quest = 140 XP.

*"Un menú sin `do-while` es un menú que puede no abrirse. Un menú con `do-while` siempre abre."* — De la introducción de este manual.

Fin del Tema 2.5

📝 Quest · Cuestionario — 📝 Quest — Reactivos para autoevaluación

Las siguientes preguntas te sirven para autoevaluarte después de leer el tema. Responde en tu cuaderno o mentalmente, y luego revisa las Respuestas modelo (disponibles en libre acceso, sin iniciar sesión).

Sección A · Opción múltiple

Elige la opción correcta (A, B, C o D). Las respuestas están en la sección Respuestas modelo.

  1. ¿Cuál es la diferencia entre while y do-while?
    • Son iguales
    • do-while evalúa al final, ejecuta al menos una vez
    • do-while es más rápido
    • do-while no usa condición
  2. ¿Cuándo es útil do-while?
    • Nunca
    • Cuando necesitas que se ejecute al menos una vez
    • Solo en C++
    • Solo con arrays
  3. Sintaxis de do-while:
    • do { } while (cond);
    • do { } while cond;
    • do { } while (cond)
    • while (cond) do { }
  4. Si el usuario debe escribir "salir" para terminar, ¿qué bucle?
    • for
    • do-while con break
    • while simple
    • switch
  5. ¿do-while puede no tener cuerpo?
    • Sí, con ;
    • No, el bloque es obligatorio
    • Solo con ; al final
    • Solo en JS
  6. ¿Cuántas veces se ejecuta un do-while si la condición es false desde el inicio?
    • 0
    • 1
    • 2
    • infinito
  7. ¿do-while vs while infinito?
    • Son iguales
    • do-while es más seguro para menús
    • while es más rápido
    • do-while no compila
  8. ¿Qué pasa si dentro de do-while hay un continue?
    • Sale
    • Salta a evaluar la condición (siguiente iteración)
    • Termina
    • Crash
  9. ¿Qué pasa si dentro de do-while hay un break?
    • Reinicia
    • Sale del bucle
    • Salta iteración
    • Continúa
  10. do-while es ideal para:
    • Recorrer arrays
    • Validar entrada del usuario (al menos 1 vez)
    • Sumar números
    • Definir funciones

Sección B · Preguntas abiertas

Desarrolla tu respuesta en al menos 3 líneas. Compara con la respuesta modelo después de escribir.

  1. Diseña un menú interactivo con do-while que muestre opciones hasta que el usuario elija "salir".
    → Escribe tu respuesta aquí (en tu cuaderno o mentalmente)…
  2. ¿Cuándo es mejor do-while que while? Da un ejemplo concreto.
    → Escribe tu respuesta aquí (en tu cuaderno o mentalmente)…
  3. Explica la diferencia entre while(true) con break y do-while. ¿Cuál es más limpio?
    → Escribe tu respuesta aquí (en tu cuaderno o mentalmente)…

🟢 Cuando termines, revisa las Respuestas modelo y compáralas con las tuyas. La mejor forma de aprender es discutir cada respuesta contigo mismo o con un compañero.

← Volver a temas del capítulo 📚 Ver todos los temas 🔑 Inicia sesión para hacer el Test