Debido a que el lenguaje Cobol fue concebido para la gestión de grandes cantidades de datos y a resolver problemas de tipo comercial y de administración, no se incluyeron dentro de sus especificaciones verbos que nos puedieran ayudar a resolver cálculos complejos como integrales, trigonometría, raices cuadradas, etc…, sino simplemente las orientadas a los cálculos básicos, suma, resta, multiplicación y división que son las que vamos a ver a continuación:
ADD , ésta es la instrucción que utilizaremos para realizar sumas y tiene los siguientes formatos:
1.- ADD variable ó literal variable ó literal … TO variable (ROUNDED) (ON SIZE ERROR ) instrucción
2.- ADD variable ó literal variable ó literal …GIVING variable (ROUNDED) (ON SIZE ERROR ) instrucción
3.- ADD CORR variable TO variable (ROUNDED) ( ON SIZE ERROR) instrucción
Para ver las explicaciones de cada uno de los formatos partiremos de la misma WORKING , y a continuación pondremos un ejemplo y su explicación.
WORKING-STORAGE SECTION. 01 VALORES. 02 UNO PIC 99 VALUE 10. 02 DOS PIC 9(6) VALUE 280. 02 TRES PIC 9(4) VALUE 540. 01 OTROS 02 OTRO1 PIC 9. 02 DOS PIC 9(6) VALUE 110. 01 RESULTADO PIC S9(8) VALUE 10. 01 RESTO PIC 99. PROCEDURE DIVISION. INICIO. |
|
Formato 1: | |
ADD UNO TRES 5 TO RESULTADO. | |
Se sumarán todas las variables o literales numéricos (cifras) al valor de la variable que se de a continuación del TO, guardandose el resultado también en ésta última.Por tanto al realizar ésta operación el valor de la variable RESULTADO, será de: 10 (de la variable UNO) + 540 (de la variable TRES) + 5 + 10 (de Resultado) = 565. Como veis UNO + TRES + 5 suman 555 pero ésto se suma al valor que ya tenía la variable RESULTADO, con lo que la suma total es de 565. Este formato se usa mucho para hacer de contador y hacer que una varable aumente en uno su valor poniendo: |
|
Formato 2: | |
ADD UNO TRES 5 GIVING RESULTADO. | |
En éste caso la variable RESULTADO tendrá el valor de la suma de las variables anteriores, sin tener en cuenta su valor inicial, es decir, será de: 10 (de la variable UNO) + 540 (de la variable TRES) + 5 = 555.
|
|
Formato 3: | |
ADD CORR VALORES TO OTROS. | |
Con éste formato conseguimos que las variables del campo compuesto VALORES se sumen al valor de las variables con el mismo nombre del campo compuesto OTROS, obteniendo como resultado: 280 (de la variable DOS del campo VALORES) + 110 (de la variable DOS del campo OTROS) = 390. Si hubiera coincidido alguna variable mas con el mismo nombre en ambos campos también se hubiese sumado. |
|
Nota: Como habreis podido apreciar pueden coexistir variables con el mismo nombre pero nunca al nivel 01 o 77, es decir nunca como variables independientes, pero si que formen parte de otra, aunque yo personalmente nunca lo uso porque solo puede dar lugar a confusiones. Si de todas formas lo utilizais, hay que tener en cuenta que para referirse a éstas variables no solo bastará con poner su nombre, sino que además habrá que especificar a que campo pertenece con la palabra IN u OF . Esto se explicará con mas detalle cuando veamos los verbos para manipular variables como MOVE. |
SUBTRACT , ésta es la instrucción que utilizaremos para realizar restas y tiene los siguientes formatos:
1.- SUBTRACT variable ó literal variable ó literal … FROM variable (ROUNDED) (ON SIZE ERROR ) instrucción
2.- SUBTRACT variable ó literal variable ó literal … FROM variable ó literal GIVING variable (ROUNDED) (ON SIZE ERROR) instrucción
3.- SUBTRACT CORR variable FROM variable (ROUNDED) (ON SIZE ERROR) instrucción
Para ver las explicaciones de cada uno de los formatos partiremos de la misma WORKING que hemos utilizado con la instrucción ADD, poniendo a continuación un ejemplo y su explicación.
Formato 1: | |
SUBTRACT UNO TRES 5 FROM RESULTADO. | |
Se restarán todas las variables o literales numéricos (cifras) del valor de la variable que se de a continuación del FROM, guardandose el resultado también en ésta última. Por tanto al realizar ésta operación el valor de la variable RESULTADO, será de: -10 (de la variable UNO) – 540 (de la variable TRES) – 5 + 10 (de Resultado) = -545. Este formato lo podemos utilizar para hacer contadores en retroceso, poniendo: |
|
Formato 2: | |
SUBTRACT UNO 5 FROM TRES GIVING RESULTADO. | |
Aquí lo que conseguiremos será restar el valor de la variable UNO y 5 del valor de la variable TRES y el resultado guardarlo en la variable RESULTADO, sin tener en cuenta su valor inicial, es decir, será de: 540 (de la variable TRES) – 10 (de la variable UNO) – 5 = 525. |
|
Formato 3: | |
SUBTRACT CORR VALORES FROM OTROS. | |
Al igual que con la instrucción ADD, con éste formato conseguimos que las variables del campo compuesto VALORES se resten al valor de las variables con el mismo nombre del campo compuesto OTROS, obteniendo como resultado: 280 (de la variable DOS del campo VALORES) – 110 (de la variable DOS del campo OTROS) = 170. Si hubiera coincidido alguna variable mas con el mismo nombre en ambos campos también se hubiese restado. |
|
Nota: Tened en cuenta que al utilizar restas el signo puede ser negativo y si no tenemos bien declarada la variable que va a contener el resultado, ésta cojerá su valor absoluto. |
MULTIPLY , ésta es la instrucción que utilizaremos para realizar multiplicaciones y tiene los siguientes formatos:
1.- MULTIPLY variable ó literal BY variable ( ROUNDED) (ON SIZE ERROR ) instrucción
2.- MULTIPLY variable ó literal BY variable ó literal GIVING variable (ROUNDED) (ON SIZE ERROR ) instrucción
Utilizando la misma WORKING que hemos utilizado con las instrucciones ADD y SUBTRACT, veremos a continuación unos ejemplos y su explicación.
Formato 1: | |
MULTIPLY 5 BY RESULTADO. | |
Multiplica el número 5 por el valor de la variable RESULTADO, guardando en ésta misma el resultado de la operación que será: 5 x 10 (de la variable RESULTADO) = 50. |
|
Formato 2: |
|
MULTIPLY 5 BY TRES GIVING RESULTADO. | |
Aquí multiplicaremos el número 5 por el valor de la variable TRES guardando el resultado en la variable RESULTADO, sin tener en cuenta su valor inicial, es decir, será de: 5 x 540 (de la variable TRES) = 2700. |
DIVIDE , ésta es la instrucción que utilizaremos para realizar divisiones y tiene los siguientes formatos:
1.- DIVIDE variable ó literal INTO variable (ROUNDED) (ON SIZE ERROR ) instrucción
2.- DIVIDE variable ó literal (BY ó INTO) variable ó literal GIVING variable (ROUNDED) (REMAINDER ) variable (ON SIZE ERROR ) instrucción
Utilizando la misma WORKING que hemos utilizado con las instrucciones ADD, SUBTRACT y MULTIPLY, veremos a continuación unos ejemplos y su explicación.
Formato 1: | |
DIVIDE 10 INTO TRES. | |
Divide el valor de la variable TRES entre el número 10, guardando el resultado en la variable TRES: 540 (de la variable TRES) / 10 = 54. |
|
Formato 2: | |
DIVIDE 7 INTO TRES GIVING RESULTADO REMAINDER RESTO. | |
Aquí dividiremos el valor del la variable TRES entre 7 guardando el resultado en la variable RESULTADO, sin tener en cuenta su valor inicial, y además el resto de la operación lo guardará en la variable RESTO, quedando así: 540 / 7 = 77, pero como 7 x 77 son 539 el resto es 1 que será el valor de RESTO. Si en vez de utilizar INTO utilizamos BY cambia el orden de los operandos, es decir en vez de dividir TRES entre 7 dividiríamos 7 entre TRES. La opción REMAINDER no es obligatoria, todo dependerá del uso que queramos hacer de la instrucción. La variable que iría a continuación guardará el resto de la división. |
|
COMPUTE , con ésta orden podemos realizar todos los cálculos aritméticos posibles en una sola instrucción, utilizando los operadores +(suma) -(resta) *(multiplicación) /(división) **(potenciación), además de utilizar paréntesis para especificar mejor la operación a realizar.
1.- COMPUTE variable (ROUNDED) = expresión aritmética (ON SIZE ERROR) instrucción
Utilizando la misma WORKING que hemos utilizado anteriormente vamos a ver un ejemplo:
Formato 1: | |
COMPUTE RESULTADO = DOS OF VALORES * 16 / 100. | |
El valor de la variable RESULTADO será de 44, obtenido después de multiplicar 280 (de la variable DOS del grupo VALORES) x 16 y lo que de dividido entre 100. En realidad si hacemos el cálculo en una calculadora nos daremos cuenta que el resultado exacto es 44,80 pero como la variable RESULTADO no la hemos definido con decimales éstos son depreciados por el compilador. Puesto que la variable DOS pertenece a dos grupos de variables deberemos especificar a que grupo pertenece (OF VALORES). Debemos de tener en cuenta que siempre tienen preferencia los operadores que vayan entre paréntesis, a continuación los de multiplicación y división (*) y (/) y por último los de suma y resta (+) y (-) y el orden en que va a ir realizando las operaciones será de izquierda a derecha, por lo tanto: |
|
COMPUTE RESULTADO = 2 + 3 * 5. | |
Esta operación daría como resultado 3*5=15+2=17. |
|
COMPUTE RESULTADO = (2 + 3) * 5. | |
En cambio ésta otra daría: 2+3=5*5=25. Espero que hayais notado la diferencia y la podais aplicar a vuestros casos en concreto. |
Para todas éstas instrucciones de cálculo que hemos visto la opcion ROUNDED significa lo mismo y quiere decir que fuerza al redondeo del resultado para cada operación y siempre teniendo en cuenta la definición de la variable que va a guardar ese resultado, por ejemplo si tras una operación resulta 18,76 éste podría quedar como sigue:
- 77 RESULTADO PIC 99V99. (valor = 18,76)
- 77 RESULTADO PIC 99V9. (valor sin redondeo = 18,7 – valor con redondeo = 18,8)
- 77 RESULTADO PIC 99. (Valor sin redondeo = 18 – valor con redondeo = 19).
Igual ocurre con la frase ON SIZE ERROR instrucción, que propiciará que se ejecute la instrucción que pongamos a continuación cuando se produzca un desbordamiento del campo que va a acoger el resultado, por ejemplo si el resultado de una operación es 8.976.400 y la variable la hemos definido con PIC 9(6) y hemos especificado dicha opción se ejecutará la instrucción especificada.