Estructuras Repetitivas
Estructuras Repetitivas
Estructuras Repetitivas
CAPÍTULO 5
Estructuras
de control repetitivas
( while, for, do-while)
Introducción
En este capítulo se estudian las estructuras de control iterativas o repetitivas que realizan la iteración de acciones. C++ so-
porta tres tipos de estructuras de control: los bucles while, for y do–while. Estas estructuras de control o sentencias repeti-
tivas controlan el número de v eces que una sentencia o listas de sentencias se ejecutan.
falsa
condición
verdadera
sentencia (acción)
Sintaxis
1 while (condición_bucle)
sentencia; cuerpo
77
05_Joyanes_C++ 15/3/06 17:21 Página 78
2 while (condición_bucle)
{
sentencia-1;
sentencia-2;
.
. cuerpo
.
sentencia-n;
}
Las sentencias del cuerpo del b ucle se repiten mientras que la e xpresión lógica (condición del b ucle) sea v erdadera.
Cuando se evalúa la expresión lógica y resulta f alsa, se termina y se sale del bucle y se ejecuta la siguiente sentencia
de programa después de la sentencia while.
EJEMPLO 5.1. Bucle mientras para escribir de los números del 1 al 10. En cada iteración se escribe el símbolo ca-
rácter X, el contenido de x, se incrementa x en una unidad y se salta de línea. Comienza el bucle con el valor de x en 1
y se sale del bucle con el valor de x a 11, pero el último valor escrito es 10, ya que el incremento del valor de x en una
unidad se realiza después de haber sido escrito el valor de x.
int x = 1;
EJEMPLO 5.2. Bucle infinito. El contador se inicializa a 1 (menor de 100) y como contador-- decrementa en 1 el
valor de contador en cada iteración, el valor del contador nunca llegará a valer 100, que es el valor necesario para
que la condición del bucle sea falsa.
int contador = 1;
while (contador < 100)
{
cout << contador << endl;
contador--; //decrementa en 1 contador
}
Son bucles en los cuales la variable de control contador se incrementa o decrementa en cada iteración en una cantidad cons-
tante. La variable de control contador se inicializa antes de comenzar el b ucle a un valor. Se comprueba el v alor de conta-
dor antes de que comience la repetición de cada b ucle, y en cada iteración o pasada se incrementa o decrementa en una can-
tidad constante.
EJEMPLO 5.3. La suma de la serie 1/2 + 1/3 + 1/4 + 1/5 + ... + 1/50 se realiza mediante el uso de un con-
tador n. Por cada valor de la variable contador n del rango 1 hasta 50 se ejecuta la sentencia de acumular en suma
el valor de 1/n. El fragmento de programa siguiente inicializa el acumulador suma a 0, el contador n a 1 posterior-
mente realiza la suma mediante el contador r eal n (obliga a que el cociente 1/n sea real) y presenta el resultado.
#include <cstdlib>
#include <iostream>
using namespace std;
float suma = 0, n = 1;
EJEMPLO 5.4. El bucle adecuado para resolver la tarea de sumar los enteros del intervalo 11..50, es un bucle con-
trolado por un contador n. Se inicializa el acumulador suma a 0. El contador enter o n se inicializa a 11, se incre-
menta en cada iter ación en una unidad hasta lle gar a 50. El contador n se acumula en el acumulador suma en cada
iteración del bucle while para los valores del rango comprendido entre 11 y 50.
#include <cstdlib>
#include <iostream>
using namespace std;
EJEMPLO 5.5. Leer las notas de un alumno usando como valor centinela par a la entrada de notas el valor de –1.
Se define una constante entera centinela con el valor de –1. En la variable nota se leen los datos de la entr ada. La
variable contador cuenta el número total de notas intr oducidas, y el acumulador suma contiene la suma total de las
notas introducidas. El bucle while está controlado por el valor de centinela. En cada iteración se incrementa el con-
tador de en una unidad, se lee una nueva nota y se acumula en suma. Obsérvese que la variable contador, siempre
contiene una unidad menos del número de datos que han sido intr oducidos.
#include <cstdlib>
#include <iostream>
using namespace std;
05_Joyanes_C++ 15/3/06 17:21 Página 80
Las variables tipo bool se utilizan como indicadores o banderas de estado. El valor del indicador se inicializa (normalmente
a false) antes de la entrada al bucle y se redefine (normalmente a true) cuando un suceso específico ocurre dentro del bucle.
Un bucle controlado por bandera-indicador se ejecuta hasta que se produce el suceso anticipado y se cambia el v alor del in-
dicador.
EJEMPLO 5.6. Se leen repetidamente caracteres del teclado y se detiene , cuando se introduce un dígito. Se def ine
una bandera digito_leido que se inicializa a false, y se cambia al valor de true cuando se lee un dígito. El b ucle
que resuelve el problema está controlado por la bander a digito_leido, y en cada iter ación solicita un carácter, se
lee en la variable car, y si es un dígito cambia el valor de la bander a. Al final del bucle se escribe el dígito leído.
#include <cstdlib>
#include <iostream>
using namespace std;
while (!digito_leido)
{
cout << "Introduzca un carácter dígito para salir del bucle :";
cin >> car;
digito_leido = (('0'<= car) && (car <= '9'));
} // fin de while
cout << car << " es el dígito leído" << endl;
system("PAUSE");
return EXIT_SUCCESS;
}
05_Joyanes_C++ 15/3/06 17:21 Página 81
EJEMPLO 5.7. El siguiente código extrae y visualiza valores enteros de la entrada hasta que se encuentra un valor
entero especificado, previamente leído del teclado.
int Clave;
int Entrada_entera;
Sintaxis
inicialización;
while (condiciónIteración)
{
sentencias del bucle for
incremento;
}
EJEMPLO 5.8. Bucle for ascendente que escribe los 5 primeros números naturales, su cuadrado y su cubo. Se ini-
cializa la variable enter a n a 1 y mientras el valor de n sea menor o igual a 5 se escribe el número n, su cuadrado y
su cubo. Posteriormente se incrementa en una unidad el valor de n.
#include <cstdlib>
#include <iostream>
using namespace std;
05_Joyanes_C++ 15/3/06 17:21 Página 82
Resultados de ejecución:
EJEMPLO 5.9. Bucle for descendente que escribe números reales y su r aíz cuadrada. Se inicializa la variable n a
16. En cada iteración del bucle se decrementa n en 2.5. El bucle termina cuando n es menor que 1.
#include <cstdlib>
#include <iostream>
#include <math.h>
using namespace std;
Resultados de ejecución:
EJEMPLO 5.10. Bucle for que no termina nunca. La salida del bucle se realiza con la sentencia break. Cuando se
v max 1
cumple la condición de salida del bucle. El ejemplo suma los vmax primeros términos de la serie Σ , siendo vmax
c=1 c * c
un dato de programa. En cada iteración se incrementa el contador c en una unidad, se acumula en suma el valor del
1 1
término de la serie . La condición if decide si hay que sumar el término a la serie o si hay que terminar
c*c c*c
mediante la ejecución de la sentencia break. El programa inicializa el contador c y el acumulador suma a 0 y en cada
iteración del bucle, cada vez que se suma un término a la serie pr esenta los valores del contador c y de la suma par-
cial del acumulador suma.
05_Joyanes_C++ 15/3/06 17:21 Página 83
#include <cstdlib>
#include <iostream>
using namespace std;
Sintaxis Semántica
do
sentencia
Después de cada eje-
while (expresión) sentencia cución de sentencia se
evalúa expresión. Si es
verdadera se repite el
cuerpo del b ucle (seten-
cia). Si es f alsa, se ter-
verdadera
expresión mina el bucle y se ejecu-
ta la siguiente sentencia.
falsa
EJEMPLO 5.11. Bucle que escribe las letras mayúsculas del alfabeto. Se inicializa la variable carácter car a 'A', y
mediante un bucle do while que termina cuando en car hay un carácter mayor que 'Z', se itera escribiendo el valor
de car e incrementando el valor de car en una unidad por lo que car toma el siguiente carácter del código ASCII.
#include <cstdlib>
#include <iostream>
using namespace std;
do
{
cout <<car << ' ';
car ++;
} while (car <= 'Y');
system("PAUSE");
return EXIT_SUCCESS;
}
Resultado de la ejecución:
EJEMPLO 5.12. Se escriben los números 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, con un bucle while, con
un bucle for, y con un bucle do while en un mismo programa.
#include <cstdlib>
#include <iostream>
using namespace std;
EJEMPLO 5.13. Leer un número entero positivo en un bucle do while y calcular su factorial, mediante un bucle for,
un bucle while y un bucle do while. (Nota: Factorial de n = n ∗ (n – 1) ∗ (n – 2) ∗ ... ∗ 2 ∗ 1).
#include <cstdlib>
#include <iostream>
using namespace std;
do
{
cout << "dame numero entero: ";
cin >> numero;
} while ( numero <= 0);
for( factorial = 1, i = 1; i <= numero; i++) //con bucle for
factorial *= i;
cout << factorial << endl;
factorial = 1; //con bucle while
i = 1;
while( i < numero)
{
i++;
factorial *= i ;
}
cout << factorial << endl;
factorial = 1; //con bucle do-while
i = 0 ;
do
{
i++;
factorial *= i;
} while(i < numero);
cout << factorial << endl;;
system("PAUSE");
return EXIT_SUCCESS;
}
05_Joyanes_C++ 15/3/06 17:21 Página 86
EJEMPLO 5.14. El siguiente programa muestra dos bucles for anidados que presentan las tablas de multiplicar del
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, pero de forma inversa. Para cada valor de la variable n en el rango 1, 2, 3,
4, 5, 6, 7, 8, 9, 10, se ejecuta una orden de escritura y el bucle interno for controlado por la variable entera
m que toma los valores 10, 9, 8, 7, ..., 1, escribiendo en cada iteración los valores de n, m y su producto n * m.
#include <cstdlib>
#include <iostream>
using namespace std;
EJERCICIOS
5.1. ¿Cuál es la salida del siguiente se gmento de programa?