22
Estructuras Repetitivas. Este tipo de estructuras permiten ejecutar más de una vez un mismo blo Supongamos que tenemos que hacer un programa para entrar las notas de una alumnos y después hacer la media; con las estructuras vistas hasta ahora Programa "al; Variables #ota ! Entero ; $edia ! Real ; Inicio $edia !% & ; Escribir '(Entrar la nota ! () ; Leer '#ota) ; $edia !% $edia * #ota ; Escribir '(Entrar la nota ! () ; Leer '#ota) ; $edia !% $edia * #ota ; Escribir '(Entrar la nota ! () ; Leer '#ota) ; $edia !% $edia * #ota ; Escribir '(Entrar la nota ! () ; Leer '#ota) ; $edia !% $edia * #ota ; Escribir '(Entrar la nota ! () ; Leer '#ota) ; $edia !% $edia * #ota ; $edia !% $edia + 5 ; Escribir '(,a media de la clase es ! ($edia) ; Fin . -ijaros que este programa repite el bloque de sentencias Escribir '(Entrar la nota ! () ; Leer '#ota) ; $edia !% $edia * #ota ; 5 veces. ara evitar esta tipo de repeticiones de c/digo los lenguajes de incorporan instrucciones que permiten la repetici/n de bloques de c/digo. 0

Estructuras Repetitivas en C

Embed Size (px)

DESCRIPTION

Programacion en C Estructuras repetitivas

Citation preview

Estructuras Repetitivas.
Este tipo de estructuras permiten ejecutar más de una vez un mismo bloque de sentencias. Supongamos que tenemos que hacer un programa para entrar las notas de una clase de 5 alumnos y después hacer la media; con las estructuras vistas hasta ahora podriamos hacer!
Programa "al;
Inicio $edia !% & ; Escribir'(Entrar la nota ! () ; Leer'#ota) ; $edia !% $edia * #ota ;
Escribir'(Entrar la nota ! () ; Leer'#ota) ; $edia !% $edia * #ota ;
Escribir'(Entrar la nota ! () ; Leer'#ota) ; $edia !% $edia * #ota ;
Escribir'(Entrar la nota ! () ; Leer'#ota) ; $edia !% $edia * #ota ;
Escribir'(Entrar la nota ! () ; Leer'#ota) ; $edia !% $edia * #ota ;
$edia !% $edia + 5 ;
Fin.
Escribir'(Entrar la nota ! () ; Leer'#ota) ; $edia !% $edia * #ota ;
5 veces. ara evitar esta tipo de repeticiones de c/digo los lenguajes de programaci/n incorporan instrucciones que permiten la repetici/n de bloques de c/digo.
0
• Estructura repetitiva Para (for).
Esta estructura sirve para repetir la ejecuci/n de una sentencia o bloque de sentencias un n1mero de2inido de veces. ,a estructura es la siguiente!
 Para var !% 3alor4nicial  Hasta 3alor42inal Hacer  sentencia ;
 Para var !%3alor4nicial Hasta 3alor4-inal  Hacer  Inicio
Sentencia 0 ; Sentencia 6 ;
Programa "al;
Inicio $edia !% & ;  Para i !%0 Hasta 5 Hacer 
Inicio  Escribir '(Entreu la nota ! () ;  Leer '#ota) ; $edia !% $edia * #ota ;
Fin;  Escribir '(,a $edia de la clase es ! ($edia) ;
Fin.
 Para y !%0 Hasta  5 Hacer 
• ,a variable i se inicia con 0 'valor inicial) • 7ada vez que se ejecuta el cuerpo del bucle la variable i se incrementa una unidad. • 7uando la varible i llega a valer 5'valor 2inal) se ejecuta el bucle y continua el programa.
En esta segunda versi/n el programa a parte de reducir la cantidad de c/digo queda más elegante. 8demás observar que si ahora la clase a la cual se quiere hacer la media es de 6& alumnos lo 1nico que hay que hacer es cambiar el 5 'valor 2inal) por el 6& en cambio en la  primera versi/n se tendria que repetir el c/digo 05 veces més.
6
El bucle 2or con lenguaje 7.
,a sinta9is del bucle 2or en lenguaje 7 es un poco compleja el algoritmo anterior en lengiaje 7 ser:a!
main') {
{ printf '(Entrar la nota ! () ; scanf '(<d=>#ota) ; $edia % $edia * #ota ;
} $edia % $edia + 5 ; printf '(,a media és ! <d ($edia) ;
}
2or 'i%0 ; i%5 ; i**)
El bucle for tiene tres partes
i= e9presi/n inicial inicia la variable 'en este caso hace que i % 0) .
i != " e9presi/n de comprobaci/n 'en este caso comprueba que i sea menor o igual que 5) .
i##$ e9pressi/n de incremento 'incremementa la variable i con 0). @s lo mismo que i % i*0.
%uando el programa llega al bucle$
0. Se inicia la variable de control &i='. 6. Se comprueba que se cumpla la condici/n &i != "'; si se cumple se ejecuta el
cuerpo de bucle si no se cumple el programa salta a la siguiente sentencia 2uera del bucle; en este caso a $edia % $edia + 5.
A. -inalmente se incrementa la variable de control &i##' y se vuelve a paso 6.
3ea el siguiente esquema para compender mejor el 2uncionamiento de esta estructura!
A
 
7opie el programa anterior y ejec1telo para ver el 2uncionamento del bucle 2or.
• Ejecutar los programas sentencia a sentencia. Utilizar las opciones
del depurador.
8hora aprovechando el programa anterior nos detendremos un poco para ver como 2uncionan las opciones del depurador '(ebug'. Estas opciones permiten la ejecuci/n de los  programas sentencia a sentencia y as: tener un control Bptimo de su ejecuci/n 'comprobar si el programa se ejecuta com se hab:a previsto). "ambién nos permitirá utilizando las di2erentes opciones del depurador inspeccionar los di2erentes valores que van tomando las variables.
Ejecutar un programa sentencia a sentencia.
 #o es una opci/n del men1 debug pero resulta muy 1til en el control de programas. 7on esta opci/n podremos hacer que un programa se ejecute sentencia a sentencia. ara hacerlo active la opci/n Run) *race Into para ejecutar cada sentencia también puede pulsar la tecla F+.
7argue el programa de las notas una vez lo tenga en pantalla vaya pulsando la tecla -C; 2:jese c/mo las sentencias se van ejecutando una a una. -:jese como se va repitiendo la ejecuci/n del bloque de sentencias del bucle  for .
"ambién se puede utilizar la opci/n Run) Step o,er 'o pulsar la tecla F-) el 2uncionamiento es similar. Se veran las di2erencias con el método anterior cuando se hagan programas con 2unciones.
untos de ruptura. arar la ejecuci/n de un programa para continuar paso a paso .
Esta opci/n se utiliza para parar un programa y poder continuar ejecutándolo paso a paso. Es muy 1til en programas largos. 7uando se sabe que un programa 2alla en un punto determinado no hace 2alta ejecutar el programa paso a paso hasta llegar a la zona del error se puede hacer correr el programa hasta este punto parar la ejecuci/n y continuar paso a  paso.
Para definir un punto de ruptura$
D
7omprobar la condici/n del  bucle
Ejecutar sentencias del cuerpo del bucle.
ncrementar variable de control. i**
La condicin se cumple
La condicin no se cumple
7ontinua el ro rama.
 
0. Situe el cursor en la l:nea donde quiera que pare el programa.
6. 8ctive la opci/n (ebug) *oggle /rea0point. "ambién puede pulsar la combinaci/n %trl#F-.
Situe un punto de ruptura en la l:nea $edia % $edia + 5 y ejecute el programa observe como la ejecuci/n del programa para en esta l:nea. 8cabe de ejecutar el  programa pulsando la tecla F+.
• uede de2inir más de un punto de ruptura en un mismo programa.
• Si s/lo ha de utilizar un punto de ruptura en un programa puede utilizar la opci/n Run)
1oto %ursor; el programa se ejecutará hasta el punto donde se encuentra el cursor; entonces puede continuar paso a paso.
• ara eliminar un punto de ruptura siga los mismos pasos que ha utilizado para establecerlo.
• 7uando esté ejecutando un programa paso a paso en cualquier momento puede hacer que se ejecute hasta al 2inal activando la opci/n Run)Run.
• 7uando esté ejecutando un programa paso a paso en cualquier momento puede interrumpir su ejecuci/n activando la opci/n Run) Program Reset.
nspecci/n de 3ariables.
7on esta opci/n podrá saber en cualquier momento el valor de las variables que utiliza un  programa. ara hacer posible esta inspecci/n ha de ejecutar el programa paso a paso.
ara establecer las varibles de las cuales quiera ver los valores
0. 8ctive la opci/n (ebug) 2atc3es) 4dd 2atc3. 6. "eclee el nombre de la variable. onga la varible i para ver un ejemplo.
?bserve que se abre una ventana con el mensaje i : Undefined simbol ‘i’  esto signi2ica que no se conoce la variable esto ocurre sencillamente porqué el programa no se está ejecutando y por tanto no está cargada en memoria la variable.
%uidado.
• ?bserve que al aadir un Fatch se abre una ventana nueva con este nombre ' 2atc3). ara ejecutar el programa tiene que situarse en la ventana don está el programa. ara cambiar de ventana lo tiene que hacer con la tecla F5$ o bien activando la opci/n 2indo6) 7e8t.
• Si cuando ejecute el programa paso a paso no aparece la ventana Fatch solo tiene que activarla pulsando la tecla F5.
8ada a la ventana Fatch la variable $edia y ejecute el programa paso a paso; observe como van cambiando los valores de las variables Media e i a medida que se van ejecutando las sentencias.
5
 
El resto de las opciones del men9 :ue se despliega con (ebug) 2atc3 son
Edit 2atc3 sirve para modi2icar el nombre de una variable por si se ha equivocado al teclearla. "ambién puede editarla yendo a la ventana Fatch y pulsando E#"ER.
(elete 2atc3 borra la variable seleccionada.
Remo,e all 2atc3es borra todas las variables de la ventana Fatch. "ambién puede hacerlo cerrando la ventana Fatch 'recuerde para cerrar una ventana pulse 8,"*-A).
$ás ejemplos del bucle for .
rograma que visualiza la tabla 8S7.
Ginclude stdio.hH Ginclude conio.hH
printf '(<Ad%<c It= i i) ;
getc3') ; }
?bserve la l:nea  printf  la misma variable i  sirve para visualizar el n1mero entero que contiene y su c/digo 8S7 correspondiente. <d muestra el n1mero y <c muestra el carácter 8S7 que este n1mero representa.
rograma que muestra los cien primeros pares negativos. ?bserve en este programa que en lugar de incrementar la variable de control esta se decrementa.
Ginclude stdio.hH Ginclude conio.hH
printf '(<d (i) ;
}
rograma que visualiza los n1meros comprendidos entre 5& y 0&& en intérvalos de D. ?bserve que el valor incial para la variable de control és 5& y que se incrementa de D en D.
K
printf '(<d= i) ;
}
rograma que imprime los 0&& primeros n1meros positivos y los 0&& primeros n1meros negativos de la siguiente manera! 0 J0 6 J6 A JA D J5LL MM JMM 0&& J0&&. ?bserve que en la parte de inicializaci/n del bucle se asignan valores a dos variables y en la parte de incremento també se incrementan 6.
Ginclude stdio.hH Ginclude conio.hH
clrscr') ;  for 'i%0 j%J0 ;i % 0&& ; i** jJJ)
printf '(<d <d ( i j) ;
}
• En la parte de iniciaci/n del bucle se puede dar valores a tantas variables como se quiera; cada asignaci/n ha de ir separada por comas. En la parte de incremento se puede cambiar  el valor de las variables que se desee; cada asignaci/n se ha de separar por comas. S/lo se puede establecer una 1nica condici/n de 2inalizaci/n de bucle y siempre separada por ; de las e9presiones inciciales y de incremento.
En un bucle 2or se puede prescindir de las e9presiones de inicializaci/n de bucle y de la e9presi/n de incremento. 3ea los ejemplos siguientes!
C
 
rograma que muestra los valores entre un n1mero introducido por el teclado y visualiza los valores entre este valor y 0&. Si el n1mero entrado es H 0& no se visualiza nada.
Ginclude stdio.hH G include conio.hH
main') {
int i ;
clrscr') ; printf '(Entrar el valor inicial ! () ; scanf '(<d=>i) ;  for  ' ;i%0& ;i**)
printf '(<d In=i) ;
}
rograma que muestra n1meros del 0 al 0& con incrementos introducidos por el teclado.
Ginclude stdio.hH Ginclude conio.hH
clrscr') ;  for 'i%0 ;i%0& ;)
} }
rograma que introduce valores hasta que se introduzca uno mayor que 0&.
Ginclude stdio.hH Ginclude conio.hH
main') {
int i % &; ++ niciada para que en la primera evaluaci/n sea % 0&.
clrscr') ;  for ';i%0& ;)
} }
,es tres estructuras anteriores son realmente rebuscadas raramente se utilizan; por otra parte se hubiese podido resolver más (naturalmente= con otro tipo de bucle.
N
Errores 2recuentes en las estructuras 2or.
• oner  ; después de la sentencia  for .
7argue el programa de las notas ponga ; al 2inal de la l:nea 2or y ejecute el programa. 7ompruebe que el programa s/lo pide una nota. 8l poner  ; al 2inal de la l:nea  for  el  programa cuenta hasta a 5 y después continua la ejecuci/n secuencial del resto de senténcias; no trata el bloque cerrado entre llaves como una senténcia compuesta de instrucciones dentro del bucle for  sino com senténcias desligadas de éste.
• 7ambiar el valor de la variable de control 2uera de la e9presi/n de incremento del  bucle.
onga abajo la instrucci/n <edia = <edia # 7ota  la l:nea i =i #. Ejecute el  programa y compruebe que s/lo pide A notas. Eso es debido a que en cada paso de  bucle la variable i se incrementa 6 veces una a la e9presi/n de incremento del bucle 'i**) y la otra a la senténcia i % i * 0. rocure que los programas s/lo se cámbie el valor de la variable de control en la e9presi/n de incremento.
8nidamiento de bucles.
Oe la misma manera que vimos c/mo 2uncionan las estructuras condicionales un bucle for  puede contener otros. 3ea el programa siguiente desarrollado directamente en lenguage 7.
rograma que muestra todos los resultados posibles que pueden salir al tirar dos dados. 7ombinaremos el resultado de un dado con los seis que pueden salir del otro.
Ginclude stdio.hH Ginclude conio.hH
}
En este programa nos encontramos con el mismo caso que con la misma versi/n del  programa de las notas 'la que no utilizaba el bucle  for )! hay una sentencia que se repite K veces 'la 1nica di2erencia es el valor que representa el primer dado valor del 0 al K). 7erraremos esta sentencia dentro de un bucle  for  y el programa quedará de la siguiente manera!
M
int dado0 dado6 ;
 for  'dado0%0 ; dado0 % K ; dado0**)  for  'dado6 % 0 ; dado6 %K ; dado6**)
printf '(<d <d= dado0 dado6) ;
}
Ejecute este programa y compruebe :ue cada ,e :ue se e>ecuta el primer bucle &el
controlado para la ,ariable (ado'$ el segundo se ejecuta 6 veces.
rograma que visualiza la cantidad de asteriscos que representa cada l:nea de la  pantalla. ,:nea 0 un asterisco l:nea 6 dos asteriscos... l:nea 65 veinticinco asceriscos
Ginclude stdio.hH Ginclude conio.hH
 for  'numl:nea % 0 ; numl:nea % 65 ; numl:nea**) {  for  ' numasteriscos % 0 ; numasteriscos % numl:nea ;
numasteriscos**) putc3ar'PQ) ;
}
• osiblemente la primera l:nea desaparecerá de la pantalla debido al In de la 1ltima ejecuci/n del primer 2or. Recuerde que cuando la pantalla está llena automáticamente suben las l:neas provocando la desaparici/n de la primera.
0&
 
rograma que desplaza un circulo por la pantalla. El método más sencillo para desplazar cualquier objeto por la pantalla consiste en dibujar el objeto en una  posici/n borrar el objeto de esta posici/n calcular las nuevas coordenadas y volver a comenzar.
3éa el esquema siguiente!
Paso . Oibujar el objeto en la posici/n 9y Paso ?. orrar el objeto de la posici/n 9y Paso @. 7ambiar el valor de las coordenadas 9y Paso A. 3olver al paso 0.
Ginclude stdio.hH Ginclude conio.hH Ginclude graphics.hH
main') {
} }
Es muy posible que el c:rculo vaya tan rápido que no tenga tiempo de verlo. ara retrasar el movimiento del c:rculo pondremos un par de bucles 2or entre las l:neas circle'9A&&5&) y setcolor',87V). -:jese que la 1nica 2unci/n de estos bucles es la de contar de 0 al KD&&&. El programa quedar:a!
Ginclude stdio.hH Ginclude conio.hH Ginclude graphics.hH
main') {
antalla4Trá2ica');  for '9%5&;9%5M&;9%9*0&)
} }
?bserve que hemos declarado  y como long int; recuerde que el n1mero más grande que puede guardar una variable del tipo int es A6.C6N.
rograma que desplaza un c:rculo por la pantalla. El c:rculo va desplazandose de izquierda a derecha y de derecha a izquierda tantas veces como le indica el usuario desde el teclado.
00
main') {
int  veces W; int  punt49; long  int  i;
clrscr'); printf '(7uantas veces se ha de mover el c:rculo ! (); scanf '(<d=>veces); antalla4Trá2ica');  for 'W%0; W % veces; W**)
{  for '9%5&;9%5M&;9%9*0&)
{ setcolor',UE); circle'9A&&5&); // Dibujarl círculo de color azul.  for  'i%&; y % KD&&&; i**); setcolor',87V); circle'9A&&5&); ++ Oibujar c:rculo de color negro.
}  for '9%5M&;9H%5&;9%9J0&)
} }
• Estructura repetitiva Mientras (While).
Supongamos que tenemos que hacer un programa que sume n1meros que se van entrando desde el teclado pero que en principio no se sabe la cantidad de n1meros que se van a entrar.
Utilizando el bucle 2or que ya conecemos podr:amos llegar a solucionarlo de la manera siguiente!
. n1mero % 0 ; ++ para entrar al bucle  for  ' ; n1mero H & ;)
X printf '(Entre un n1mero '& para acabar la serie) ! () ; scanf '(<d=>n1mero) ; suma % suma * n1mero ;
Y  printf '(,a suma de los valores entrados es ! () ; .
Es una 2orma rebuscada poco intuitiva y nada elegante. la mayor:a de lenguajes de  programaci/n de alto nivel 'por no decir todos) tienen una estructura repetitiva para controlar acciones repetitivas que en principio no se sabe cuantas veces se ha de ejecutar. Esta estructura es la estructura <ientras y la repetici/n de las sentencias esta controlada por  una o más condiciones. El programa anterior con esta estructura quedar:a as:!
Programa $ientras0 ;
Inicio Suma !% & ; Escribir'PEntreu un n1mero '& para acabar) P) ; Leer'#1mero) ;
 Mientras '#1mero H &) Hacer 
Inicio Suma !% Suma * #1mero ; Escribir'PEntre otro n1mero '& para acabar) ! P) ; Leer'#1mero) ;
Fin Fin.
7uando el programa llega a la sentencia  Mientras:
0. 7omprueba si se cumple la condici/n 'de la misma manera que un if )
6. Si la condici/n se cumple pasa a ejecutar las senténcias del cuerpo de bucle y se vuelve al  paso 0; si no se cumple la condici/n pasa a la l:nea siguiente 2uera del bucle.
Resumiendo! las sentencias del cuerpo del bucle se ,an e>ecutando <ientras se cumple la condicin.
0A
El programa anterior con lenguaje 7 seria!
Ginclude stdio.hH Ginclude conio.hH
int #1mero Suma ;
clrscr') ; Suma % & ; printf '(Entre un n1mero '& para acabar) ! () ; scanf '(<d=>#1mero) ;
while 'n1mero Z% &) {
}
}
Inicio Suma !% & ;  #1mero % A6 ;  Mientras '#1mero H &)
Inicio Escribir'PEntre un n1mero '& para acabar) ! P) ; Leer'#1mero) ; Suma !% Suma * #1mero ;
Fin; Fin.
El programa ser:a el mismo pero la soluci/n del problema es menos elegante. ?bserve que primero tiene que inicializar la variable #1mero a un valor di2erente de & 'A6 es arbitrario) para aseguar que se entra al bucle 'si la primera vez #1mero %& no se ejecuta ninguna sentencia del cuerpo del  bucle). -:jese también que el n1mero & también se suma en este programa no pasa nada 'Suma * & % suma) pero si en lugar de escoger & se hubiera escogido cualquier otro valor el programa tendr:a que controlar que este valor no se sumase. 3éa la soluci/n con las dos opciones si el programa acabara entrando un J0.
05
Inicio Suma !% & ; Escribir'PEntre un n1mero '& para acabar) P) ; Leer'#1mero) ;
 Mientras '#1mero HJ0) Inicio
Suma !% Suma * #umero ; Escribir'PEntre otro n1mero '& para acabar) ! P) ; Leer'#umero) ;
Fin Escribir'P,a suma de los valores entrados es ! Suma) ;
Fin.
Inicio Suma !% & ;  #umero % A6 ;  Mientras '#1mero H &)
Inicio Escribir'PEntre otro n1mero '& para acabar) ! P) ; Leer'#umero) ; Suma !% Suma * #umero ;
Fin Suma % Suma J0 ; Escribir'P,a suma de los valores entrados es ! P Suma) ;
Fin.
 
?bserve como en la segundo versi/n del programa se ha de ajustar el valor de la Suma'suma%sumaJ 0) al salir del bucle antes de mostrar el resultado.
-:jese bién como construye este tipo de estructuras para no llegar a soluciones tan poco elegantes y e2icientes como la segunda versi/n del programa. En este caso era un programa corto y no ten:a más  problema que unas l:neas de c/digo innecesárias cuando los programas son largos este tipo de chapuzas se arrastran durante un buen trozo de c/digo. Si quiere que sus programas tengan el aspecto indeseable de la versi/n 6 no haga análisi ahorrese los algoritmos y sobre todo comience a teclear inmediatamente el programa sin pensar en que soluci/n es la más adecuada para el  problema.
?tra soluci/n al problema ser:a! . . Suma !%& ;  #1mero !% A6 ;
 Mientras '#1mero H &) Inicio
Escribir'PEntre un n1mero 'J0 para acabar) () ; Leer'#1mero) ;  Si  '#1mero H J0)
Suma !% Suma * #1mero ; Fin ;
Escribir'P,a suma es ! PSuma) ; . .
 De hecho la solución que le hemos propuesto también es un poco chapuza !er" que en este tipo de problemas de introducción de series de !alores# se solucionan mejor  con la estructura repetiti!a Hacer .. Mientras do!!while".
ucles [hile con más de una condici/n.
Oe la misma manera que utilizábamos los operadores relacionales con la estructura if  cuando ten:amos que evaluar más de una condici/n a la vez los podemos utilizar con el bucle while.
rograma que entra caracteres por el teclado hasta que se pulsa la tecla E#"ER. El  programa ha de dejar entrar como má9imo 0& caracteres.
Programa $ientras ;
Variables ,etra ! caracter ;  #umletras !entero ;
Inicio Escribir 'PEntre letras para acabar pulse E#"ER P) ; Leer',etra) ;  #umletras !% 0  // $e cuenta el primer car"cter.  Mientras ',etra H E#"ER y #umletras 0&)  Hacer 
Inicio Leer',etra) ;  #umletras !% #umletras * 0 ;
Fin ; Fin.
• Recuerde que una e9presi/n con dos o más condiciones operadas con el operador 8#O es cierta si las dos condiciones lo son; as: el bucle dejará de repetirse cuando alguna de las dos condiciones 2alle.
0K
 
ara ver el 2uncionamiento del programa codi2iquelo en lenguage 7 y ejec1telo paso a paso. Ser:a una buena idea establecer un Fatch para la variable #umletras para ver como va evolucionando.
ara ver si se ha pulsado la tecla E7*ER  compare la variable letra con 0A '8S7 de E#"ER) o bién con PBrC.
rograma que introduzca caracteres hasta pulsar E#"ER. El programa ha de dejar entrar como má9imo 5 Pa.
Programa $ientras ;
Inicio
 #umde8s !% & ; Escribir'PEntre letras para acabar pulse E#"ER P) ; Leer',etra) ;  Si  ',etra % Pa) #ntonces
 #umde8s !% #umde8s * 0 ;
 Mientras ' ,etra H E#"ER y #umde8s 5 ) Hacer  Inicio
Leer ',etra) ;  Si  ' ,etra % Pa)  #umde8s !% #umde8s * 0 ;
Fin ; Fin.
7odi2ique el programa anterior en lenguaje 7.
rograma que desplaza un c:rculo por la pantalla. El c:rculo ha de ir rebotando por los cuatro lados de la pantalla. El programa acaba cuando se pulsa E#"ER.
Ginclude stdio.hH Ginclude conio.hH Ginclude graphics.hH
void  pantalla4gr\2ica'); main')
int  inc49%5inc4y%5; long int  i; char  tecla%&;
 pantalla4gra2ica'); while 'tecla Z% 0A)
{ setcolor',UE); circle'punt49punt4y5&);  for 'i%&;i%KD&&&;i**);  // %ucle de espera setcolor',87V); circle'punt49punt4y5&);
 punt49%punt49*inc49;  // &nc. coordenada ' 
0C
 
if  'punt49 H 5M&)  // $i ha llegado a límite derecho inc49 % J5;  // (an!iar dirección# inc de ) negati!o
if  'punt49 5&)  // $i ha llegado a límite izquierdo inc49 % 5;  // (ambiar dirección# incde ) positi!o
 punt4y%punt4y*inc4y;  // &nc. coordenada *  if  'punt4y H DA&)  // $i ha llegado a límite in+erior 
inc4y % J5;  // (an!iar dirección# inc. de y negati!o if  'punt4y 5&)  // $i ha llegado a límite superior 
inc4y % 5;  // (an!iar dirección# inc. y positi!o
tecla%getc3'); }
?bserve que en el programa anterior ha de ir pulsando una tecla para qué el c:rculo haga un movimiento esto es debido a la instrucci/n tecla% getc3') que se ha tenido que poner para controlar que el bucle pare cuando se pulse E#"ER. Si quiere que el c:rculo tenga un movimento cont:nuo sustituya la l:nie tecla % getche') por
if  '0b3it') % % 0) tecla%getc3e');
0b3it') es una 2unci/n que rastrea el bu22er de teclado 'zona de mem/ria donde se guardan las pulsaciones que se e2ectuan en el teclado) si detecta que se ha pulsado una tecla retorna un 0.
 Si  se ha pulsado una tecla "omar el carácter sobre variable tecla.
$odi2ique el programa anterior para que el c:rculo acelere; si se pulsa la tecla P* y es desacelere si se pulsa la tecla PJ. ,o 1nico que tiene que hacer es declarar una variable 'espera) para controlar el 2inal del bucle de espera.
long int  espera% KD&&&; .  for  'i%&; y % espera; i**);
Oespués ha de evaluar la tecla que se ha pulsado y incrementar o decrementar el valor de la variable espera. "inga en cuenta que la velocidad no puede sobrepassar KD&&& 'valor má9imo  para a una variable tipo long int) y tampoco puede ser menor que &.
 Si  se ha pulsado una tecla Inicio
7oger caracter sobre variable tecla;  Si  'tecla % P* y espera KD&&&)  #ntonces
espera % espera J 0&&&;  Si  'tecla % PJ y espera H &)  #ntonces
espera % espera * 0&&&; fin;
8nidar bucles $ientras '[hile).
Oe la misma manera que se encadenen bucles  for  también se pueden encadenar bucles while. 3ea el ejemplo siguiente
]aga un programa para sumar di2erentes series de n1meros. El programa ha de pedir  la cantidad de términos para la serie después ha de pedir los términos y sumarlos. El  programa acaba cuando el usuario introduce un & a la cantidad de términos para la serie.
Programa doble$ientras.
Inicio
Escribir'PEntre la cantidad de términos para a la serie ! P) ; Leer'#um"erminos) ;
 Mientras '#um"erminos H &) Hacer 
Inicio Escribir'P Entre término P7ontador "ermino ! ) ; Leer'"ermino) ; Suma !% Suma * "ermino ; 7ontador !% 7ontador * 0 ;
Fin; Escribir 'PEl valor de la suma és ! P Suma) ; Escribir'PEntre la cantidad de término para a la s^rie ! P) ; Leer '#um"ermes) ;
Fin ;
Fin.
7odi2ique el programa anterior con lenguaje 7. Ejec1teulo paso a paso. 8bra un Fatch y  ponga les variables 7ontador Suma y #umtérminos para observar como evolucionan.
_u^ pasaria si la sentencia 7ontador !% & estuviera 2uera del primer  Mientras en lugar de estar en la posici/n actual ` ruébelo.
Repita el programa anterior pero que al 2inal también muestre la suma de todos los n1meros.
Repita el programa anterior sustituyendo la estructura while del segundo bucle por una estructura $or .
0M
roblemas más 2recuentes con el bucle $ientras.
• Oe la misma manera que pasaba con el  for  poner punto y coma en la misma l:nea del  bucle. ?bserve un caso grave en programaci/n
i !%& ; <ientras ' i 0&) ;
.
Inicio Suma % Suma * # ; Leer'#) ;
Fin ; . .
ongamos por caso que cuando el programa llega a la sentencia Leer'#1mero) se entra un A. 7uando acabará el programa ` #unca. ?bserve que una vez el programa ha entrado en el cuerpo del bucle no hay ninguna sentencia que permita canviar el valor de la variable #1mero que es la que controla el bucle. En nuestro caso esta variable siempre valdrá A y por tanto la condici/n del bucle se cumplirá siempre.
• Si el programa queda atascado para este caso o alg1n otro puede probar de pulsar la combinaci/n %D7*RDL # P4S4 'reaW con teclado inglés) para pararlo ' algunas veces se ha de pulsar dos veces la combinaci/n y después E7*ER ). Si el problema  persiste apague el ordenador si no ha guardado el programa mala suerte.
• Estructura repetitiva Hacer.. Mientras.
Esta estructura es muy parecida a la estructura  Mientras la 1nica di2eréncia es que en el  bucle  Hacer .. Mientras la evaluaci/n de la condici/n se hace al 2inal es decir después de haberse ejecutado el cuerpo del bucle almenos una vez. ?bserve el programa de introducir  n1meros hasta pulsar & y compare las dos 2ormas de hacerlo!
6&
Inicio Suma !% & ; Escribir'PEntre un n1mero '& para acabar) P) ; Leer'#umero) ;
 Mientras '#umero H &) Hacer  Inicio
Suma !% Suma * #1mero ; Escribir'PEntre otro n1mero '& para acabar) ! P) ; Leer'#umero) ;
Fin Fin.
Inicio Suma !% & ;
 Hacer  Suma !% Suma * #1mero ; Escribir'PEntre otro n1mero '& para acabar) ! P) ; Leer'#umero) ;
 Mientras 'i H &) ; Fin.
 
• En estructuras repetitivas que requieren la ejecuci/n de les instrucciones del cuerpo de bucle almenos una vez es mejor utilizar la estructura ]acer..$ientras.
Estructura general del bucle Hacer .. Mientras.
El bucle Hacer .. Mientras implementado con lenguaje 7 siempre lleva llaves de apertura y cierre. ?bserve también que la l:nea while acaba siempre con un punto y coma.
60
.
El programa introducir n1meros hasta pulsar & con el bucle do..while.
Ginclude stdio.hH Ginclude conio.hH
{ printf '(Entre un n1mero ! () ; scanf '(<d=>#1mero) ; Suma % Suma * #1mero ;
} while '#umero Z% &) ;
}
Repita todos el ejemplos que se han visto con el bucle while utilizando la estructura do..while. ]a de hacer el algoritmo y el programa en 7.
• Cuando utilizar cada estructura.
• Utilice el bucle for  cuando sepa a priori el n1mero de veces que se ha de repetir un  proceso.
• Utilice el bucle while cuando no sepa a priori cuantas veces se ha de repetir un proceso.
• Utilice el bucle do..while cuando no sepa a priori cuántas veces se ha de repetir un  proceso pero que éste al menos se ha de ejecutar una vez.
• 7on el bucle while se pueden implementar todas las estructuras repetitivas. ]ay lenguajes que la 1nica estructura repetitiva que tienen es esta.
66