Cobol.Entrada y Salida de datos.

Ismael Royano Gómez
Enredando con Programación
8 min readMay 10, 2016

En cualquier lenguaje de programación se necesita trabajar con datos. En Cobol existen tres categorías donde almacenar datos: Las variables, los literales y constantes figurativas:

Variables. Una variable es un nombre que le asignamos a trozo de memoria, en la cual un programa puede acceder a éste y trabajar.

Cada variable utilizada en un programa COBOL deben ser descritos en la DATA DIVISION, en la sección WORKING-STORAGE SECTION.

Tipos de Variables. En COBOL, en realidad sólo hay tres tipos de datos; numérico, alfanumérico (número y letras) y alfabético (de la A a la Z).

Literales o constantes. Son datos cuyo valor suelen ser constantes y no cambian. Existen dos tipos de literales:

  • Literales alfanuméricas. Se encierran entre comillas y se componen de números y letras, como por ejemplo “ismael”, “-125.25”, “ismael-15”.
  • Literales numéricas. Se componen fundamentalmente de números, ya sean positivos o negativos, incluyendo punto decimales. Un ejemplo sería -125.25, 25.48, 6.

Constantes Figurativas. Son valores que se le dan por defecto a las variables cuando se definen en la WORKING-STORAGE SECTION. Las constante figurativas son las siguientes;

  • SPACE ó SPACES. Actúa como uno o más espacios.
  • ZERO ó ZEROS ó ZEROES. Actúa como uno o más ceros.
  • QUOTE ó QUOTES. Se utiliza en lugar de las comillas, no hay valor.
  • HIGH-VALUE ó HIGH-VALUES. Utiliza el valor máximo posible.
  • LOW-VALUE ó LOW-VALUES. Utiliza el valor menor posible.

Declarando Variables o Identificadores. Cuando se define una variable en cobol debemos especificar detalladamente 3 elementos fundamentales:

  • El número de nivel. Que indica el tipo de datos que almacenaremos, por ejemplo, numérico, alfanumérico ó alfabético.
  • El nombre de la variable. Este variable no podrá contener caracteres raros, ni nada fuera de lo normal. Se suelen utilizar letras y números, guiones, pero nunca deben comenzar ni terminar por guion. Los nombres no podrán superar los 30 caracteres.
  • Cláusula de imagen. (PICTURE ó PIC).
  1. 9. Campos numéricos.
  2. A. Campos alfabéticos.
  3. X. Campos alfanuméricos.
  4. S. Variable con signo.
  5. V. Variable con punto decimal.

Podemos utilizar otros elementos para completar los campos:

  • . El punto la separación de miles.
  • , La coma indica la separación de decimales.
  • Z. Representa espacios para los ceros de la izquierda, de esta manera no se visualizan.

El número de nivel. Cada campo declarado debe de llevar un número de nivel que le informe al compilador del tipo de campo que es:

  • El nivel 01, identifica la primera entrada de un registro o la primera entrada de un campo que se va a subdividir.
  • El nivel 77, identifica a una variable que no se va a subdividir y que no forma parte de ningún registro.
  • El nivel 88, identifica los posibles valores que puede almacenar una variable.
  • Los niveles 02 al 49 indicarán las distintas subdivisiones de un campo cuya primera entrada ha sido definida a nivel 01. Los niveles 01 y 77 deberán de ir siempre en el Área A (Col 8) el resto es independiente.

Veamos un ejemplo para ver como se van declarando las variables:

WORKING-STORAGE SECTION.
77 FECHA PIC 9(8).
77 FECHA-EDIT PIC ZZ/ZZ/ZZZZ.
77 IMPORTE PIC S9(8)V99.
77 IMPORTE-EDIT PIC ZZ.ZZZ.ZZZ,ZZ-.
01 ESTADO PIC 9.
88 SOLTERO VALUE 1.
88 CASADO VALUE 2.
88 DIVORCIADO VALUE 3.
01 DOMICILIO.
02 TIPO PIC XX.
02 NOMBRE PIC X(20).
02 NUMERO PIC 9(4).

Como hemos visto anteriormente, la PROCEDURE DIVISION es donde reflejamos todo el código de un programa. En esta parte vamos aprender como se asignan valores a variables, mostrar en pantalla sus valores, obtener la fecha y hora del sistema y operaciones aritméticas básicas.

Display. Esta instrucción la usaremos para visualizar datos en pantalla, ya sean variables, constantes o texto. Si sintaxis es la siguiente:

Algunos ejemplos:

DISPLAY "Mi nombre es: "Nombre.

Notas. Por norma general cuando termina una instrucción, automáticamente mueve el cursor a la linea siguiente, excepto cuando ponemos la cláusula WITH NO ADVANCING. La claúsula UPON se usa para que el programador utilice un nombre para identificar algún periférico del ordenador, como por el ejemplo, el puerto de la impresora. Por defecto se usa la pantalla como periférico del ordenador.

Accept. Esta instrucción se utiliza para obtener datos desde un teclado, un periférico del ordenador o incluso de variables definidas por el sistema, como por ejemplo la fecha y hora del sistema. Su sintaxis es la siguiente:

El primer formato se utiliza para aceptar variables desde teclado o cualquier otro periférico del ordenador.

El segundo formato se utiliza para aceptar variables del sistema.

Nota. Por defecto el periférico del ordenador que se suele utilizar con esta instrucción es el teclado.

Veamos un ejemplo de como se definen las variables del sistema:

IDENTIFICATION DIVISION.
PROGRAM-ID. PruebaFechas.
AUTHOR. Ismael.
DATA DIVISION.
WORKING-STORAGE SECTION.
* Formato YYMMDD
01 CurrentDate.
02 CurrentYear PIC 9(4).
02 CurrentMonth PIC 99.
02 CurrentDay PIC 99.
* Formato YYDDD
01 DayOfYear.
02 YearDay PIC 9(3).
* El Tiempo en formato HHMMSSss s = S/100
01 CurrentTime.
02 CurrentHour PIC 99.
02 CurrentMinute PIC 99.
PROCEDURE DIVISION.
Inicio.
ACCEPT CurrentDate FROM DATE YYYYMMDD
ACCEPT DayOfYear FROM DAY YYYYDDD
ACCEPT CurrentTime FROM TIME
DISPLAY "La fecha es: " CurrentDay SPACE CurrentMonth
SPACE CurrentYear
DISPLAY "Día nº. " YearDay " Del año " CurrentYear
DISPLAY "Son las " CurrentHour ":" CurrentMinute
STOP RUN.

En la cláusula ACCEPT debemos indicarle el formato del año que queremos introducir, en este caso es con 4 dígitos (YYYY).

Asignación de Datos.

En cobol básicamente existe solo tres tipos de datos; los alfabéticos, numéricos y alfanuméricos. A la hora de asignar datos o darle valor a una variable se utiliza la instrucción MOVE. Su sintaxis es la siguiente:

MOVE origen TO destino…

Esta instrucción lo que hace es mover los valores as una o varias variables, teniendo en cuenta lo siguiente:

  • Si el origen es mas pequeño que el destino, se rellenarán los espacios sobrantes con ceros o espacios.
  • Si el origen es mas grande que el destino, obviamente se perderán los datos que no encajen.
  • Si existiera punto decimal, el campo se le dará formato de nuevo, según lo que tengamos declarado en la WORKING-STORAGE SECTION.

Hay que tener en cuenta que los datos de origen y destino deben ser del mismo tipo y tamaño, no podemos almacenar textos cuando la variable de destino son de números y viceversa.

Algunos ejemplos pueden ser:

MOVE 135 TO num1.
MOVE 25 TO num1 num2 num3.
MOVE "juan" TO nombre.

Cálculos Aritméticos.

Sumando.

Veamos unos ejemplos:

  • Vamos a imaginar que tenemos creadas 3 variables, num1, num2 y resultado y tiene un valor cada una de ellas. En este ejemplo suma el valor de num1 + num2 + 5 + el valor que tenga la variable resultado y lo vuelve a guardar en la variable resultado.
ADD num1 num2 5 TO resultado
  • En este ejemplo no tiene en cuenta el valor inicial que tenga la variable resultado, es decir, que suma borrará el valor de resultado y guardará sólo la suma de num1 + num2 + 5.
ADD num1 num2 5 GIVING resultado

Restando.

Veamos unos ejemplos:

  • En este ejemplo lo que hace es restar todas las valores numéricos al valor que hay a continuación de FROM, incluida éste y lo guarda en resultado, es decir, resta a resultado el valor de la variable num1 5 num2 y después resta el valor que tenga resultado y lo guarda en resultado.
SUBTRACT num1 5 num2 FROM resultado
  • En este ejemplo lo que hace es restar num1 y 5 al valor de num2 y lo almacena en resultado, sin tener en cuenta el valor que tenga resultado, ya que no cuenta en la resta.
SUBTRACT num1 5 FROM num2 GIVING resultado

Multiplicando.

Veamos unos ejemplos:

  • Multiplica el 5 por el valor de resultado y lo guarda en resultado.
MULTIPLY 5 BY resultado
  • Multiplica el 5 por el valor de num1 y lo guarda en resultado, sin tener en cuenta el valor que ésta pueda tener, ya que no participa en la multiplicación.
MULTIPLY 5 BY num1 GIVING resultado

Dividiendo.

Veamos unos ejemplos:

  • Divide el valor de la variable resultado entre 10 y lo guarda en resultado.
DIVIDE 10 INTO resultado
  • Divide el valor de num1 entre 7 y lo guarda en la variable resultado, sin tener en cuenta el valor de resultado, ya que no interviene en la división.
DIVIDE 7 INTO num1 GIVING resultado

Múltiples Cálculos. Existe una instrucción que no puede facilitar mucho las cosas, ya que su objetivo es evaluar una expresión aritmética y realizar varios cálculos al mismo tiempo. Esta instrucción se llama COMPUTE. Su sintáxis es la siguiente:

Veamos unos ejemplos:

  • Este ejempo da como resultado 17, es decir 3x5=15+2=17.
COMPUTE resultado = 2 + 3 * 5
  • En cambio en este ejemplo lo que hace primero es 2 + 3 y el resultado lo multiplica por 5, cuyo resultado es 25.
COMPUTE resultado = (2 + 3) * 5

Debemos tener en cuenta que cuando hacemos varios cálculos simultáneos hay un orden de preferencia. Primero se hacen los operadores que hayan entre paréntesis después las multiplicaciones y divisiones y por último las sumas y las restas. Por ese motivo estas dos instrucciones dan un resultado diferente.

Operadores:

  • **. Calcula la potencia.
  • *. Calcula la multiplicación.
  • /. Calcula la división.
  • +. Calcula la suma.
  • -. Calcula la resta.

Si nos fijamos bien, todas las operaciones de aritmética que hemos visto hasta ahora tienen la opción ROUNDED. Esta opción sirve para redondear resultados, veamos un ejemplo para ver que ocurre cuando la utilizamos:

Declaración. Resultado. Truncado. Redondeado.

PIC 9(3)V9 123.25 123.2 123.3
PIC 9(3)V9 123.247 123.2 123.2
PIC 9(3) 123.25 123 123

Un valor se trunca cuando un resultado es mas grande que la variable donde queremos almacenarlo, entonces el sistema intenta truncarlo de manera que entre en su destino.

El cláusula ROUNDED (redondeado) lo que hace es ajustar la parte decimal, de forma, que si el segundo decimal es 5 o mayor de 5 se le suma uno al primer dígito decimal y si es menor de 5 se queda con el primer número decimal.

Vamos a hacer un ejemplo, en el que nos pida desde teclado dos números, y hacemos una suma, resta, multiplicación, división y potencia de esos dos números, para ver como se van haciendo un programa:

IDENTIFICATION DIVISION.
PROGRAM-ID. Calcular.
AUTHOR. Ismael.
DATA DIVISION.
WORKING-STORAGE SECTION.
77 Num1 PIC 9 VALUE ZEROS.
77 Num2 PIC 9 VALUE ZEROS.
77 Result1 PIC 9(2)V9(2) VALUE ZEROS.
77 Result2 PIC 9(2)V9(2) VALUE ZEROS.
77 Result3 PIC 9(2)V9(2) VALUE ZEROS.
77 Result4 PIC S9(2)V9(2) VALUE ZEROS.
77 Result5 PIC 9(2)V9(2) VALUE ZEROS.
PROCEDURE DIVISION.
Inicio.
DISPLAY "Dame el primer numero: "WITH NO ADVANCING
ACCEPT Num1
DISPLAY "Dame el segundo numero: "WITH NO ADVANCING
ACCEPT Num2
ADD Num1 Num2 GIVING Result3
SUBTRACT Num1 FROM Num2 GIVING Result4
MULTIPLY Num1 BY Num2 GIVING Result1
DIVIDE Num1 INTO Num2 GIVING Result2
COMPUTE Result5 = Num1 /2 * (Num2–7)
DISPLAY "Resultado de la multiplicacion es: ", Result1
DISPLAY "Resultado de la division es: ", Result2
DISPLAY "Resultado de la suma es: ", Result3
DISPLAY "Resultado de la resta es: ", Result4
DISPLAY "Resultado de la expresion es: ", Result5
STOP RUN.

Si nos fijamos bien en la WORKING , hemos usado en los PIC una V y un S, voy a explicarlo un poco:

  • Definimos un valor numérico entero de dos caracteres “9(2)” y otros dos de punto decimal “V9(2)”. Cuando usamos una S delante significa que nos mostrará si es o no negativo el valor.
77 Result1 PIC 9(2)V9(2) VALUE ZEROS
  • También podemos usar la “Z” para que no muestre los ceros de la izquierda. Si observamos con detenimiento, se usan tantas Z como dígitos se componga la variable, indicando el signo delante y el punto que separa los decimales.
77 Result1 PIC -ZZ.ZZ VALUE ZEROS

Nota: A la hora de realizar cálculos aritméticos con COMPUTE, debemos fijarnos bien y utilizar los espacios, es decir, separar siempre la variable del signo aritmético, ya que hay algunos compiladores que lo pueden mal interpretar y dar un error de compilación.

Continúa por Condiciones.

--

--

Ismael Royano Gómez
Enredando con Programación

Técnico Informático curioso, lector activo de las nuevas tecnologías, amante de las series de televisión y usuario del respetable mundo del enredo.