El proceso del programa comienza en donde nosotros queramos, aunque por poner un poco de orden, podemos decir que empazará después de que acabemos de definir todas las variables que vayamos a necesitar.
INFORMANDO VARIABLES
En PL/I la manera de informar variables es "asignándoles" un valor:
DCL CAMPO1 CHAR(3) INIT ('123');
DCL CAMPO2 CHAR(3);
CAMPO2 = CAMPO1;
Ahora CAMPO2 valdrá '123'.
Vamos a ver algunos ejemplos de asignaciones denominadas "simples", es decir, la asignación se hace entre variables del mismo tipo (numéricos con numéricos, alfanuméricos con alfanuméricos).
Ejemplo 1: Campos numéricos.
DCL CAMPO_NUM1 DEC FIXED (3,2) INIT (0);
DCL CAMPO_NUM2 DEC FIXED (6,3) INIT (0);
CAMPO_NUM1 = 1.23;
CAMPO_NUM2 = CAMPO_NUM1;
Ahora CAMPO_NUM2 valdrá 001.230.
CAMPO_NUM2 = 456.789;
CAMPO_NUM1 = CAMPO_NUM2;
Ahora CAMPO_NUM1 valdrá 6.78.
Como podéis ver, mantiene la posición del punto decimal.
En las asginaciones de campos numéricos también podremos guardar operaciones artiméticas:
CAMPO_NUM1 = CAMPO_NUM2/2 + CAMPO_NUM3 * (CAMPO_NUM4 - CAMPO_NUM5) ** 2;
Y se aplican las mismas reglas de prioridades que en matemáticas (el doble asterisco es la potencia).
Ejemplo 2: campos alfanuméricos.
DCL ALFANUM1 CHAR (5) INIT(' ');
DCL ALFANUM2 CHAR (11) INIT (' ');
ALFANUM1 = 'COBOL';
ALFANUM2 = ALFANUM1;
Ahora ALFANUM2 valdrá 'COBOL '.
ALFANUM2 = 'CONSULTORIO';
ALFANUM1 = ALFANUM2;
Ahora ALFANUM1 valdrá 'CONSU'.
Usando el operador de concatenación || podemos guardar varios campos en una variable:
DCL CAMPO1 CHAR(10) INIT ('COMO MOLA ');
DCL CAMPO2 CHAR(20) INIT ('EL CONSULTORIO COBOL');
DCL CAMPO3 CHAR(30);
CAMPO3 = CAMPO1||CAMPO2;
Ahora CAMPO3 contendrá 'COMO MOLA EL CONSULTORIO COBOL' :D
Ejemplo 3: matrices (tablas internas).
DCL TABLA(3) CHAR(1);
Para utilizar un elemento de una matriz tendremos que indicar el índice del elemento entre paréntesis.
TABLA(1) = 'A';
TABLA(2) = 'B';
TABLA(3) = 'C';
Ahora el elemento 1 de la tabla valdrá 'A', el elemento 2 valdrá 'B', y el elemento 3 valdrá 'C'.
Para tablas de 2 dimensiones se indicarán los dos índices entre paréntesis.
DCL TABLA_DOBLE(2,3) CHAR(1);
Y en las asignaciones también se indicarán los dos índices:
TABLA_DOBLE(1,1) = 'A';
INICIALIZANDO VARIABLES
La inicialización de variables en PL/I se hace en el momento de declararlas, con la sentencia INIT que vimos en el artículo del "Esquema de un programa pl/i".
Vamos a ver algunos ejemplos:
DCL CAMPO_ALFANUM CHAR(10) INIT(' '); Se rellena con espacios. Para campos alfanuméricos el valor se indica entre comillas simples ''.
DCL CAMPO_ALFANUM CHAR(100) INIT((100)'-'); Se rellena con 100 guiones.
DCL CAMPO_NUM PIC 10(9) INIT(0); Se rellena con ceros. Para campos numéricos, el valor se indica sin comillas.
DCL CAMPO_DEC DEC FIXED (10,3) INIT(0); Se rellena con ceros.
DCL TABLA1 DEC FIXED(2,2) INIT(1,2,3,4);
Asigna valores a cada elemento de la tabla:
TABLA1(1,1) = 1
TABLA1(1,2) = 2
TABLA1(2,1) = 3
TABLA1(2,2) = 4
DCL TABLA1 DEC FIXED(2,2) INIT(4(0));
Asigna ceros a los 4 elementos de la tabla.
CONDICIONES
Para expresar condiciones en PL/I se utilizará el IF/ELSE de toda la vida, pero con sus particularidades.
Ejemplo 1: IF.
IF CAMPO1 = CAMPO2
THEN CAMPO1 = 2;
Al poner el ; finalizamos la sentencia IF (no hay que cerrarla con un END-IF como en cobol).
Ejemplo 2: IF/ELSE.
IF CAMPO1 = CAMPO2
THEN CAMPO1 = 2;
ELSE CAMPO1 = 1;
La condición finaliza con el ; de la parte del ELSE.
Puede darse el caso de que no queramos realizar ninguna acción para la condición del IF, sino sólo en el caso contrario (ELSE):
IF CAMPO1 = CAMPO2 THEN;
ELSE CAMPO1 = 1;
Ejemplo 3: IF/ELSE con DO.
IF CAMPO1 = CAMPO2
THEN DO;
CAMPO1 = 2;
CAMPO2 = 1;
END;
ELSE DO;
CAMPO1 = 1;
CAMPO2 = 2;
END;
Cuando dentro de un IF o un ELSE hay más de una expresión, todas ellas se incluirán dentro de la sentencia DO/END.
Los operadores que se utilizan en las condiciones serán:
= : igual a
¬= : distinto
& : y
| : o
< : menor que
> : mayor que
<= : menor o igual
>= : mayor o igual
¬< : no menor que
¬> : no mayor que
Otra manera de incluir una condición es con la sentencia SELECT. Viene a ser el equivalente al EVALUATE de Cobol, pero hay que tener cuidado porque no funcionan exactamente igual.
Si queremos poner como condición el valor que tome una variable:
SELECT(CAMPO_1);
WHEN(1);
WHEN(2) CAMPO_2 = 2;
OTHERWISE CAMPO_2 = 0;
END;
Si queremos validar que se cumple una condición:
SELEC;
WHEN(CAMPO_1 = CAMPO_2);
WHEN(CAMPO_1 < CAMPO_2) CAMPO_3 = 2;
OTHERWISE CAMPO_3 = 0;
END;
Fijaos en el primer WHEN de los dos ejemplos. Cuando un WHEN finaliza con ; significa que para ese caso no haremos nada. Sería el equivalente a poner un CONTINUE en Cobol.
MUY IMPORTANTE no confundir con el caso del EVALUATE, donde al poner dos WHEN seguidos significa que el código que venga a continuación se realizará para los dos WHEN:
EVALUATE WX-CAMPO1
WHEN 1
WHEN 2
DISPLAY 'CAMPO1 ES 1 o 2'
WHEN OTHER
CONTINUE
END-EVALUATE
El display se mostrará para WX-CAMPO1 = 1 y WX-CAMPO1 = 2.
En el caso del SELECT, se indicarán los dos valores en el mismo WHEN:
SELEC CAMPO_1;
WHEN(1,2) PUT EDIT ('CAMPO_1 ES 1 o 2') (A);
OTHERWISE;
END;
Para terminar decir que en caso de que dentro de un WHEN queramos escribir más de una instrucción, tendremos que usar el DO/END como en el caso del IF.
BUCLES
En PL/I los bucles se codifican con la sentencia DO/END. Existen varias opciones para acompañar al DO:
DO WHILE
En este caso las sentencias entre el DO y el END se ejecutarán "mientras que" se cumpla una condición, es decir, mientras esa condición sea cierta.
DO WHILE CAMPO1 ¬= ' ';
sentencias a ejecutar;
END;
Si tuviésemos más de una condición, deberá ir entre paréntesis.
DO WHILE (CAMPO1 ¬= ' ' & CAMPO2 = 1);
sentencias a ejecutar;
END;
DO UNTIL
En este caso las sentencias entre el DO y el END se ejecutarán "hasta que" se cumpla la condición especificada.
DO UNTIL CAMPO_ANO = 2012;
sentencias a ejecutar;
END;
Si tuviésemos más de una condición, deberá ir entre paréntesis.
DO + TO
En este caso las sentencias entre el DO y el END se ejecutarán hasta que se cumpla la condición especificada.
DO INDICE = 1 TO 10;
sentencias a ejecutar;
END;
Las sentencias a ejecutar se harán 10 veces (desde INDICE = 1 hasta 10, de 1 en 1).
Para retorcerlo un poco más podemos usar la sentencia BY:
DO INDICE = 1 TO 10 BY 2
sentencias a ejecutar;
END;
Las sentencias a ejecutar se harán 5 veces (desde INDICE = 1 hasta 10, de 2 en 2).
También se puede combinar el DO/TO con la opción WHILE:
DO INDICE = 1 TO 10 WHILE CAMPO1 = ' ';
sentencias a ejecutar;
END;
En este caso, además de controlar el valor de INDICE, la expresión del WHILE debe ser cierta.
2 comentarios:
La segunda vez que aparece: TABLA1(2,1) en "Inicializando variables", debe ser TABLA1 (2,2)
Besos y enhorabuena por esta parte PL1. Les viene genial a mis alumnos novatos!
Gracias África!
Corregido jaja