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.
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