Elaboración de la estructura del ADN y ARN en papel.pdf
5.3 instruccion while
1. CENTRO TECNOLÓGICO DE AVANZADA
AREA DE MECATRÓNICA
Código: M06 MICROCONTROLADORES I
Laboratorio: D-19
Duración: 2 Hs INSTRUCCIONES DE CONTROL
5.3. Instrucción while
Objetivos
1. Entender el funcionamiento de la estructura while.
Hasta ahora hemos visto algunos aspectos básicos del control del flujo de ejecución de
un programa en C. Este capítulo presenta los mecanismos que C ofrece para la ejecución
repetida de sentencias, bien un número prefijado de veces, bien dependiendo de cierta
condición. Es decir, mecanismos para la creación de bucles de ejecución. C proporciona
las siguientes construcciones iterativas:
la construcción while,
la construcción do-while, y
la construcción for.
5.3.1. Construcción while
La construcción while es similar a la existente en otros lenguajes de programación.
Sin embargo, debido a que en C toda sentencia puede considerarse como una expresión,
la construcción while de C ofrece cierta potencia añadida.
La forma más general para la ejecución repetida de una sola sentencia es:
while(condición) sentencia;
O para la ejecución repetida de un grupo de sentencias:
while(condición) { grupo_de_sentencias; }
El funcionamiento de esta construcción es bastante simple. El cuerpo del bucle, es
decir, la sentencia o grupo de sentencias dentro del bucle, se ejecuta mientras el valor
de la expresión que actúa de condición sea cierto. En el momento en que la condición
sea falsa, la ejecución del programa continúa secuencialmente con la siguiente instrucción
tras el bucle (ver Figura 5.1).
Pedro Ramírez <pedroramirez22@gmail.com> 1
2. CENTRO TECNOLÓGICO DE AVANZADA
AREA DE MECATRÓNICA
Código: M06 MICROCONTROLADORES I
Laboratorio: D-19
Duración: 2 Hs INSTRUCCIONES DE CONTROL
5.1. Construcci´on while 34
Condición
sentencias
Grupo de
Cierto
Falso
Figura 5.1: Esquema de funcionamiento de while
El siguiente ejemplo calcula la media de una secuencia de n´umeros enteros le´ıdos por teclado aca-
bada en ;1:
#include <stdio.h>
void main()
f
int num, cont, suma;
cont = 0;
suma = 0;
scanf( "%d", &num );
while (num != -1)
f
cont++;
suma = suma + num;
scanf( "%d", &num );
g
if (cont != 0)
printf( "La media es %dnn", sum/cont );
else
printf( "La secuencia es vac´ıa.nn" );
g
En la construcci´on while la condici´on se eval´ua al principio del bucle. Por ello, si cuando se al-
canza el bucle por primera vez, la condici´on es falsa, el cuerpo del bucle no se ejecuta nunca (imag´ınese
el caso, en el ejemplo anterior, en que el primer n´umero de la secuencia sea ;1). Como consecuencia,
el cuerpo de un bucle while puede ejecutarse entre 0 y N veces, donde N depende de la condici´on.
N´otese tambi´en que si la condici´on permanece cierta, el bucle puede no terminar nunca (imag´ınese
qu´e ocurrir´ıa si se elimina la sentencia scanf del cuerpo del bucle del ejemplo anterior). Por ello,
habitualmente las sentencias del cuerpo del bucle modifican las variables que aparecen en la condici´on,
de forma que ´esta sea falsa en alg´un momento.
Por otra parte, la condici´on del bucle (y esto es extensible a las diferentes construcciones repetitivas)
Figura 5.1: Esquema de funcionamiento de while
En la construcción while la condición se evalúa al principio del bucle. Por ello, si
cuando se alcanza el bucle por primera vez, la condición es falsa, el cuerpo del bucle no
se ejecuta nunca.
El comportamiento o funcionamiento de una sentencia (bucle) while es:
1. Se evalúa la condición-bucle
2. Si condición-bucle es verdadera (distinto de cero) :
a) La sentencia especificada, denominada el cuerpo del bucle, se ejecuta.
b) Vuelve el control al paso I.
3. En caso contrario:
El control se transfiere a la sentencia siguiente al bucle o sentencia while.
Las sentencias del cuerpo del bucle se repiten mientras que la expresión lógica (con-
dición del bucle) sea verdadera. Cuando se evalúa la expresión lógica y resulta falsa, se
termina y se sale del bucle y se ejecuta la siguiente sentencia de programa después de la
sentencia while.
EJEMPLO 1.
/* cuenta hasta 10 */
int x = 0 ;
while(x < 10)
printf("x: %d" , x++);
La variable que representa la condición del bucle se denomina también variable de
control del bucle debido a que su valor determina si el cuerpo del bucle se repite. La
variable de control del bucle debe ser: 1) inicializada, 2) comprobada, y 3) actualizada
para que el cuerpo del bucle se ejecute adecuadamente.
Pedro Ramírez <pedroramirez22@gmail.com> 2
3. CENTRO TECNOLÓGICO DE AVANZADA
AREA DE MECATRÓNICA
Código: M06 MICROCONTROLADORES I
Laboratorio: D-19
Duración: 2 Hs INSTRUCCIONES DE CONTROL
Cada etapa se resume así:
1. Inicialización. Contador se establece a un valor inicial (se inicializa a cero, aunque
podría ser otro su valor) antes de que se alcance la sentencia while.
2. Prueba/condición. Se comprueba el valor de contador antes de que comience la
repetición de cada bucle (denominada iteración o pasada).
3. Actualización. Contador se actualiza (su valor se incrementa en 1, mediante el
operador ++) durante cada iteración.
Si la variable de control no se actualiza el bucle se ejecutará «siempre». Tal bu-
cle se denomina bucle infinito. En otras palabras un bucle infinito (sin terminación)
se producirá cuando la condición del bucle permanece y no se hace falsa en ninguna
iteración.
/*bucle infinito*/
contador = 1;
while(contador < 100)
{
printf("%d n",contador);
contador--;
}
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,
valor necesario de contador para que la condición del bucle sea falsa. Por consiguiente,
la condición contador<1OO siempre será verdadera, resultando un bucle infinito.
Pedro Ramírez <pedroramirez22@gmail.com> 3
4. CENTRO TECNOLÓGICO DE AVANZADA
AREA DE MECATRÓNICA
Código: M06 MICROCONTROLADORES I
Laboratorio: D-19
Duración: 2 Hs INSTRUCCIONES DE CONTROL
EJEMPLO 2.
/ * Bucle de muestra con while * /
#include<stdio.h>
int main()
{
int contador = 0; /*inicializa la condición*/
while(contador < 5) /*condición de prueba*/
{
contador++; /*cuerpo del bucle*/
printf("contador: %d n",contador);
}
printf("Terminado.Contador: %dn",contador);
return 0;
}
EJECUCIÓN
contador: 1
contador: 2
contador: 3
contador: 4
contador: 5
Terminado.Contador: 5
5.3.2. Bucles while con cero iteraciones
El cuerpo de un bucle no se ejecuta nunca si la prueba o condición de repetición del
bucle no se cumple, es falsa (es cero en C), cuando se alcanza while la primera vez.
contador = 10;
while(contador > 100)
{
...
}
El bucle anterior nunca se ejecutará ya que la condición del bucle (contador >100)
es falsa la primera vez que se ejecuta. El cuerpo del bucle nunca se ejecutará.
5.3.3. Bucles controlados por centinelas
Normalmente, no se conoce con exactitud cuantos elementos de datos se procesarán
antes de comenzar su ejecución. Esto se produce bien porque hay muchos datos a contar
normalmente o porque el número de datos a procesar depende de cómo prosigue el proceso
de cálculo.
Pedro Ramírez <pedroramirez22@gmail.com> 4
5. CENTRO TECNOLÓGICO DE AVANZADA
AREA DE MECATRÓNICA
Código: M06 MICROCONTROLADORES I
Laboratorio: D-19
Duración: 2 Hs INSTRUCCIONES DE CONTROL
Un medio para manejar esta situación es instruir al usuario a introducir un único dato
definido y especificado denominado valor centinela como Último dato. La condición del
bucle comprueba cada dato y termina cuando se lee el valor centinela. El valor centinela
se debe seleccionar con mucho cuidado y debe ser un valor que no pueda producirse como
dato. En realidad el centinela es un valor que sirve para terminar el proceso del bucle.
En el siguiente fragmento de código hay un bucle con centinela; se introducen notas
mientras que ésta sea distinta de centinela.
/*
entrada de datos numéricos,
centinela -1
*/
const int centinela = -1;
int cuenta = 0;
printf("Introduzca primera nota:");
scanf("%d", ¬a);
while(nota != centinela)
{
cuenta++;
suma += nota;
printf("Introduzca la siquiente nota");
scanf("%d", ¬a);
}/*fin de while*/
puts("Final");
EJECUCIÓN Si se lee el primer valor de nota, por ejemplo 25 y luego se ejecuta, la
salida podría ser ésta:
Introduzca primera nota: 25
Introduzca primera nota: 30
Introduzca primera nota: 90
Introduzca primera nota: -1 /*valor del centinela*/
Final
Pedro Ramírez <pedroramirez22@gmail.com> 5
6. CENTRO TECNOLÓGICO DE AVANZADA
AREA DE MECATRÓNICA
Código: M06 MICROCONTROLADORES I
Laboratorio: D-19
Duración: 2 Hs INSTRUCCIONES DE CONTROL
5.3.4. La sentencia break en los bucles
La sentencia break se utiliza, a veces, para realizar una terminación anormal del
bucle. Dicho de otro modo, una terminación antes de lo previsto. Su sintaxis es:
break;
while(condición)
{
if(condicion2)
break;
/*sentencias*/
}
5.3.5. Bucles while (true)
La condición que se comprueba en un bucle while puede ser cualquier expresión
válida C. Mientras que la condición permanezca verdadera (distinto de 0) , el bucle
while continuará ejecutándose. Se puede crear un bucle que nunca termine utilizando el
valor 1 (verdadero) para la condición que se comprueba.
/*Listado while (true)*/
#include<stdio.h>
int main()
{
int flag=1, contador=0;
while(flag)
{
contador++;
if(contador > 10)
break;
}
printf("Contador: %dn", contador) ;
return 0;
}
Salida
Contador: 11
Por otra parte, la condición del bucle (y esto es extensible a las diferentes construc-
ciones repetitivas) no tiene por qué ser simplemente una expresión lógica, sino que puede
ser cualquier expresión. Por ejemplo, los siguiente bucles
while (x−−) { . . . }
while (x = x+1);
Pedro Ramírez <pedroramirez22@gmail.com> 6
7. CENTRO TECNOLÓGICO DE AVANZADA
AREA DE MECATRÓNICA
Código: M06 MICROCONTROLADORES I
Laboratorio: D-19
Duración: 2 Hs INSTRUCCIONES DE CONTROL
son perfectamente válidos. En ambos casos el cuerpo del bucle se repetirá mientras el
valor de x sea distinto de 0 . Nótese que en el segundo caso el cuerpo del bucle es nulo,
lo cual también es posible.
EJERCICIOS
1. Considerar el siguiente código del programa
int i = 1;
while(i <= n){
if((i%n) == 0){
++i;
}
printf("%d n", i);
}
a) Cuál será la salida si n es cero.
b) Cuál será la salida si n es uno.
c) Cuál será la salida si n es tres.
2. Cuál es la salida del siguiente bucle?
suma = 0;
while(suma < 100)
sum+=5;
printf("%d n", suma);
3. Escribir un bucle while que visualice todas las potencias de un entero n menores
a un valor especificado max_limite.
4. Escribir un programa que encuentre el primer numero introducido por teclado.
5. Calcular la suma de una serie de números leídos del teclado.
Ultima Actualización 16 de marzo de 2017
Pedro Ramírez <pedroramirez22@gmail.com> 7