Curso de Cobol y PowerCobol

¿Cómo utilizar PERFORM UNTIL con BEFORE y AFTER?

Capítulo 43: El bucle PERFORM UNTIL WITH TEST BEFORE y AFTER

Seguimos con los PERFORM de COBOL. En esta ocasión veremos las opciones WITH TEST BEFORE y WITH TEST AFTER de COBOL.

¿Qué es el bucle PERFORM UNTIL de COBOL?

Su nombre ya nos da pistas. UNTIL en español, es hasta. Pues bien, es algo así como decirle a COBOL, ejecuta cierto párrafo hasta que...

Metalenguaje de PERFORM UNTIL

Metalenguaje de PERFORM UNTIL de COBOL

PERFORM UNTIL es comparable a los bucles while y do while de otros lenguajes de programación. Gracias a las opciones BEFORE y AFTER, se puede hacer que el bucle se ejecute al menos una vez aunque no se cumpla nunca su condición o no, ambas opciones son posibles.

PERFORM UNTIL BEFORE

Construyamos un bucle equivalente a un while, el cual, se va a comprobar su condición antes de ser ejecutado. De ahí viene lo de BEFORE (antes en español).

Voy a poner un ACCEPT con el que poder probar el PERFORM UNTIL

⁠⁠       IDENTIFICATION DIVISION.
       PROGRAM-ID. Capitulo43.

       DATA DIVISION.
       FILE SECTION.
       WORKING-STORAGE SECTION.
       77  Numero PIC 99 VALUE ZEROS.

       PROCEDURE DIVISION.

       ObtenerNumero.
       DISPLAY "Introducir número:"
       ACCEPT Numero.
       PERFORM MuestraNumero WITH TEST BEFORE
       UNTIL Numero = 10.
       STOP RUN.

       MuestraNumero.
       DISPLAY Numero.
       ADD 1 TO Numero.
       
       END PROGRAM Capitulo43.

Introduzco un 3 en la consola y este es el resultado:

Introducir número:
3
03
04
05
06
07
08
09

Gracias a TEST BEFORE, le he indicado que compruebe la condición antes de ejecutar el bucle. Si se cumple, lo ejecuta. En las siguientes ejecuciones, irá comprobando antes de ejecutarse una y otra vez hasta que no se cumpla la condición.

Esto está funcionando como el bucle while de otros lenguajes de programación.

Quizás no entiendas porqué se imprime hasta el 09 en la consola, si le hemos indicado hasta Numero = 10. Eso es por el flujo de ejecución.

Pongamos un ejemplo, Numero vale 7.

En el párrafo MuestraNumero tenemos el DISPLAY antes del incremento. Se comprueba el valor de Numero. Vale 7, por lo tanto se ejecuta MuestraNumero. Se imprime el 7 y luego, se le suma 1 al valor. Ahora, cuando el bucle comprueba el valor de Numero este ya vale 8. Entonces, se ejecuta de nuevo y se imprime el 8. Se incrementa a 9. Se ejecuta de nuevo. Se imprime el 9 y al incrementar, Numero vale 10, por eso, cuando lo compruebe, ya va a valer 10 y no se cumplirá la condición, por eso no se imprime el 10, pero llegar, llega hasta el 10. Lo podemos comprobar poniendo un DISPLAY antes del STOP RUN.

⁠⁠       IDENTIFICATION DIVISION.
       PROGRAM-ID. Capitulo43.

       DATA DIVISION.
       FILE SECTION.
       WORKING-STORAGE SECTION.
       77  Numero PIC 99 VALUE ZEROS.

       PROCEDURE DIVISION.

       ObtenerNumero.
       DISPLAY "Introducir número:"
       ACCEPT Numero.
       PERFORM MuestraNumero WITH TEST BEFORE
       UNTIL Numero = 10.
       DISPLAY Numero.
       STOP RUN.

       MuestraNumero.
       DISPLAY Numero.
       ADD 1 TO Numero.
       
       END PROGRAM Capitulo43.

Ten en cuenta, que el 10 ahora se muestra por el DISPLAY de la línea 16, no es el bucle el que lo muestra.

Introducir número:
7
07
08
09
10

De hecho, podemos borrar esa línea 16 y modificar el flujo de ejecución del párrafo MuestraNumero. Ponemos el incremento antes del DISPLAY.

⁠⁠       IDENTIFICATION DIVISION.
       PROGRAM-ID. Capitulo43.

       DATA DIVISION.
       FILE SECTION.
       WORKING-STORAGE SECTION.
       77  Numero PIC 99 VALUE ZEROS.

       PROCEDURE DIVISION.

       ObtenerNumero.
       DISPLAY "Introducir número:"
       ACCEPT Numero.
       PERFORM MuestraNumero WITH TEST BEFORE
       UNTIL Numero = 10.
       STOP RUN.

       MuestraNumero.
       ADD 1 TO Numero.
       DISPLAY Numero.
       
       END PROGRAM Capitulo43.
Introducir número:
7
07
08
09
10

PERFORM UNTIL AFTER

Con TEST AFTER podremos conseguir todo lo contrario. Primero ejecutará la vuelta del bucle y después comprobará si se cumple la condición. Eso significa que es como el bucle do while de otros lenguajes de programación. Así pues, aunque nunca se cumpla la condición, se ejecutará si o si una vez.

Tendremos el código así, vamos a cambiar el igual por el mayor qué:

⁠⁠       IDENTIFICATION DIVISION.
       PROGRAM-ID. Capitulo43.

       DATA DIVISION.
       FILE SECTION.
       WORKING-STORAGE SECTION.
       77  Numero PIC 99 VALUE ZEROS.

       PROCEDURE DIVISION.

       ObtenerNumero.
       DISPLAY "Introducir número:"
       ACCEPT Numero.
       PERFORM MuestraNumero WITH TEST AFTER
       UNTIL Numero > 10.
       STOP RUN.

       MuestraNumero.
       DISPLAY Numero.
       ADD 1 TO Numero.
       
       END PROGRAM Capitulo43.

Si pones un número como por ejemplo, el 8, se va a ejecutar igual que hacía el BEFORE. Esta vez, pongamos en la consola un número mayor que 10, que no se cumpla la condición. Por ejemplo, el valor 15.

Podemos ver, que al hacer la comprobación después (after), se ejecuta una vez.

Introducir número:
15
15

¿Para qué puede servir AFTER?

AFTER, por si no conoces el concepto de bucle do while, nos permite hacer que se ejecute un bloque de código al menos 1 vez. Supongamos que el programa depende de que se ejecute un párrafo al menos una vez. En este caso, aunque el usuario introduzca algún valor inesperado que no cumpla con la condición del bucle, se ejecutará una vez, lo que evitará que el programa entre en error.

Si probamos esto con TEST BEFORE, no se ejecuta MuestraNumero ni una sola vez.

⁠⁠       IDENTIFICATION DIVISION.
       PROGRAM-ID. Capitulo43.

       DATA DIVISION.
       FILE SECTION.
       WORKING-STORAGE SECTION.
       77  Numero PIC 99 VALUE ZEROS.

       PROCEDURE DIVISION.

       ObtenerNumero.
       DISPLAY "Introducir número:"
       ACCEPT Numero.
       PERFORM MuestraNumero WITH TEST BEFORE
       UNTIL Numero > 10.
       STOP RUN.

       MuestraNumero.
       DISPLAY Numero.
       ADD 1 TO Numero.
       
       END PROGRAM Capitulo43.
Introducir número:
15
Si no indicas TEST BEFORE o TEST AFTER con PERFORM UNTIL, por defecto, se trata como si pusiéramos un TEST BEFORE.
PERFORM MuestraNumero UNTIL Numero > 10.

Comentarios

Si te quedan dudas sobre el temario, sobre Cobol, o cualquier otra cosa relacionada o simplemente quieres agradecer, aquí tienes tu sitio para dejar tu granito de arena. Gracias por tus comentarios y por darle vida a este sitio web.

Programación Fácil YouTube

Suscríbete

Si te ha gustado este curso y crees que el trabajo merece la pena, te agradeceré eternamente que te suscribas a mi canal de YouTube para apoyarme y que pueda seguir haciendo cursos gratuitos.

Además, si te encanta la programación, tienes un montón más de cursos gratuitos para ver.

No solo eso, podrás participar enviándome comentarios con tus sugerencias para temas específicos o cursos completos o incluso las dudas que tengas y las intentaré ir resolviendo en los cursos que estén todavía abiertos.