Vous êtes sur la page 1sur 24

INSTRUCCIONES BÁSICAS (II):

Al igual que la clase anterior, vamos a seguir estudiando las sentencias e


instrucciones básicas del lenguaje COBOL, y como ya dijimos su estudio es
imprescindible para poder realizar un programa COBOL. Trataremos
instrucciones de control, aritméticas y de cadenas de caracteres.

PERFORM (llamada)
La instrucción PERFORM como ya se dijo en la clase anterior: tiene un
uso variado, la estudiamos en la clase pasada como bucle y en la clase de hoy
se verá su formato para transferir el control del programa desde un
procedimiento a otro, devolviendo el control una vez finalizado el
procedimiento llamado, a la línea siguiente de la llamada.

Formato 1:

nom_sección1 nom_sección2
PERFORM THRU .
nom_párrafo1 nom_párrafo2

PERFORM transfiere el control del flujo del programa a la


sección1 o párrafo1. Si se usa la cláusula THRU, el control no será
devuelto hasta que no ejecute todas las secciones o párrafos entre la
sección1 y la sección2 o el párrafo1 y el párrafo2.

Ejemplo 1:

PROCEDURE DIVISION.
UNO.
DISPLAY “ “ WITH BLANK SCREEN.
PERFORM DOS.
DISPLAY “ESTOY EN EL PÁRAFO UNO”.
STOP RUN.

DOS.
DISPLAY “ESTOY EN EL PÁRRAFO DOS”.

Ejemplo 2:

PROCEDURE DIVISION.
UNO.
DISPLAY “ “ WITH BLANK SCREEN.
PERFORM DOS THRU TRES.
DISPLAY “ESTOY EN EL PÁRAFO UNO”.
STOP RUN.

1
COBOL Conceptos Básicos

DOS.
DISPLAY “ESTOY EN EL PÁRRAFO DOS”.

TRES.
DISPLAY “ESTOY EN EL PÁRRAFO TRES”.

En ambos ejemplos el programa pasa el control de flujo al párrafo DOS,


pero en el ejemplo 2, el control no es devuelto hasta que se ejecuta el párrafo
TRES por el uso de THRU.

Lo más importante es tener claro el funcionamiento de las llamadas.


Veámoslo gráficamente con un ejemplo:

Ejemplo 3:

UNO.
PERFORM CUATRO CUATRO.

DOS.

TRES.

Ejemplo 4:

UNO.
PERFORM CUATRO THRU
CINCO CUATRO.

DOS.

CINCO.

TRES.

Pero como ya hemos dicho PERFORM es una sentencia con muchos


formatos, y podemos mezclar los dos usos de PERFORM (bucle y
llamada) en uno sólo, con los que los formatos que sabemos se multiplican
por dos. Veamos los formatos:

Formato 2:

nom_sección1 nom_sección2 entero


PERFORM THRU TIMES.
nom_párrafo1 nom_párrafo2 nom_dato

2
COBOL Conceptos Básicos

Como se puede apreciar se ha utilizado todo el formato de PERFORM


para llamadas a otros procedimientos y se le ha añadido el formato del bucle,
con lo que la llamada a la sección1 o párrafo1 se realizará tantas veces
como diga el número entero o el nom_dato.

Ejemplo 5:

PROCEDURE DIVISION.
UNO.
DISPLAY “ “ WITH BLANK SCREEN.
PERFORM DOS 5 TIMES.
DISPLAY “ESTOY EN EL PÁRAFO UNO”.
STOP RUN.

DOS.
DISPLAY “ESTOY EN EL PÁRRAFO DOS”.

En el ejemplo 3 se visualizará “ESTOY EN EL PÁRRAFO DOS” cinco veces,


como le indica el formato de este PERFORM, después se visualizará “ESTOY EN
EL PÁRRAFO UNO”.

Pero al igual que se puede añadir este tipo de bucle al PERFORM


de llamada, también se puede hacer con los demás tipos de bucle.
Veámoslo:

Formato 3:

nom_seccion1 nom_sección2
PERFORM THRU [WITH]
nom_párrafo1 nom_párrafo2

AFTER
TEST UNTIL condición.
BEFORE

Su funcionamiento es igual que el anterior pero, ahora el/los


procedimiento/s no se ejecutan un número determinado de veces, sino hasta
que se cumpla una condición.

Ejemplo 6:

PROCEDURE DIVISION.
INICIO.
PERFORM TECLADO TEST AFTER UNTIL NUMERO = 0.
STOP RUN.

TECLADO.
DISPLAY “INTRODUCE UN NUMERO (CERO PARA SALIR):”.

3
COBOL Conceptos Básicos

ACCEPT NUMERO.

He usado el mismo ejemplo que para explicar el tipo de bucle hasta que
se cumple la condición, pero ahora usando la llamada a un procedimiento.

Formato 4:

nom_seccion1 nom_sección2
PERFORM THRU [WITH]
nom_párrafo1 nom_párrafo2

AFTER nom_dato2
TEST VARYING nom_dato1 FROM
BEFORE literal

nom_dato3
BY UNTIL condición.
literal

Como se puede ver los formatos del PERFORM con ambas tipos de
funcionamiento (bucle y llamada) cumple lo ya estudiado en los formatos del
PERFORM por separado, por parte de la llamada, el funcionamiento es siempre
igual, y por parte del bucle, son iguales a lo explicado la clase anterior, por lo
que no he hecho mucho hincapié en explicar esa parte. Antiguamente sólo se
podía usar PERFORM como llamada y no existían los bucles.

Otro tema a tener en cuenta a la hora de usar PERFORM es el


anidamiento. Dentro del ámbito de una sentencia PERFORM puede
especificarse otra sentencia PERFORM, aunque hay que seguir estas
reglas:

1) El procedimiento PERFORM ejecutado desde el ámbito de otro


PERFORM debe ser totalmente interior o totalmente exterior.

A PERFORM B THRU F A PERFORM B THRU D


B B
C PERFORM D THRU E C PERFORM E THRU F
D D
E E
F F
2) Los ámbitos de dos PERFORM se pueden solapar cuando las
sentencias de llamada para su ejecución está fuera de estos ámbitos.

A PERFORM B THRU D
B
C
D

4
COBOL Conceptos Básicos

E
F PERFORM B THRU E

NOTA: Para dar más dinamismo a la clase y una mejor comprensión por
parte de los alumnos, se debe realizar el ejercicio 6 (de la hoja de ejercicios de
esta clase).

EVALUATE
La sentencia EVALUATE sirve para evaluar el valor de una
variable, expresión o literal y dependiendo de esta, ejecutar una de
las alternativas que se plantean (parecida a la estructura case). Su
uso será válido para controlar menús de opciones o para sustituir a IF
anidados entre otras cosas. Para una mejor explicación veamos primero el
formato:

Formato:

variable variable
literal literal
EVALUATE expresión ALSO expresión ...
TRUE TRUE
FALSE FALSE

ANY
TRUE
WHEN FALSE
condicion
[NOT] {iden | literal | exp} [THRU {iden | literal | exp}]

ANY
TRUE
ALSO FALSE
condicion
[NOT] {iden | literal | exp} [THRU {iden | literal | exp}]

instrucciones

...

[WHEN OTHER instrucciones]


[END-EVALUATE].

A pesar de ser uno de los formatos más grandes, el uso de EVALUATE es


sencillo. Lo que la sentencia EVALUATE evalúa es la variable, el literal o la
expresión que sigue a EVALUATE, así mismo, también se puede hacer uso de
TRUE o FALSE para que se ejecuten aquellas alternativas ciertas o falsas.

5
COBOL Conceptos Básicos

La palabra opcional ALSO nos servirá para poder evaluar varias


expresiones, variables o literales en el mismo EVALUATE, si se usa en
EVALUATE después en cada una de las alternativas también deberá usarse
ALSO.

Para cada una de las alternativas que se quiere ejecutar, se deberá usar
una sentencia WHEN. Esta sentencia WHEN deberá ir seguida de una
condición, un literal o un identificador y se ejecutará el WHEN que cumpla la
condición o tenga el literal correcto. Si lo que sigue a WHEN es ANY, esa
alternativa se ejecutará siempre que no se haya ejecutado otra sentencia
WHEN.

Si se ha ejecutado algún WHEN, no se ejecutará ningún otro, aunque


éste WHEN posterior sea valido o verdadero.

La cláusula WHEN OTHER se debe poner siempre la última y se


ejecutará cuando no se haya ejecutado ningún otro WHEN. Esta cláusula no es
obligatoria.

El final de EVALUATE se puede realizar de dos maneras posibles: o con


END-EVALUATE o con un punto(.) – Aconsejamos el primero –.Al igual que con
otras sentencias que tiene fin de instrucción (como el PERFORM para bucles)
no debe haber ningún punto dentro de la sentencia. Ahora veamos unos
ejemplos del uso de esta sentencia:

Ejemplo 7:

IDENTIFICATION DIVISION.
PROGRAM-ID. EJEMPLO7.

DATA DIVISION.
WORKING-STORAGE SECTION.
77 COLOR-ELEGIDO PIC 9.

PROCEDURE DIVISION.
MENUINICIO.
DISPLAY “ “ WITH BLANK SCREEN.
DISPLAY “1-AZUL”.
DISPLAY “2-VERDE”.
DISPLAY “3-CELESTE”.
DISPLAY “4-ROJO”.
DISPLAY “ELIGE UN COLOR:”.
ACCEPT COLOR-ELEGIDO.

EVALUACION.
EVALUATE COLOR-ELEGIDO
WHEN 1
DISPLAY “HAS ELEGIDO AZUL” WITH FOREGROUND-COLOR 1
WHEN 2
DISPLAY “HAS ELEGIDO CELESTE” WITH FOREGROUND-COLOR 2

6
COBOL Conceptos Básicos

WHEN 3
DISPLAY “HAS ELEGIDO VERDE” WITH FOREGROUND-COLOR 3
WHEN 4
DISPLAY “HAS ELEGIDO ROJO” WITH FOREGROUND-COLOR 4
WHEN OTHER
DISPLAY “NO HAS ELEGIDO NINGÚN COLOR”
END-EVALUATE.
STOP RUN.

Ejemplo 8:

IDENTIFICATION DIVISION.
PROGRAM-ID. EJEMPLO8.

DATA DIVISION.
WORKING-STORAGE SECTION.
77 A PIC S9.
77 B PIC S9.

PROCEDURE DIVISION.
ENTRARTECLADO.
DISPLAY “ “ WITH BLANK SCREEN.
DISPLAY “INTRODUCE EL VALOR DE A:”.
ACCEPT A.
DISPLAY “INTRODUCE EL VALOR DE B:”.
ACCEPT B.

EVALUAROPCION.
EVALUATE A>0 ALSO B>0
WHEN TRUE ALSO TRUE
DISPLAY “LOS DOS NUMEROS SON POSITIVOS”
WHEN FALSE ALSO FALSE
DISPLAY “LOS DOS NUMEROS SON NEGATIVOS”
WHEN TRUE ALSO FALSE
DISPLAY “A ES POSITIVA Y B NEGATIVA”
WHEN FALSE ALSO TRUE
DISPLAY “A ES NEGATIVA Y B POSITIVA”
END-EVALUATE.
STOP RUN.

INSTRUCCIONES ARITMÉTICAS:

El lenguaje COBOL sólo dispone de cinco instrucciones


aritméticas, debido a que este no es el principal cometido de un lenguaje
orientado a la gestión de ficheros. Tanto es así, que aunque la norma ANSI
para el estándar de COBOL permite raíces cuadradas, la versión del
compilador que estamos estudiando no.
Todas las instrucciones aritméticas que posee COBOL tienen en común
una serie de cláusulas, que son:

7
COBOL Conceptos Básicos

• GIVING: Esta cláusula sirve para indicar en qué variable se


guardará el resultado de la operación.
• ROUNDED: Con esta cláusula se redondea el resultado de la
operación dependiendo del PIC del campo resultado. La
cantidad 345.158 en una variable con PIC 999V99 y haciendo uso
de ROUNDED quedaría almacenada como 345.16.
• ON SIZE ERROR y NOT ON SIZE ERROR: Con esta cláusula
podemos controlar si se ha producido o no un
desbordamiento de la capacidad del campo resultado,
dicho desbordamiento se produce cuando la parte entera
de un cálculo no cupiera en el campo receptor.
• END-operación: Así finalizan todas las operaciones
aritméticas en el caso de usar ON SIZE ERROR y NOT ON
SIZE ERROR.

También hay que tener en cuenta que, si la variable donde se guardará


el resultado no tiene el formato adecuado para guardar el signo (Ejem.: PIC
S999V99), este no se almacenará.

ADD
Sirve para sumar. Su formato es el siguiente:

Formato:

nom_dato1 nom_dato2
ADD [CORR] ...TO [GIVING nom_dato3] [ROUNDED]
literal literal
[ON SIZE ERROR instrucciones]
[NOT ON SIZE ERROR instrucciones]
[END-ADD].

ADD suma todos los datos que preceden a TO y los agrega a nom_dato2,
donde se guarda el resultado. Si se especifica la opción GIVING, el resultado
se guarda en el nom_dato3. Las demás opciones se han explicado
anteriormente.

Ejemplo 8.1:

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.

8
COBOL Conceptos Básicos

PROCEDURE DIVISION.
INICIO.

ADD UNO TRES 5 TO RESULTADO.

Resultado = 565

ADD UNO TRES TO 5 GIVING RESULTADO.

Resultado = 555

ADD CORR VALORES TO OTROS.

Variable DOS del campo compuesto OTROS = 390

SUBTRACT
Permite restar. Su formato es el siguiente:

Formato:

nom_dato1 nom_dato2
SUBTRACT ... FROM [GIVING nom_dato3] [ROUNDED]
Literal literal
[ON SIZE ERROR instrucciones]
[NOT ON SIZE ERROR instrucciones]
[END-SUBTRACT].

El nom_dato1 hace la función de sustraendo y nom_dato2 de minuendo.


El resultado se guarda en este último si no se especifica la opción GIVING con
el nom_dato3. SUBTRACT da la posibilidad de usar más de un nom_dato1, en
ese caso se suman todos los sustraednos y se restan al minuendo.

Ejemplo 8.2:

SUBTRACT UNO TRES 5 FROM RESULTADO.

Resultado = – 545

SUBTRACT UNO 5 FROM TRES GIVING RESULTADO.

Resultado = 540 – 10 – 5 = 525

SUBTRACT CORR VALORES FROM OTROS.

Variable DOS del campo compuesto OTROS = 170

MULTIPLY
Sirve para realizar multiplicaciones. Su formato es el siguiente:

9
COBOL Conceptos Básicos

Formato:

nom_dato1 nom_dato2
MULTIPLY BY [GIVING nom_dato3] [ROUNDED]
literal literal
[ON SIZE ERROR instrucciones]
[NOT ON SIZE ERROR instrucciones]
[END-MULTIPLY].

MULTIPLY sirve para multiplicar el nom_dato1 por nom_dato2. La


multiplicación es posiblemente donde más se use ON SIZE ERROR y NOT ON
SIZE ERROR, debido a los resultados tan grandes que pueden dar las
multiplicaciones. El resto del formato es igual a los demás.

DIVIDE
Sirve para dividir. Su formato es el siguiente:

Formato:

nom_dato1 BY nom_dato2
DIVIDE [GIVING nom_dato3] [ROUNDED]
literal INTO literal
[REMAINDER nom_dato4]
[ON SIZE ERROR instrucciones]
[NOT ON SIZE ERROR instrucciones]
[END-DIVIDE].

Con DIVIDE se pueden realizar divisiones. Si se usa BY el nom_dato1


hace de dividendo y nom_dato2 de divisor. Si en lugar de usar BY se usa INTO
el papel de nom_dato1 y nom_dato2 se intercambian. En ambos casos si se
omite GIVING el resultado irá a nom_dato2.

DIVIDE 10 INTO TRES.

Tres = 540/10 = 54

DIVIDE 7 INTO TRES GIVING RESULTADO REMAINDER RESTO.

Resultado = 540/7 = 77
Resto = 540 – 539 = 1

Otra opción que se puede usar con DIVIDE es REMAINDER, esta opción
sirve para indicar en qué variable se va a guardar el resto de la división. Para
que el resto de la división sea el correcto (si no se hace así el resto da un
número con decimales) el PIC de la variable que guarda el resultado no debe
llevar decimales y el PIC de la variable que guarda el resto tampoco.

10
COBOL Conceptos Básicos

Ejemplo 9:

IDENTIFICATION DIVISION.
PROGRAM-ID. EJEMPLO9.

DATA DIVISION.
WORKING-STORAGE SECTION.
77 NUM1 PIC S99.
77 NUM2 PIC S99.
77 RESU PIC S9999 DISPLAY SIGN LEADING SEPARATE.
77 RESTO PIC S99.

PROCEDURE DIVISION.
INICIO.
DISPLAY “ “ WITH BLANK SCREEN.
DISPLAY “INTRODUCE UN NÚMERO:”.
ACCEPT NUM1.
DISPLAY “INTRODUCE OTRO NÚMERO:”.
ACCEPT NUM2.
PERFORM SUMAR THRU DIVIDIR.
STOP RUN.

SUMAR.
ADD NUM1 TO NUM2 GIVING RESU.
DISPLAY “LA SUMA ES:” RESU.

RESTAR.
SUBTRACT NUM2 FROM NUM1 GIVING RESU.
DISPLAY “LA RESTA ES:” RESU.

MULTIPLICAR.
MULTIPLY NUM1 BY NUM2 GIVING RESU.
DISPLAY “LA MULTIPLICACIÓN ES:” RESU.

DIVIDIR.
DIVIDE NUM1 BY NUM2 GIVING RESU REMAINDER RESTO.
DISPLAY “LA DIVISION ES:” RESU.
DISPLAY “EL RESTO ES:” RESTO.

NOTA: Para dar más dinamismo a la clase y una mejor comprensión por
parte de los alumnos, se debe realizar el ejercicio 11 (de la hoja de ejercicios
de esta clase).

COMPUTE
Esta instrucción nos permite realizar operaciones aritméticas usando
expresiones y operadores aritméticos (+, - ,*, /, **), así como los paréntesis
para delimitar el orden de ejecución de las operaciones.

Formato:

11
COBOL Conceptos Básicos

nom_dato2
COMPUTE nom_dato1 [ROUNDED]= expresión aritmética
literal
[ON SIZE ERROR instrucciones]
[NOT ON SIZE ERROR instrucciones]
[END-COMPUTE].
No obstante su uso debe evitarse en la medida de lo posible, ya que su
uso puede ralentizar el programa.

Ejemplo 10:

IDENTIFICATION DIVISION.
PROGRAM-ID. EJEMPLO10.

DATA DIVISION.
WORKING-STORAGE SECTION.
77 INTENTOS PIC 99.
77 CONVERTIDOS PIC 99.
77 PORCENTAJE PIC 999.

PROCEDURE DIVISION.
INICIO.
DISPLAY “ “ WITH BLANK SCREEN.
DISPLAY “NUMERO DE TIROS INTENTADOS:”.
ACCEPT INTENTOS.
DISPLAY “NUMERO DE TIROS CONVERTIDOS:”.
ACCEPT CONVERTIDOS.

OPERACION.
COMPUTE PORCENTAJE ROUNDED = (CONVERTIDOS * 100) / INTENTOS.
DISPLAY “EL PORCENTAJE DE TIRO ES DE UN “ PORCENTAJE “%”.
STOP RUN.

OTRAS INSTRUCCIONES (MANIPULACIÓN DE CARACTERES):

Aunque como ya se ha dicho las instrucciones más potentes de COBOL


se centran en las instrucciones para manejar datos de los ficheros, COBOL
también dispone de instrucciones de manipulación de cadenas de caracteres.
Son las siguientes:

EXAMINE solo para el compilador osvs


Esta sentencia sirve para dos cosas, permite contar el número de veces
que se repite un determinado carácter dentro de un campo y también permite
reemplazar el carácter por otro. Como su función es doble, tiene dos formatos,
uno para cada uno de las funciones. Aunque en ambos formatos la sentencia
EXAMINE hace distinción entre mayúsculas y minúsculas.

Formato 1: Cómputo de ocurrencias.

12
COBOL Conceptos Básicos

UNTIL FIRST
EXAMINE nom_dato TALLYING ALL carácter.
LEADING

Con este primer formato EXAMINE cuenta en la variable que indique


nom_dato del modo elegido (UNTIL FIRST, ALL, LEADING) el carácter indicado.
El resultado de dicho conteo se quedará guardado en un campo llamado
TALLY.

Los modos u opciones sirven para:

• UNTIL FISRT: Cuenta todos los caracteres, empezando por la


izquierda, del nom_dato hasta que se encuentra uno coincidente
con el carácter especificado.
• ALL: Cuenta todos los caracteres del nom_dato que coincidan con
el carácter indicado.
• LEADING: Cuenta las veces que se repita de manera consecutiva
el carácter indicado. Si el carácter buscado no está en la primera
posición de la cadena, el resultado será cero.

Ejemplo 11:

IDENTIFICATION DIVISION.
PROGRAM-ID. EJEMPLO11.

DATA DIVISION.
WORKING-STORAGE SECTION.
77 FRASE PIC X(10).

PROCEDURE DIVISION.
INICIO.
DISPLAY “INTRODUCE UNA FRASE:” WITH BLANK SCREEN.
ACCEPT FRASE.
EXAMINE FRASE TALLYING ALL “A”.
DISPLAY “LA FRASE TIENE “ TALLY “ VECES LA LETRA A”.
STOP RUN.

EXAMINE en este ejemplo cuenta todas las letras A que contendrá la


frase FRASE.

Formato 2: Sustitución de caracteres.

FIRST
UNTIL FIRST
EXAMINE nom_dato REPLACING carácter1 BY carácter2.
ALL
LEADING

En este segundo formato EXAMINE reemplaza en el nom_dato del modo


especificado el carácter1 por el carácter2.

13
COBOL Conceptos Básicos

Los modos son:

• FIRST: Solo sustituirá el primer carácter coincidente con carácter1 por


el carácter2 en la cadena nom_dato.
• UNTIL FIRST: Sustituirá todos los caracteres de nom_dato por
carácter2 hasta encontrar uno que coincida con carácter1.
• ALL: Sustituirá todos los caracteres del nom_dato que coincidan con
carácter1 por carácter2.
• LEADING: Se sustituirán todos los caracteres consecutivos e idénticos
al carácter1 del nom_dato por el carácter2 hasta encontrar uno
distinto. Al igual que en el formato anterior. Si el primer carácter no
es coincidente no se sustituirá ningún carácter.

Ejemplo 12:

IDENTIFICATION DIVISION.
PROGRAM-ID. EJEMPLO12.

DATA DIVISION.
WORKING-STORAGE SECTION.
77 FRASE PIC X(10) VALUE “CASA”.

PROCEDURE DIVISION.
INICIO.
DISPLAY “ “ WITH BLANK SCREEN.
DIPLAY “LA FRASE ANTES DE EXAMINE:” FRASE.
EXAMINE FRASE REPLACING FIRST “A” BY “O”.
DISPLAY “LA FRASE DESPUÉS DE EXAMINE:” FRASE.
STOP RUN.

El ejemplo visualizará COSA una vez ejecutada la instrucción EXAMINE


en vez de CASA, que era el valor inicial de la variable FRASE.

Para hacer uso de la instrucción EXAMINE en el archivo COBOL.DIR debe


aparecer la directiva OSVS, o bien añadir la directiva OSVS en la línea de
comandos a la hora de compilar el programa.

C:\LENGUAJE\COBOL>COBOL A:\EJEM10.CBL OSVS;

Si no se hace uso de esta directiva el compilador de COBOL dará un


error por no reconocer la instrucción EXAMINE.

TRANSFORM solo para el compilador osvs


Con TRANSFORM se podrán sustituir algunos o todos los caracteres de
una cadena por otros según la norma o modelo que se establezca. Un
programa con esta instrucción también debe ser compilado con la directiva
OSVS.

14
COBOL Conceptos Básicos

Formato:

TRANSFORM nom_dato FROM dato1 TO dato2.

TRANSFORM nom_dato CHARACTERS FROM dato1 TO dato2.

En el nom_dato se podrá la cadena de caracteres que se quiera


transformar, y en dato1 se establecerán los caracteres que se quieren
sustituir. Por último en el dato2 los
caracteres que sustituirán a los indicados en el dato1. Pero mejor será verlo
en un ejemplo:

Ejemplo 13:

IDENTIFICATION DIVISION.
PROGRAM-ID. EJEMPLO13.

DATA DIVISION.
WORKING-STORAGE SECTION.
77 CAMPO PIC X(10) VALUE “MADERA”.

PROCEDURE DIVISION.
INICIO.
DISPLAY “ “ WITH BLANK SCREEN.
DIPLAY “EL CAMPO ANTES DE TRANSFORM:” CAMPO.
TRANSFORM CAMPO FROM “MDR” TO “CST”.
DISPLAY “EL CAMPO DESPUÉS DE TRANSFORM:” CAMPO.

FIN.
STOP RUN.

En este ejemplo la variable CAMPO que tiene un valor de “MADERA” una


vez aplicada la instrucción TRANSFORM el resultado será “CASETA”, ya que la
norma utilizada cambia todas las M por C, las D por S y las R por T.

Si el campo contuviese más de alguno de los caracteres del dato1, todos


serían sustituidos por su correspondiente carácter del dato2.

TRANSFORM “1365861” FROM “16” TO “24”.

En este pequeño ejemplo se puede ver mejor lo dicho anteriormente. La


cadena “1365861” se transformaría en “2345842”.

Otro forma de usar TRANSFORM es utilizarlo para convertir una cadena


de mayúsculas a minúsculas o viceversa.

TRANSFORM CAMPO FROM “ABCDEFGHIJKLMNÑOPQRSTUVWXYZ”


TO “abcdefghijklmnñopqrstuvwxyz”.

15
COBOL Conceptos Básicos

INSPECT
La instrucción INSPECT es posiblemente la sentencia más potente que
existe a la hora de manipular cadenas. No necesita ninguna directiva adicional
y al igual que EXAMINE, puede realizar dos funciones. Permite contar
caracteres o cadenas de caracteres y también sustituirlas. Así que, con
INSPECT habrá también dos formatos.

Formato 1: Cómputo de caracteres.

ALL nom_dato2
INSPECT nom_dato1 TALLYING contador FOR LEADING literal1
CHARACTERS

BEFORE nom_dato3
INITIAL .
AFTER literal2

Con este formato INSPECT examina el nom_dato1 y cuenta, guardando


el resultado en la variable contador (esta variable debe ser declarada en la
WORKING-STORAGE SECTION) que va después de TALLYING, el número de
veces que se repite nom_dato2 o el literal1, según el modo que se elija.

• ALL: Cuenta todas las veces que aparece el nom_dato2 o el literal1


en el nom_dato1
• LEADING: Cuenta todas las veces que aparece el nom_dato2 o el
literal1 en el nom_dato1 siempre que aparezcan desde la primera
posición y de forma contigua.
• CHARACTERS: Cuenta el tamaño del nom_dato1, tenga o no datos.

Opcionalmente también se puede indicar cuando ha de comenzar o


parar el conteo con las opciones:

• BEFORE: Indica que el computo debe interrumpirse después de


encontrar la cadena coincidente con el nom_dato3 o literal2.
• AFTER: Indica que le conteo debe comenzar después de encontrar
la cadena coincidente con el nom_dato3 o literal2.

Ejemplo 14:

IDENTIFICATION DIVISION.
PROGRAM-ID. EJEMPLO14.

DATA DIVISION.
WORKING-STORAGE SECTION.
77 CAMPO1 PIC X(18) VALUE “ANITA LAVA LA TINA”.

16
COBOL Conceptos Básicos

77 CAMPO2 PIC X(30) VALUE “ESTABA YO ESCONDIDO EN ESPAÑA”.


77 CONT PIC 99.

PROCEDURE DIVISION.
INICIO.
DISPLAY “ “ WITH BLANK SCREEN.

COMPUTO1.
DIPLAY “EL CAMPO 1:” CAMPO1.
INSPECT CAMPO1 TALLYING CONT FOR ALL “A LA”.
DISPLAY “VECES QUE APACERE“ QUOTE “A LA” QUOTE “ SON:” CONT.
COMPUTO2.
DIPLAY “EL CAMPO 2:” CAMPO2.
INSPECT CAMPO2 TALLYING CONT FOR ALL “ES” AFTER INITIAL “YO”.
DISPLAY “VECES QUE APACERE “ QUOTE “ES” QUOTE
“DESPUÉS DE” QUOTE “YO” QUOTE “ SON:” CONT.

FIN.
STOP RUN.

En el ejemplo anterior se utiliza INSPECT con el formato de cómputo de


ocurrencias sin opciones en el párrafo COMPUTO1 y con la opción AFTER
INITIAL en el siguiente párrafo.

Formato 2: Sustitución de caracteres.

FIRST nom_dato2
ALL nom_dato3
INSPECT nom_dato1 REPLACING LEADING literal1 BY
literal2
CHARACTERS

BEFORE nom_dato4
INITIAL .
AFTER literal3

La manera de funcionar de este formato INSPECT es idéntica a la


anterior, con la excepción de que ahora en vez de contar ocurrencias, estas se
sustituyen por lo que diga nom_dato3 o literal2. Si se usa CHARACTERS se
cambiarán todos los caracteres, pero nom_dato3 o literal2 sólo puede
contener un carácter. A este formato se le ha añadido FIRST, que tiene el
mismo significado que en EXAMINE.

Las opciones BEFORE y AFTER funcionan igual que el formato de


cómputo de ocurrencias.

Como se puede apreciar INSPECT parece que funcione o haga las


mismas cosas que EXAMINE, pero hay una diferencia. Con EXAMINE, sólo
podías contar o sustituir un carácter, en cambio con INSPECT se puede hacer

17
COBOL Conceptos Básicos

con una cadena de caracteres, y además se puede especificar donde


queremos que comience el cómputo o la sustitución de caracteres.

Ejemplo 15:

IDENTIFICATION DIVISION.
PROGRAM-ID. EJEMPLO15.

DATA DIVISION.
WORKING-STORAGE SECTION.
77 CAMPO1 PIC X(30) VALUE “ESTABA EL RECOGIENDO EL CORREO”.
77 CAMPO2 PIC X(35) VALUE “LOS CHICOS JUGABAN CON OTROS CHICOS”.

PROCEDURE DIVISION.
INICIO.
DISPLAY “ “ WITH BLANK SCREEN.

CAMBIO1.
DIPLAY “EL CAMPO 1:” CAMPO1.
INSPECT CAMPO1 REPLACING FIRST “EL” BY “YO”.
DISPLAY “EL CAMPO 1 DESPUÉS DE INSPECT:” CAMPO1.

CAMBIO2.
DIPLAY “EL CAMPO 2:” CAMPO2.
INSPECT CAMPO2 REPLACING ALL “CHICOS” BY “PEQUES”
BEFORE INITIAL “JUGABAN”.
DISPLAY “EL CAMPO 2 DESPUÉS DE INSPECT:” CAMPO2.

FIN.
STOP RUN.

El ejemplo nos muestras las dos formas de reemplazar cadenas de


caracteres con INSPECT, con y sin opción de comienzo o final. En el primer
cambio solo el primer “EL” será cambiado por “YO” por el modificador FIRST.

Ya en el segundo cambio aunque hay dos palabras “CHICOS” en el


campo2, y a pesar de usar el modificador “ALL” (que los cambie todos) solo se
cambia el primero; esto es debido a la opción BEFORE, que cambia hasta que
se encuentra con la cadena especificada tras BEFORE INITIAL(en este caso
“JUGABAN”).

Hay que tener en cuenta a la hora de usar INSPECT que para que el
cambio sea correcto, la cadena cambiada debe tener el mismo número de
caracteres que la nueva cadena. En el ejemplo anterior no podría haber hecho
el cambio de CHICOS por NIÑOS, ya que CHICOS tiene seis caracteres y NIÑOS
cinco.

Formato 3: Sustitución de caracteres.

18
COBOL Conceptos Básicos

literal-4
literal-5
INSPECT nombre dato-1 CONVERTING TO
nombre dato-6 nombre dato-7
BEFORE literal-2
INITIAL ...
AFTER nombre dato-4

CONVERTING indica que hay que convertir cada carácter de una cadena
de caracteres a los correspondientes caracteres de otra. Ambas cadenas
deben tener la misma longitud.

STRING
STRING sirve para concatenar o enlazar el contenido total o parcial de
dos cadenas de caracteres, guardando el resultado en otra variable. Para
poder realizar este enlace, los datos deben ser alfanuméricos. Veámos el
formato de STRING.

Formato:

nom_dato1 nom_dato2
STRING ... DELIMITED BY literal2 INTO nom_dato3
literal1 SIZE
[WITH POINTER puntero]
[ON OVERFLOW instrucciones]
[NOT ON OVERFLOW instrucciones]
[END-STRING].

Los datos que concatena son los datos que hay detrás de la instrucción
STRING. DELIMITED BY sirve para indicarle cual va a ser el límite de la
concatenación, o bien por algún literal o variable (excluido este) o bien por el
tamaño del nom_dato3 (opción SIZE). El nom_dato3 es el campo donde se
guarda el resultado de la concatenación y el tamaño de este campo debe ser
lo suficientemente grande para contener los datos de los campos a
concatenar o como se ha dicho antes especificar la cláusula SIZE.

Es posible indicarle a partir de qué posición queremos empezar la


concatenación con la sentencia WITH POINTER, es decir, la posición en la que
va a ser almacenado el primer carácter transferido. Anteriormente a la
variable puntero hay que asignarle el valor. Esta variable irá cambiando de
valor, la propia instrucción STRING lo hará, cada vez que se vaya
concatenando un carácter le sumará uno.

Con ON OVERFLOW y NOT ON OVERFLOW podemos controlar si la


variable puntero tiene un valor mayor al del tamaño del campo receptor. Se

19
COBOL Conceptos Básicos

ejecutarán las instrucciones que siguen a ON OVERFLOW cuando ese puntero


sea superior al tamaño o inferior a 1. En caso de que esto no ocurra se
ejecutarán las sentencias que siguen a NOT ON OVERFLOW. Estas cláusulas no
son obligatorias.

Al igual que otras muchas instrucciones STRING tiene una cláusula para
el cierre de la instrucción END-STRING. No es obligatoria, pero si aconsejable
si se usa ON OVERFLOW y NOT ON OVERFLOW, si no se usa, la instrucción
debe acabar con un punto(.).

Ejemplo 16:

IDENTIFICATION DIVISION.
PROGRAM-ID. EJEMPLO16.

DATA DIVISION.
WORKING-STORAGE SECTION.
77 DATO1 PIC X(15) VALUE “EL VALOR DE PI “.
77 DATO2 PIC X(15) VALUE “ ES DE 3.141592”.
77 CAMPOR PIC X(45).
77 DATO3 PIC X(15) VALUE “ESTA CADENA ES “.
77 DATO4 PIC X(15) VALUE “DEMASIADO LARGA”.
77 CAMPOD PIC X(25).

PROCEDURE DIVISION.
INICIO.
DISPLAY “ “ WITH BLANK SCREEN.
STRING DATO1 “APROXIMADAMENTE” DATO2
DELIMITED BY SIZE INTO CAMPOR.
DISPLAY “LA FRASE CONCATENADA ES:” CAMPOR.
STRING DATO3 DATO4 DELIMITED BY SIZE INTO CAMPOD
ON OVERFLOW
DISPLAY “OPERACION INCORRECTA, DESBORDAMIENTO”
NOT ON OVERFLOW
DISPLAY “LA FRASE CONCATENADA ES:” CAMPOD
END-STRING.
STOP RUN.
UNSTRING
Esta sentencia sirve para dividir el contenido de un campo en varios
campos. Es decir hace lo contrario de STRING. Veamos el formato:

Formato:

nom_dato2 nom_dato3
UNSTRING nom_dato1 DELIMITED BY [ALL] OR [ALL] ...
literal1 literal2

[DELIMITER IN nom_dato4]
INTO nom_datoN ...
[COUNT IN nom_dato5]

[WITH POINTER puntero]

20
COBOL Conceptos Básicos

[TALLYING IN nom_dato6]
[ON OVERFLOW instrucciones]
[NOT ON OVERFLOW instrucciones]
[END-UNSTRING].

El nom_dato1 es el campo que queremos dividir, podemos hacer las


divisiones delimitadas por el nom_dato2 o el literal1 o por el nom_dato3 o
literal2, es decir, campos alfanuméricos elementales que indican por donde
hay que separar la cadena original. Podemos usar tantas veces el operador OR
como sea necesario. ALL sirve para las posibles ocurrencias consecutivas
indicadas por nom_dato2 o nom_dato3 como delimitadores, se tratarán como
si fuesen una única ocurrencia. Por ejemplo. ALL “AB” significa que las
cadenas “AB”, “ABAB”, “ABABAB”, etc. serán consideradas como una única
ocurrencia “AB”. Cada literal puede ser un literal no numérico o una constante
figurativa excepto ALL.

Tras INTO van los campos donde se van a guardar las divisiones hechas
al nom_dato1; habrá que poner tantos nom_datoN como divisiones al
nom_dato1 queramos hacer.

Si se especifica la opción DELIMITER IN, los caracteres delimitadores son


tratados como datos alfanuméricos elementales y almacenados en los campos
referenciados por nombre dato-5.

Si se especifica la opción COUNT IN, el valor correspondiente al número


de caracteres examinados, excluyendo los delimitadores, es almacenado en
el campo referenciado por nombre dato-6.

DELIMITER y COUNT solamente pueden utilizarse si se ha especificado la


opción DELIMITED BY.

La cláusula WITH POINTER puntero sirve para especificarle a partir de


qué posición queremos dividir el nom_dato1.

TALLYING nos sirve para guardar en el nom_dato6 el número de partes


en la que se ha dividido nom_dato1. Las cuenta la instrucción UNSTRING
automáticamente.

ON OVERFLOW ejecuta la instrucciones que tiene a continuación cuando


el valor de puntero es menor que 1 o mayor que el tamaño del nom_dato1, o
bien que todos los nom_datoN está ya utilizados y completos. NOT ON
OVERFLOW se ejecutará en el resto de los casos.

Ejemplo 17:

IDENTIFICATION DIVISION.
PROGRAM-ID. EJEMPLO17.

DATA DIVISION.

21
COBOL Conceptos Básicos

WORKING-STORAGE SECTION.
77 DATO PIC X(25) VALUE "17/04/03-23:15:55".
77 DIA PIC XX.
77 MES PIC XX.
77 ANNO PIC XX.
77 HOR PIC XX.
77 MIN PIC XX.
77 SEC PIC XX.
77 CON PIC 99.

PROCEDURE DIVISION.
INICIO.
DISPLAY " " WITH BLANK SCREEN.
UNSTRING DATO DELIMITED BY “/” OR “-” OR “:”
INTO DIA MES ANNO HOR MIN SEC
TALLYING CON
END-UNSTRING.
DISPLAY “FECHA:” DIA “/” MES “/” ANNO.
DISPLAY “HORA:” HOR “:” MIN “:” SEC.
DISPLAY “LA CADENA SE HA DIVIDIDO EN “ CON “ PARTES”.
STOP RUN.

El ejemplo muestra como la variable DATO es dividida en varias partes,


cada vez que se encuentra un delimitador ( “/” , “-” , “:” ). Las partes van en
cada una de las variable que hay a continuación de INTO y en la variable CON
se queda en número de partes que se ha hecho de la variable DATO.

EJERCICIOS:

1) Ejercicio escrito (solo la PROCEDURE). Realizar un programa que


visualice los 20 primeros número impares. Realizarlo de varias
maneras con el PERFORM, tanto de bucle como de llamada.

2) Dada una serie de números introducidos por teclado, contabilizar


cuántos de ellos son positivos, negativos y cero. El operador finalizará
el proceso de introducir datos, tecleando el numero 999.

3) Introducir un número de tres cifras por teclado y decir a que centena


pertenece.(realizas un divide entre 100 y te quedas con el cociente o
utilizas un unstring)

4) Introducir una frase por teclado y si está en mayúsculas convertirla a


minúsculas y viceversa. (instrucción transform, condiciones
ALPHABETIC-LOWER y ALPHABETIC-UPPER)

5) Introduce una frase por teclado y contar cuantas palabras contiene.

22
COBOL Conceptos Básicos

6) Introducir una frase por teclado y cambiar todas las vocales por A.
(realizamos tantos inspect como vocales haya)

7) Realizar un programa donde me muestre un menú donde pueda


seleccionar entre alguna de las operaciones aritméticas (suma,
resta, división y producto). Una vez elegida la operación a realizar, el
programa me pedirá dos números por teclado, mostrándome
posteriormente el resultado de dicha operación. El programa no
finaliza hasta que seleccione la opción 5 de salida.

8) Dados dos números A y B, enteros y positivos, introducidos por


teclado, realizar un programa que calcule su producto mediante
sumas sucesivas y visualice el resultado.

9) Realizar un programa que permita introducir por teclado el nombre y


sueldo de los empleados de una empresa, y decida cuál es el nombre
del empleado que tiene el mayor sueldo, el de menor sueldo y el
sueldo medio del conjunto, visualizando el resultado. Considérese
que no puede haber dos sueldos iguales. El proceso termina cuando
el operador pulsa “*”.

10) Se introduce por teclado una secuencia de informaciones, cada una


de ellas compuesta por un nombre y seis números enteros positivos
correspondientes al nombre de un alumno y las calificaciones que ha
obtenido en sus seis asignaturas. La secuencia termina al introducir el
nombre FIN, o cuando el número de alumnos introducido sea mayor
que 10.
Se desea un programa que visualice un listado de calificaciones en el
que ha de figurar el nombre del alumno seguido de su nota media.
Finalmente se imprimirá la nota media del grupo.

Ejemplo de datos de ENTRADA:


PEDRO ALVAREZ GOMEZ 5 8 7 6 6 8
.........................................................
CURRO LÓPEZ LÓPEZ 7 7 8 9 6 6
FIN
Ejemplo de datos de SALIDA:
LISTADO DE CALIFICACIONES
------------------------------------------------
Nombre del Alumno Nota Media
PEDRO ALVAREZ GOMEZ 6.6
........................................
........................................
CURRO LÓPEZ LÓPEZ 7.1
Nota Media de Grupo: 6.8

23
COBOL Conceptos Básicos

24

Vous aimerez peut-être aussi