While Do While y For
While Do While y For
3 Sentencias de iteración
§1 Sinopsis
Las sentencias de iteración permiten repetir una sentencia o conjunto de ellas. Es lo que se
denomina ejecutar un bucle. En C++ existen tres formas de iteraciones: los bucles while;
do…while y for.
Observe que en todos los casos el bucle puede estar constituido por una sola sentencia o por
varias. En cuyo caso se trata de un bloque de código delimitado por un par de corchetes { }
( 3.2.6). Si se trata de una sola sentencia, los corchetes no son necesarios.
§2.2 Descripción
Nota: recordemos que cierto (true) equivale numéricamente a distinto de cero ( 3.2.1b),
mientras que falso (false) equivale al valor cero.
Puesto que la condición se evalúa antes que cada ejecución del bucle, si al comienzo
<condicion> devuelve falso, <sentencia> no se ejecuta ninguna vez, y el control pasa a
la siguiente sentencia. Si <condición> devuelve cierto se ejecuta el bucle <sentencia>, y
a continuación se vuelve a evaluar <condicion> con lo que se repite el ciclo.
§2.3 Ejemplos
++i;
Intente por sí mismo la explicación de las salidas del programa adjunto antes de leer el
comentario final (esta disposición es muy utilizada en bucles que deben repetirse un
número n de veces).
#include <iostream>
using namespace std;
while ( x-- ) {
cout << "x = " << x << endl;
}
while ( --y ) {
cout << " y = " << y << endl;
}
Salida:
x=4
x=3
x=2
x=1
x=0
y=4
y=3
y=2
y=1
Terminado!!
Comentario
1. decremento unitario de x
2. comprobación de que x es cierto (distinto de cero). El resultado, que
denominaremos R, es un bool.
3. dos posibilidades:
1. R == true → ejecutar el bucle (salida en pantalla) → volver al punto 1.
2. R == false → abandonar el bucle.
§3.2 Descripción
Puesto que el control se evalúa después de cada ejecución del bucle, resulta que este se
ejecuta al menos una vez, aunque <condición> devuelva el valor falso desde el principio
(si requiere que el bucle no se ejecute ninguna vez, es mejor utilizar while).
do {
<sentencia> ;
} while ( <condición> );
§3.3 Ejemplo
Este programa solicita una clave de acceso indefinidamente hasta que el usuario
proporciona una que coincide con el valor almacenado en la matriz checkword.
#include <stdio.h>
#include <string.h>
int main () { // ===================
char checkword[80] = "password";
char password[80] = "";
do {
printf ("Introducir clave: ");
scanf("%s", password);
} while (strcmp(password, checkword));
return 0;
}
Nota: C++ no dispone en ninguna de sus sentencias de bucle de la opción loop (o similar),
como la ofrecida por otros lenguajes para saltar al principio desde cualquier punto de la
iteración. No obstante, ofrece alternativas que pueden servir para el caso. Ver las sentencias
goto y continue en el siguiente capítulo ( 4.10.4).
A continuación se muestra un caso simétrico al presentado para los bucles while , que
utiliza los operadores unitarios de decremento. Intente explicar por sí mismo las salidas
obtenidas antes de leer el comentario:
#include <iostream>
using namespace std;
do {
cout << "x = " << x << endl;
} while ( x-- );
do {
cout << "y = " << y << endl;
} while ( --y );
Salida:
x=5
x=4
x=3
x=2
x=1
x=0
y=5
y=4
y=3
y=2
y=1
Terminado OK!!
Comentario
En este caso, las el bloque de código (salida en pantalla) es ejecutado antes del chequeo de
la condición expresada en el paréntesis. La diferencia entre ambos bucles es que en el
primero, el postdecremento (x--) se realiza después de la evaluación del paréntesis
(comprobación de que su contenido es cierto). En consecuencia, el ciclo es como sigue:
Esta sentencia permite realizar un bucle repetidamente en base a una condición, la cual
suele estar basada en el valor de un contador que se actualiza después de cada ejecución del
bucle.
§4.1 Sintaxis
for ( [<inicio>] ; [<condicion>] ; [<incremento>] ) <sentencia>
§4.2 Descripción
Ejemplo
<inicio> inicia las variables para el bucle antes de la primera iteración. Puede ser una
expresión o una declaración. El ejemplo que sigue sería correcto en C++:
int i;
for (i=0; i<10; i++) printf("i =%5.0d\n", i);
Todas las expresiones son opcionales, pero los separadores ; no pueden faltar. Si falta
<condición>, se supone que es siempre cierta, por lo que se trata de un bucle indefinido
del que se saldrá por otro mecanismo externo al propio for, que pueden ser un break (
4.10.4) o un return ( 4.10.4). Es típico utilizar este tipo de construcciones para construir
bucles con una o más condiciones de salida:
§4.3 Ejemplos
Función que lee una línea (por teclado) y devuelve su longitud. Utiliza una expresión
<condición> del for compuesta; lim es la longitud máxima que puede ser leída.
Bucle indefinido (de una sola sentencia) que espera la pulsación de una tecla:
equivale a:
for( ; ; ) {
if(getch()!=0) break;
}
Tema relacionado
El compilador C++Builder dispone de una opción -Vd ( 1.4.3), que permite alterar el
ámbito de las variables declaradas en la expresión <inicio>. Si está desconectado (por
defecto), él ámbito se limita solo al interior del bloque <sentencia>. Si está activada (se
compila con -Vd), el ámbito se extiende al interior del bloque que contiene al for.
Al compilar el ejemplo que sigue con las opciones por defecto, se obtiene un error:
Símbolo indefinido para el identificador i por la sentencia que está fuera del bucle. Si se
compila con -Vd, la compilación se realiza sin problema.
int main(void) {
{ // comienzo del bloque que contiene al for.
for(int i=0; i<10; i++) {
cout << "Dentro del bucle, i = " << i << endl;
} //final del bloque <sentencia>
cout << "Fuera del bucle, i = " << i << endl; //error sin -Vd
} //final del bloque que contiene el for
}
Inicio