Tópicos em PL/I do Buga

Achei um documento com algumas anotações que fiz quando de uma entrevista e eu nunca tinha traballhado com PL/I

Free format – Colunas da 2 a 72

Compilador – PLIXC

Compila e Link – PLIXCL

Compila, Lionka e Executa – PLIXCLG

O PGM que compila é o ibmzpli, o link suponho ser o IEWL mesmo, e estou correto!

Labels, indentificadores e outros só podem ter no máximo 31 caracteres

Arquivos 8 caracteres (tipo padrôn do mainframe)

Comentários começam com /* e terminam com */ nao admite grupo

Variaveis são declaradas com DECLARE ou DCL

Exemplo de programinha (le 5 notas e da a media)

AVERAGE: PROCEDURE OPTION (MAIN);

GET LIST (A,B,C,D,E);

SUM=A+B+C+D+E;

AVERAGE_GRADE=SUM/5;

PUT LIST (‘AVERAGE GRADE IS’, AVERAGE_GRADE);

END AVERAGE;

Pra rodar usar um JCL normalzao com os dados A..E entrando via SYSIN

Variáveis

DCL Xpto REAL BINARY FIXED COMPLEX DECIMAL FLOAT

Se nao tiver o “tamanho”vai 10 no inteiro e 0 na fração

DECLARE PERCENTAGE FIXED DECIMAL; /* vai ser (10,0) DECLARE CEBOL FIXED DECIMAL (5,2);

DECLARE BINARIO FIXED BINARY (31,0);

DECLARE CEBOLA CHARACTER (10); DECLARE CEBOLA PICTURE ‘(10)X`;

DECLARE OLHA_O_BIT BIT(5); Valores possiveis para BIT ‘01011’, (5)’10’B , ‘’B (nulo), ‘1’B

INITIAL OU init -> inicializa a variavel

Structures:

DECLARE 1 COUNTA; -> NAO PODE INICIALIZAR ESSE 2 PRIMEIRO FIXED BIN(15) INITIAL (0); 2 SEGUNDO FIXED BIN(15); 2 TERCEIRO (5) FIXED BIN(15) INITIAL (5(1)); 🡪 tABELa !

DEFINED ou DEF -> Tipo REDEFINICAo DO COBOL, mas é mais que isso.

DECLARE ZONE CHARACTER (10) DEFINED (ZIP) POSITION (4);

  • Ao referenciar ZIP vou acessar a posicao 4 da variavel ZONE.

Programa dois

AUDIT: PROC OPTION(MAIN Deu preguica de copiar o programa 2.

Multi-Level Structures

DECLARE 1 PAYROLL, 2 NAME, 3 LAST CHARACTER (60) VARYING, 3 FIRST CHARACTER (60) VARYING, 2 SALARY FIXED DECIMAL (7,2);

No máximo 255 niveis

PAYROLL.NAME.LAST = ‘ROBERTO’

BY NAME – MOVE COM NOME IGUAL (tipo o move corr – eu acho) LIKE – declarar string 1 igual a string 2

DCL FOLHA_DE_PAGAMENTO LIKE PAYROLL;

SAIDA = ENTRADA, BY NAME; -> Move os campos com nome iguais

Operator

De conta – sem novidades + - / * **

Lógicos ^ XOR ou NOT |: OR

Igualdade e otros... ^< (not less)

– Data Type

Em expressoes os dados sao convertidos pro de maior significancia

Tipo um FIXED DEC e um FLOAT DEC o resultado da em float.

– Expression

IF A > B THEN DO;

...

END;

SELECT ;

WHEN [any/all];

[OTHERWISE/OTHER];

END;

DO WHILE (A < B);

END;

DO UNTIL -> fAZ NO MINIMO UMA VEZ

DO NOTHING - > cONTINUE

GOTO ROLA;

ROLA:

PROGRAMA DE NUMEROS PRIMOS EM PL/I

PRIMES: PROC OPTIONS (MAIN);

DCL DIVISOR FIXED DEC (3,0);

DCL MAY_BE_PRIME BIT(1);

DCL NO BIT(1) INIT (‘0’B);

DCL TEST# FIZED DEC(3,0);

DCL YES BIT(1) INIT (‘1’B);

DCL MODE BUILTIN; /* SABE-SE LA O QUE SEJA ISSO */

/* NUCLEUS */

CALL INITIALIZATION;

DO WHILE ( TEST# < 101);

CALL PRIME_TEST;

TEST# = TEST# -2;

END;

INITIALIZATION: PROC;

PUT LIST (‘PRIMOS DE 0 A 100’);

PUT SKIP (2) LIST(001); PUT SKIP LIST(002);

TEST# = -3;

END INITIALIZATION:

PRIME TEST: PROC;

DIVISOR =3;

MAY_BE_PRIME = YES;

DO WHILE (DIVISOR < TEST# & MAY_BE_PRIME);

IF MOD (TEST#,DIVISOR) = 0 THEN

MAY_BE_PRIME = NO;

ELSE

DIVISOR = DIVISOR +2;

END;

IF MAY_BE_PRIME THEN

PUT SKIPE LIST (TEST#);

END PRIME_TEST;

END PRIMES;

BITWISE OPERATORS

&, |, !, &:, ^ INFIX, |:, ^- PREFIX

Procedure é um bloco de codigo que realiza determinada tarefa

Função é um bloco de codigo que realiza determinada tarefa e retorna algo

Argumento é o valor passado como parametro pra uma funcao ou procedure

Parametro é o valor recebido.

EXEMPLO DE EXTERNAL

WINDUP: PROCEDURE;

DECLARE PITCH EXTERNAL ENTRY (CHARACTERS (15)

VARYING, FIXED BINARY (7));

CALL PITCH (PLAYER_NAME, NUMBER_OF_OUTS);

Exemplo de ENTRY

MAINPR: PROC OPTIONS (MAIN);

DCL ADD3 ENTRY (FIXED DEC (7,2), FIXED DEC(7,2),

FIXED DEC(7,2);

DCL X,Y,Z FLOAT DEC(6);

GET LIST (X,Y,Z);

CALL ADD3(X,Y,Z);

ADD3: PROCEDURE (A,B,C);

DCL A,B,C FIXED DEC (7,2);

C = A + B + C;

END ADD3;

END MAINFR;

OUTRO EXEMPLO

ADDER: PROCEDURE (X,Y) RETURNS (FLOAD);

DECLARE (X,Y) FLOAT;

RETURN (X+Y);

END;

  • pRA USAR PODE ROLAR ASSIM:

  • TOTAL = ADDER (5,6)... TOTAL FICA COM 11

Arquivos

Sequencial ou seql

DECLARE INFILE FILE SEQUENTIAL INPUT;

Input/output – ambos é UPDATE

Read, write, rewrite

END-file 🡪 on, signal, revert.

Environment -> declare, open e close

Pictures em variáveis ‘4(9)’é a mesma coisa que ‘9999’

Tabelas

DIM – Tamanho da tabela LBOUND – Limite Inferior HBOUND – Limite superior SUM / PROD – Soma e produto de todos os elementos

Operações com BIT --------------------

NOT ^ DECLARE (A,B) BIT (4);

A = ‘0011’B;

B= ^A

B vale 1100 (INVERTE se era 0 vira 1, e 1 vira 0)

AND & (esse simbolo & isso chama ampersand em ingles) --- DECLARE (A,B,C) BIT (4); A = ‘0011’B; B = ‘1111’B; C = A & B;

C vale 0011 (compara se for 1 nos 2 sai 1 na saida)

OR | ------

DECLARE (A,B,C) BIT (4); A = ‘0011’B; B = ‘1111’B; C = A | B;

C vale 1111 (compara e se qualquer um for 1 a saida é 1)

XOR ^ -----

DECLARE (A,B,C) BIT (4); A = ‘0011’B; B = ‘1011’B; C = A ^ B;

C vale 1000 (só fica com 1 se for diferente)

AND THEN &: (testa o primeiro e o segundo só se o primeiro for verdadeiro) Retorna 1 se os dois forem verdadeiros, 0 outros casos

OR ELSE |: (testa o primeiro e o segundo só se o primeiro for falso) Retorna 1 se os dois forem verdadeiros, 0 outros casos

ALIGNED – controls storage boundary of bit-string

1 é true, 0 é false

Conversao de data type -----------------------

DECIMAL -> “fracao” em base 10

BINARY -> Numeros em Base 2

CHARACTER ->

PICTURE OR PIC -> DEFINE DECIMAL OU CHARACTERS

Muito phoda as contas, tipo 3.32 1,31 vezes e outras

Compound Statments (IF, ON, WHEN, OTHERWISE)

Funções intrinsecas

BIT, HIGH, MPSTR, TRANSLATE, BOOL, INDEX, REPEAT, UNSPEC, VERIFY, CHAR, LENGTH, STRING, GRAPHIC,LOW, SUBSTRING

Matemáticas

ABS, DECIMAL, IMAG, PRECISION, ADD, DIVIDE, MAX, REAL, BINARY, FIXED, MIN, ROUND, CEIL, FLOAT, MOD, SIGN, COMPLEX, FLOOR, MULTIPLY, TRUNC, CONJUG

Data

DATE () yymmdd TIME () hhmmssxx (xx hundreds of seconds)

POINTER -------

DCL POINTER_NAME POINTER INIT(NULL);

Alocando:

DCL P POINTER;

DCL STRING CHAR (20) BASED (P);

ALLOCATE STR;

OU

DCL P POINTER;

DCL STD CHAR(20);

P = ADDR(STR);

O endereço de STR esta disponivel no ponteiro P. Mas a diferenca entre BASED e ALLOCATE é que só no comando

P -> STR

Que vai poder acessar os dados (isso é, eu acho)

Last updated