Dado que la Lección 9 no fue en sí una lección propiamente dicha ya que lo único que hice fue enseñarles a usar una herramienta del compilador, hago rápidamente la entrega de la Lección 10.
La sentencia REPEAT funciona igual que WHILE y sirve para lo mismo, entonces ¿cuál es la diferencia? Escencialmente WHILE repite algo mientras una condición es verdadera, en contraparte REPEAT lo hace hasta que la condición sea verdadera, o sea, mientras la condición es falsa.
¿Qué ventaja tiene esto? Uno tiende a preguntarse a veces para qué sirve REPEAT ya que, si se repite mientras una condición es falsa podríamos simplemente utilizar WHILE con el operador NOT en su condición y listo. Sin embargo esto no es tan sencillo.
Otra diferencia es que WHILE verifica su condición antes de entrar en su bloque de instrucciones, REPEAT lo hace al final. ¿Qué significa esto? Veamos un código simple hecho con WHILE:
Este programa hará aumentar una variable desde 0 hasta 10 mostrando su valor en pantalla y terminará cuando eso suceda:
Código Pascal:
Ver original
PROGRAM WhileVSRpeat; VAR i: INTEGER; BEGIN i:= 0; //Inicializamos la variable en 0. WHILE i<10 DO Begin i:= i+1; //Aumentamos el valor de i en 1. Write(i,' '); //Imprimimos el valor de i y un espacio de separación. End; ReadLn; END.
Como podrán observar este es un programa bien sencillo. Mientras i sea menor que 10 se repetirá el bloque dentro del WHILE. Cuando i valga 10 el WHILE verificará eso y pues no entrará en su bloque y la iteración terminará.
Ahora veamos exactamente el mismo programa en su versión con REPEAT. Esto servirá también para ver la sintaxis de esta nueva sentencia:
Código Pascal:
Este programa hace exactamente lo mismo, solo que ahora en vez de repetirse mientras i<10, se repite hasta que i=10. Como ven, la condición del WHILE es opuesta a la de REPEAT y viceversa.Ver original
PROGRAM WhileVSRpeat2; VAR i: INTEGER; BEGIN i:= 0; //Inicializamos la variable en 0. REPEAT i:= i+1; //Aumentamos el valor de i en 1. Write(i,' '); //Imprimimos el valor de i y un espacio de separación. UNTIL i=10;; ReadLn; END.
Dado este ejemplo pueden observar que si hay que repetir más de una instrucción (en este caso eran solo dos), en un WHILE hay que utilizar BEGIN y END para delimitar su bloque, pero REPEAT no lleva esta delimitación ya que se limita por sí mismo entre REPEAT y UNTIL. De este modo, mientras la sintaxis genérica de un WHILE es
Código Pascal:
Ver original
WHILE condicion_es_verdadera DO Begin Instrucción1; Instrucción2; . . . InstrucciónN; End;[/code] la de un REPEAT es [code]REPEAT Instrucción1; Instrucción2; . . . InstrucciónN; UNTIL condicion_sea_falsa;
Con WHILE... DO queríamos decir "Mientras... Haz", con REPEAT... UNTIL estamos diciendo "Repite... Hasta que".
Como ya dije, WHILE verifica su condición antes de entrar en su bloque de instrucciones, por lo tanto podría suceder que a la primera la condición fuera FALSE con lo cual WHILE no entraría nunca en su código y no se ejecutaría nunca. REPEAT verifica su condición al final, por lo tanto, sabemos siempre que esta sentencia se ejecutará al menos una vez, ya que entrará en su código, hará lo que tenga que hacer, y luego mirará la condición.
Esto es lo que nos marca la diferencia esencial entre una sentencia y la otra. La gente tiende a preguntarse cuándo usar REPEAT y cuando usar WHILE. Pues bien, la respuesta es:
Cuando sé que una lista de instrucciones debe ejecutarse al menos una vez como mínimo, entonces uso REPEAT. Si sabemos que es admisible que la lista de instrucciones pueda NO ejecutarse nunca, entonces usamos WHILE.
¿Es correcto o incorrecto no discriminar estos casos? Pues si el programa hace lo que tiene que hacer, podríamos decir que cada uno puede usar la sentencia con la que mejor se lleve, sin embargo, hacerlo como he descrito ayuda a una mayor legibilidad del código fuente ya que al ver un REPEAT sabemos que lo que sea que este haga debe hacerse al menos una vez.
Ejemplo: Veamos un programa en el que se le pedirá al usuario ingresar un número entero. Si este número es menor que 20, iteraremos hasta dejarlo en 20, mostrando siempre los números en pantalla:
Versión WHILE:
Código Pascal:
Ver original
PROGRAM WhileVSRepeat3; VAR num: INTEGER; BEGIN Write('Ingresa un número entero: '); ReadLn(num); WHILE num<20 DO Begin num:= num + 1; Write(num,' '); End; ReadLn; END.
Como ven, en este programa, si el usuario ingresa de entrada un número mayor o igual que 20 el WHILE no se ejecutará en absoluto, en caso contrario sí lo hará y se repetirá tantas veces como sea necesario.
Versión REPEAT:
Código Pascal:
Ver original
PROGRAM WhileVSRepeat4; VAR num: INTEGER; BEGIN Write('Ingresa un número entero: '); ReadLn(num); REPEAT num:= num + 1; Write(num,' '); UNTIL num>=20; ReadLn; END.
¿Cuál es la diferencia entre este programa y el anterior? Pues si en el anterior programa el usuario ingresaba el número 20 el WHILE no se ejecutaba y la variable no aumentaba su valor. En este programa, aunque REPEAT se repetirá hasta que la variable valga 20, si el usuario ingresa justo ese número el bloque del REPEAT se ejecutará igual porque esta sentencia verificará el valor de num justo al final de su bloque. Incluso se ejecutará aunque el usuario ingrese un número más alto que 20 ¿comprenden?
Continuamos en la parte b.