Declaraciones de bucle en COBOL

Cada lenguaje de programación no solo tiene una construcción de selección sino también una que implica iteración.

Con esta construcción, es posible que un bloque de código se ejecute repetidamente. De hecho, el propio programador puede codificarlo seleccionando un tipo específico de bucle. 

Hablando de tipos de bucles, los lenguajes de programación modernos ofrecen bucles for y while, mientras que otros proporcionan una construcción repetida. Mientras que el primero se ejecuta durante un cierto número de veces según lo especificado por el programador, el segundo puede ejecutarse indefinidamente si no se cumple la condición establecida. Aquí está el bucle ‘for’ de Python 3:

Python3

for i in range(0,5,1):
    print(i)

Como puede ver, los números del 0 al 4 se imprimen con este bucle for, como se muestra en el siguiente resultado:

0
1
2
3
4

Ahora, veamos el bucle ‘while’ en Java:

Java

int x = 0;
while (x < 5) {
System.out.println(x);
x++;
}

Obtienes el mismo resultado con este ciclo while en Java también, como se muestra en el siguiente resultado:

0
1
2
3
4

Tan simples como son estas construcciones iterativas, COBOL también proporciona dichas construcciones de bucle. Incluso si la sintaxis puede parecer muy diferente de los ejemplos que se muestran arriba.

Declaraciones de bucle en COBOL:

En pocas palabras, los bucles en COBOL se realizan utilizando el verbo PERFORM pero tiene otras funciones que vale la pena mencionar aquí.

En su forma más simple, PERFORM simplemente transfiere el control a un bloque de código que se ejecutará solo una vez. Esto podría ser un párrafo o una sección. Alternativamente, podría ejecutar varios bloques de código contenidos en varios párrafos consecutivos utilizando la construcción PERFORM THRU.

En cuanto a las construcciones de iteración que son el foco de esta discusión, puede usar el verbo PERFORM para ejecutar un bloque de código, un número determinado de veces usando el ciclo PERFORM TIMES.

También puede configurar el verbo PERFORM para ejecutar bloques de código hasta que se cumpla una condición particular usando el bucle PERFORM UNTIL.

Por último, el bucle PERFORM VARYING funciona un cierto número de veces y depende de los valores FROM BY que utilicemos.

Comencemos con la sintaxis de la instrucción PERFORM simple.

La declaración PERFORM simple:

Como se mencionó anteriormente, la declaración PERFORM ejecutará un bloque de código solo una vez en su forma más simple. Para este ejemplo, hemos utilizado la declaración PERFORM para ejecutar el código dentro de los párrafos AddTwoNumbers y SubtractTwoNumbers.

Cobol

IDENTIFICATION DIVISION.
       PROGRAM-ID. ADD-SUBTRACT-NUMBERS.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
           01 my-var PIC 99 VALUE 12.
           01 my-var2 PIC 99 VALUE 23.
           01 resultAdd PIC 999.
           01 resultSub PIC 99.
       PROCEDURE DIVISION.
       MAIN-PROCEDURE.
           PERFORM AddTwoNumbers
           PERFORM SubtractTwoNumbers
           PERFORM DisplayResult
           STOP RUN.
       AddTwoNumbers.
           COMPUTE resultAdd = my-var + my-var2.
       SubtractTwoNumbers.
           COMPUTE resultSub = my-var2 - my-var.
       DisplayResult.
           DISPLAY "Total: " resultAdd
           DISPLAY "Difference: " resultSub.
       END PROGRAM ADD-SUBTRACT-NUMBERS.

 Una vez que se completan los resultados de las operaciones, el párrafo DisplayResult luego imprime los resultados como se muestra a continuación:

Total: 035
Difference: 11

A continuación, veremos la sintaxis de la declaración PERFORM THRU y cómo difiere de usar la declaración PERFORM solo una vez.

La declaración PERFORM-THRU:

Cuando usamos la declaración PERFORM-THRU, el objetivo es ejecutar varios párrafos de una sola vez. Por supuesto, la declaración debe proporcionar el párrafo inicial y final, como se muestra en el siguiente código:

Cobol

IDENTIFICATION DIVISION.
       PROGRAM-ID. ADD-SUBTRACT-NUMBERS.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
           01 my-var PIC 99 VALUE 12.
           01 my-var2 PIC 99 VALUE 23.
           01 resultAdd PIC 999.
           01 resultSub PIC 99.
       PROCEDURE DIVISION.
       MAIN-PROCEDURE.
           PERFORM AddTwoNumbers THRU DisplayResult
           STOP RUN.
       AddTwoNumbers.
           COMPUTE resultAdd = my-var + my-var2.
       SubtractTwoNumbers.
           COMPUTE resultSub = my-var2 - my-var.
       DisplayResult.
           DISPLAY "Total: " resultAdd
           DISPLAY "Difference: " resultSub.
       END PROGRAM ADD-SUBTRACT-NUMBERS.

Como puede ver, la instrucción PERFORM anterior comienza ejecutando el código en AddTwoNumbers hasta que llega al párrafo DisplayResult. No se equivoque: sigue el orden natural de los párrafos de principio a fin.

No en vano, obtenemos el mismo resultado ya que usamos las mismas entradas:

Total: 035
Difference: 11

Esto nos lleva a la tercera forma en que se usa el verbo PERFORM en COBOL.

La declaración PERFORM TIMES

Esta declaración es la primera forma en COBOL por la cual podemos repetir un bloque de código tantas veces como elijamos. Como puede ver, podemos especificar la cantidad de veces, 3 veces, que el bloque de código debe ejecutarse, como se muestra a continuación:

Cobol

IDENTIFICATION DIVISION.
PROGRAM-ID. DISPLAY-HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
    01 my-var PIC X(6) VALUE "Hello!".
PROCEDURE DIVISION.
MAIN-PROCEDURE.
    PERFORM DisplayHello 3 TIMES
    STOP RUN.
DisplayHello.
    DISPLAY my-var.
END PROGRAM DISPLAY-HELLO.

Cuando ejecute el código, encontrará que la string «¡Hola!» se muestra tres veces, como se muestra a continuación. Eso es todo. Esto es todo lo que hay en la instrucción PERFORM TIMES.

Hello!
Hello!
Hello!

Por supuesto, la siguiente declaración PERFORM incluye una prueba previa o posterior para decidir si el ciclo debe terminar o no.

 La declaración REALIZAR HASTA:

Ahora, la declaración PERFORM UNTIL actúa como un ciclo while donde las declaraciones dentro del ciclo se ejecutan repetidamente hasta que se alcanza un valor. En otras palabras, el ciclo termina tan pronto como se alcanza un cierto valor o se cumple la condición:

Cobol

IDENTIFICATION DIVISION.
PROGRAM-ID. DISPLAY-NUMBERS.
DATA DIVISION.
WORKING-STORAGE SECTION.
    01 MyCounter PIC 9 VALUE 1.
PROCEDURE DIVISION.
MAIN-PROCEDURE.
    PERFORM DisplayNumbers UNTIL MyCounter > 5
    STOP RUN.
DisplayNumbers.
    DISPLAY MyCounter.
    COMPUTE MyCounter = MyCounter + 1.
END PROGRAM DISPLAY-NUMBERS.

En el ejemplo anterior, cuando el valor de MyCounter alcanza el valor de 6, el ciclo termina. Entonces, para la salida, lo que obtendrá es una lista de números del 1 al 5, como se muestra a continuación:

1
2
3
4
5

Además de esta instrucción, puede agregar las cláusulas WITH TEST BEFORE y WITH TEST AFTER antes de la palabra UNTIL. El primero actúa como un ciclo while normal y el segundo se asemeja a un ciclo do-while en los lenguajes modernos. Si debe saberlo, la cláusula WITH TEST BEFORE es la predeterminada y no es necesario indicarla explícitamente.

Dicho esto, veamos a continuación la sentencia PERFORM VARYING.

La sentencia PERFORM VARYING:

La sentencia PERFORM VARYING es a lo que los lenguajes modernos se refieren como un bucle for. Como sabes, un bucle for generalmente tiene un valor inicial y final. Con cada iteración, el valor se incrementa en un cierto número hasta que alcanza el valor final. Como puede ver a continuación, la declaración PERFORM VARYING intenta hacer exactamente eso:

Cobol

IDENTIFICATION DIVISION.
PROGRAM-ID. DISPLAY-NUMBERS.
DATA DIVISION.
WORKING-STORAGE SECTION.
    01 MyCounter PIC 9 VALUE 1.
PROCEDURE DIVISION.
MAIN-PROCEDURE.
    PERFORM DisplayNumbers VARYING MyCounter FROM 1 BY 1 
    UNTIL MyCounter > 5
    STOP RUN.
DisplayNumbers.
    DISPLAY MyCounter. 
END PROGRAM DISPLAY-NUMBERS.

El valor de MyCounter comienza en 1 y se incrementa en 1 hasta que alcanza un valor mayor que 5. Por lo tanto, su salida muestra todos los números del 1 al 5, como se muestra a continuación:

1
2
3
4
5

Como puede ver, esta declaración es similar a la declaración PERFORM TIMES pero no requiere que actualicemos el valor de MyCounter .

Finalmente, veremos la declaración GO TO y cómo se usa en COBOL.

La declaración IR A:

Hay una buena razón por la que la declaración GO TO ha recibido muchas críticas en los últimos 50 años. Fue el famoso científico informático holandés Djikstra quien lideró el debate sobre si realmente vale la pena usar esta declaración cuando se trata del flujo de control del programa. Echa un vistazo a este ejemplo a continuación:

Cobol

IDENTIFICATION DIVISION.
PROGRAM-ID. DISPLAY-HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
    01 Greeting PIC A(5) VALUE "Hello".
PROCEDURE DIVISION.
MAIN-PROCEDURE.
    PERFORM DisplayHello
    STOP RUN.
DisplayHello.
    DISPLAY Greeting
    GO TO DisplayHello.    
END PROGRAM DISPLAY-HELLO.

El programa queda atrapado en un bucle sin fin debido a la declaración GO TO mal ubicada en el párrafo DisplayHello y donde la salida muestra «¡Hola!» un número infinito de veces. Debe evitarse a toda costa esta instrucción GO TO incondicional.

Por supuesto, si es absolutamente necesario usar una declaración GO TO, use una que sea condicional. Aquí hay un ejemplo de tal instrucción GO TO:

Cobol

IDENTIFICATION DIVISION.
PROGRAM-ID. DISPLAY-HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
    01 Greeting PIC A(5) VALUE "Hello".
    01 Answer PIC A(1) VALUE "N".
PROCEDURE DIVISION.
MAIN-PROCEDURE.
    PERFORM DisplayHello
    STOP RUN.
DisplayHello.
    DISPLAY Greeting
    DISPLAY "Terminate Greeting? (Y/N): "
    ACCEPT Answer
    IF Answer = "N"
        GO TO DisplayHello.
END PROGRAM DISPLAY-HELLO.

Como puede ver, puede terminar este ciclo creado por la declaración GO TO si cambia el valor de Respuesta a «Y» por entrada, como se muestra en el resultado a continuación:

Sin embargo, la mayoría de los expertos piensan que es mejor evitar las declaraciones GO TO por completo y, en el caso de COBOL, es mejor usar el verbo PERFORM para bucles.

Conclusión:

Ahora que hemos cubierto los bucles en COBOL, no debería ser difícil notar que el lenguaje tiene opciones para los populares bucles de repetición, while, for y do-while que vemos en los lenguajes modernos. Esto se logra usando el todopoderoso verbo PERFORM. Alternativamente, el verbo GO TO no se usa mucho debido a los problemas que surgen cuando se usa sin una condición.

Entonces, ¿hay algo más que le gustaría agregar cuando se trata de bucles en COBOL? Por favor, siéntase libre de compartir sus pensamientos en la sección de comentarios a continuación.

Publicación traducida automáticamente

Artículo escrito por justdan40 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *