Curso de Cobol y PowerCobol

Operaciones matemáticas básicas con COBOL

Capítulo 14: Operaciones aritméticas básicas

Este capítulo he decidido hacerlo un poco más práctico. Comenzamos ya a realizar operaciones aritméticas básicas de suma, resta, multiplicación y división en COBOL.

El verbo COMPUTE de COBOL

En COBOL disponemos del verbo COMPUTE que sirve para evaluar expresiones aritméticas. Es decir, podemos hacer las cuatro operaciones que vas a ver en este capítulo.

Empecemos por ver cómo realizar una suma y almacenar su resultado en una variable.

Lo primero que tienes que escribir son dos variables para almacenar los números. Van a ser números de dos dígitos, por lo que el PICTURE lo voy a poner así:

01 Numero1 PIC 99 VALUE 25.
01 Numero2 PIC 99 VALUE 15.

Después ponemos una tercera variable para almacenar el resultado de la suma.

01 Resultado PIC 99.

Esta última variable, no hace falta que la inicies con VALUE, ya que cuando esta variable obtenga un resultado, se le aplicará automáticamente.

No obstante, puedes y en muchos casos es recomendable iniciar la variable. En este caso, le puedes poner un value de 0. Mientras no se realice ninguna operación, esta variable va a tener ese valor por defecto.

01 Resultado PIC 99 VALUE 0.

¿Recuerdas que te hablé de constantes figurativas en un capítulo anterior? En este caso, tienes la constante ZERO que hace lo mismo, le da un valor de 0 a la variable.

01 Resultado PIC 99 VALUE ZERO.

Tenemos otras dos constantes que hacen lo mismo que ZERO. Se trata de ZEROS o ZEROES.

01 Resultado PIC 99 VALUE ZEROS.
01 Resultado PIC 99 VALUE ZEROES.

¿Para qué tantas constantes para hacer lo mismo? Bien, te hablé de las críticas a COBOL por cosas como esto, tiene demasiadas palabras reservadas con cosas como estas. COBOL es un lenguaje que se trató de adaptar lo máximo posible al idioma inglés, por eso, lo de párrafos, frases, verbos, etc. Según el contexto, queda mejor escribir ZEROS o ZEROES que ZERO. Ya lo irás apreciando más adelante.

Ahora que ya tenemos los datos introducidos en el programa, vamos a la PROCEDURE DIVISION a escribir la pequeña lógica de este programa.

Por el momento, el programa te debe quedar así:

⁠⁠       IDENTIFICATION DIVISION.
       PROGRAM-ID. Capitulo14.

       ENVIRONMENT DIVISION.

       DATA DIVISION.
       FILE SECTION.
       WORKING-STORAGE SECTION.
      *> Variables para los operandos
           01 Numero1 PIC 99 VALUE 25.
           01 Numero2 PIC 99 VALUE 15.
      *> Variable para el resultado de la suma
           01 Resultado PIC 99 VALUE ZERO.

       PROCEDURE DIVISION.

       STOP RUN.

       END PROGRAM Capitulo14.
Los operandos son los números sobre los cuales se aplica una operación.

Primero, crea una párrafo o procedimiento.

CalculaYMuestra.

Calcula y muestra porque va a realizar el cálculo y luego lo va a mostrar.

Realizar operaciones aritméticas en COBOL con COMPUTE

Con COMPUTE, vamos a indicarle a COBOL que queremos realizar una operación aritmética. Espera un mínimo de un valor.

COMPUTE Resultado = Numero1.
					
DISPLAY Resultado.
25

Esto último, no tiene sentido, ya que la operación con un solo valor no hace nada más que almacenar en resultado el mismo valor, por lo que en el DISPLAY, podríamos llamar directamente a Numero1.

Ahora, añade un símbolo de estos cuatro y otro valor al COMPUTE. Empecemos por la suma.

Operador Símbolo
Suma +
Resta -
Multiplicación *
División /
COMPUTE Resultado = Numero1 + Numero2.

Por el momento, debe quedarte el programa así:

Programa de sumas en COBOL

⁠⁠       IDENTIFICATION DIVISION.
       PROGRAM-ID. Capitulo14.

       ENVIRONMENT DIVISION.

       DATA DIVISION.
       FILE SECTION.
       WORKING-STORAGE SECTION.
      *> Variables para los operandos
           01 Numero1 PIC 99 VALUE 25.
           01 Numero2 PIC 99 VALUE 15.
      *> Variable para el resultado de la suma
           01 Resultado PIC 99 VALUE ZERO.

       PROCEDURE DIVISION.
      *> Realiza la operación y almacena el resultado en Resultado
       COMPUTE Resultado = Numero1 + Numero2.
      *> Muestra el resultado en la consola
       DISPLAY Resultado.

       STOP RUN.

       END PROGRAM Capitulo14.
40

Veamos como funciona COMPUTE. Este verbo, lo que hace es realizar una operación aritmética. El resultado se va a almacenar en la variable que especificamos después de COMPUTE. En el caso del ejemplo, en Resultado.

El resto de operaciones son también fáciles de hacer. Solo cambia el símbolo + por el que corresponda.

Resta, multiplicación y división en COBOL

COMPUTE Resultado = Numero1 - Numero2.
10
COMPUTE Resultado = Numero1 * Numero2.
75

En el caso de la división, vamos a cambiar los valores de las variables Numero para que veas un resultado mejor. De momento estamos con enteros, por eso lo digo.

01 Numero1 PIC 99 VALUE 20.
01 Numero2 PIC 99 VALUE 10.
COMPUTE Resultado = Numero1 / Numero2.
02

Por supuesto, pon los números que quieras y ves haciendo todas las pruebas que quieras.

Ahora, hagamos una multiplicación con un resultado más grande. Es aquí donde puedes cometer tus primeros fallos de pérdida de datos, así que esta parte es importante.

⁠⁠       IDENTIFICATION DIVISION.
       PROGRAM-ID. Capitulo14.

       ENVIRONMENT DIVISION.

       DATA DIVISION.
       FILE SECTION.
       WORKING-STORAGE SECTION.
      *> Variables para los operandos
           01 Numero1 PIC 99 VALUE 25.
           01 Numero2 PIC 99 VALUE 15.
      *> Variable para el resultado de la suma
           01 Resultado PIC 99 VALUE ZERO.

       PROCEDURE DIVISION.
      *> Realiza la operación y almacena el resultado en Resultado
       COMPUTE Resultado = Numero1 * Numero2.
      *> Muestra el resultado en la consola
       DISPLAY Resultado.

       STOP RUN.

       END PROGRAM Capitulo14.

Si ejecutas este programa, verás el siguiente resultado:

75

75, correcto. Ah no, espera, 25 multiplicado por 15 son 375. ¿Entonces, qué ocurre? ¿COBOL es tan desastroso que no sabe ni realizar correctamente una multiplicación? No, por supuesto que COBOL opera correctamente. Lo que está mal es el código.

Piensa que en el tamaño de la variable Resultado es de dos dígitos PIC 99. Esto deja un contenedor con la posibilidad de albergar dos dígitos, ninguno más. Entonces, la solución es fácil. Poner un PICTURE mayor. ¿Cuánto mayor? En este caso, cuatro dígitos. El número mayor que puede producir una operación con las variables Numero1 y Numero2 de dos dígitos (hasta el número 99) es de 9801. Si multiplicamos 99 * 99, nos da ese resultado. Por lo tanto, el PICTURE será de 9999.

Aquí tienes una pequeña tabla de referencia:

PICTURE operandos Número máximo Tamaño PICTURE resultado
9 9*9 = 81 99
99 99 * 99 = 9801 9999
999 999*999 = 998.001 999999
9999 9999*9999 = 99.980.001 99999999

Entonces, esto quiere decir, que tienes que tener en cuenta el tamaño máximo que puede dar un resultado en una operación. Si a Resultado le damos un PICTURE de 3 dígitos, nos cabe el resultado del ejemplo anterior (375), no obstante, si ponemos por ejemplo 15 * 50 (1500), ya no nos basta. Finalmente, lo dejamos así:

01 Resultado PIC 9999 VALUE ZERO.

Podrías pensar en poner siempre el tamaño máximo de dígitos que te deje el PICTURE para evitar pensar en posibles resultados, pero de esta forma, tu programa se volverá con cada variable, más pesado de lo que debería y el resultado es una mayor carga en la memoria RAM, que se traduce en programa poco optimizado.

Imagina la variable como un contenedor de cajas para tus envíos, sí, esos que se ven en los muelles.

Tenemos por ejemplo un contenedor lo suficientemente grande como para guardar hasta 24 bultos o cajas (por poner un número. Este se corresponde al tamaño de dígitos del PICTURE). Si a ese contenedor le metes por ejemplo, 3 cajas y dejas el resto vacío, estás desperdiciando espacio y por lo tanto, el barco que lleva los contenedores, va a hacer un viaje con todo lleno de contenedores medio vacíos.

Contenedores RAM

Este ejemplo, es un problema en logística y lo es en informática. El barco es la memoria RAM, los contenedores las variables y las cajas, en este ejemplo, dígitos. ¿El compilador COBOL es el muelle?

Fuera bromas, espero que de una forma u otra te quede claro. Si no, déjame un comentario.

¿Te parece complicado estar contando las posibilidades como en la tabla anterior? Tengo la solución, un pequeño truco mágico de matemáticas.

Los resultados de dos números iguales de dígitos en las multiplicaciones es exactamente el doble de dígitos.

Por ejemplo, un número de dos dígitos por otro igual, da un resultado en multiplicación máximo de 4 dígitos (9.801), es el doble de dígitos en el resultado.

Si los operandos son de 3 dígitos, el doble es 6, ahí tenemos el PICTURE, ya que el resultado máximo posible es de 998.001.

¿Si los operandos son de 6 dígitos? Resultado de 12 máximo (999.998.000.001). Es fácil ¿verdad?

⁠⁠       IDENTIFICATION DIVISION.
       PROGRAM-ID. Capitulo14.

       ENVIRONMENT DIVISION.

       DATA DIVISION.
       FILE SECTION.
       WORKING-STORAGE SECTION.
      *> Variables para los operandos
           01 Numero1 PIC 9(15) VALUE 999999999999999.
           01 Numero2 PIC 9(15) VALUE 999999999999999.
      *> Variable para el resultado de la suma
           01 Resultado PIC 9(30) VALUE ZERO.

       PROCEDURE DIVISION.
      *> Realiza la operación y almacena el resultado en Resultado
       COMPUTE Resultado = Numero1 * Numero2.
      *> Muestra el resultado en la consola
       DISPLAY Resultado.

       STOP RUN.

       END PROGRAM Capitulo14.
999999999999998000000000000001

Pon ahora un PICTURE 31 a Resultado para ver que ocurre:

01 Resultado PIC 9(31) VALUE ZERO.

Fíjate que nos sobra un dígito, que es el que rellena con un cero a la izquierda, y ya sabes el dicho.

0999999999999998000000000000001

Volvamos a la división. Pon los operandos y Resultado así:

01 Numero1 PIC 99 VALUE 25.
01 Numero2 PIC 99 VALUE 15.
01 Resultado PIC 9(4) VALUE ZERO.

Se nos devuelve un 1 (ignora los ceros a la izquierda), pero en realidad, el resultado es un decimal, 1,66 en concreto.

Esto ocurre porque con el PICTURE 9, el tipo de dato usado es integer, entero en español. Los decimales los pierde. Para ello debes utilizar un PICTURE que admita decimales. Ya te mostré cómo, pero veremos algún ejemplo en el siguiente capítulo, ya es suficiente para este.

Puedes realizar operaciones con valores numéricos directamente, sin utilizar variables para guardarlos:

⁠⁠       IDENTIFICATION DIVISION.
       PROGRAM-ID. Capitulo14.

       ENVIRONMENT DIVISION.

       DATA DIVISION.
       FILE SECTION.
       WORKING-STORAGE SECTION.
      *> Variable para almacenar el resultado.
           01 Resultado PIC 9999 VALUE ZEROS.

       PROCEDURE DIVISION.
       MuestraResultado.
      *> Calcula el resultado.
           COMPUTE Resultado = 10 + 15 * 2 / 5 + 10 - 5.
      *> Muestra el resultado.
           DISPLAY Resultado.

           STOP RUN.
       END PROGRAM Capitulo14.

Esto funciona como las matemáticas tradicionales, se le da prioridad a las multiplicaciones y divisiones sobre la suma y la resta. (15 * 2 / 5 + 10 + 10 - 5 = 21)

0021

Los paréntesis también sirven para establecer prioridad en unas operaciones sobre otras:

⁠⁠       IDENTIFICATION DIVISION.
       PROGRAM-ID. Capitulo14.

       ENVIRONMENT DIVISION.

       DATA DIVISION.
       FILE SECTION.
       WORKING-STORAGE SECTION.
      *> Variable para almacenar el resultado.
           01 Resultado PIC 9999 VALUE ZEROS.

       PROCEDURE DIVISION.
       MuestraResultado.
      *> Calcula el resultado.
           COMPUTE Resultado = (10 + 15) * 2 / (5 + 10 - 5).
      *> Muestra el resultado.
           DISPLAY Resultado.

           STOP RUN.
       END PROGRAM Capitulo14.

(25) * 2 / (10)
25 * 2 / 10 = 5.

0005

Esto, por supuesto, lo puedes hacer con variables:

⁠⁠       IDENTIFICATION DIVISION.
       PROGRAM-ID. Capitulo14.

       ENVIRONMENT DIVISION.

       DATA DIVISION.
       FILE SECTION.
       WORKING-STORAGE SECTION.
      *> Variables de números.
           01 Numero1 PIC 99 VALUE 10.
           01 Numero2 PIC 99 VALUE 15.
           01 Numero3 PIC 99 VALUE 2.
           01 Numero4 PIC 99 VALUE 5.
      *> Variable para almacenar el resultado.
           01 Resultado PIC 9999 VALUE ZEROS.

       PROCEDURE DIVISION.
       MuestraResultado.
      *> Calcula el resultado.
           COMPUTE Resultado = (Numero1 + Numero2) * Numero3 /
           (Numero4 + Numero1 - Numero4).
      *> Muestra el resultado.
           DISPLAY Resultado.

           STOP RUN.
       END PROGRAM Capitulo14.

Si las líneas son muy largas y no caben en el área A y B, deberás cortar la línea en dos o más con un simple ENTER , ya que como sabes, lo que termina la frase, es el punto .. Esto quiere decir, que lo lee como si fuese una misma frase aunque esté en dos líneas.

0005

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.