48565983-Conceptos-BasicosII-COBOL

download 48565983-Conceptos-BasicosII-COBOL

of 24

Transcript of 48565983-Conceptos-BasicosII-COBOL

  • INSTRUCCIONES BSICAS (II):

    Al igual que la clase anterior, vamos a seguir estudiando las sentencias e instrucciones bsicas del lenguaje COBOL, y como ya dijimos su estudio es imprescindible para poder realizar un programa COBOL. Trataremos instrucciones de control, aritmticas y de cadenas de caracteres.

    PERFORM (llamada)La instruccin 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 lnea siguiente de la llamada.

    Formato 1:nom_seccin1 nom_seccin2

    PERFORM THRU .nom_prrafo1 nom_prrafo2

    PERFORM transfiere el control del flujo del programa a la seccin1 o prrafo1. Si se usa la clusula THRU, el control no ser devuelto hasta que no ejecute todas las secciones o prrafos entre la seccin1 y la seccin2 o el prrafo1 y el prrafo2.

    Ejemplo 1:PROCEDURE DIVISION.UNO. DISPLAY WITH BLANK SCREEN. PERFORM DOS. DISPLAY ESTOY EN EL PRAFO UNO. STOP RUN.DOS. DISPLAY ESTOY EN EL PRRAFO DOS.Ejemplo 2:PROCEDURE DIVISION.UNO. DISPLAY WITH BLANK SCREEN. PERFORM DOS THRU TRES. DISPLAY ESTOY EN EL PRAFO UNO. STOP RUN.

    1

  • COBOL Conceptos Bsicos

    DOS. DISPLAY ESTOY EN EL PRRAFO DOS.TRES. DISPLAY ESTOY EN EL PRRAFO TRES.

    En ambos ejemplos el programa pasa el control de flujo al prrafo DOS, pero en el ejemplo 2, el control no es devuelto hasta que se ejecuta el prrafo TRES por el uso de THRU.

    Lo ms importante es tener claro el funcionamiento de las llamadas. Vemoslo grficamente con un ejemplo:

    Ejemplo 3:

    Ejemplo 4:

    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 slo, con los que los formatos que sabemos se multiplican por dos. Veamos los formatos:

    Formato 2: nom_seccin1 nom_seccin2 enteroPERFORM THRU TIMES. nom_prrafo1 nom_prrafo2 nom_dato

    2

    UNO.PERFORM CUATRO

    DOS.

    UNO.PERFORM CUATRO THRU CINCODOS.

    CUATRO.

    CUATRO.

    CINCO.

    TRES.

    TRES.

  • COBOL Conceptos Bsicos

    Como se puede apreciar se ha utilizado todo el formato de PERFORM para llamadas a otros procedimientos y se le ha aadido el formato del bucle, con lo que la llamada a la seccin1 o prrafo1 se realizar tantas veces como diga el nmero entero o el nom_dato.

    Ejemplo 5:PROCEDURE DIVISION.UNO. DISPLAY WITH BLANK SCREEN. PERFORM DOS 5 TIMES. DISPLAY ESTOY EN EL PRAFO UNO. STOP RUN.DOS. DISPLAY ESTOY EN EL PRRAFO DOS.

    En el ejemplo 3 se visualizar ESTOY EN EL PRRAFO DOS cinco veces, como le indica el formato de este PERFORM, despus se visualizar ESTOY EN EL PRRAFO UNO.

    Pero al igual que se puede aadir este tipo de bucle al PERFORM de llamada, tambin se puede hacer con los dems tipos de bucle. Vemoslo:

    Formato 3: nom_seccion1 nom_seccin2 PERFORM THRU [WITH] nom_prrafo1 nom_prrafo2

    AFTERTEST UNTIL condicin.

    BEFORE

    Su funcionamiento es igual que el anterior pero, ahora el/los procedimiento/s no se ejecutan un nmero determinado de veces, sino hasta que se cumpla una condicin.

    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 Bsicos

    ACCEPT NUMERO.

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

    Formato 4: nom_seccion1 nom_seccin2 PERFORM THRU [WITH] nom_prrafo1 nom_prrafo2

    AFTER nom_dato2TEST VARYING nom_dato1 FROM

    BEFORE literal

    nom_dato3 BY UNTIL condicin.

    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 slo se poda usar PERFORM como llamada y no existan 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 DB BC PERFORM D THRU E C PERFORM E THRU FD DE EF F

    2) Los mbitos de dos PERFORM se pueden solapar cuando las sentencias de llamada para su ejecucin est fuera de estos mbitos.

    A PERFORM B THRU DBCD

    4

  • COBOL Conceptos Bsicos

    EF PERFORM B THRU E

    NOTA: Para dar ms dinamismo a la clase y una mejor comprensin 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, expresin o literal y dependiendo de esta, ejecutar una de las alternativas que se plantean (parecida a la estructura case). Su uso ser vlido para controlar mens de opciones o para sustituir a IF anidados entre otras cosas. Para una mejor explicacin veamos primero el formato:

    Formato: variable variable literal literal EVALUATE expresin ALSO expresin ... 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 ms grandes, el uso de EVALUATE es sencillo. Lo que la sentencia EVALUATE evala es la variable, el literal o la expresin que sigue a EVALUATE, as mismo, tambin se puede hacer uso de TRUE o FALSE para que se ejecuten aquellas alternativas ciertas o falsas.

    5

  • COBOL Conceptos Bsicos

    La palabra opcional ALSO nos servir para poder evaluar varias expresiones, variables o literales en el mismo EVALUATE, si se usa en EVALUATE despus en cada una de las alternativas tambin 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 condicin, un literal o un identificador y se ejecutar el WHEN que cumpla la condicin 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 algn WHEN, no se ejecutar ningn otro, aunque ste WHEN posterior sea valido o verdadero.

    La clusula WHEN OTHER se debe poner siempre la ltima y se ejecutar cuando no se haya ejecutado ningn otro WHEN. Esta clusula 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 instruccin (como el PERFORM para bucles) no debe haber ningn 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 Bsicos

    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 NINGN 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 ARITMTICAS:

    El lenguaje COBOL slo dispone de cinco instrucciones aritmticas, debido a que este no es el principal cometido de un lenguaje orientado a la gestin de ficheros. Tanto es as, que aunque la norma ANSI para el estndar de COBOL permite races cuadradas, la versin del compilador que estamos estudiando no.

    Todas las instrucciones aritmticas que posee COBOL tienen en comn una serie de clusulas, que son:

    7

  • COBOL Conceptos Bsicos

    GIVING: Esta clusula sirve para indicar en qu variable se guardar el resultado de la operacin.

    ROUNDED: Con esta clusula se redondea el resultado de la operacin dependiendo del PIC del campo resultado. La cantidad 345.158 en una variable con PIC 999V99 y haciendo uso de ROUNDED quedara almacenada como 345.16.

    ON SIZE ERROR y NOT ON SIZE ERROR: Con esta clusula 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 clculo no cupiera en el campo receptor.

    END-operacin: As finalizan todas las operaciones aritmticas en el caso de usar ON SIZE ERROR y NOT ON SIZE ERROR.

    Tambin 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 opcin GIVING, el resultado se guarda en el nom_dato3. Las dems 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 Bsicos

    PROCEDURE DIVISION.INICIO.

    ADD UNO TRES 5 TO RESULTADO.

    Resultado = 565ADD 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 funcin de sustraendo y nom_dato2 de minuendo. El resultado se guarda en este ltimo si no se especifica la opcin GIVING con el nom_dato3. SUBTRACT da la posibilidad de usar ms 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 = 525SUBTRACT CORR VALORES FROM OTROS.

    Variable DOS del campo compuesto OTROS = 170

    MULTIPLYSirve para realizar multiplicaciones. Su formato es el siguiente:

    9

  • COBOL Conceptos Bsicos

    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 multiplicacin es posiblemente donde ms 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 dems.

    DIVIDESirve 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 = 77Resto = 540 539 = 1

    Otra opcin que se puede usar con DIVIDE es REMAINDER, esta opcin sirve para indicar en qu variable se va a guardar el resto de la divisin. Para que el resto de la divisin sea el correcto (si no se hace as el resto da un nmero 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 Bsicos

    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 NMERO:. ACCEPT NUM1. DISPLAY INTRODUCE OTRO NMERO:. 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 MULTIPLICACIN ES: RESU.DIVIDIR. DIVIDE NUM1 BY NUM2 GIVING RESU REMAINDER RESTO. DISPLAY LA DIVISION ES: RESU.

    DISPLAY EL RESTO ES: RESTO.

    NOTA: Para dar ms dinamismo a la clase y una mejor comprensin por parte de los alumnos, se debe realizar el ejercicio 11 (de la hoja de ejercicios de esta clase).

    COMPUTEEsta instruccin nos permite realizar operaciones aritmticas usando

    expresiones y operadores aritmticos (+, - ,*, /, **), as como los parntesis para delimitar el orden de ejecucin de las operaciones.

    Formato:

    11

  • COBOL Conceptos Bsicos

    nom_dato2 COMPUTE nom_dato1 [ROUNDED]= expresin aritmtica 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 (MANIPULACIN DE CARACTERES):

    Aunque como ya se ha dicho las instrucciones ms potentes de COBOL se centran en las instrucciones para manejar datos de los ficheros, COBOL tambin dispone de instrucciones de manipulacin de cadenas de caracteres. Son las siguientes:

    EXAMINE solo para el compilador osvsEsta sentencia sirve para dos cosas, permite contar el nmero de veces

    que se repite un determinado carcter dentro de un campo y tambin permite reemplazar el carcter por otro. Como su funcin es doble, tiene dos formatos, uno para cada uno de las funciones. Aunque en ambos formatos la sentencia EXAMINE hace distincin entre maysculas y minsculas.

    Formato 1: Cmputo de ocurrencias.

    12

  • COBOL Conceptos Bsicos

    UNTIL FIRST EXAMINE nom_dato TALLYING ALL carcter. LEADING

    Con este primer formato EXAMINE cuenta en la variable que indique nom_dato del modo elegido (UNTIL FIRST, ALL, LEADING) el carcter 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 carcter especificado.

    ALL: Cuenta todos los caracteres del nom_dato que coincidan con el carcter indicado.

    LEADING: Cuenta las veces que se repita de manera consecutiva el carcter indicado. Si el carcter buscado no est en la primera posicin 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: Sustitucin de caracteres. FIRST UNTIL FIRST EXAMINE nom_dato REPLACING carcter1 BY carcter2. ALL LEADING

    En este segundo formato EXAMINE reemplaza en el nom_dato del modo especificado el carcter1 por el carcter2.

    13

  • COBOL Conceptos Bsicos

    Los modos son:

    FIRST: Solo sustituir el primer carcter coincidente con carcter1 por el carcter2 en la cadena nom_dato.

    UNTIL FIRST: Sustituir todos los caracteres de nom_dato por carcter2 hasta encontrar uno que coincida con carcter1.

    ALL: Sustituir todos los caracteres del nom_dato que coincidan con carcter1 por carcter2.

    LEADING: Se sustituirn todos los caracteres consecutivos e idnticos al carcter1 del nom_dato por el carcter2 hasta encontrar uno distinto. Al igual que en el formato anterior. Si el primer carcter no es coincidente no se sustituir ningn carcter.

    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 DESPUS DE EXAMINE: FRASE. STOP RUN.

    El ejemplo visualizar COSA una vez ejecutada la instruccin EXAMINE en vez de CASA, que era el valor inicial de la variable FRASE.

    Para hacer uso de la instruccin EXAMINE en el archivo COBOL.DIR debe aparecer la directiva OSVS, o bien aadir la directiva OSVS en la lnea 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 instruccin EXAMINE.

    TRANSFORM solo para el compilador osvsCon TRANSFORM se podrn sustituir algunos o todos los caracteres de

    una cadena por otros segn la norma o modelo que se establezca. Un programa con esta instruccin tambin debe ser compilado con la directiva OSVS.

    14

  • COBOL Conceptos Bsicos

    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 establecern los caracteres que se quieren sustituir. Por ltimo en el dato2 los caracteres que sustituirn 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 DESPUS DE TRANSFORM: CAMPO.FIN. STOP RUN.

    En este ejemplo la variable CAMPO que tiene un valor de MADERA una vez aplicada la instruccin 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 ms de alguno de los caracteres del dato1, todos seran sustituidos por su correspondiente carcter del dato2.

    TRANSFORM 1365861 FROM 16 TO 24.

    En este pequeo ejemplo se puede ver mejor lo dicho anteriormente. La cadena 1365861 se transformara en 2345842.

    Otro forma de usar TRANSFORM es utilizarlo para convertir una cadena de maysculas a minsculas o viceversa.

    TRANSFORM CAMPO FROM ABCDEFGHIJKLMNOPQRSTUVWXYZ TO abcdefghijklmnopqrstuvwxyz.

    15

  • COBOL Conceptos Bsicos

    INSPECTLa instruccin INSPECT es posiblemente la sentencia ms 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 tambin sustituirlas. As que, con INSPECT habr tambin dos formatos.

    Formato 1: Cmputo de caracteres.

    ALL nom_dato2INSPECT 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 despus de TALLYING, el nmero de veces que se repite nom_dato2 o el literal1, segn 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 posicin y de forma contigua.

    CHARACTERS: Cuenta el tamao del nom_dato1, tenga o no datos.

    Opcionalmente tambin se puede indicar cuando ha de comenzar o parar el conteo con las opciones:

    BEFORE: Indica que el computo debe interrumpirse despus de encontrar la cadena coincidente con el nom_dato3 o literal2.

    AFTER: Indica que le conteo debe comenzar despus 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 Bsicos

    77 CAMPO2 PIC X(30) VALUE ESTABA YO ESCONDIDO EN ESPAA.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 DESPUS DE QUOTE YO QUOTE SON: CONT.FIN. STOP RUN.

    En el ejemplo anterior se utiliza INSPECT con el formato de cmputo de ocurrencias sin opciones en el prrafo COMPUTO1 y con la opcin AFTER INITIAL en el siguiente prrafo.

    Formato 2: Sustitucin 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 idntica a la anterior, con la excepcin de que ahora en vez de contar ocurrencias, estas se sustituyen por lo que diga nom_dato3 o literal2. Si se usa CHARACTERS se cambiarn todos los caracteres, pero nom_dato3 o literal2 slo puede contener un carcter. A este formato se le ha aadido FIRST, que tiene el mismo significado que en EXAMINE.

    Las opciones BEFORE y AFTER funcionan igual que el formato de cmputo de ocurrencias.

    Como se puede apreciar INSPECT parece que funcione o haga las mismas cosas que EXAMINE, pero hay una diferencia. Con EXAMINE, slo podas contar o sustituir un carcter, en cambio con INSPECT se puede hacer

    17

  • COBOL Conceptos Bsicos

    con una cadena de caracteres, y adems se puede especificar donde queremos que comience el cmputo o la sustitucin 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 DESPUS DE INSPECT: CAMPO1.CAMBIO2.

    DIPLAY EL CAMPO 2: CAMPO2. INSPECT CAMPO2 REPLACING ALL CHICOS BY PEQUES

    BEFORE INITIAL JUGABAN. DISPLAY EL CAMPO 2 DESPUS DE INSPECT: CAMPO2.FIN. STOP RUN.

    El ejemplo nos muestras las dos formas de reemplazar cadenas de caracteres con INSPECT, con y sin opcin 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 opcin 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 nmero de caracteres que la nueva cadena. En el ejemplo anterior no podra haber hecho el cambio de CHICOS por NIOS, ya que CHICOS tiene seis caracteres y NIOS cinco.

    Formato 3: Sustitucin de caracteres.

    18

  • COBOL Conceptos Bsicos

    INSPECT CONVERTING

    BEFORE

    AFTERINITIAL

    nombre dato-1

    nombre dato-4

    literal-2...

    TOnombre dato-7

    literal-5

    nombre dato-6

    literal-4

    CONVERTING indica que hay que convertir cada carcter 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 alfanumricos. Vemos 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 detrs de la instruccin STRING. DELIMITED BY sirve para indicarle cual va a ser el lmite de la concatenacin, o bien por algn literal o variable (excluido este) o bien por el tamao del nom_dato3 (opcin SIZE). El nom_dato3 es el campo donde se guarda el resultado de la concatenacin y el tamao 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 clusula SIZE.

    Es posible indicarle a partir de qu posicin queremos empezar la concatenacin con la sentencia WITH POINTER, es decir, la posicin en la que va a ser almacenado el primer carcter transferido. Anteriormente a la variable puntero hay que asignarle el valor. Esta variable ir cambiando de valor, la propia instruccin STRING lo har, cada vez que se vaya concatenando un carcter le sumar uno.

    Con ON OVERFLOW y NOT ON OVERFLOW podemos controlar si la variable puntero tiene un valor mayor al del tamao del campo receptor. Se

    19

  • COBOL Conceptos Bsicos

    ejecutarn las instrucciones que siguen a ON OVERFLOW cuando ese puntero sea superior al tamao o inferior a 1. En caso de que esto no ocurra se ejecutarn las sentencias que siguen a NOT ON OVERFLOW. Estas clusulas no son obligatorias.

    Al igual que otras muchas instrucciones STRING tiene una clusula para el cierre de la instruccin END-STRING. No es obligatoria, pero si aconsejable si se usa ON OVERFLOW y NOT ON OVERFLOW, si no se usa, la instruccin 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 Bsicos

    [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 alfanumricos 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 tratarn como si fuesen una nica ocurrencia. Por ejemplo. ALL AB significa que las cadenas AB, ABAB, ABABAB, etc. sern consideradas como una nica ocurrencia AB. Cada literal puede ser un literal no numrico 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 opcin DELIMITER IN, los caracteres delimitadores son tratados como datos alfanumricos elementales y almacenados en los campos referenciados por nombre dato-5.

    Si se especifica la opcin COUNT IN, el valor correspondiente al nmero 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 opcin DELIMITED BY.

    La clusula WITH POINTER puntero sirve para especificarle a partir de qu posicin queremos dividir el nom_dato1.

    TALLYING nos sirve para guardar en el nom_dato6 el nmero de partes en la que se ha dividido nom_dato1. Las cuenta la instruccin UNSTRING automticamente.

    ON OVERFLOW ejecuta la instrucciones que tiene a continuacin cuando el valor de puntero es menor que 1 o mayor que el tamao 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 Bsicos

    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 continuacin de INTO y en la variable CON se queda en nmero 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 nmero impares. Realizarlo de varias maneras con el PERFORM, tanto de bucle como de llamada.

    2) Dada una serie de nmeros introducidos por teclado, contabilizar cuntos de ellos son positivos, negativos y cero. El operador finalizar el proceso de introducir datos, tecleando el numero 999.

    3) Introducir un nmero 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 maysculas convertirla a minsculas y viceversa. (instruccin transform, condiciones ALPHABETIC-LOWER y ALPHABETIC-UPPER)

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

    22

  • COBOL Conceptos Bsicos

    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 aritmticas (suma, resta, divisin y producto). Una vez elegida la operacin a realizar, el programa me pedir dos nmeros por teclado, mostrndome posteriormente el resultado de dicha operacin. El programa no finaliza hasta que seleccione la opcin 5 de salida.

    8) Dados dos nmeros 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 cul es el nombre del empleado que tiene el mayor sueldo, el de menor sueldo y el sueldo medio del conjunto, visualizando el resultado. Considrese 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 nmeros 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 nmero 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 LPEZ LPEZ 7 7 8 9 6 6FIN

    Ejemplo de datos de SALIDA:LISTADO DE CALIFICACIONES

    ------------------------------------------------Nombre del Alumno Nota MediaPEDRO ALVAREZ GOMEZ 6.6................................................................................CURRO LPEZ LPEZ 7.1

    Nota Media de Grupo: 6.8

    23

  • COBOL Conceptos Bsicos

    24

    INSTRUCCIONES BSICAS (II):INSTRUCCIONES ARITMTICAS:OTRAS INSTRUCCIONES (MANIPULACIN DE CARACTERES):