Skip to content

8. Ciclo Mientras (4.3.1)

Lo que las condicionales no pudieron resolver

Section titled “Lo que las condicionales no pudieron resolver”
ProblemaLo que pasó
Cifras de un númeroSolo funcionaba con exactamente tres cifras
Validar el semestreSi el dato era incorrecto, el algoritmo terminaba. No podía pedirlo otra vez
Cajero automáticoHacía una sola operación por ejecución
CafeteríaCobra un pedido y termina. No puede atender un turno completo
Sumar las calificaciones de un grupoHay que escribir una entrada por alumno, y el tamaño del grupo cambia

En todos los casos el algoritmo necesitaba repetir un bloque de instrucciones.

Una estructura repetitiva (ciclo, loop) ejecuta un bloque de instrucciones varias veces, mientras una condición lo indique.

ElementoQué es
CuerpoLas instrucciones que se repiten
IteraciónCada ejecución del cuerpo
Condición de controlDecide si se repite otra vez
Variable de controlLa variable de la que depende la condición

Supuesto: algo dentro del cuerpo cambia la variable de control. Si nada la cambia, la condición nunca deja de cumplirse y el algoritmo no termina: es un ciclo infinito.

i = 1 // 1. inicialización: antes del ciclo
Mientras i <= 5 Hacer // 2. evaluación: en la condición
Mostrar i
i = i + 1 // 3. actualización: dentro del cuerpo
FinMientras
FaltaConsecuencia
InicializaciónLa condición usa un valor indefinido (0 en PSeInt)
ActualizaciónCiclo infinito: muestra 1 para siempre
Condición con < en lugar de <=Una iteración menos: muestra del 1 al 4
Ciclo¿Cuándo evalúa?Mínimo de iteracionesPregunta que respondeContenido
MientrasAntes del cuerpo0¿Repito mientras se cumpla algo?4.3.1
RepetirDespués del cuerpo1¿Repito hasta que se cumpla algo?4.3.2
DesdeAntes, con un contador0¿Repito un número conocido de veces?4.3.3
Mientras <condición> Hacer
<instrucciones>
FinMientras
  1. Se evalúa la condición.
  2. Si es verdadera, se ejecuta el cuerpo y se vuelve al paso 1.
  3. Si es falsa, el ciclo termina y se continúa después de FinMientras.

Como la condición se revisa antes, el cuerpo puede ejecutarse cero veces.

Se usa cuando el número de repeticiones no se conoce antes de empezar.

Ejemplo: registro de gastos (0 para terminar)

Section titled “Ejemplo: registro de gastos (0 para terminar)”
Inicio
REAL gasto
REAL total
REAL mayor
ENTERO cantidad
total = 0
cantidad = 0
mayor = 0
Mostrar "Gasto (0 para terminar): "
Entrada: gasto
Mientras gasto <> 0 Hacer
total = total + gasto
cantidad = cantidad + 1
Si gasto > mayor Entonces
mayor = gasto
FinSi
Mostrar "Gasto (0 para terminar): "
Entrada: gasto
FinMientras
Mostrar "Total: $", total, " en ", cantidad, " gastos. Mayor: $", mayor
Fin

El usuario captura sus gastos uno por uno. Al final se muestran el total, el número de gastos y el gasto mayor.

El 0 es un valor centinela: no es un gasto, solo indica el final.

Por eso hay dos entradas:

  • una antes del ciclo, para que la condición tenga un valor la primera vez
  • otra al final del cuerpo, para leer el siguiente dato antes de volver a evaluar
Iteracióngastototalcantidadmayor
Antes del ciclo120000
145.51201120
2300165.52120
30465.53300
Sale del ciclo

Pantalla final: Total: $465.5 en 3 gastos. Mayor: $300

Si el primer dato es 0, el ciclo se ejecuta cero veces: total 0, cantidad 0.

Registro de gastos: así se ve al ejecutarse

Section titled “Registro de gastos: así se ve al ejecutarse”
Ventana de ejecución del registro de gastos. El mensaje Gasto (0 para terminar) aparece cuatro veces. El usuario escribe 120, 45.5, 300 y 0. Al final se muestra Total: $465.5 en 3 gastos. Mayor: $300

El mismo mensaje aparece cuatro veces aunque en el pseudocódigo está escrito solo dos: una antes del ciclo y otra dentro, que se repite.

PatrónAntes del cicloDentro del cicloEn el ejemplo
Contadorcantidad = 0cantidad = cantidad + 1Cuántos gastos
Acumuladortotal = 0total = total + gastoCuánto se gastó
Máximomayor = 0Si gasto > mayor Entonces mayor = gastoEl gasto mayor

mayor = 0 funciona porque los gastos son positivos. Si los datos pudieran ser negativos, habría que iniciar con el primer dato o con un valor imposible.

Un acumulador que se inicializa dentro del ciclo vuelve a cero en cada iteración y al final solo guarda el último dato.

En el bloque 4.1 el algoritmo de las cifras solo servía para tres cifras. Con Mientras se separa una cifra en cada iteración, sin importar cuántas tenga.

pendiente = numero
suma = 0
cifras = 0
Mientras pendiente > 0 Hacer
suma = suma + pendiente % 10
cifras = cifras + 1
pendiente = trunc(pendiente / 10)
FinMientras
numeroIteracionessumacifras
4723133
852132
1000414
0000

pendiente es una copia: si el ciclo modificara numero, al final ya no se podría mostrar el número original.

Diagrama de flujo de la suma de cifras. Después de leer numero e inicializar pendiente, suma y cifras, decisión pendiente > 0. Por Sí se suman la cifra, se cuenta y se quita la última cifra, y una línea regresa a la decisión. Por No se muestran la suma y las cifras

Limitación: con 0 el algoritmo dice “0 cifras”, aunque el 0 se escribe con una. El supuesto del ciclo (pendiente > 0) no cubre ese caso. Se puede corregir con una condicional antes del ciclo.

Continúa con 9. Ciclo Repetir.