Para el programa del Adivinador que les fue solicitado en la Lección 8 ¿Qué conviene más utilizar? ¿WHILE o REPEAT?
Yo les diría que REPEAT, porque saben que el usuario intentará adivinar al menos una vez pudiendo adivinar o no. Si adivina, pues genial, si no adivina se seguirá repitiendo.
Con WHILE ustedes estarán obligados a hacer que las condiciones sean falsas para que entre en el bloque al menos una vez.
Centinela:
Veremos ahora, aunque sin usar REPEAT un ejemplo de iteración por centinela. Un centinela es un valor que tomará nuestra variable para indicar el fin de la iteración, algo así como una bandera booleana, pero aplicado a otras variables. Veámoslo para comprenderlo mejor. El siguiente programa irá leyendo de la entrada estándar una serie de números enteros positivos y realizando su suma hasta que se ingrese un negativo. En ese caso ya no se leerán más números y luego se mostrará la suma de todos los números ingresados (excepto el negativo):
Código Pascal:
Ver original
PROGRAM centinela; Var numero, suma : integer; BEGIN (* lectura inicial *) ReadLn(numero); (* inicialización *) suma:= 0; WHILE numero > 0 DO Begin (* acumulación *) suma:= suma + numero; (* siguiente lectura *) ReadLn(numero); End; (* mostrar resultado *) WriteLn('La suma de los números es: ', suma); END.
Bien, en la línea 8 leemos el primer valor que debemos sumar. En la línea 10 inicializamos la variable suma con el valor 0 ya que aún no ha sumado nada.
En la línea 13 comienza el WHILE solo si el número que ingresamos es mayor que 0, en caso contrario no se ejecutará. Aquí vemos por qué es mejor utilizar un WHILE que un REPEAT, ya que si el usuario ingresa como primer valor un número negativo ya no habrá nada para sumar.
En caso de entrar en el WHILE aumentamos el valor de la variable suma sumando su valor anterior al valor del número leído, o sea, al valor de numero. En la línea 18 volvemos a leer un número y el WHILE volverá a su encabezado. Si el nuevo número leído es menor que 0 ya no habrá iteración y en caso contrario sí.
Luego de haber salido del WHILE mostramos al usuario el resultado de la suma.
Bien, esto era para mostrar la idea de centinela. En este caso nuestro centinela es cualquier número negativo ingresado por el usuario ya que éste será el que detenga la iteración del WHILE. Veremos muchos más ejemplos de centinelas de aquí en adelante.
Ejercicio: Si han hecho el programa del Adivinador con WHILE, ahora háganlo con REPEAT.
Un ejemplo más complejo: Contador de palabras:
Ahora veremos un ejemplo de programa que cuente la cantidad de palabras en una línea de texto que será ingresada por el usuario. Dicho texto debe terminar con un espacio y un punto sí o sí (centinelas).
¿Cómo funcionará el programa? Leeremos todo caracter a caracter, nada de usar Strings. Consideraremos palabra todo aquello que no es un espacio, por lo tanto, letras sueltas también son palabras.
Como en primera instancia el usuario puede escribir un texto que comience con espacios en blanco, usaremos un REPEAT para ir leyendo todos esos espacios hasta encontrar otra cosa.
Luego de eso entraremos en un bucle principal dominado por un WHILE, esto es porque nuestro centinela es el punto (.) y puede suceder que el usuario ingrese un punto como inicio del texto o un punto luego de los espacios iniciales; en cualquiera de esos casos WHILE no entrará en su código.
Mientras no encontremos ese punto (.), leeremos los caracteres hasta hallar un nuevo espacio con lo cual habremos consumido una palabra, luego volvemos a usar, dentro de WHILE esta vez, un REPEAT para consumir espacios en blanco ya que entre una palabra y otra el usuario puede poner varios espacios consecutivos:
Código Pascal:
Ver original
PROGRAM cuenta_palabras; Const ESPACIO= ' '; FIN= '.'; Var caracter: char; //Caracter leído. cantidadPalabras: integer;//Cantidad de palabras contadas. BEGIN //Salteamos todos los espacios al inicio del texto. Repeat read(caracter) Until caracter <> ESPACIO; //En cada iteración consumiremos una palabra. While caracter <> FIN do begin //Leemos caracteres hasta encontrar un espacio. Repeat read(caracter); Until caracter = ESPACIO; //Aumentamos en 1 el contador. cantidadPalabras:= cantidadPalabras + 1; //Salteamos los espacios que separan las palabras. Repeat read(caracter) Until caracter <> ESPACIO; end; //Del While. writeln('La cantidad de palabras en el texto es: ',cantidadPalabras); END.
Les dejaré como tarea que estudien este código hasta que lo entiendan completamente. Fíjense como implementamos distintos REAPEAT dentro de un WHILE y como usamos el procedimiento READ para siempre ir leyendo sobre la misma línea. No olviden las constantes declaradas al inicio del programa. Los comentarios son su gran guía y eso es algo muy importante para un programador. Si deben trabajar con el código de su compañero de trabajo deberán ser capaces de entender sus códigos basados en que saben la tarea que desempeña su programa, las variables que declaro tienen nombres mnemotécnicos y sus comentarios indican bien cada acción aunque sin extenderse o abusar de ellos. Todo esto es realmente muy importante que aprendan a implementarlo.
Por si alguno de ustedes no lo sabe, un nombre mnemotécnico es aquel que ayuda a saber el propósito de una variable, por ejemplo, en este programa la variable que guarda el valor de cuantas palabras se cuentan se llama cantidadPalabras. Bien podía haberse llamado cont que es una abreviación de contador o podría haber tenido cualquier otro nombre. Usen nombres mnemotécnicos aunque sean largos, esto ayuda a prescindir un poco de los comentarios y a que el código sea más entendible.
Continuamos en la parte c.