Académique Documents
Professionnel Documents
Culture Documents
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
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”.
Ejemplo 3:
UNO.
PERFORM CUATRO CUATRO.
DOS.
TRES.
Ejemplo 4:
UNO.
PERFORM CUATRO THRU
CINCO CUATRO.
DOS.
CINCO.
TRES.
Formato 2:
2
COBOL Conceptos Básicos
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”.
Formato 3:
nom_seccion1 nom_sección2
PERFORM THRU [WITH]
nom_párrafo1 nom_párrafo2
AFTER
TEST UNTIL condición.
BEFORE
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.
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
...
5
COBOL Conceptos Básicos
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.
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:
7
COBOL Conceptos Básicos
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.
Resultado = 565
Resultado = 555
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].
Ejemplo 8.2:
Resultado = – 545
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].
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].
Tres = 540/10 = 54
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.
12
COBOL Conceptos Básicos
UNTIL FIRST
EXAMINE nom_dato TALLYING ALL carácter.
LEADING
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.
FIRST
UNTIL FIRST
EXAMINE nom_dato REPLACING carácter1 BY carácter2.
ALL
LEADING
13
COBOL Conceptos Básicos
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.
14
COBOL Conceptos Básicos
Formato:
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.
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.
ALL nom_dato2
INSPECT nom_dato1 TALLYING contador FOR LEADING literal1
CHARACTERS
BEFORE nom_dato3
INITIAL .
AFTER 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
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.
FIRST nom_dato2
ALL nom_dato3
INSPECT nom_dato1 REPLACING LEADING literal1 BY
literal2
CHARACTERS
BEFORE nom_dato4
INITIAL .
AFTER literal3
17
COBOL Conceptos Básicos
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.
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.
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.
19
COBOL Conceptos Básicos
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]
20
COBOL Conceptos Básicos
[TALLYING IN nom_dato6]
[ON OVERFLOW instrucciones]
[NOT ON OVERFLOW instrucciones]
[END-UNSTRING].
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.
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.
EJERCICIOS:
22
COBOL Conceptos Básicos
6) Introducir una frase por teclado y cambiar todas las vocales por A.
(realizamos tantos inspect como vocales haya)
23
COBOL Conceptos Básicos
24