Ir al contenido principal

COBOL para principiantes #7

Continuamos con esta serie de entregas sobre el lenguaje COBOL.

En esta ocasión veremos:

  • Ejemplos del uso del verbo ``PERFORM``.
  • Ejemplos de uso de sentencias ``GO TO``.
  • Ejemplos de campos empacados.
  • Ejemplos del uso de los verbos ``MOVE``, ``ADD``, ``SUBTRACT``, etc.
  • Ejemplos del uso de ``COMPUTE``.

PERFORM

Una instrucción que nos permite transferir el control a otro u otros procedimientos o bien realizar una serie de sentencias dentro de ella misma mientras se cumplan las condiciones que le hayamos indicado. Permite retornar a la línea inmediata, contrario a la instrucción```GOT TO``.

parrafos.cbl

IDENTIFICATION DIVISION.
PROGRAM-ID. PARRAFOS.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-N1 PIC 9(3) VALUE 5.
   01 WS-N2 PIC 9(4) VALUE 7.
   01 WS-N3 PIC 9(4) VALUE 8.
   01 WS-NA PIC 9(3) VALUE 80.
   01 WS-NB PIC 9(3) VALUE 20.
   01 WS-NC PIC 9(3).

PROCEDURE DIVISION.
   INICIO.
     PERFORM PRESENTACION.
     PERFORM CALCULAR.
     PERFORM RESULTADO.
   
   CALCULAR.
     COMPUTE WS-NC= (WS-N1 * WS-N2) - (WS-NA / WS-NB) + WS-N3.
   
   PRESENTACION.
     DISPLAY "[  USO DE SENTENCIA PERFORM ]".
   
   RESULTADO.
   DISPLAY "WS-NUM1     : " WS-N1
   DISPLAY "WS-NUM2     : " WS-N2
   DISPLAY "WS-NUM3     : " WS-N3
   DISPLAY "WS-NUMA     : " WS-NA
   DISPLAY "WS-NUMB     : " WS-NB
   DISPLAY "RESULTADO DE LA OPERACION     : " WS-NC
   STOP RUN.

El programa contiene 4 párrafos:

  • INICIO, que es el inicio del programa y donde se colocan las instrucciones ``PERFORM`` para ir a determinado párrafo.
  • PRESENTACION, párrafo donde se muestra el mensaje de inicio o presentación del programa.
  • CALCULAR, párrafo donde se llevan a cabo las operaciones.
  • RESULTADO, párrafo donde se muestran los resultados de las operaciones.

PERFORM se clasifica principalmente en dos tipos:

  • PERFORM en línea. 
  • PERFORM fuera de línea.

En línea:

PERFORM
  DISPLAY 'PROGRAMANDO EN COBOL!!'
END-PERFORM.

Fuera de línea:

PERFORM MAIN-PROCESS
   THRU PROCESS-EXIT.

PERFORM UNTIL y PERFORM VARIYING

Ambas instrucciones nos servirán para crear bucles.

parrafosthree.cbl

      ******************************************************************
      * Author: ALQUIMISTA DE CODIGO.
      * Date:   09/06/2024.
      * Purpose:  How to use PERFORM UNTIL.
      * Tectonics: cbl
      ******************************************************************
       IDENTIFICATION DIVISION.
       PROGRAM-ID. PARRAFOSTHREE.
       AUTHOR. ALQUIMISTA DE CODIGO.
       DATA DIVISION.
       FILE SECTION.
       WORKING-STORAGE SECTION.
       01 NUMERO PIC 999.
       PROCEDURE DIVISION.
       
       MAIN-PROCEDURE.
           INICIO.
               PERFORM PRESENTACION.
               PERFORM OPERACION UNTIL NUMERO = 10.
               DISPLAY "Hecho!!"
               STOP RUN.
           OPERACION.
               ADD 1 TO NUMERO.
               DISPLAY "NUMERO: "NUMERO.
           PRESENTACION.
               DISPLAY "[ USO DE PERFORM UNTIL ]".
            
            
       END PROGRAM PARRAFOSTHREE.

En este caso, se va a hacer un ``PERFORM`` todas las veces que sea necesarias hasta que la variable NUMERO valga 10.

parrafosfour.cbl

      ******************************************************************
      * Author: ALQUIMISTA DE CODIGO.
      * Date:   05/02/2024.
      * Purpose:  How to use PERFORM VARYING.
      * Tectonics: cbl
      ******************************************************************
       IDENTIFICATION DIVISION.
       PROGRAM-ID. PARRAFOSFOUR.
       AUTHOR. ALQUIMISTA DE CODIGO.
       DATA DIVISION.
       FILE SECTION.
       WORKING-STORAGE SECTION.
       01 NUM PIC 999.
       PROCEDURE DIVISION.

       MAIN-PROCEDURE.
           INICIO.
           PERFORM PRESENTACION.
           PERFORM OPERACION VARYING NUM FROM 10 BY 2 UNTIL NUM > 25.
               DISPLAY "Hecho!!"
               STOP RUN.
           OPERACION.
               ADD 1 TO NUM.
               DISPLAY "NUMERO: "NUM.
           PRESENTACION.
               DISPLAY "[ USO DE PERFORM VARYING ]".


       END PROGRAM PARRAFOSFOUR.

Similar al ``PERFORM UNTIL``, pero más controlado. Ambos para crear bucles en nuestros programas.

Aquí otro ejemplo del uso de ``PERFORM UNTIL``

parrafountil.cbl

      ******************************************************************
      * Author: ALQUIMISTA DE CODIGO
      * Date:   2024/06/09
      * Purpose: How to use PERFORM UNTIL
      * Tectonics: cbl
      ******************************************************************
       IDENTIFICATION DIVISION.
       PROGRAM-ID. PARRAFOUNTIL.
       DATA DIVISION.
       FILE SECTION.
       WORKING-STORAGE SECTION.
       01 CONTEO PICTURE 9(2) VALUE 1.
       PROCEDURE DIVISION.
       MAIN-PROCEDURE.
            
            INICIO.
                PERFORM PRESENTACION.
                PERFORM CALCULO.
                PERFORM TERMINAR.
            
            TERMINAR.
              DISPLAY "Hecho!!".
              STOP RUN.
              
           PRESENTACION.
               DISPLAY "[  USO DE PERFORM UNTIL ]".
               
           CALCULO.
               PERFORM UNTIL CONTEO > 10
                 DISPLAY CONTEO
                 ADD 1 TO CONTEO
               END-PERFORM.
            
       END PROGRAM PARRAFOUNTIL.

En este caso el ``PERFORM`` es de tipo en línea.

GO TO

Transfiere el control de una parte de la División de Procedimientos a otra. Al contrario de ```PERFORM`` no retorna a la línea inmediata, no vuelve hacia atrás.

usego.cbl

      ******************************************************************
      * Author: ALQUIMISTA DE CODIGO
      * Date:  2024-06-08
      * Purpose: How to use GOTO sentence
      * Tectonics: cobc
      ******************************************************************
       IDENTIFICATION DIVISION.
       PROGRAM-ID. USE-GO.
       DATA DIVISION.
       FILE SECTION.
       WORKING-STORAGE SECTION.
       01 RESPUESTA PIC X.
       PROCEDURE DIVISION.

       MAIN-PROCEDURE.
           PERFORM EJECUTAR.
           IF RESPUESTA = "S" OR RESPUESTA = "s"
               GO TO FIN-PROGRAMA.
           IF RESPUESTA = "N" OR RESPUESTA = "n"
               PERFORM INICIO
           ELSE
               DISPLAY "INTRODUCE 'S' o 'N'".

           *> Termina el programa
           FIN-PROGRAMA.
            DISPLAY "Decimos good bye!"
            STOP RUN.

           *> Pregunta
           EJECUTAR.
               DISPLAY "Desea salir ? [s] [n]".
               ACCEPT RESPUESTA.

           *> Muestra mensaje
           INICIO.
               DISPLAY "Ejemplo del uso de GOTO".

       END PROGRAM USE-GO.

COMPUTE

Una instrucción que asigna el valor de una expresión aritmética a uno o más elementos de datos. Es más eficiente que las declaraciones aritméticas separadas escritas en una serie.

calculos.cbl

IDENTIFICATION DIVISION.
PROGRAM-ID. CALCULOS.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-N1 PIC 9(3) VALUE 5.
   01 WS-N2 PIC 9(4) VALUE 7.
   01 WS-N3 PIC 9(4) VALUE 8.
   01 WS-NA PIC 9(3) VALUE 80.
   01 WS-NB PIC 9(3) VALUE 20.
   01 WS-NC PIC 9(3).

PROCEDURE DIVISION.
   COMPUTE WS-NC= (WS-N1 * WS-N2) - (WS-NA / WS-NB) + WS-N3.
   DISPLAY "WS-NUM1     : " WS-N1
   DISPLAY "WS-NUM2     : " WS-N2
   DISPLAY "WS-NUM3     : " WS-N3
   DISPLAY "WS-NUMA     : " WS-NA
   DISPLAY "WS-NUMB     : " WS-NB
   DISPLAY "RESULTADO DE LA OPERACION     : " WS-NC
   STOP RUN.

MOVE [TO]

Este verbo, junto con TO, nos permite la asignación de valores a variables.

asignar.cbl

IDENTIFICATION DIVISION.
PROGRAM-ID. ASIGNAR.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-N1 PIC 9(3).
   01 WS-N2 PIC 9(4).
   01 WS-N3 PIC 9(4).
   01 WS-NA PIC 9(3).
   01 WS-NB PIC 9(3).
   01 WS-NC PIC 9(3).

PROCEDURE DIVISION.
   

   INICIO.
     PERFORM PRESENTACION.
     PERFORM ASIGNACION.
     PERFORM CALCULAR.
     PERFORM RESULTADO.
     
    ASIGNACION.
    MOVE 7 TO WS-N2.
    MOVE 8 TO WS-N3.
    MOVE 20 TO WS-NB.
    MOVE 80 TO WS-NA.
    MOVE 5 TO WS-N1.
   
   CALCULAR.
     COMPUTE WS-NC= (WS-N1 * WS-N2) - (WS-NA / WS-NB) + WS-N3.
   
   PRESENTACION.
     DISPLAY "[  USO DE SENTENCIA PERFORM]".
   
   RESULTADO.
   DISPLAY "WS-NUM1     : " WS-N1
   DISPLAY "WS-NUM2     : " WS-N2
   DISPLAY "WS-NUM3     : " WS-N3
   DISPLAY "WS-NUMA     : " WS-NA
   DISPLAY "WS-NUMB     : " WS-NB
   DISPLAY "RESULTADO DE LA OPERACION     : " WS-NC
   STOP RUN.

ACCEPT

Es la instrucción que nos permite la entrada de datos.

pulsaciones.cbl

IDENTIFICATION DIVISION.
       PROGRAM-ID. PULSACIONES.

       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01  WS-AGE                 PIC 99.
       01  WS-WEIGHT              PIC 999V9.
       01  WS-PULSE-RATE          PIC 999V9.
       01  WS-INTERMEDIATE-VALUE  PIC 999V9.

       PROCEDURE DIVISION.
       MAIN-PARAGRAPH.
           PERFORM GET-INPUTS.
           PERFORM CALCULATE-PULSE-RATE.
           PERFORM DISPLAY-RESULT.

       GET-INPUTS.
           DISPLAY "Ingrese la edad: " WITH NO ADVANCING.
           ACCEPT WS-AGE
           DISPLAY "Ingrese el peso en kg: " WITH NO ADVANCING.
           ACCEPT WS-WEIGHT.

       CALCULATE-PULSE-RATE.
           COMPUTE WS-INTERMEDIATE-VALUE = 0.5 * WS-AGE
           COMPUTE WS-PULSE-RATE = 210 - WS-INTERMEDIATE-VALUE
           COMPUTE WS-INTERMEDIATE-VALUE = 0.11 * WS-WEIGHT
           COMPUTE WS-PULSE-RATE = WS-PULSE-RATE - WS-INTERMEDIATE-VALUE.

       DISPLAY-RESULT.
           DISPLAY "Las pulsaciones por minuto son: " WS-PULSE-RATE.
           STOP RUN.

       END PROGRAM PULSACIONES.

Continuaremos con esta serie en próximas entregas.

Enlaces:

http://www.consultoriocobol.com/
https://cobol.es/
http://www.universocobol.com/
https://www.ibmmainframer.com/cobol-tutorial/cobol-add-statement/
https://www.programacionfacil.org/cursos/cobol/capitulo_11_rutinas_go_to.html
https://cobolcoder.com/bucle-con-cobol-perform-varying/

Comentarios

Entradas populares de este blog

Rocket: un framework web para Rust

Rocket Framework es: Un framework web escrito en Rust.   Inspirado en Rails, Flask, Bottle y Yesod.  Admite el manejo de solicitudes HTTP, Web Sockets, JSON, plantillas y más. Creando un proyecto con Rocket Framework En primer lugar, verificamos la instalación de Rust en nuestras máquinas: rustc - - version Continuamos con la configuración de Rust nightly como nuestra cadena de herramientas predeterminada ejecutando el comando: rustup default nightly Si lo prefieres, una vez que configuremos un directorio de proyecto en la siguiente sección, puedes usar anulaciones por directorio para usar la versión nocturna solo para tu proyecto Rocket ejecutando el siguiente comando en el directorio: rustup override set nightly Creamos nuevo proyecto `` hola-rocket `` y nos ubicamos en el directorio creado: cargo new hola - rocket - - bin cd hola - rocket Con Cargo, agregamos la dependencia de rocket: cargo add rocket Abrimos el archivo `` Cargo.toml `` Ca...

Odin language: el lenguaje de programación orientado a datos para un desarrollo de software sensato

En esta serie sobre lenguajes de programación hablamos de Odin , un lenguaje orientado a datos. Un nuevo lenguaje de programación que nos podrá recordar a lenguajes como C++, Python, Golang o hasta Rust. Instalación (Windows): 1 2 3 4 $ git clone https://github.com/odin-lang/Odin $ cd Odin $ git pull $ build.bat release Debemos asegurarnos de crear la variable de entorno: Nombre: ODIN_HOME Valor: C:\Users\HP\Documents\pruebasOdin\Odin Ejemplo 1. Como primer programa tendremos al clásico "Hola, mundo". holamundo.odin package holamundo import " core:fmt " main : : proc ( ) { fmt . println ( " ¡Hola, mundo desde Odin! " ) } Construimos: $ odin build holamundo . odin - file Ejecutamos: $ holamundo .exe Recordar que si usamos Visual Studio Code podemos instalar el plugin de Odin Language: https://marketplace.visualstudio.com/items?itemName=DanielGavin.ols Ejemplo 2. Programa que muestre las variables que pod...

Programación Windows Batch (CMD) parte 3

Crear ciclos para efectuar operaciones tediosas nos ahorrará tiempo para realizar otras tareas. En está ocasión veremos ciclos con FOR . ¿Cuál es la síntaxis de bucle FOR en Windows Batch? Si está dentro de un archivo *.bat : FOR %%variable IN (seq) DO operaciones Si lo ejecutamos en una terminal: FOR %variable IN (seq) DO operaciones Ejemplo 1 . Recorrer una secuencia de números del 0 al 5: recorrer.bat @ echo off FOR %%i in ( 0 1 2 3 4 5 ) DO echo Hola no. %%i pause Nos imprimirá en pantalla: Hola no. 0 Hola no. 1 Hola no. 2 Hola no. 3 Hola no. 4 Hola no. 5 ¿Puedo usar contadores? Si, se pueden usar. Ejemplo 2 . Uso de contadores: contador.bat @ echo off set numeros = 1 2 3 4 5 6 7 8 9 10 set cont = 0 for %%a in ( %numeros% ) do ( echo Hola no. %%a :: Contador set /a cont+ = 1 ) echo Total: %cont% Este código nos imprimirá, además de los mensajes Hola no. 0 ..., el total de valores conta...