Professional Documents
Culture Documents
Manual de PL1 - Completo
Manual de PL1 - Completo
|***********************************************************************|
|***********************************************************************|
|***********************************************************************|
|*********** ***************************************************|
|*********** **************************************************|
|*********** **** **************************************************|
|*********** **** **************************************************|
|*********** **** *******************************************|
|*********** ***** *******************************************|
|*********** *********** *******************************************|
|*********** *********** *******************************************|
|*********** *********** ****************** **********************|
|************************* ***************** ***********************|
|************************* **************** ************************|
|************************* ******** *************************|
|************************* ******* ******** ***********|
|***************************************** ********* ***********|
|**************************************** ************ *************|
|*************************************** ************* *************|
|************************************** ************** *************|
|******************************************************* *************|
|******************************************************* *************|
|***************************************************** ***********|
|***************************************************** ***********|
|***********************************************************************|
|***********************************************************************|
|************************************************ VERSAO UNICA *******|
|***********************************************************************|
|***********************************************************************|
|***********************************************************************|
|***********************************************************************|
|*************** ************************|
|***********************************************************************|
|***********************************************************************|
└───────────────────────────────────────────────────────────────────────┘
┌───────────────────────────────────────────────────────────────────────┐
| |
| ANALISTA : _______________________________________________ |
| |
| |
| DEPARTAMENTO : ______________________________________ |
| |
| ANDAR : _____ SALA : _____ |
| |
└───────────────────────────────────────────────────────────────────────┘
Page 1
Page 2
1. CONCEITOS BASICOS
____________________
Uma linguagem de computador e' como qualquer idioma com sua sintaxe: tem
vocabulario,regras gramaticais e de pontuacao.
1. CONCEITOS BASICOS
Page 3
e'o mesmo usado no primeiro comando e o seu uso e' opcional neste co-
mando.
Por exemplo:
® Formato "string"
® Formato identado
® Formato combinado
1. CONCEITOS BASICOS
Page 4
COMANDO-3;
COMANDO-4;
COMANDO-N-1;
COMANDO-N;END Label;
1. CONCEITOS BASICOS
Page 5
1.6 IDENTIFICADORES
___________________
1. CONCEITOS BASICOS
Page 6
│
- de 60 │ 10 caracteres numericos
│
│ 21 caracteres especiais
.
.
.
.
│ 27 caracteres alfabeticos
│
- de 48 │ 10 caracteres numericos
│
│ 11 caracteres especiais
.
.
1. CONCEITOS BASICOS
Page 7
_______________________________________________________________
│ │ │ │ │
│ Classificacao │ 60 caracteres │ 48 caracteres │ Descricao │
│_______________│________________│________________│_____________│
│ │ │ │ │
│ │ A a Z │ A a Z │ alfabetico │
│ │ $ │ $ │ alfabetico │
│ Alfanumericos │ @ e # │ nao disponivel │ alfabetico │
│ │________________│________________│_____________│
│ │ │ │ │
│ │ 0 a 9 │ 0 a 9 │ numerico │
│ │________________│________________│_____________│
│ │ │ │ │
│ │ │ │ branco │
│ │ = │ = │ igual │
│ │ + │ + │ mais │
│ │ - │ - │ menos │
│ │ * │ * │ vezes ou ast│
│ │ / │ / │ divisao ou │
│ │ │ │ barra │
│ │ ( │ ( │ abre paren- │
│ │ │ │ teses │
│ │ ) │ ) │ fecha paren-│
│ │ │ │ teses │
│ │ , │ , │ virgula │
│ │ . │ . │ ponto │
│ Especiais │ ' │ ' │ apostrofo │
│ │ % │ // │ percentual │
│ │ : │ .. │ dois pontos │
│ │ ; │ ,. │ ponto e vir-│
│ │ │ │ gula │
│ │ ¬ │ NOT │ nao │
│ │ & │ AND │ e │
│ │ │ │ OR │ ou │
│ │ < │ LT │ menor que │
│ │ > │ GT │ maior que │
│ │ _ │ nao disponivel │ travessao │
│ │ ? │ nao disponivel │ interrogacao│
│_______________│________________│________________│_____________│
Fig. 1.1
1. CONCEITOS BASICOS
Page 8
_________________________________________________________
│ │
│ 60 caracteres 48 caracteres │
│_________________________________________________________│
│ │
1 │ @ nao ha' correspondente │
2 │ # nao ha' correspondente │
3 │ - nao ha' correspondente │
4 │ ? nao ha' correspondente │
5 │ % // │
6 │ : .. │
7 │ ; ,. │
8 │ > GT │
9 │ < LT │
10 │ ¬ NOT │
11 │ │ OR │
12 │ & AND │
│_________________________________________________________│
Fig 1.2
1. CONCEITOS BASICOS
Page 9
® o unico carater especial que pode ser usado num identificador e' o
"travessao" (_);
1. CONCEITOS BASICOS
Page 10
2. OPERACOES E EXPRESSOES
_________________________
2.1 INTRODUCAO
______________
2.2 OPERADORES
______________
2. OPERACOES E EXPRESSOES
Page 11
________________________________________________________________
│ │ │ │
│ Tipo de │ Simbolo de operacao │ │
│ │_____________________________│ Descricao │
│ operacao │ │ │ │
│ │ 60 caracteres│ 48 caracteres│ │
│______________│______________│______________│___________________│
│ │ │ │ │
│ │ + │ + │ soma ou prefixo + │
│ │ - │ - │ subtracao ou pre- │
│ Aritmetica │ │ │ fixo - │
│ │ * │ * │ multiplicacao │
│ │ / │ / │ divisao │
│ │ ** │ ** │ exponenciacao │
│______________│______________│______________│___________________│
│ │ │ │ │
│ │ > │ GT │ maior que │
│ │ >= │ GE │ maior ou igual │
│ │ = │ = │ igual │
│ Comparacao │ ¬= │ NE │ nao igual │
│ │ <= │ LE │ menor ou igual │
│ │ < │ LT │ menor que │
│ │ ¬> │ NG │ nao maior que │
│ │ ¬< │ NL │ nao menor que │
│______________│______________│______________│___________________│
│ │ │ │ │
│ │ ¬ │ NOT │ nao │
│ Logica │ │ │ OR │ ou │
│ │ & │ AND │ e │
│______________│______________│______________│___________________│
│ │ │ │ │
│ Concatenacao │ ││ │ CAT │ concatenacao │
│______________│______________│______________│___________________│
Fig 2.1
2. OPERACOES E EXPRESSOES
Page 12
_______________________________________________________________
│ │ │ │ │ │ │ │ │
│ Prioridades│ 1a │ 2a│ 3a│ 4a│ 5a │ 6a│7a │
│____________│_______│___│___│___│______________________│___│___│
│ │ │ │ │ │ │ │ │
│ Operadores │ ** + -│ /*│ +-│ │││ = >= <= > < ¬= ¬> ¬< │& │ │ │
│____________│_______│___│___│___│______________________│___│___│
Fig 2.2
1) -A**2 e' diferente de (-A)**2, de uma vez que so' havendo um termo
nessa expressao os dois operadores pertencem ao grupo de prioridades 1;
assim sendo,as expressoes serao efetuadas da direita para a esquerda.
Essa expressao e' exatamente igual a -(A**2)
2. OPERACOES E EXPRESSOES
Page 13
(X OR Y) NE (A CAT B)
5)
3**1**2 = 3**(1**2) = 3
3**2*3 = (3**2)*3 = 27
3*2**3 = 3*(2**3) = 24
Ja' foi visto que uma expressao aritmetica e' aquela que usa operadores
aritmeticos.O resultado de uma expressao aritmetica sera' o valor da
expressao quando forem atribuidos valores de "constantes" 'as variaveis
que compoem a expressao.
Pode-se definir um string de bits como sendo uma sequencia de digitos bi-
narios entre apostrofos e imediatamente seguida pela letra B,como,por
exemplo,'110001111000001'B
2. OPERACOES E EXPRESSOES
Page 14
___________________________________
│ │ │ │ │ │ │
│ A │ B │ ¬A │ ¬B │ A&B │ A│B │
│_____│_____│_____│_____│_____│_____│
│ │ │ │ │ │ │
│ 1 │ 1 │ 0 │ 0 │ 1 │ 1 │
│ 1 │ 0 │ 0 │ 1 │ 0 │ 1 │
│ 0 │ 1 │ 1 │ 0 │ 0 │ 1 │
│ 0 │ 0 │ 1 │ 1 │ 0 │ 0 │
│_____│_____│_____│_____│_____│_____│
Fig 2.3
Os bit strings de uma expressao logica devem ter o mesmo tamanho (mesmo
numero de bits).Se forem diferentes, a fileira menor sera automaticamente
acrescida de zeros,'a direita,ate' igualar-se ao tamanho maior,antes de
ser efetuada a operacao.
NOT A.................'101000'B
NOT C.................'001'B
C AND B...............'110000'B
A OR B................'111111'B
C OR B................'111111'B
A OR (NOT C)..........'011111'B
NOT ((NOT C) OR (NOT B))...'110111'B
2. OPERACOES E EXPRESSOES
Page 15
Pode-se definir CONSTANTE como sendo um valor autodefinivel, isto e', sua
representacao e' seu proprio valor. Por exemplo:
20 constante real decimal de ponto fixo
31.4 idem
10010B constante real binaria de ponto fixo
-37E2 constante real decimal de ponto flutuante
54.6I constante complexa
'PROG_NUM9' literal
2. OPERACOES E EXPRESSOES
Page 16
3. PROGRAMACAO ELEMENTAR
________________________
Sem entrar em detalhes, por enquanto, uma constante dita decimal de ponto
flutuante e' armazenada sob a forma de potencia de 10.
3. PROGRAMACAO ELEMENTAR
Page 17
A fim de que o dado seja processado, o programa deve ter um meio para ma-
nipular esse dado existente, para modifica'-lo ou gerar outros. Isso e'
feito por meio de expressoes contendo variaveis, constantes e operadores.
Apos uma expressao ser calculada, seu resultado pode ser atribuido a uma
variavel, na memoria, por meio de comando de atribuicao.
3. PROGRAMACAO ELEMENTAR
Page 18
Como output ..... PUT LIST (lista de variaveis e/ou expressoes e/ou
string de caracteres);
Como OUTPUT, sao impressos 5 valores por linha, nas posicoes 1, 25, 49,
73 e 97, seguindo continuamente para as linhas seguintes, ao ser impresso
o ultimo simbolo na linha.
Page 19
10.0,20.2
10.0 20.2
_____________________ ________________
│ /
10.0 20.2 3 │ │ 0.5 40.0 Representando a
│ │ │ │ lista de valores:
col.80 <--+ │ │ +--> col.1 10.0 20.2 30.5 40.0
3.4. COPY
_________
3. PROGRAMACAO ELEMENTAR
Page 20
________________________________________________
│
│ ANO bbbb 1976
│ │ │
│ +-> 1a.posicao +--> 25a.posicao
│
│
Se, logo apos o comando PUT LIST apresentado acima, se escrever o comando
PUT LIST(I,J,'SOMA =',I+J); e, imaginando que as variaveis I e J tenham
assumido nesse instante os valores 50 e 33, respectivamente, obter-se-a'
a seguinte imagem de saida:
Se w for tal que ultrapasse a ultima linha da pagina que esta sendo
impressa, a impressao se dara' na 1a. posicao da 1a. linha da pagina
seguinte.
3. PROGRAMACAO ELEMENTAR
Page 21
Nao serao impressos valores binarios atraves do comando PUT. Eles serao
sempre convertidos para o decimal correspondente. Vejam-se a seguir
alguns exemplos.
PUT PAGE LIST('A'); move o carro impressor para a primeira linha da pa-
gina seguinte e imprime o carater A.
PUT SKIP; move o carro impressor para a primeira posicao da linha
seguinte.
PUT SKIP(N+X) LIST('I'); a expressao N+X e' calculada, seu resultado e'
transformado para inteiro e o carro impressor e' movido para a
(N+X)-esima linha. Na 1a. posicao e' impresso o carater I.
Com os conceitos vistos ate' agora, ja' podemos escrever alguns progra-
mas, obviamente triviais e que servirao para exercitarmos as primeiras
praticas da linguagem PL/I.
2 - GET LIST(VAL_1,VAL_2,VAL_3,VAL_4,VAL_5);
3. PROGRAMACAO ELEMENTAR
Page 22
4 - XMEDIA = SOMA/5;
8 - END EX1C3;
│ │
E' de grande utilidade que o leitor perfure e execute esse programa para
ter uma primeira nocao de como as coisas vistas ate agora funcionam. Va-
rios valores poderao ser lidos e testados, fazendo variar o conjunto dos
5 valores que serao lidos pelo programa.
3. PROGRAMACAO ELEMENTAR
Page 23
Por exemplo:
3. PROGRAMACAO ELEMENTAR
Page 24
3.8. APLICACAO
______________
EX3C3:
PROC OPTIONS(MAIN);
PUT PAGE;
PUT PAGE LIST('A');
PUT SKIP;
PUT SKIP(3) LIST('B');
PUT SKIP LIST('C');
PUT LIST('D1','D2');
N = 2;
X = 1.5;
PUT SKIP(N) LIST('E',N);
PUT SKIP(N+X) LIST('F',N+X);
PUT PAGE LINE(30) LIST('G');
PUT SKIP(40) LIST('I');
PUT LINE(40) LIST('FIM');
END EX3C3;
Deve ser notado tambem nesse programa o uso de variaveis nos parametros
do atributo SKIP e o arredondamento para inteiro do valor da expressao
N+X, ou seja, de 3,5 para 3.
Segue-se uma imagem das paginas que constituem a saida impressa do pro-
grama:
3. PROGRAMACAO ELEMENTAR
Page 25
______________________________ ______________________________
│ │ │ │
│ (1a.pagina) │ │ (2a.pagina) │
│ / │ /
│____________________________/ │____________________________/
____________________________________________________________________
│ │
│ A (3a.pagina) │
│ │
│ │
│ │
│ B │
│ C D1 D2 │
│ /
│ E 2 /
│ /
│ /
│ F 3.50000E + 00 /
│_________________________________________________________/
_______________________________ ______________________________
│ │ │ │
│ (4a.pagina) │ │ I (5a.pagina) │
│ │ │ │
│ │ │ │
' ' │ │
' ' │ │
' ' │ │
│ G │ ' '
│ / ' '
│ / ' '
│__________________________/ │ FIM /
│_______________________/
3. PROGRAMACAO ELEMENTAR
Page 26
4. DECLARACOES DE VARIAVEIS
___________________________
Dois atributos ja' foram vistos: BINARY FIXED e DECIMAL FLOAT de precisao
(15,0) e (6), respectivamente. Ainda para variaveis numericas existem os
atributos BINARY FLOAT e DECIMAL FIXED. Os quatro tipos de atributos
tambem existem para as variaveis numericas complexas.
_____________________________________________________________________
│ │ Atributos de Precisao │
│ │______________________________│
│ Atributos de Base e Escala │ Assumido │ Maximo │
│______________________________________│________________│_____________│
│ │ │ │
│ BINARY FIXED │ (15,0) │ (31,0) │
│ DECIMAL FIXED │ ( 5,0) │ (15,0) │
│ BINARY FLOAT │ (21) │ (109) │
│ DECIMAL FLOAT │ (6) │ (33) │
│______________________________________│________________│_____________│
Fig. 4.1
4. DECLARACOES DE VARIAVEIS
Page 27
Uma variavel declarada "decimal de ponto fixo com precisao (p,q)", onde
p e' o numero total de digitos e q o numero total de digitos da parte
fracionaria (q e' tambem chamado fator de escala), deve representa cons-
tantes que sao "strings" de digitos decimais, com ou sem ponto decimal,
de no maximo 15 digitos e com ou sem sinal.
Assim, para uma constante cujo valor armazenado fosse igual a 12345.678,
ter-se-iam os seguintes valores numericos assumidos por determinadas
variaveis, cujos atributos de precisao fossem:
(p,q) valores
(8,3) 12345.678
(5,0) ou (5) 12345
(7,0) ou (7) 0012345
(7,2) 12345.67
(6,3) 345.678
(6,4) 45.6780
(1,1) .6
(5,-2) 12300
Este ultimo caso fica armazenado sob a forma 123F+2, sendo importante
salientar que o ponto decimal nao ocupa lugar na memoria em nenhum dos
casos.
A forma completa de declaracao da variavel AVA seria DCL AVA REAL DECIMAL
FIXED(4,1); onde os atributos REAL, DECIMAL e FIXED podem aparecer em
qualquer ordem, menos o de precisao (4,1), que devera' vir sempre depois
de um atributo de base ou de escala (isto sera' explicado quando se tra-
tar de ordenacoes denominadas ARRAYS). O fato de um atribut nao aparecer
no comando DECLARE sera' visto mais adiante, no topico "Declaracao par-
cial de variaveis", como aconteceu no atributo REAL na primeira
declaracao da variavel AVA.
4. DECLARACOES DE VARIAVEIS
Page 28
Uma variavel declarada "real e binaria de ponto fixo com precisao (p,q)",
onde p e' o numero total de digitos e q o numero de digitos da parte
fracionaria (tambem chamado fator de escala), deve representar constantes
que sao "strings" de digitos binarios, com ou sem ponto decimal, de no
maximo 31 digitos e seguidos pela letra B.
Assim para uma constante cujo valor armazenado fosse igual a 110.11B,
ter-se-iam os seguintes valores numericos assumidos por determinadas
variaveis, cujos atributos de precisao declarados fossem:
(p,q) valores
(5,0) ou (5) 00110B
(7,4) 110.1100B
(5,2) 110.11B
(3,0) ou (3) 110B
(2,2) .11B
(1,1) .1B
E' importante acrescentar que nem a letra B nem o ponto decimal ocupam
lugar de memoria.
Por exemplo:
4. DECLARACOES DE VARIAVEIS
Page 29
(p) valores
(6) 1.23456E+04
(8) 1.2345678E+04
(10) 1.234567800E+04
(5) 1.2345E+04
(4) 1.234E+04
(3) 1.23E+04
4.6. COMPLEX
____________
4. DECLARACOES DE VARIAVEIS
Page 30
4.7. CHARACTER(N)
_________________
Assim, para uma constante cujo valor armazenado fosse o string de carac-
teres 'SALA DE AULA NR. 2', teriamos os seguintes valores literais
assumidos por determinadas variaveis, cujos comprimemtos fossem:
(n) valores
(10) SALA DE AU
(15) SALA DE AULA NR
(17) SALA DE AULA NR 2
(20) SALA DE AULA NR 2bbb
4.8. BIT(N)
___________
4.9. VARYING
____________
4. DECLARACOES DE VARIAVEIS
Page 31
Veja-se um caso: DCL NOME CHAR(12) VAR; se se tiver uma constante literal
cujo valor seja 'COPO D"AGUA' (de comprimento igual a 11), e se se fizer
com que esse valor seja armazenado na variavel NOME, essa variavel tera'
para comprimento exatamente o comprimento da constante, ou seja, 11. Se,
a seguir, se armazenar um outro valor de constante literal,como, por
exemplo, 'BRASIL', a variavel passara' a ter comprimento igual a 6, que
e' o comprimento da constante.
4.10. INITIAL(M)
________________
O atributo INITIAL, que se abrevia por INIT, serve para dar valores
iniciais as variaveis. Seu uso pode ser substituido pelo comando de
atribuicao correspondente, por exemplo: DCL F BIT(3) VAR; F = '11'B; po-
dera' ser substituido por DCL F BIT(3) VAR INIT('11'B);
4. DECLARACOES DE VARIAVEIS
Page 32
4.11. LABEL
___________
Uma variavel declarada LABEL so' podera' assumir valores de rotulos (ou
labels) de comandos.
DCL L LABEL(LAB1,LAB2,LAB3);
Se, num comando DECLARE, faltar um ou mais atributos para uma variavel,
dir-se-a' que a variavel foi parcialmente declarada e esses atributos in-
existentes serao definidos automaticamente pelo compilador, de acordo com
a seguinte regra:
4. DECLARACOES DE VARIAVEIS
Page 33
DCL XYZ CLPX FLOAT; sera assumido DEC(6) para ambas as partes
O que foi feito para os atributos de variaveis numericas tambem e' valido
para qualquer tipo de atributos visto ate' agora, como CHAR, BIT,
COMPLEX, VAR etc.
__________________________________________________
/
/ b...b 'A' b...b 'E' b...b 'T' b...b 'O' b...b 'U'
│
4. DECLARACOES DE VARIAVEIS
Page 34
3) Seja DCL (A,B) FLOAT; se se tivesse que ler 3 vezes esse par de valo-
res e se os cartoes tivessem as seguintes perfuracoes:
__________________________________________________
/
1. cartao / b..b 1E + 10bb2E + 02bb2E + 05 b....b
│
__________________________________________________
/
2. cartao / 25E + 02bbb32E + 03bb5E + 02bb7.3E + 02b...b
│
1a. leitura - A = 1E + 10 e B = 2E + 02
Conforme se pode observar, o ultimo valor perfurado (7.3E + 02) nao foi
lido, o que e' explicado por ter acabado a lista de variaveis no comando
LIST (6 valores = 3 vezes os 2 valores). O proximo comando GET LIST que
aparecer no programa tentara ler esse valor. Agora note-se o detalhe: se
a variavel do proximo comando tiver atributo compativel com essa cons-
tante (7.3E + 02), esse valor sera' lido; se nao tiver, havera' impressao
de uma mensagem de erro de conversao na leitura. Por exemplo, se essa tal
variavel fosse declarada com o atributo CHAR, daria esse tipo de erro uma
vez que deveria, para ela, ter sido perfurado no lugar dessa constante
(7.3E + 02) um string de caracteres, entre apostrofos.
___________________________________
│
│ XYZ 10
│ │
│ '---> posicao 1 _________/
│___________________/
4. DECLARACOES DE VARIAVEIS
Page 35
_____________________________________________
│
│ Xb...................b ?
│ │ │
│ +-> posicao 1 +-> posicao 73
│ _________________
│__________________________/
_________________________________________________
│
│ ANO 1972 1973 1974 1975
│ │ │ │ │ │
│ +->pos1 +->pos25 +->pos49 +->pos73 +->pos97
│
4. DECLARACOES DE VARIAVEIS
Page 36
DESCRICAO DE DADOS
____________________________________________________________________
│ Caracteristicas │ Definicoes │ Atributos │ Exemplos │
│______________________│___________________│______________│__________│
│BASE │DECIMAL │Composto dos digi-│ DECIMAL │ 3324.51 │
│ │ │tos do sistema nu -│ │ │
│ │ │merico decimal:0,1,│ │ │
│ │ │2,3,4,5,6,7,8,9 │ │ │
│ │______________│___________________│______________│__________│
│ │BINARIO │Composto dos digi-│ BINARY │Deve ser│
│ │ │tos do sistema bi -│ │seguido p/│
│ │ │nario: 0 e 1 │ │B: 1101B │
│_______│______________│___________________│______________│__________│
│ESCALA │PONTO FIXO │Composto por digi-│ FIXED │ 322.6 │
│ │ │tos e um unico pon-│ │ │
│ │ │to que especifica o│ │ │
│ │ │inicio da fracao │ │ │
│ │______________│___________________│______________│__________│
│ │PONTO FLUTUAN-│Um campo de digitos│ FLOAT │Deve con-│
│ │TE │seguido pela letra│ │ter a le-│
│ │ │E, seguida por um│ │tra E: │
│ │ │expoente decimal│ │4788.2E2 │
│ │ │sinalizado opcio-│ │ │
│ │ │nalmente │ │ │
│_______│______________│___________________│______________│__________│
│PRECISAO │a) Em um numero de│ │ │
│ │ponto fixo, o 1.nr.│ │ │
│ │maximo de digitos│ │ │
│ │que a variavel pode│ (n ,n ) │ (5,3) │
│ │conter; o 2. espe -│ 1 2 │ 99,999 │
│ │cifica o nr. destes│ │ │
│ │'a direita do pto. │ │ │
│ │___________________│______________│__________│
│ │b)Em um nr. de pon-│ │ │
│ │to flutuante, espe-│ │ │
│ │cifica o numero de│ (n) │ (5) │
│ │digitos antes da│ │+9.9999E+-│
│ │letra E │ │99 │
│______________________│___________________│______________│__________│
4. DECLARACOES DE VARIAVEIS
Page 37
____________________________________________________________________
│ Caracteristicas │ Definicoes │ Atributos │ Exemplos │
│______________________│___________________│______________│__________│
│STRINGS│De Caracteres │Uma sequencia co-│ │Deve vir│
│ │ │nectada de caracte-│ │sempre en-│
│ │ │res que pode in-│ │tre apos-│
│ │ │cluir qualquer di-│ │trofos │
│ │ │gito, letra ou ca-│CHARACTER │'CONCURSO │
│ │ │rater especial re-│ │ 1' │
│ │ │conhecido pelo Sist│ │ │
│ │ │Oper. entre apos-│ │ │
│ │ │trofos │ │ │
│ │______________│___________________│______________│__________│
│ │Comprimento │Indica o nr. de ca-│ │'CONCURSO │
│ │ │racteres no string │ (n) │1' -> n=10│
│ │______________│___________________│______________│__________│
│ │De Bits │Uma sequencia de│ │ │
│ │ │digitos binarios│BIT │'10110'B │
│ │ │entre apostrofos e│ │ │
│ │ │seguida pela letra│ │ │
│ │ │B │ │ │
│ │______________│___________________│______________│__________│
│ │Comprimento │Indica o nr. de di-│ │'10110'B │
│ │ │gitos binarios │ (n) │n = 5 │
│ │______________│___________________│______________│__________│
│ │de Caracteres │Usado para inicia -│INITIAL (*) │INITIAL(9)│
│ │e de Bits │lizar valores │ │ou │
│ │ │ │ │INIT ('A')│
│ │ │___________________│______________│__________│
│ │ │Usado para especi -│ │ │
│ │ │ficar comp. varia-│ │CHAR(50) │
│ │ │vel │VARYING │VAR │
│_______│______________│___________________│______________│__________│
│LABEL ou rotulo │E' a declaracao de│ │Prefixado │
│ │uma variavel como│LABEL │a um co-│
│ │sendo um rotulo va-│ │mando e│
│ │riavel de comando │ │ separado│
│ │ │ │por dois│
│ │ │ │pontos │
│______________________│___________________│______________│__________│
FIG. 4.2
4. DECLARACOES DE VARIAVEIS
Page 38
5.1. INTRODUCAO
_______________
____________________________________________________________________
│ DEC FIXED(p,q) -> DEC FLOAT - p │
│____________________________________________________________________│
│ DEC FIXED(p,q) -> BIN FIXED - 3.32p + 1 , 3.32q │
│____________________________________________________________________│
│ DEC FIXED(p,q) -> BIN FLOAT - 3.32p │
│____________________________________________________________________│
│ DEC FLOAT(p) -> BIN FLOAT - 3.32p │
│____________________________________________________________________│
│ BIN FIXED(p,q) -> BIN FLOAT - p │
│____________________________________________________________________│
│ BIN FIXED(p,q) -> DEC FLOAT - p/3.32 │
│____________________________________________________________________│
│ BIN FIXED(p,q) -> DEC FIXED - p/3.32 + 1 , q/3.32 │
│____________________________________________________________________│
│ BIN FLOAT(p) -> DEC FLOAT - p/3.32 │
│____________________________________________________________________│
FIG. 5.1
Page 39
5.2. EXEMPLOS
_____________
A * B -
para B - nao ha' conversao
para A - e' convertido para BIN FIXED(28,10) -
p = 3.32 X 8 + 1 = 26.56 + 1 = 27.56 = 28
q = 3.32 X 3 = 9.96 = 10
(consultando a Fig. 5.1)
A + B
para A - e' convertido para BIN FLOAT(14) -
p = 3.32 X 4 = 13.28 = 14
para B - e' convertido para BIN FLOAT(5) -
p = 5
Page 40
____________________________________________________________________
│ OPERACAO │ p │ q │
│____________________________│___________________│___________________│
│ Adicao ou Subtracao │ 1 + PQ + Q │ Q │
│____________________________│___________________│___________________│
│ Multiplicacao │ p1 + p2 + 1 │ q1 + q2 │
│____________________________│___________________│___________________│
│ Divisao │ 15(se decimal) │ p - ((p1-q1) + q2)│
│ │ 31(se binario) │ │
│____________________________│___________________│___________________│
│ Potenciacao │ (p1 + 1) X (valor │ q1 X (valor do ex-│
│ │ do expoente) - 1 │ poente) │
│____________________________│___________________│___________________│
FIG. 5.2
A potenciacao e' valida somente para expoente sem sinal e base sem parte
fracionaria (q1 = 0).
® ADICAO(ouSUBTRACAO)
Page 41
® MULTIPLICACAO
® DIVISAO
® EXPONENCIACAO
Page 42
6. ARRAY
________
6.1 INTRODUCAO
______________
Por exemplo, se der 'a colecao das vogais A,E,I,O e U o nome de VOGAIS,
ter-se-a' formado um array, cujos elementos serao referenciados pelo nome
do array, seguido do indice correspondente entre parenteses,como
VOGAIS(1), VOGAIS(2), VOGAIS(3), VOGAIS(4) e VOGAIS(5), representando,
cada uma, uma das 5 vogais do alfabeto.
Para indicar que uma variavel representa um array, ou seja, uma colecao
de dados e nao uma variavel simples, sua declaracao devera' constar do
comando DECLARE, seguida do numero de elementos entre parenteses,
imediatamente apos o nome da variavel.
DCL A(6) DEC FLOAT; e' completamente diferente de DCL A DEC FLOAT(6); no
primeiro, declara-se um array de nome A com 6 elementos que sao variaveis
decimais, de ponto flutuante e de precisao igual a 6 digitos signifi-
cativos, enquanto que, no segundo, se declara uma variavel de nom A, de-
cimal, de ponto flutuante e de precisao igual a 6 digitos signifitivos.
No primeiro exemplo, foram assumidos, automaticamente, os atributos REAL
e a precisao(6), no segundo, apenas o atributo REAL.
6. ARRAY
Page 43
Uma colecao arranjada em uma tabela de dupla entrada pode ser represen-
tada por um array de duas dimensoes, em que a 1a. dimensao diz respeito
'as linhas e a 2a. dimensao diz respeito 'as colunas da matriz por
exemplo: DCL MATRIZ(2,3) BIN FIXED(3); representando uma matriz de nome
MATRIZ, com 2 linhas e 3 colunas, totalizando 6 elementos, sendo todos
variaveis binarias, de ponto fixo e de precisao (3).
6. ARRAY
Page 44
Assim, quando um elemento string deve ser repetido como inicializacao dos
elementos de um array, este devera' conter o seu fator de expansao, mesmo
que seja igual a 1.
9)DCL L(3) LABEL; indicando ser um array que contera' 3 valores de cons-
tantes label.
6. ARRAY
Page 45
Uma outra maneira de se declarar a dimensao de um array e' pelo uso dos
limites inferiores e superiores dos elementos que compreendem a dimensao
do referido array.
Uma declaracao do tipo A(3) poderia ser feita usando esta nova modalidade
da seguinte maneira: A(1:3). Ate' ai', nada de mais. Porem, se for pre-
ciso trabalhar com valores de indices variando em intervalos, nao
necessariamente de inteiros naturais, poder-se-a' lancar mao desse re-
curso, declarando convenientemente a dimensao do array, como no caso de
se desejarem, por exemplo, os coeficientes a0, a1, a2, de um polinomio
do 2o. grau, armazenados numa colecao cujos indices devam variar com a
mesma indicacao. Nesse caso, ter-se-a' o seguinte comando:
O leitor deve observar que os exemplos foram dados para variaveis com
atributos DEC, FLOAT, precisao (6). Isso ocorreu apenas para facilidade
6. ARRAY
Page 46
DCL LET(4) CHAR(1); o comando GET LIST(LET); fara' com que sejam lidos os
4 elementos do array denominado LET, na ordem: LET(1), LET(2), LET(3) e
LET(4).
6. ARRAY
Page 47
3) TABELA = 0;
Seja DCL A(2,3) FIXED(1) INIT(1,2,3,4,5,6), B(2,3) FIXED(1) INIT ((6) 1);
6. ARRAY
Page 48
MAT(4,3) e o vetor como VET(4). A coluna a ser copiada e' a segund da ma-
triz MAT, assim: VET = MAT(*,2); implicara' VET(1) = MAT(1,2), VET(2) =
MAT(2,2), VET(3) = MAT(3,2) e VET(4) = MAT(4,2)
Uma outra facilidade do uso do asterisco em array e' o seu uso no atri-
buto INITIAL como DCL A(8) FIXED INIT((4)(1,*)); implicando a
inicializacao, apenas, dos elementos A(1), A(3), A(5) e A(7) com o valor
1.
6.7. APLICACOES
_______________
A B C
_____ _____ _____
1 -1 1+(0)*(-1-1) = 1 1
3 3 3+(0)*(3-3) = 3 3
5 7 5+(1)*(7-5) = 7 7
6. ARRAY
Page 49
EX1C6:
PROC OPTIONS(MAIN);
DCL XAD(5,5) CHAR(1) INIT((25)(1)'.')
,(I,J) FIXED(1)
;
GET LIST(I,J);
XAD(I,*) = '*';
XAD(*,J) = '*';
XAD(I,J) = 'T'; _
PUT LIST(XAD(1,*)); │
PUT LIST(XAD(2,*)); │
PUT LIST(XAD(3,*)); │> ou PUT LIST(XAD(*,*));
PUT LIST(XAD(4,*)); │ ou PUT LIST(XAD);
PUT LIST(XAD(5,*)); _│
END EX1C6;
_____________________________________________________
│
│
│ . . * . .
│ * * T * *
│ . . * . .
│ . . * . .
│ . . * . .
│
. _______________
. .
. .
._______________________________.
Sabendo-se como um array e' armazenado, pode-se optar por uma das tres
maneiras a seguir:
6. ARRAY
Page 50
6. ARRAY
Page 51
7. COMANDOS DE DESVIOS
______________________
7.1. INTRODUCAO
_______________
Ha', entretanto, alguns comandos que fazem com que essa execucao
sequencial seja alterada, isto e', deixe de ser executada
sequencialmente, passando a executar um outro comando, por meio de des-
vios.
7.2. COMANDO DE DESVIO INCONDICIONAL (GOTO)
___________________________________________
EX1C7:
PROC OPTIONS(MAIN);
DCL LAB(2) LABEL INIT(LAB1,LAB2)
,I FIXED(1)
,A(5) DEC FIXED(3)
,B(10) BIN FLOAT(4)
;
GET LIST(I);
GOTO LAB(I);
LAB1:
GET LIST(A);
PUT LIST(A);
GOTO FIM;
LAB2:
GET LIST(B); _
B = B ** 2; │__ ou PUT LIST(B**2);
PUT LIST(B); _│
FIM;
7. COMANDOS DE DESVIOS
Page 52
END EX1C7;
________________________________________________________
│ │
│ {label:} IF expressao THEN unidade-1 ELSE unidade-2 │
│________________________________________________________│
7. COMANDOS DE DESVIOS
Page 53
..
. .
. .
. Testa se a .
<--- sim -------< expressao e' >------ nao --->
│ . verdadeira . │
│ . . │
│ . . │
│ .. │
____│____________ ___________│________
│ Executa a │ │ Executa a │
│ │ │ │
│ unidade-1 │ │ unidade-2 │
│ │ │ │
│ (THEN) │ │ (ELSE) │
│_________________│ │____________________│
│ │
│ ___________________ │
│ │ │ │
V________________│ COMANDO │_______________V
│ SEGUINTE │
│ │
│___________________│
│
│
│
7. COMANDOS DE DESVIOS
Page 54
1) IF A LE B THEN
DO; │
X = 2*A; │ ..... unidade 1
Y = Y**3; │
END; │
ELSE
X = X + Y; ..... unidade 2
2) IF A LT C THEN
Y = Y + 1; ..... unidade 1
ELSE
X = X + 1; ..... unidade 2
3) IF B = C THEN
; ..... unidade 1
ELSE
A = B + C; ..... unidade 2
4) IF X = Y AND X = Z THEN
PUT LIST (X,Y,Z); .. unidade 1
7. COMANDOS DE DESVIOS
Page 55
5) IF X = Y THEN
IF A GT D THEN
IF C LE A THEN
X = X1;
ELSE
X = X2;
ELSE
X = X3;
C = A + B;
7. COMANDOS DE DESVIOS
Page 56
EX4C7:
PROC OPTIONS (MAIN);
DCL (A,B,C) FLOAT (10), /* areas de entrada e saida */
TITULO CHAR (11) VAR, /* tipo de operacao */
TIT (4) CHAR (11) VAR INIT ('SOMAR','SUBTRAIR','MULTIPLICAR',
'DIVIDIR'),
OPERACAO (4) CHAR (12) VAR INIT ('MAIS','MENOS','VEZES',
'DIVIDIDO POR') ;
/*ler operacao e valores */
GET LIST (TITULO,A,B);
7. COMANDOS DE DESVIOS
Page 57
_________________________
/
│ 'MULTIPLICAR' 12 10
│
_________________________________________________________
│
│ 1.20000e+1 VEZES 1.00000e+01 IGUAL 1.20000E+02
│ _______________________________
│_________ ___
___________
E' usado para especificar a acao a ser tomada sempre que uma interrupcao
de execucao do programa ocorrer.
7. COMANDOS DE DESVIOS
Page 58
A forma do comando ON e': "ON condicao acao", onde a condicao e' uma das
que se verao adiante, como, por exemplo, a ERROR, que e' a padrao do Sis-
tema. A acao e' um comando simples da linguagem ou um grupo de comandos
formando um bloco BEGIN, cuja forma e' BEGIN; comandos... END;
Por exemplo:
Este comando faz com que, ao ser detectada uma condicao de erro qualquer
no programa, a sequencia de execucao seja desviada para o comando cujo
label e' FIM.
ON ERROR
BEGIN;
PUT LIST ('ERRO,NO PROGRAMA,DESCONHECIDO');
GOTO FIM;
END;
fazendo com que, ao ser detectada uma condicao de erro qualquer no pro-
grama, seja impresa a mensagem 'ERRO,NO PROGRAMA,DESCONHECIDO' e a
sequencia de execucao desviada para o comando cujo rotulo e' FIM.
1) condicoes computacionais;
3) condicoes de check;
7. COMANDOS DE DESVIOS
Page 59
A fig.7.1 apresenta algumas dessas condicoes:
7. COMANDOS DE DESVIOS
Page 60
_______________________________________________________________
│ CONVERSION │ Carater ilegal para conversao de contanstan- │
│ ( CONV ) │ tes numericas │
│_______________│_______________________________________________│
│ FIXEDOVERFLOW │ Valor excedendo a capacidade maxima permiti- │
│ ( FOFL ) │ da do campo │
│_______________│_______________________________________________│
│ OVERFLOW │ Valor excedendo a capacidade maxima permiti- │
│ ( OFL ) │ da do campo │
│_______________│_______________________________________________│
│ UNDERFLOW │ Valor excedendo a capacidade minima permiti- │
│ ( UFL ) │ da do campo │
│_______________│_______________________________________________│
│ ZERODIVIDE │ Tentativa de divisao por zero │
│ ( ZDIV ) │ │
│_______________│_______________________________________________│
│ SIZE │ Atribuicao de valores a campo nao suficien - │
│ │ temente grande │
│_______________│_______________________________________________│
FIG. 7.1
Sao aquelas que podem ocorrer durante uma operacao de E/S, ou seja, na
transmissao de dados, como, por exemplo, tentativa de ler um registro
quando o arquivo ja' atingiu o fim de registros, etc.
_______________________________________________________________
│ ENDFILE │ Ao ser detectado o fim de arquivo │
│ ( nome do arquivo )│ │
│_____________________│_________________________________________│
│ ENDPAGE │ Ao ser detectado o fim da pagina │
│ ( nome do arquivo )│ │
│_____________________│_________________________________________│
│ NAME │ Ao ser detectado um nome errado │
│ ( nome do arquivo )│ │
│_____________________│_________________________________________│
FIG. 7.1
7. COMANDOS DE DESVIOS
Page 61
_________________________________________________________________
│ CHECK │ Toda vez que houver uma modificacao no vlr. de │
│ ( lista ) │ alguma variavel da lista, ou referencia a elas │
│_______________│_________________________________________________│
│SUBSCRIPTRANGE │ Subscrito fora dos limites definidos para o │
│ ( SUBRG ) │ array │
│_______________│_________________________________________________│
│ STRINGRANGE │ Comprimento errado do argumento string em │
│ ( STRG ) │ SUBSTR │
│_______________│_________________________________________________│
FIG. 7.3
Algumas condicoes sao ditas "enabled" e outras sao ditas "disabled", ter-
mos esses que significam, respectivamente, disponiveis e nao disponiveis
automaticamente pelo Sistema, ou entao sao mais comumente conhecidas por
LIGADAS e DESLIGADAS.
EX5C7:
PROC OPTIONS (MAIN);
DCL SOMA FIXED (10) INIT(0),
XAV BIT (1) INIT ('1'B);
ON ENDFILE (SYSIN) XAV = '0'B;
LER:
GET LIST (VALOR);
IF XAV THEN
DO;
SOMA = SOMA + VALOR;
GOTO LER;
END;
ELSE
PUT LIST('SOMA= ',SOMA);
END EX5C7;
7. COMANDOS DE DESVIOS
Page 62
O comando ON deve ficar num lugar do programa que, pelo menos uma vez, na
execucao, o fluxo logico passe por ele, para ativa-lo,sem o que, ao
ocorrer a interrupcao, a acao especificada no comando nao sera' tomada.
O prefixo de condicao pode ser usado para fazer com que uma determinada
condicao seja ligada ou desligada,dependendo do seu estado atual,durante
a execucao do programa, de algunas comandos ou mesmo de um unico comando.
O prefixo de condicao e' o nome da condicao (se for para ligar) ou o nome
da condicao apos a palavra NO ( se for para desligar ), colocado entre
paranteses e seguido por dois pontos.
Por exemplo:
(NOFIXEDOVERFLOW,SUBSCRIPTRANGE):
A:
PROC OPTIONS (MAIN);
.........
.........
(FIXEDOVERFLOW):
M= I ** N;
.........
.........
(NOSUBSCRIPTRANGE):
L:
B = P(I) + P(J);
7. COMANDOS DE DESVIOS
Page 63
..........
END A;
No exemplo, para que seja tomada uma determinada acao, deverao existir na
proc-A os comandos ON para as condicoes previstas ( fixedoverflow e
subscriptrange), caso contrario apenas terao sido ligadas e desligadas as
condicoes,e , se houver uma interrupcao de um desses tipos, a acao a ser
tomada sera' a acao-padrao do sistema dada pela condicao ERROR. Essa
acao-padrao consiste na impressao de uma mensagem a respeito da
interrupcao e o cancelamento do programa imediatamente.
Se a variavel for um label, seu nome sera' impresso toda vez que houver
uma referencia ao seu nome, ou pela simples passagem do fluxo logico do
programa por esse label.
Pode tambem ser usada no comando ON, mas sempre acompanhada da lista de
variaveis. Por exemplo: ON CHECK (A,B) acao ; significando que, ao serem
impressas as variaveis A e/ou B, uma acao devera', tambem, ser executada.
7.5 APLICACOES
______________
1) Esse programa e' semelhante ao programa EX5C7, apenas com uma outra
apresentacao, inclusive nao aconselhada dentro das novas tecnicas de
programacao estruturada, pelo uso do BEGIN na on-condition ( ver Ap. A)
EX6C7:
PROC OPTIONS (MAIN);
DCL SOMA FIXED (10) INIT (0),
XAV BIT(1) INIT ('1'B);
ON ENDFILE (SYSIN)
BEGIN;
PUT SKIP (5);
PUT LIST ('SOMA =',SOMA);
XAV = '0'B;
END;
GET LIST (VALOR);
DO WHILE (XAV);
SOMA = SOMA + VALOR;
7. COMANDOS DE DESVIOS
Page 64
_________________________________
│ SOMA = 55 │
│ │ │ │
│ +---> col. 1 +--> col.25 │
│_________________________________│
EX7C7:
(SUBSCRIPTRANGE):
PROC OPTIONS (MAIN);
DCL A (-1:1) FLOAT,
SEGUE LABEL (SEG1,SEG2) INIT (SEG1) ;
ON SUBSCRIPTRANGE
BEGIN ;
PUT SKIP (3) LIST (I);
GOTO SEGUE;
END;
DO I = -3 to 3;
A(I) = I;
SEG1:
END;
PUT SKIP (3) LIST(A);
SEGUE = SEG2;
DO I = 1 TO 4;
A(I) = A(I-1);
SEG2;
END;
PUT SKIP (3) LIST (A);
END EX7C7;
7. COMANDOS DE DESVIOS
Page 65
________________________________________________
│ - 3 │
│ - 2 │
│ 2 │
│ 3 │
│ - 1.0000E + 00 0.00000E + 00 1.00000E + 00│
│ 2 │
│ 3 │
│ 4 │
│ - 1.0000E + 00 0.00000E + 00 0.00000E + 00│
│ │
│________________________________________________│
EX8C7:
PROC OPTIONS (MAIN);
DCL (A(10),I) FIXED ;
A = 0;
(CHECK(A,I)):
BEGIN;
DO I = 1 TO 5;
A(I) = 3*I;
END;
END;
END EX8C7;
S A I D A D O P R O G R A M A - EX8C7
I = 1
A(1)= 3 A(2)= 0 A(3)= 0 A(4)= 0 A(5)= 0
A(6)= 0 A(7)= 0 A(8)= 0 A(9)= 0 A(10)= 0
I = 2
A(1)= 3 A(2)= 6 A(3)= 0 A(4)= 0 A(5)= 0
A(6)= 0 A(7)= 0 A(8)= 0 A(9)= 0 A(10)= 0
I = 3
A(1)= 3 A(2)= 6 A(3)= 9 A(4)= 0 A(5)= 0
A(6)= 0 A(7)= 0 A(8)= 0 A(9)= 0 A(10)= 0
I = 4
A(1)= 3 A(2)= 6 A(3)= 9 A(4)= 12 A(5)= 0
A(6)= 0 A(7)= 0 A(8)= 0 A(9)= 0 A(10)= 0
7. COMANDOS DE DESVIOS
Page 66
I = 5
A(1)= 3 A(2)= 6 A(3)= 9 A(4)= 12 A(5)= 15
A(6)= 0 A(7)= 0 A(8)= 0 A(9)= 0 A(10)= 0
I = 6
7. COMANDOS DE DESVIOS
Page 67
Eis um caso simples. O programa que se segue usa um laco para ler 5 va-
lores, perfurados em cartao, um de cada vez, e esse laco e' controlado
pelo comando IF que, de acordo com uma condicao baseada num contador,
fara' o programa seguir sua sequencia logica normal, abandonando o laco
para imprimir os 5 valores lidos e terminar o programa.
EX1C8:
PROC OPTIONS (MAIN);
DCL A(5) DEC;
I = 0;
-----> VOLTA:
│ I = I + 1;
│ IF I > 5 THEN
│ GOTO FORA; -------->
│ GET LIST (A(I)); │ desvio para fora
<----- GOTO VOLTA; │ do laco
FORA: <--------
PUT LIST (A);
END EX1C8;
EX2C8:
PROC OPTIONS(MAIN);
DCL A(5) DEC;
DO I = 1 TO 5 BY 1; <--------
GET LIST(A(I)); │ Laco
END; -------->
PUT LIST(A);
END EX2C8;
O comando DO, assim usado, significa executar o comendo GET LIST tantas
vezes quantas forem as variacoes da variavel I, desde o valor 1 ate' o
valor 5, com incrementos de 1 em 1, ou seja, o comando sera' executado 5
vezes.
Page 68
ou
DO WHILE(expressao);
(comandos);
(comandos);
END;
Exemplos:
. DO KONT = 1,2,3,4,5;
X(KONT) = 0;
END;
. DO IJK = 12,20,28,10,20,25;
VALOR = VALOR + B(IJK);
END;
. DO L = I,I+1,I+2,10;
GET LIST(A(I));
END;
Exemplo:
Page 69
DO I = 1 TO 5 BY 1;
X(I) = 0;
END;
Exemplo:
I = 1;
DO WHILE (I <= 5);
X(I) = 0;
I = I + 1;
END;
8.3. EXEMPLOS
_____________
1 ) I = 1;
DO J = 1 BY 1 WHILE(I <= 5);
X(J) = 0;
I = I + 1;
END;
3 ) I = 5;
DO I = 1 TO I + 2;
Y(I) = I;
END;
Page 70
4 ) DO I = 1 TO 1000;
SOMA = SOMA + I;
END;
6 ) DO I = 1 TO 4, 9 TO 8 BY -0,2;
(comandos)
END;
DO X = 1 TO 4, 9 TO 8 BY -0,2;
(comandos)
END;
8 ) DO A = B+2*C TO D**2, X, Y;
(comandos)
END;
Page 71
identicos:
a) GET LIST(C);
b) DO I = 1 TO 5;
GET LIST(C(I));
END;
c) DO I = 1,2,3,4,5;
GET LIST(C(I));
END;
d) I = 1;
DO WHILE(I GT 5);
GET LIST(C(I));
I = I + 1;
END:
Podem-se ter varios lacos-DO, uns dentro dos outros, formando o que se
chama de DO aninhado.
________
│
SOMA = 0; │ SOMA = 0;
│
- DO I = 1 TO 10; │ - D: DO I = 1 TO 10;
' │ '
' - DO J = 1 TO 5; │ '------ DO J = 1 TO 5;
' ' │ '
' ' - DO K = 1 TO 3; │ '--------- DO K = 1 TO 3;
' ' ' │ '
' ' ' SOMA=SOMA+D(I,J,K); │ ' SOMA=SOMA+D(I,J,K);
' ' ' │ '
' ' - END; │ '--- END D;
' ' │
' - END; │
' │
- END; │
Essa operacao e' permitida quando todos os lacos terminam num mesmo
ponto.
Nao se pode, de qualquer que seja o ponto de um programa, entrar num laco
de DO, a menos que se tenha saido e retornado ao ponto imediatamente
seguinte.
Page 72
Esquematizando-se, tem-se:
<-+ _
___DO _│ pode ___DO │ nao __L: DO <--+
│ │ <-+ │ <--+ │
│ __DO │ __DO │___DO _│ │
││ _ ││ _ │ <-+ │ pode
││ _DO │ nao ││ _DO │ nao │___DO │ │
│││ <-+ │││ <-+ │ _│ │
│││ │││ │ __│
│││_END │││_END │___END L;
││ <-+ ││
││__END │ ││__END
│ │ nao │
│___END _│ │___END
_DO _DO
│ - _____ │ - _______
│ │ │ │
│ - <-+ │ │ - <---+ │
│ │ │ pode │ │ │
│ │ │ │ │ │ pode
│ │ │ │ │ │
│_END │ │ │_END │ │
_│ │ │ │
- <---+ - <----+--+
- │
- │
- _____│
( a ) ( b ) ( c )
( a ) I = 6 ( b ) J = 8 ( c ) K = 7
Page 73
8.4. APLICACOES
_______________
Solucao: DO I = 2 TO 1000 BY 2;
QUADRADOS (I/2) = I * I;
END;
Solucao: SOMA = 0;
DO I = 3 TO 1000 BY 3;
SOMA = SOMA + I;
END;
Solucao: J = 1;
DO X = 3.2,8.9,10.5, 0.75 TO 3.0 BY 0.25;
AREAS(J) = 3.14 * X **2;
J = J + 1;
END;
Solucao: DO Y = 1 TO 10;
PUT LIST(Y,Y**2,Y**3,Y**4,Y**5);
END;
Outra Solucao:
Page 74
9. FUNCOES INTERNAS
___________________
9.1. INTRODUCAO
_______________
Sao referenciados pelos seus proprios nomes, podendo ter ou nao argumen-
tos.
Por exemplo, SQRT(x) e' o nome de uma BUILT-IN FUNCTION que calcula a
raiz quadrada do argumento x.
Para esse tipo de built-in function, o argumento 'x' podera' ser uma
expressao, como, por exemplo, no calculo de uma das raizes da equacao do
segundo grau: X1 = ( -B + SQRT( B * B - 4 * A * C )) / ( 2 * A )
Identica 'a ADD. E' usada para a multiplicacao. Eis alguns exemplos
praticos:
9. FUNCOES INTERNAS
Page 75
9. FUNCOES INTERNAS
Page 76
B = ROUND(A,3) 123.4570
B = ROUND(A,2) 123.4600
B = ROUND(A,1) 123.5000
B = ROUND(A,0) 124.0000
B = ROUND(A,-1) 120.0000
Se C = 9.99 o comando B = ROUND(C,0) implica
B = 10.00
9. FUNCOES INTERNAS
Page 77
9. FUNCOES INTERNAS
Page 78
Seja B CHAR (10) INIT ('1234567890'), C CHAR (3) e POS BINARY FIXED .
Entao :
9. FUNCOES INTERNAS
Page 79
Outro exemplo:
Seja I FIXED BINARY (3), C CHAR (6) e D BIT (5). Seja, ainda, I = 7.
Entao:
® HIGH(n) / LOW(n)
9. FUNCOES INTERNAS
Page 80
® PROD(arg) / SUM(arg)
® POLY(arg1,arg2)
S = 0;
DO I=0 TO (N-M);
S = S + ARRAY(M+I)*X**I;
END;
® HBOUND(arg,n) / LBOUND(arg,n)
DCL D(1:5,10)
B=HBOUND(D,2) implicara' B = 10
C=HBOUND(D,1) implicara' C = 5
E=LBOUND(D,1) implicara' E = 1
F=LBOUND(D,2) implicara' F = 1
DO I = 10 TO -10 BY -1;
(comandos)
9. FUNCOES INTERNAS
Page 81
END;
® DIM(arg,n)
® DATE
® TIME
9.7. PSEUDOVARIAVEIS
____________________
Algumas das "BUILT-IN FUNCTION" podem ser usadas como variaveis, isto 'e,
podem ser usadas do lado esquerdo do sinal de atribuicao, na lista de
variaveis de um comando de saida(como o PUT LIST e outros que serao vis-
tos mais adiante) etc.
9. FUNCOES INTERNAS
Page 82
9.8. APLICACOES
_______________
EX1C9:
PROC OPTIONS(MAIN);
DECLARE B(2,3), C(3,2), D(2,2)
;
GET LIST(B,C);
DO I = 1 TO 2;
DO J = 1 TO 2;
D(I,J) = SUM(B(I,*) * C(*,J);
END;
END;
PUT LIST(D);
END EX1C9;
EX2C9:
PROC OPTIONS(MAIN);
DCL ALFABETO CHAR(26)
INIT('ABCDEFGHIJKLMNOPQRSTUVWXYZ')
,SENTENCA CHAR(80) VAR
,LETRA CHAR(1), XAV FIM ARQ BIT(1)
,(FREQ,P,Q,R) FIXED
;
ON ENDFILE(SYSIN) XAV FIM ARQ = 'O'B;
XAV_FIM_ARQ = '1'B;
GET LIST(SENTENCA);
DO WHILE(XAV_FIM_ARQ);
DO Q = 1 TO 26 BY 1;
LETRA = SUBSTR(ALFABETO,Q,1);
FREQ = 0;
R,P = INDEX(SENTENCA,LETRA);
DO WHILE(P NE 0);
FREQ = FREQ + 1;
P = INDEX(SUBSTR(SENTENCA,R + 1),LETRA);
R = R + P;
END;
PUT LIST(SUBSTR(ALFABETO,Q,1), '=', FREQ)SKIP;
END;
GET LIST(SENTENCA);
END;
END EX2C9;
A = 2
9. FUNCOES INTERNAS
Page 83
B = 0
C = 2
D = 0
E = 2
F = 0
G = 0
H = 0
I = 5
J = 0
K = 0
L = 1
M = 2
N = 4
O = 2
P = 0
Q = 0
..(etc)
│ │ │
V V V
col.1 col.25 col.49
EX3C9:
PROC OPTIONS(MAIN);
DCL (A(2,3),B(2,3) INIT(1,2,3,4,5,6)
,C(2,3) INIT(3) (1,2))) FIXED(3,1)
;
(1) PUT SKIP LIST(B(1,*));
(2) PUT SKIP LIST(B(*,2));
A = B + C;
(3) PUT SKIP(2) LIST(A(1,*));
(4) PUT SKIP LIST(A(2,*));
A(*,3) = SQRT(B(*,3));
(5) PUT SKIP(2) LIST(A(*,3));
DCL D FIXED
;
D = LBOUND(A,1);
(6) PUT SKIP(2) LIST(D);
(7) PUT SKIP LIST(HBOUND(A,2));
D = PROD(B);
(8) PUT SKIP LIST(D);
D = SUM(B);
9. FUNCOES INTERNAS
Page 84
(3) 2.0
4.0 4.0
(4) 6.0
6.0 8.0
_ ____ ____ _ _ _
A(*,3) = SQRT(B(*,3)) = │ V 3.0 V 6.0 │= │ 1.7 2.4│
│_ _│ │_ _│
(5) 1.7 2.4
D=LBOUND(a,1)=1
(6) 1
(7) 3
D=PROD(b)= 1.0 X 2.0 X 3.0 X 4.0 X 5.0 X 6.0 = 720.0
(8) 720
D=SUM(b)= 1.0 + 2.0 + 3.0 + 4.0 + 5.0 + 6.0 = 21.0
(9) 21
Determinar A=B/ABS(C)-10*SIND(D)
_ _
│ 1 10 2 │
Solucao: ABS(C) = │ │
│_40 5 10_│
9. FUNCOES INTERNAS
Page 85
_ _
│ 10 2 15│
B/ABS(C) = │ │
│_ 1 10 6_│
_ ___ _
│ 1/2 V3/2 1 │
SIND(D) = │ ___ │
│_ 0 V3/2 1/2_│
_ __ _
│ 5 5 V 3 10 │
10 * SIND(D) = │ __ │
│_ 0 5 V 3 5_│
_ __ _
│ 5 2-5 V 3 5 │
A= │ __ │
│_ 1 10-5 V 3 1_│
9. FUNCOES INTERNAS
Page 86
10.1. INTRODUCAO
________________
Tambem e' permitido o uso dos atributos COPY, SKIP, LINE e PAGE conforme
foi visto no comando LIST.
10.2. GET DATA
______________
Por exemplo, tendo-se num primeiro cartao as perfuracoes A=1, B=2, C =3,
D=4; C=2; A=2 e num segundo cartao B=3, C=5; D=3, A=1; valores esses
perfurados em quaisquer posicoes, para que esses valores sejam lidos,
devem-se ter 4 comandos GET DATA, pois existem 4 sinais de ponto-e-
virgula, que sao os delimitadores das listas de variaveis.
Page 87
Se a variavel a ser lida for uma variavel array, ela devera' vir
perfurada com seus subscritos: C(1)=3, C(2)=4, C(5)=0, C(4)=1, C(3)=1; e,
conforme se pode verificar, em qualquer ordem. E, na lista de variaveis,
se existir, ela podera' aparecer com seus subscritos ou, se forem todos
os seus elementos, apenas com o nome do array.
Assim, se se quiserem ler todos os 5 elementos do array denominado C,
poder-se-a' escrever GET DATA(C); ou GET DATA(C(1),C(4),C(2),C(5),C(3));
ou em qualquer ordem. Se se quiserem ler apenas o 3. elemento e o 2.
elemento, sera' preciso escrever GET DATA(C(3),C(2)); ou (C(2),C(3)).
Page 88
Ele faz com que as variaveis especificadas em sua lista sejam impressas
no formato de comandos de atribuicao, respeitando a mesma tabulacao que
dirige o comando PUT LIST.
J=0;
DO I = 1 TO 3;
PUT DATA (I);
GET DATA(K,L);
J = J + K - L;
END;
PUT DATA(J,K,L);
se os dados perfurados em cartao forem: K=1, L=1; L=2; K=3; quais os va-
lores impressos , ao ser executado o trecho de programa apresentado?
Solucao:
10.4. APLICACOES
________________
EX1C10:
PROC OPTIONS(MAIN);
GET DATA(RAIO);
VOLUME = (4.0 * 3.14 * RAIO**3)/3.0;
PUT DATA(VOLUME);
END EX1C10;
___________ _________________________
/ │ │ │
Sendo │ RAIO = 5; │ a saida sera' │ VOLUME = 5.23333E+02; │
│____________│ │ │ │
│ +---->col.1 │
│_________________________│
Page 89
11.1. INTRODUCAO
________________
Page 90
Por exemplo, o string de caracteres 'Xb=Y/12,3', onde b representa o
caracter em branco (espaco em branco), pode ser especificado por meio de
uma PICTURE de caracteres de 96 modos, ou seja:
2 X 3 X 1 X 2 X 1 X 2 X 2 X 1 X 2 = 96
X b = Y / 1 2 , 3
pois:
X Y pode-se usar X ou A
b pode-se usar X ou A ou 9
= / , pode-se usar X
1 2 3 pode-se usar X ou 9
9 V Y S + - $ , . / B Z *
Page 91
Page 92
So' podem ser usados junto com os caracteres "S+-$" se estes forem
estaticos.
Page 93
Casos errados:
? 'ZZZVZ9' ?
? 'ZZ9ZZ' ?
? '**ZZZ' ?
11.4. CONVERSOES
________________
Page 94
11.5. APLICACOES
________________
**********************************************************************
Num. de prestacoes Saldo Anterior Juros Saldo Atual Mensalidade
**********************************************************************
1 00,00 0,00 2.000,00 200,00
2 1.800,00 54,00 1.854,00 185,40
3 1.668,60 50,05 1.718,65 171,86
..... ...... ... ....
10 981,55 29,94 1.010,99 101,09
11 909,90 27,29 937,19 100,00
12 837,19 25,11 862,30 100,00
13 762,30 22,86 785,16 100,00
..... ...... ... ....
20 171,25 5,13 176,38 100,00
21 76,38 2,29 78,67 78,67
**********************************************************************
Totais 534,52 2.534,52
************************************************************************
EX1C11:
PROC OPTIONS(MAIN);
DCL (SALDO_ANTERIOR,SALDO_ATUAL,MENSALIDADE_MINIMA
, VALOR_COMPRA,JUROS,TOTJUR,MENSALIDADE)
PIC'ZZ99V,99'
,ASTERISCOS CHAR(64) INIT((64)'*')
,NUMERO_PRESTACAO FIXED(5)
Page 95
;
ON ENDFILE(SYSIN) GOTO FIM;
DO WHILE('1'B);
GET LIST(VALOR_COMPRA,MENSALIDADE_MINIMA);
PUT PAGE LIST(ASTERISCOS);
PUT SKIP LIST('NUM.PRESTACOES'CAT'SALDO ANTERIOR'
CAT'JUROS'CAT'SALDO ATUAL'CAT'MENSALIDADE');
PUT SKIP LIST(ASTERISCOS);
PUT SKIP;
SALDO_ANTERIOR=0;
JUROS=0;
NUMERO_PRESTACAO=0;
TOTJUR=0;
SALDO_ATUAL=VALOR_COMPRA;
DO WHILE(SALDO_ATUAL GT MENSALIDADE_MINIMA);
MENSALIDADE=SALDO_ATUAL/10;
IF MENSALIDADE LE MENSALIDADE_MINIMA THEN
MENSALIDADE=MENSALIDADE_MINIMA;
NUMERO_PRESTACAO=NUMERO_PRESTACAO + 1;
PUT SKIP LIST(NUMERO_PRESTACAO CAT (8)' ' CAT
SALDO_ANTERIOR CAT(5)' ' CAT JUROS CAT (3)' '
CAT SALDO_ATUAL CAT ' ' CAT MENSALIDADE);
SALDO_ANTERIOR= SALDO_ATUAL = MENSALIDADE;
JUROS=SALDO_ANTERIOR * 0,03;
SALDO_ATUAL=SALDO_ANTERIOR + JUROS;
TOTJUR=TOTJUR + JUROS;
END;
MENSALIDADE= SALDO_ATUAL;
NUMERO_PRESTACAO=NUMERO_PRESTACAO + 1;
PUT SKIP LIST(NUMERO_PRESTACAO CAT(8)' ' CAT
SALDO_ANTERIOR CAT (5)' ' CAT JUROS
CAT(3)' ' CAT SALDO_ATUAL CAT' '
CAT MENSALIDADE);
PUT SKIP(1) LIST(ASTERISCOS);
VALOR_COMPRA = VALOR_COMPRA + TOTJUR;
PUT SKIP LIST(ASTERISCOS);
END;
FIM:
PUT SKIP(2) LIST('FIM DO TRABALHO');
END EX1C11;
Page 96
12. ESTRUTURAS
______________
12.1. INTRODUCAO
________________
Como ja' foi visto, os arrays eram colecoes de dados contendo, todos, os
mesmos atributos. Uma estrutura e' tambem uma colecao de dados, porem
contendo os mais variados atributos.
Uma outra diferenca entre um array e uma estrutura e' que um array e'
simplesmente um agregado, uma lista, uma colecao de dados mantendo uma
determinada ordenacao em seus elementos, e uma ESTRUTURA e' uma colecao
de dados hierarquica, ou seja, possui niveis de hierarquia, podendo um ou
mais itens da estrutura ser arrays.
______
│ TV │
│______│
│
_____________│__________________________________
│ │ │ │
______ ____________ ______________ __________
│ NOME │ │ RESIDENCIA │ │ ESTADO CIVIL │ │ CANAL-TV │
│______│ │____________│ │______________│ │__________│
│ │
│ │
_____________ ____________
│ │ │ │
________ __________ ___________ ________
│ ULTIMO │ │ PRIMEIRO │ │ RUA E NUM │ │ BAIRRO │
│________│ │__________│ │___________│ │________│
Uma estrutura desse tipo seria empregada, por exemplo, num levantamento
estatistico sobre o canal de TV mais sintonizado num determinado horario,
em uma determinada cidade.
12. ESTRUTURAS
Page 97
Com relacao a esses numeros, o importante e' saber que o primeiro nivel
da estrutura deve ser sempre o numero 1 e que os demais niveis devem ser
numeros em ordem crescente, mas nao necessariamente consecutivos.
Quando se diz que se pode referir a um nome, isso significa que se pode
usar esse nome em comandos da linguagem, como, por exemplo:
GET LIST(TV);
GET LIST(NOME,RESIDENCIA,ESTADO_CIVIL,CANAL_TV);
GET LIST(ULTIMO,PRIMEIRO,RUA_E_NUM,BAIRRO,ESTADO_CIVIL,
CANAL_TV);
GET LIST(NOME,RUA_E_NUM,BAIRRO,ESTADO_CIVIL,CANAL_TV);
GET LIST(ULTIMO,PRIMEIRO,RESIDENCIA,ESTADO_CIVIL,CANAL_TV);
12. ESTRUTURAS
Page 98
DECLARE 1 TV,
2 NOME,
3 ULTIMO CHAR(10),
3 PRIMEIRO CHAR(20),
2 RESIDENCIA,
3 RUA_E_NUM CHAR(30),
3 BAIRRO CHAR(15),
2 ESTADO_CIVIL CHAR(8),
2 CANAL_TV CHAR(10) ;
12.2. REFERENCIA QUALIFICADA
____________________________
Tal recurso e' permitido devido ao uso da referencia qualificada, que e'
a referencia a uma variavel pela sua posicao hierarquica na estrutura.
Assim, a variavel BAIRRO, por exemplo, podera' ser referenciada por uma
das tres maneiras a seguir:
Pode-se, entao, referir a uma variavel de uma estrutura por meio de uma
referencia qualificada, total, ou parcialmente ou mesmo simplesmente pelo
seu nome, se nao existir uma ou outra variavel no programa com esse mesmo
nome; caso contrario, dever-se-a' usar uma referencia qualificada
qualquer que identifique a variavel da estrura.
Sempre que num programa existirem duas ou mais variaveis com mesmo nome,
a referencia somente ao nome da variavel (sem referencia qualificada) in-
12. ESTRUTURAS
Page 99
Apenas como lembranca, nos tres exemplos dados aparecem os tres tipos de
referencias, ou seja:
1) referencia simples;
2) referencia parcialmente qualificada;
3) referencia totalmente qualificada.
EX1C12:
PROC OPTIONS(MAIN);
DCL XAV BIT(1) INIT('1'B),
1 JOB,
2 NUM_CONTAB FIXED,
2 SALDO FIXED(6,2),
2 TEMPO,
3 COMPILAR FLOAT(3),
3 EXECUTAR FLOAT(3),
2 CUSTO FIXED(5,2);
ON ENDFILE(SYSIN) XAV = '0'B;
GET LIST(JOB);
DO WHILE(XAV);
SALDO = SALDO - (CUSTO*EXECUTAR + .5*CUSTO*COMPILAR);
PUT SKIP DATA(JOB);
GET LIST(JOB);
END;
END EX1C12;
Por ter sido usado o comando LIST, para entrada, os dados deverao vir
perfurados em cartao, separados por virgula ou pelo menos um branco e
deverao estar na mesma ordem em que eles foram definidos na estrutura, o
seja, o primeiro valor para a variavel NUM_CONTAB, o segundo para a
12. ESTRUTURAS
Page 100
______________
_____________│ CLASSIFICACAO│______________
. │______________│ .
. │ .
______ . __________________│__________________ . _______
│ NOME │. │ CURSO(1),CURSO(2),CURSO(3),CURSO(4) │ .│ MEDIA │
│______│ │_____________________________________│ │_______│
DCL 1 CLASSIFICACAO,
2 NOME CHAR(30),
2 CURSO(4) PIC'99V.9',
2 MEDIA FLOAT(3);
Tudo o que foi visto ate' agora sobre arrays e sobre estruturas e' valido
para o array de estruturas.
12. ESTRUTURAS
Page 101
12. ESTRUTURAS
Page 102
DCL 1 A(2),
2 B(3),
3 E(2,3),
3 F,
2 C(2),
3 E(2),
3 G;
12. ESTRUTURAS
Page 103
A(2).C(1).G
A(2,1).C.G
A.C(2,1).G
A.C.G(2,1)
A(2).C.G(1)
A.C(2).G(1)
A(2).G(1) C(2,1).G
A.G(2,1) C(2).G(1) G(2,1)
A(2,1).G C.G(2,1)
12. ESTRUTURAS
Page 104
Numa declaracao do tipo: DCL 1 A,2 B,2 C,2 D,3 F,3 G;as expressoes
D**5,A-G e B+D sao exemplos de expressoes de estruturas,enquanto que a
expressao C*F/2 nao, pois e' formada apenas por itens elementares(C e F),
constituindo-se,assim,numa expressao de elementos.
2 S,
3 T(2,2),
3 U,
2 V;
Solucao: T(1,1)=T(1,1)*T(1,2)=1*4=4
T(1,2)=T(1,2)*T(1,2)=4*4=16
T(2,1)=T(2,1)*T(1,2)=0*16=0
T(2,2)=T(2,2)*T(1,2)=1*16=16
U = U *T(1,2)=3*16=48
V = V *T(1,2)=2*16=32
12.5. BY NAME
_____________
12. ESTRUTURAS
Page 105
ser relacionados tenham os mesmos nomes e estejam nos mesmos niveis de
hierarquia.
12.6. LIKE
__________
12. ESTRUTURAS
Page 106
Outro exemplo:
1 A3, 1 B,
2 B2, e 2 C2,
3 C2, 2 D2;
3 D2;
Um cuidado especial que se deve ter e' nas referencias aos elementos das
estruturas, quando se usa o atributo LIKE. No ultimo exemplo visto, as
referencias aos elementos das estruturas D e C, denominados B, deveriam
ser feitas usando uma referencia qualificada, que no caso seria: D.B e C.
12. ESTRUTURAS
Page 107
12.7. APLICACAO
_______________
12. ESTRUTURAS
Page 108
12. ESTRUTURAS
Page 109
E' mais um comando de entrada e saida. A exemplo dos outros dois vistos
anteriormente, o LIST e o DATA, apresenta-se na forma GET EDIT, quando
usado para entrada, e na forma PUT EDIT, quando usado para saida de
informacoes.
sendo, tambem, permitido o uso dos atributos COPY (para o GET), SKIP,
LINE e PAGE(para o PUT), como foi visto nos comandos LIST e DATA.
Page 110
vao ser saltados antes do proximo elemento da lista de variaveis ser lido
ou impresso,e COLUMN(w), que se abrevia por COL(w), significando que a
leitura ou impressao do proximo elemento da lista de variaveis se dara' a
partir da w-esima coluna do cartao ou da impressao, respectivamente.
Exemplos desses itens de FORMAT serao vistos mais adiante, quando se tra-
tar dos codigos do tipo itens de FORMAT de dados.
Quando os itens de FORMAT de controle, SKIP, PAGE e LINE, sao usados fora
da lista de formato, ou seja, como opcoes dos comandos de entrada e saida
vistos (LIST,DATA e EDIT), somente o PAGE e o LINE podem ser usados em
combinacao. Por exemplo: PUT SKIP LIST ... ou PUT LINE(w) LIST.. ou PUT
PAGE LIST...ou PUT PAGE LINE(w) LIST ... As combinacoes SKIP LINE(w) ou
LINE(w) SKIP nao sao permitidas. Quando usadas dentro da lista de
formato, tal fato nao ocorre, pois, sendo os codigos de formato separados
por virgulas, a acao sera' tomada para cada codigo separadamente, podendo
ter, assim, situacoes como: SKIP,LINE(w),... ou LINE(w),SKIP... ou
...,PAGE,SKIP(w),... etc.
Page 111
(P'9V.99',P'S9V.9') 1 . 2 5 - 6 . 5
(P'999V,9',P'ZZZV,99') 0 0 1 , 2 6 , 5 0
(P'$$$9V.99',P'SSS9V,') $ 1 . 2 5 - 6 ,
(P'--9V,99',P'++9V,99') 1 , 2 5 6 , 5 0
12345 12345 12345 12345 12345 12345 12345 12345 12345 12345
3.2 3.2 3.2 32 320 00320 003.2 03.20 3.200 00320
Page 112
Page 113
Quando usado para saida, seu uso e' opcional, significando que, quando
nao usado, o comprimento assumido para o campo de impressao sera' o do
elemento da lista de variaveis do comando PUT EDIT.
12345
XY
5) BIT STRING FORMAT, cuja forma e' B(w), onde w representa o comprimento
do campo de entrada ou de saida para variaveis declaradas com atributo
BIT(n).
6) COMPLEX FORMAT, cuja forma e' C(i), onde i e' um dos itens de formato
para constantes numericas ja' visto.
Seu uso e' identico aos casos dos itens de formato numericos vistos, ape-
nas com a particularidade da duplicidade de campos, uma vez que um valor
complexo e' composto de duas partes: a real e a imaginaria. O PL/I sempre
considera o complexo com suas duas partes, mesmo que seja o complexo do
tipo real puro ou do tipo imaginario puro, respectivamente com a cons-
tante imaginaria igual a zero e com a constante real igual a zero.
Page 114
1.2-1I C(F(2)) 1 -1
3.45-1.4I C(E(9,4)) .3450E+01 .1400E+01
13.4. EXEMPLOS
______________
DO I = -2 TO 2;
PUT EDIT(A,B,C)
((I)F(6),(1-I)F(8),(2-I)E(15,6));
END;
Page 115
(1)F(6) nulo (1)E(15,6)
I=2 F(6) F(6) F(6) ((2)F(6),(-1)F(8),(0)E(15,6))
(2)F(6) nulo nulo
Quando elas forem iguais, nao havera' problema, porque a cada variavel
correspondera' um item de formato de dado.
Quando a lista de variaveis for menor que a lista de formato, esta sera'
abandonada,exatamente no momento em que o codigo de format de dado
satisfazer ao ultimo elemento da lista de variaveis, o que significa que,
se depois desse codigo de format aparecerem mais codigos de format, eles
serao simplesmente abandonados, mesmo que seja um codigo de format de
controle (SKIP, X(w), COL(w), etc...).
Page 116
No entanto, deve-se ter cuidado nessas transformacoes, uma vez que nem
sempre se podem incorporar os espacos em branco aos comprimentos especi-
ficados nos codigos de format de dados para os elementos de uma lista de
variaveis. Isso acontece realmente, quando nesses espacos em branco estao
perfuradas algumas informacoes, nao so' de esclarecimento como tambem de
interesse para posteriores leituras, por exemplo:
Page 117
(A(20),COL(31)P'99V,99',
COL(51),A(10))
5) Quando se desejar ler ou imprimir varios campos, de tal modo que eles
nao completem 80 posicoes do cartao ou 120 da impressora, por varios
cartoes ou impressoes, dever-se-a' ter suficiente cuidado para nao inco-
rrer num erro muito comum, que e' completar a lista de itens de formato
com o codigo X(w), por exemplo:
GO TO LER;
Essa lista de codigos de format nao fara' com que a proxima leitura se
verifique na coluna 1 do proximo cartao como se deseja, pois, uma vez
satisfeita a lista de variaveis, a lista de formato e' abandonada ( ver
caso de lista de variaveis menor do que a lista de format) exatamente no
momento em que o codigo F(5) foi executado.
Page 118
LL1: FORMAT(A(5),SKIP,F(7,4),X(13),F(4));
.......
GET EDIT(X,Y,Z) (R(LL1);
.......
PUT LINE(5) EDIT(A,B,C) (R(LL1));
.......
GET EDIT(I,J) (R(LL1));
F1: FORMAT(A(2),F(3,1));
F2: FORMAT(X(3),R(F1),F(2));
F3: FORMAT(R(F2),R(F1));
Para terminar a apresentacao do FORMAT remoto, lembramos que o label re-
ferenciado podera' ser um label variavel, de tal modo que poderiamos ter:
GET EDIT(....) (R(F)); onde, em qualquer momento, F tenha sido definido
com o valor de F1, F2 ou F3.
13.6. APLICACOES
________________
Page 119
ficios pelo uso da built-in STRING ou CHAR, o que serviria apenas como
exercicios didaticos. Vejamos, pois, o programa:
EX1C13:
PROC OPTIONS(MAIN);
DCL LINHA(8) CHAR(1) INIT((8)(1)'*')
,LINHAI(8) CHAR(1) INIT((8)(1)'.')
,(I,J) FIXED(1)
;
GET EDIT(I,J) (COL(1),2 F(5,0));
LINHAI(J) = '*';
LINHA(J) = 'T';
DO K = 1 TO 8;
IF K = I THEN
PUT SKIP EDIT(LINHA) ((8)A(2));
ELSE
PUT SKIP EDIT(LINHAI) ((8)A(2));
END;
END EX1C13;
____________________________________
│
│ . . * . . . . .
│ * * T * * * * *
│ . . * . . . . .
│ . . * . . . . .
│ . . * . . . . .
│ . . * . . . . .
│ . . * . . . . .
│ . . * . . . . .
│ _________
│ /
│_________________________/
Page 120
Foi visto ate' agora que os comandos GET e PUT eram usados para
transmissao de dados de ou para um meio externo e que esses meios exter-
nos eram, respectivamente, a leitora de cartoes perfurados padrao do sis-
tema operacional (SYSIN) e a impressora de formularios continuos padrao
do sistema operacional (SYSPRINT).
Muito bem, a opcao STRING de entrada e saida e' usada com os comandos GET
e PUT, porem, em vez da transmissao de dados ser feita de ou para um meio
externo, essa transmissao e' feita internamente de variavel para variavel
e a parte dos comandos GET e PUT, referenciada no paragrafo anterior,
formada pelas palavras FILE(nome do arquivo-padrao), e' substituida pelas
palavras STRING(nome da variavel string de caracteres)
Page 121
EX1C14:
PROC OPTIONS(MAIN);
DCL XAV_FIM BIT(1) INIT('1'B)
,(A,B,C) CHAR(5)
,D FIXED(5,2)
,(E,F) FLOAT(6)
;
DCL ENTRADA CHAR(80)
,CODIGO CHAR(1)
;
ON ENDFILE(SYSIN) XAV_FIM = '0'B;
GET FILE(SYSIN) EDIT(ENTRADA) (A(80));
DO WHILE(XAV_FIM);
GET STRING(ENTRADA) EDIT(CODIGO) (X(79),A(1));
IF CODIGO = '1' THEN
GET STRING(ENTRADA) EDIT(F) (X(1),P'9V.999');
ELSE IF CODIGO = '2' THEN
GET STRING(ENTRADA) EDIT(D,E) (F(5,2),E(6,2));
ELSE IF CODIGO = '3' THEN
GET STRING(ENTRADA) EDIT(A,B,C) (3 A(25));
ELSE PUT SKIP LIST('ERRO --
CODIGO DIFERENTE DE 1,2 OU 3');
GET FILE(SYSIN) EDIT(ENTRADA) (A(80));
END;
END EX1C14;
Um detalhe interessante a ser notado e' que, para ler mais de uma vez uma
variavel string de caracteres na memoria, nao precisamos ter o cuidado
mencionado antes, de posicionar o cursor de leitura no inicio do campo,
como se fazia em cartoes perfurados por meio do codigo de format COL(w).
Ele se posicionara' automaticamente na primeira posicao sempre que for
iniciado um comando GET STRING(ou PUT STRING, para gravacao).
Page 122
EX2C14:
PROC OPTIONS(MAIN);
DCL (CONT_CARTAO INIT(0),NUM_LINHA) FIXED
,IMAGEM(50) CHAR(80) INIT((50)(1)'')
,CARTAO CHAR(80)
;
ON ENDFILE(SYSIN) GOTO SEGUE;
DO I = 1 TO 50;
GET FILE(SYSIN) EDIT(CARTAO) (A(80));
GET STRING(CARTAO) EDIT(NUM_LINHA) (X(59),F(2));
PUT STRING(IMAGEM(NUM_LINHA)) EDIT(CARTAO) (A);
CONT_CARTAO = CONT_CARTAO + 1;
END;
SEGUE:
PUT SKIP EDIT('IMPRESSAO DOS ',CONT_CARTAO,'LIDOS E',
'ORDENADOS') (A,F(2),2 A);
DO I = 1 TO 50;
IF IMAGEM(I) = (80)'' THEN
PUT SKIP LIST('',IMAGEM(I));
END;
END EX2C14;
14.3. DEFINED
_____________
O atributo DEFINED e' usado para redefinir areas na memoria, isto e', de-
finir uma variavel que ocupara' o mesmo local de memoria que uma outra
ja' definida.
_______________________________________________
│ │
│ variavel DEFINED variavel base POSITION(c) │
│_______________________________________________│
____________________________________________________
│ │
│ array DEFINED array base (lista de subscrito) │
│____________________________________________________│
Page 123
Vejamos uma aplicacao: DCL BB CHAR(100), B CHAR(10) DEF BB; significa que
os 10 caracteres do string B ocupam as mesmas posicoes dos 10 primeiros
caracteres do string BB, ou seja, os 10 primeiros caracteres d string BB
foram redefinidos pelos caracteres de B. E' obvio que se referir ao
string B e' o mesmo que se referir 'as 10 primeiras posicoes do string
BB, pois, sendo o mesmo local de memoria, so' podera' haver um conteudo
(valor da constante string de caracteres).
Page 124
LETRA = 'F';
SUBSTR(LETRAS,1,1) = 'F';
ambos fazem com que o string de caracteres LETRAS, que inicialmente tinha
o valor da constante string de caracteres 'NORMA' passe a ter o string
'FORMA'.
Esse tipo e' usado quando a variavel definida e a variavel a ser definida
sao variaveis ARRAYS, nao sendo permitido, no entanto, para variaveis
arrays de estruturas.
Page 125
Conforme foi visto, podera' ser usado com a lista de subscrito especifi-
cada ou nao, respectivamente, entre arrays de dimensoes diferentes e
mesmas dimensoes.
Por outro lado, nem sempre se deseja que a definicao cubra todos os ele-
mentos de um determinado array; por exemplo, pode-se desejar que a
definicao de correspondencia cubra apenas os elementos da diagonal prin-
cipal de uma dada matriz. E, para isso, o PL/I exige que seja usada lista
de subscrito acoplada ao array-base, indicando quais as posicoes que
serao redefinidas nesse array (array basico).
Com isso os arrays nao precisam mais ter as mesmas dimensoes, como no
exemplo referido da diagonal principal; um array de 4 elementos e de uma
dimensao podera' ocupar as mesmas posicoes que os elementos da diagonal
principal de uma matriz de 4 linhas por 4 colunas (4x4).
Conforme o nome indica, e' uma relacao dos subscritos do array-base re-
presentados por um tipo especial de variavel, cuja forma e' iSUB, sendo i
uma constante inteira decimal que assumira' valores de acordo com a
dimensao do array a definir.
Page 126
Ora, pela apresentacao da variavel especial iSUB, que no caso tem a forma
1SUB, pode-se facilmente deduzir que a mesma variara' de 1 a 4 (limites
da dimensao do array DIAG a ser definido), indicando os elementos (1,1),
(2,2), (3,3) e (4,4) da matriz denominada MATRIZ.
Em resumo, pode-se entao dizer que a variavel especial iSUB e' usada na
lista de subscrito do array-base, em que i e' a ordem da dimensao do
array a ser definido e que iSUB variara' de acordo com os limites da
dimensao i. Para completar, a lista de subscrito podera' ser formada por
expressoes cujas variaveis sao as do tipo iSUB.
Page 127
Page 128
15. BLOCOS
__________
O grupo DO nao tem nada a ver com o comando DO ja visto, ou seja, nao
identifica laco algum, permitindo, assim, entradas em qualquer dos seus
comandos de pontos externos ao grupo.
Ja' um BLOCO e' uma sequencia de comandos que define uma determinada area
num programa como tendo caracteristicas proprias. E' usado para
delimitar o "scope" de um identificador (variavel, label, etc.).
Todos os programas vistos ate' agora sao compostos por apenas um bloco,
do tipo PROCEDURE. Conforme o leitor podera' verificar, todos esses pro-
gramas comecam com o comando label: PROC OPTIONS(MAIN); que e' um tipo
especial de PROCEDURE, denominado PROCEDURE PRINCIPAL. Todo programa
deve ter pelo menos um Bloco PROCEDURE (que se abrevia por PROC), que e'
chamado principal.
15. BLOCOS
Page 129
------- -------
BEGIN; D: PROC;
---- -----
---- -----
B: PROC; BEGIN;
----- ----
----- ----
END B; END;
------ ----
------ ----
END; END D;
---- ------
---- ------
END A; END C;
1 EX1C15:
2 PROC OPTIONS(MAIN);
3 DCL A(2,3),B(3,2),C(2,2);
4 CALL PROD;
15. BLOCOS
Page 130
5 DO I=1 TO 2;
6 PUT SKIP EDIT((C(I,J) DO J = 1 TO 2));
7 END;
8 BEGIN;
9 DCL A(5,4),B(4,2),C(5,2);
10 GET LIST(A,B);
11 PUT SKIP(2) EDIT(A) (F(2));
12 PUT SKIP(2) EDIT(B) (F(2));
13 DO I = 1 TO 5;
14 DO K = 1 TO 2;
15 SOMA = 0;
16 DO J = 1 TO 4;
17 SOMA = SOMA + (A(I,J)*B(J,K));
18 END;
19 C(I,K) = SOMA;
20 END;
21 END;
22 PUT SKIP(2);
23 DO I = 1 TO 5;
24 PUT SKIP EDIT((C(I,J) DO J=1 TO 2)) (F(2));
25 END;
26 END;
27 PROD:
28 PROC;
29 GET LIST(A,B);
30 PUT SKIP EDIT(A) (F(2));
31 PUT SKIP EDIT(B) (F(2));
32 C = 0;
33 DO I = 1 TO 2;
34 DO J = 1 TO 3;
35 DO K = 1 TO 2;
36 C(I,K) = A(I,J) + C(I,K);
37 END;
38 END;
39 END;
40 END PROD;
41 END EX1C15;
15. BLOCOS
Page 131
o programa passou pelo comando CALL PROD, que e' justamente o comando que
serve para ativar um bloco PROCEDURE, no caso, o bloco PROD.
Pode-se deduzir dessa filosofia que um bloco PROCEDURE pode ser colocado
em qualquer parte de um programa, pois o que fara' com que ele seja
executado sera' o comando de ativacao CALL, o qual estara', de acordo com
a logica do programa, num ou em varios pontos do mesmo.
Por exemplo:
15. BLOCOS
Page 132
Vejamos agora uma outra classificacao aplicada aos blocos, que e' a de
blocos internos e de blocos externos.
15. BLOCOS
Page 133
_A:PROC;
│ (comandos da proc-A)
│ _B:BEGIN;
│ │ (comandos do begin-B)
│ │___END B;
│ _C:PROC;
│ │ (comandos da proc-C)
│ │ _D:BEGIN;
│ │ │ (comandos do begin-D)
│ │ │ _E:PROC;
│ │ │ │ (comandos da proc-E)
│ │ │ │___END E;
│ │ │ (comandos do begin-D)
│ │ │___END D;
│ │ (comandos da proc-C)
│ │___END C;
│ (comandos da proc-A)
│___END A;
Esse exemplo serve para mostrar os niveis de relacao dos blocos de acordo
com a classificacao de interno e externo vista.
PROCEDURE-E
Ja foi visto que um bloco PROCEDURE e' ativado pelo comando CALL, cuja
forma e' (label:) CALL nome-de-entrada; e onde nome-de-entrada e' o label
do bloco PROCEDURE a ser ativado.
15. BLOCOS
Page 134
Porem, se desejassemos que a entrada se desse nao mais nesse exato ponto,
e sim em um outro ponto do bloco, estariamos especificando uma outra en-
trada, denominada secundaria, e o nome dessa entrada, alem de aparecer no
comando CALL, da mesma forma que foi visto para a entrada primaria,
deveria aparecer, identificando o ponto de entrada secundaria, como label
de um comando proprio, denominado ENTRY;
Por exemplo:
Um bloco pode ter mais do que uma entrada secundaria e mais, uma entrada
secundaria pode ter mais de um nome, isto e', mais de um label indicativo
da mesma entrada. Por exemplo: C: D: E: ENTRY; e o bloco com uma entrada
secundaria desse tipo podera' ser ativado por essa entrada de uma das
tres maneiras: CALL C; CALL D; ou CALL E;
Vimos que o comando CALL colocado num bloco pode ativar um outro bloco ,
ou seja, os blocos PROCEDURES, com excecao do principal, que era ativado
automaticamente pelo sistema operacional, eram ativados por outros blocos
e por meio do comando CALL colocados nesses outros blocos. Porem nao sao
todos os blocos que podem ser ativados por qualquer outro bloco. A regra
e' muito simples: "Uma procedure pode invocar qualquer procedure, desde
que elas sejam externas, uma em relacao a outra. Se a procedure invocada
for interna a procedure invocante, ela devera' estar no nivel
imediatamente abaixo ao da procedure invocante. E uma procedure que nao
seja interna a nenhuma outra pode ser invocada por qualquer procedure."
15. BLOCOS
Page 135
ELSE
RETURN(N*FAT(N-1));
END FAT;
Esse exemplo devera' ser revisto pelo leitor apos o Cap. 16, pois se
trata de uma PROC-funcao, com passagem de valores por meio de parametro.
O modo pelo qual um identificador e' conhecido no bloco em que foi decla-
rado e nos blocos internos a esse bloco e' dado pelo atributo INTERNAL
automaticamente declarado pelo compilador PL/I.
Os atributos INTERNAL e EXTERNAL podem ser abreviados por INT e EXT, res-
pectivamente.
Por exemplo:
A:PROC; B:PROC;
DCL XYZ BIT(1) EXT; DCL (PQR,XYZ) BIT(1) EXT;
-------- ---------
END A; END B;
15. BLOCOS
Page 136
15.6. APLICACOES
________________
EX2C15:
PROC OPTIONS(MAIN);
DCL XDATA CHAR(8), XHORA CHAR(15);
CALL DATHOR;
PUT EDIT('DATA',XDATA,'HORAS',XHORA)
(SKIP(5),COL(10),(2)(A,X(2)),X(3),(2)(A,X(2)));
DATHOR:
PROC;
DCL DATA CHAR(6), HORA CHAR(9);
DATA = DATE;
HORA = TIME;
DO I=1,3,5;
IF SUBSTR(DATA,I,1)='0' THEN
SUBSTR(DATA,I,1)=' ';
IF SUBSTR(HORA,I,1)='0' THEN
SUBSTR(HORA,I,1)=' ';
END;
XDATA = SUBSTR(DATA,5,2) CAT '/'
CAT SUBSTR(DATA,3,2) CAT '/'
CAT SUBSTR(DATA,1,2);
XHORA = SUBSTR(HORA,1,2) CAT 'H'
CAT SUBSTR(HORA,3,2) CAT 'M'
CAT SUBSTR(HORA,5,2) CAT ','
CAT SUBSTR(HORA,7,3) CAT 'S';
END DATHOR;
END EX2C15;
Essa colecao devera' ser lida de cartoes perfurados, podendo ou nao estar
em ordem crescente, segundo o campo de codigo de identificacao.
A colecao devera' conter no maximo 10 codigos com seus respectivos nomes.
EX3C15:
PROC OPTIONS(MAIN);
DCL 1 CARTAO(10)
,2 NUMERO FIXED(4)
,2 NOME
15. BLOCOS
Page 137
,3 PRIMEIRO CHAR(10)
,3 MEIO CHAR(20)
,3 ULTIMO CHAR(10)
,XAV_FIM BIT(1) INIT('1'B)
;
ON ENDFILE(SYSIN) XAV_FIM = '0'B;
DO I = 1 TO 10 WHILE(XAV_FIM);
GET LIST(CARTAO(I)) COPY;
END;
IF XAV_FIM THEN
I = 10;
ELSE
I = I - 1;
CALL SORT;
PUT SKIP(5);
DO J = 1 TO I;
PUT EDIT(CARTAO(J))
(COL(1),F(5),X(2),A(11),A(21),A(11));
END;
SORT:
PROC;
DCL IND BIT(1)
,1 TROCA LIKE CARTAO
;
DO K = I TO 1 BY -1;
IND = '1'B;
DO J = 2 TO K;
IF CARTAO(J).NUMERO LT CARTAO(J - 1).NUMERO THEN
DO;
IND = '0'B;
TROCA = CARTAO(J);
CARTAO(J) = CARTAO(J - 1);
CARTAO(J - 1) = TROCA;
END;
END;
IF IND THEN
GOTO FIM;
END;
FIM:
END SORT;
END EX3C15;
Page 138
110
'AAAAAAAAAA'
'AAAAAAAAAA'
'AAAAA'
1300
'AAAAAAAAAA'
'AAAAAAAAAA'
'AAAAA'
130
'BBBBBBBBBB'
'BBBBBBBBBB'
'BBBBB'
105
'CCCCCCCCCC'
'CCCCCCCCCC'
'CCCCC'
101
'DDDDDDDDDD'
'DDDDDDDDDD'
'DDDDD'
120
'EEEEEEEEEE'
'EEEEEEEEEE'
'EEEEE'
(puladas 5 linhas)
101 DDDDDDDDDD DDDDDDDDDD DDDDD
105 CCCCCCCCCC CCCCCCCCCC CCCCC
110 AAAAAAAAAA AAAAAAAAAA AAAAA
120 EEEEEEEEEE EEEEEEEEEE EEEEE
130 BBBBBBBBBB BBBBBBBBBB BBBBB
1300 AAAAAAAAAA AAAAAAAAAA AAAAA
EX3C15:
PROC OPTIONS(MAIN);
GET LIST(N);
BEGIN;
DCL VALORES(N);
GET LIST(VALORES);
PUT LIST(VALORES);
PUT SKIP(2) LIST('TOTAL=',SUM(VALORES));
PUT SKIP(2) LIST('MEDIA=',SUM(VALORES/N));
END;
15. BLOCOS
Page 139
END EX3C15;
15. BLOCOS
Page 140
16. SUBPROGRAMAS
________________
Agora, nem sempre uma sub-rotina e' feita por ela representar um
processamento que se repetira' varias vezes no programa. 'As vezes ela
sera' processada apenas uma vez e, tambem, pode nem ser processada. Tal
procedimento e' explicado quando estamos trabalhando com modulos de pro-
gramas, utilizando os recursos de alocacoes dinamicas ou de tecnicas de
"overlay", em que cada modulo e' representado por uma ou mais sub-
rotinas.
E' a chamada programacao modular e que nao faz parte desta apresentacao.
Mais adiante veremos exemplos desses casos abordados nesses primeiros
paragrafos, ou seja: a) programa com varios processamentos repetidos; b)
programa com blocos sendo executados varias vezes; e c) programas com
blocos que nao sao executadas nem uma vez numa determinada rodada.
Assim, uma variavel manipulada num bloco era passada para outro bloco por
meio dessa area comum usada pelo atributo EXTERNAL. Esse mecanismo
16. SUBPROGRAMAS
Page 141
® Diz-se que um bloco PROCEDURE e' uma funcao quando, ao ser passado um
ou varios valores, ele retorna apenas um valor.
Os valores passados e retornados para uma sub-rotina sao obtidos por meio
de variaveis com atributo EXTERNAL, servindo assim, esse atributo, nao
so' para uso de variaveis comuns em blocos externos, como tambem para
passagem de valores de ou para sub-rotinas.
Temos, pois, nesse momento, mais uma diferenca entre SUB-ROTINA e FUNCAO,
que e' a maneira de ativacao dos referidos blocos:
® Uma funcao e' ativada pelo uso do seu proprio nome em um comando.
16. SUBPROGRAMAS
Page 142
SOMAPRD: SOMAPRD:
PROC(X,Y,Z,A,B); PROC(A,B);
DCL (X,Y,Z) FLOATS(5); DCL (VAL1,VAL2,VAL3)
A = X + Y + Z; FLOAT(5) EXTERNAL;
B = X * Y * Z; A = VAL1 + VAL2 + VAL3;
RETURN; B = VAL1 * VAL2 * VAL3;
END SOMAPRD; END SOMAPRD;
SOMAR: SOMAR:
PROC(A,B,C); PROC;
16. SUBPROGRAMAS
Page 143
Apenas um detalhe tera' que ser explicado: o fato da funcao ser usada sem
lista de parametros. Quando isso tiver de acontecer, como no caso
apresentado, sera' preciso declarar o nome da funcao (SOMAR) no bloco in-
vocante com o atributo ENTRY, ou seja, DCL SOMAR ENTRY (e' a declaracao
que esta' faltando na procedure SUBFUN, no EX.II).
Note-se que tal fato so' acontece em caso de FUNCAO, devido ao seu uso,
ou, melhor dizendo, devido 'a sua ativacao no bloco invocante, que e'
apenas usando seu nome em um comando executavel. O compilador PL/I, ao
encontrar um comando, como no EX.II, SOM = SOMAR; se nao tiver sido de-
clarado que o identificador SOMAR e' uma entrada externa (atributo
ENTRY), interpretara' o comando como um simples comando de atribuicao, no
qual o valor da variavel denominada SOMAR estara' sendo atribuido 'a
variavel denominada SOM.
Ja' no caso de SUB-ROTINA, tal fato nao acontece, pois seu uso se da'
atraves do comando CALL, nao havendo condicao de duvidas para o compi-
lador, uma vez que o nome que aparece apos a palavra-chave CALL, nu co-
mando de ativacao de blocos PROCEDURE, tendo ou nao lista de argumento
,so' podera' indicar um nome-de-entrada.
16. SUBPROGRAMAS
Page 144
Vejamos um exemplo:
_______
CALL SUB(A+B,NOME1,NOME2,SIN(A-B));
_______
SUB:PROC(X,Y,Z,V)
________
END SUB;
16. SUBPROGRAMAS
Page 145
Por exemplo:
S:PROC(X,Y);
DCL S ENTRY(FIXED,FIXED(7)); DCL X FIXED, Y FIXED(7);
A = 5; B = 10; Y = Y + X;
CALL S(A,B); END S;
Conforme podemos verificar, foi mantida a ordem exata dos parametros, dos
argumentos e dos atributos usados no comando ENTRY.
DCL SS ENTRY(FIXED,,,FLOAT);
SS:PROC(A,B,C,J,X,Y,Z);
DCL A FIXED, B FLOAT, C FLOAT, J FLOAT;
16. SUBPROGRAMAS
Page 146
DCL A ENTRY;
CALL XYZ(X,Y,A);
Com relacao ao atributo RETURNS, ele e' usado somente em caso de funcoes,
quando se deseja mudar o atributo da variavel nome da funcao.
OPER:PROC; SOMAR:PROC(A,B,C);
GET LIST(X,Y,Z); D=A+B+C; │ ou RETURN
SOMA = SOMAR(Z,Y,X); RETURN(D); │ (A+B+C);
PUT DATA(SOMA); END SOMAR;
END OPER;
Mas vamos supor que no programa invocante tivessemos que receber essa
soma, nao como um valor decimal de ponto flutuante e sim como um valor
binario de ponto fixo, por exemplo; assim, deveriamos usar o atributo
RETURNS para fazer essa transformacao, ou seja:
16. SUBPROGRAMAS
Page 147
E' usado para invocar uma sub-rotina por meio do atributo INITIAL e sua
forma e': INITIAL CALL nome-de-entrada(lista de argumentos).
INICIAR:PROC;
ARRAY(1,1) = 1; ARRAY(1,2) = 2; ARRAY(1,3) = 3;
ARRAY(1,4) = 4; ARRAY(2,1) = 1; ARRAY(3,1) = 1;
ARRAY(2,2) = 2; ARRAY(3,2) = 2; ARRAY(2,3) = 3;
ARRAY(2,4) = 4; ARRAY(3,4) = 4; ARRAY(3,3) = 3;
END INICIAR;
Essa tecnica e' usada quando se tem uma grande quantidade de valores de
inicializacao e se tem, eventualmente, que mudar esses valores ou alguns
deles. Para nao ficar alterando o programa, que normalmente ja' esta'
pronto e testado, usa-se esse recurso, criando-se uma PROCEDURE (sub-
rotina) e fazendo nela as alteracoes necessarias.
16.7. APLICACOES
________________
1 EX1C16:
2 PROC OPTIONS(MAIN);
3 DCL VAL(10)
4 ;
5 GET EDIT(VAL) ((10)F(5));
6 SOMA = 0;
7 DO I = 1 TO 10;
8 SOMA = SOMA + VAL(1);
9 END;
10 XMEDIA = SOMA/10;
11 PUT SKIP EDIT(VAL) ((10)F(5));
12 PUT SKIP EDIT(SOMA,XMEDIA) (F(10),F(10,3));
13 DO I = 1 TO 10;
14 VAL(I) = VAL(I) - XMEDIA;
15 END;
16 SOMA = 0;
16. SUBPROGRAMAS
Page 148
17 DO I = 1 TO 10;
18 SOMA = SOMA + VAL(I);
19 END;
20 XMEDIA = SOMA/10;
21 PUT SKIP EDIT(VAL) ((10)F(10,3));
22 PUT SKIP EDIT(SOMA,XMEDIA) (F(10,3));
23 DO I = 1 TO 10;
24 VAL(I) = VAL(I) ** 2;
25 END;
26 SOMA = 0;
27 DO I = 1 TO 10;
28 SOMA = SOMA + VAL(I);
29 END;
30 XMEDIA = SOMA/10;
31 PUT SKIP EDIT(VAL) ((10)F(10,3));
32 PUT SKIP EDIT(SOMA,XMEDIA) (F(10,3));
33 DO I = 1 TO 10;
34 VAL(I) = VAL(I) ** 3;
35 END;
36 SOMA = 0;
37 DO I = 1 TO 10;
38 SOMA = SOMA + VAL(I);
39 END;
40 XMEDIA = SOMA/10;
41 PUT SKIP EDIT(VAL) ((10)F(10,3));
42 PUT SKIP EDIT(SOMA,XMEDIA) (F(10,3));
43 END EX1C16;
1 EX2C16:
2 PROC OPTIONS(MAIN);
3 DCL VAL(10), XMEDIA FIXED(10,3)
4 ;
5 GET EDIT(VAL) ((10)F(5));
6 CALL CALCULO;
7 DO I = 1 TO 10;
8 VAL(I) = VAL(I) - XMEDIA;
9 END;
10 CALL CALCULO;
11 DO I = 1 TO 10;
12 VAL(I) = VAL(I) ** 2;
13 END;
14 CALL CALCULO;
15 DO I = 1 TO 10;
16 VAL(I) = VAL(I) ** 3;
17 END;
18 CALL CALCULO;
19 CALCULO:
20 PROC;
21 SOMA = 0;
22 DO I = 1 TO 10;
16. SUBPROGRAMAS
Page 149
EX3C16:
PROC OPTIONS(MAIN);
GET DATA(CODIGO);
IF CODIGO = 1 THEN
CALL ROTINA1;
ELSE IF CODIGO = 2 THEN
CALL ROTINA2;
ELSE IF CODIGO = 3 THEN
CALL ROTINA3;
ELSE IF CODIGO = 4 THEN
CALL ROTINA4;
ELSE PUT SKIP LIST('ERRO NO CODIGO');
ROTINA1:
PROC;
(comandos);
END ROTINA1;
ROTINA2:
PROC;
(comandos);
END ROTINA2;
ROTINA3:
PROC;
(comandos);
END ROTINA3;
ROTINA4:
PROC;
(comandos);
END ROTINA4;
END EX3C16;
16. SUBPROGRAMAS
Page 150
EX4C16:
PROC OPTIONS(MAIN);
DCL (X,Y,Z) FLOAT
;
GET LIST(X,Y,Z);
Z = Z + 3 * CONT(X,X+Y+10);
PUT SKIP(5) DATA(Z);
END EX4C16;
CONT:
PROC(A,B);
DCL (A,B) FLOAT
;
IF A LE B THEN
RETURN(B-A);
ELSE
RETURN(A-B);
END CONT;
________________
Para uma entrada formada pelos valores / 10 20 30 │
│________________│
_________________
│ │
obteremos a seguinte saida: │ Z= 1.200000E+02;│
│________________/
EX5C16:
PROC OPTIONS(MAIN);
DCL SUB ENTRY(FIXED,,BINARY,BINARY)
,SS ENTRY RETURNS(BINARY)
;
GET LIST(A,B);
CALL SUB(A,B,C,SS);
PUT SKIP EDIT(A,B,C)(F(6,2));
END EX5C16;
SUB:
PROC(X,Y,Z,W)
DCL X FIXED,(W,Z) BINARY
;
Z=X+Y+W;
END SUB;
SS:
PROC RETURNS(BINARY);
GET LIST(A,B);
RETURN(A+B);
END SS;
Sendo os dados de entrada constituidos pelos valores:
____________________________
16. SUBPROGRAMAS
Page 151
/ │
│10.0 10.0 5.5 4.5 │
│_____________________________│
obtem-se a seguinte saida impressa:
____________________________
│ │
│ b10.00b20.00b30.00 │
│ /
│__________________________/
16. SUBPROGRAMAS
Page 152
17.1. INTRODUCAO
________________
17.2. STATIC
____________
ESTATIC: PROC;
-----
-----
DCL CONT FIXED STATIC INIT(0);
-----
-----
PUT LIST(CONT);
-----
CONT = CONT + 10;
-----
END ESTATIC;
Page 153
bloco qua a ativou, a variavel CONT contera' o valor 10, por forca do co-
mando CONT=CONT+10. Apos uma segunda chamada dessa PROC, essa variavel
saira' com o valor 20 e assim sucessivamente, de 10 em 10, para cada cha-
mada da PROC.
17.3. AUTOMATIC
_______________
17.4. CONTROLLED
________________
Uma vez desativado o bloco, essa alocacao sera' liberada, nao precisando,
pois, do uso do comando FREE, o qual e' usado somente quando se desejam
fazer varias alocacoes para a mesma variavel, onde o acesso 'as alocacoes
anteriores so' sera' permitido com o uso do comando FREE, para liberar a
ultima alocacao feita.
Page 154
CONTROL:PROC; ALLOC:PROC;
----- DCL A CTL;
----- -----
DCL A(10) CTL, B CTL; ALLOCATE A;
----- A = B + C;
ALLOCATE A; -----
----- ALLOCATE A;
ALLOCATE B; A = C + D;
----- PUT DATA(A);
FREE A; FREE A;
----- PUT DATA(A);
ALLOCATE A; -----
----- FREE A;
END CONTROL; PUT DATA(A);
= = = =
----- -----
DCL A CHAR(10) CTL; DCL A CHAR(10) VAR CTL;
----- -----
ALLOCATE A; ALLOCATE A CHAR(5);
----- -----
Page 155
----- -----
DCL B(N) CTL; DCL B(*,*) CTL;
----- -----
N = 10; J = 15;
ALLOCATE B; ALLOCATE B(J,5);
----- -----
Page 156
EX1C17:
PROC OPTIONS(MAIN);
DCL (A(*,*), B(*,*), C(*,*)) FIXED(2) CTL
;
GET DATA(N,M,L);
ALLOCATE A(N,M), B(M,L), C(N,L);
GET LIST(A,B);
PUT EDIT(N,M,M,L,N,L)(SKIP,6 f(2));
DO I = 1 TO N;
DO K = 1 TO L;
C(I,K) = SUM(A(I,*)*B(*,K));
END;
END;
PUT SKIP(2) EDIT(A)(F(2));
PUT SKIP(2) EDIT(B)(F(2));
PUT SKIP(2) EDIT(C)(F(3));
END EX1C17;
ENTRADA: __________________________________________
/
/ N=2, M=3, L=2; 1 1 1 1 1 1 2 2 2 2 2 2
│
│
SAIDA: ________________________________________
│ 2 3 3 2 2 2
│ 1 1 1 1 1 1
│ 2 2 2 2 2 2
│ 6 6 6 6 6 6
│
E' usada para se saber se foi alocada memoria para a variavel de atributo
CTL ou nao.
Page 157
17.8. BASED
___________
Uma variavel BASED e' sempre declarada com uma variavel POINTER, por
exemplo: DCL C BASED(D); onde C e' a variavel que tera' o atributo BASED
e D e' o POINTER associado a ela.
Pode-se tambem declarar uma variavel como sendo POINTER, simplesmente co-
locando essa palavra adiante do nome da variavel; por exemplo: DCL D
POINTER;
Seja um array denominado C cuja declaracao e' dada pelo seguinte comando:
DCL C(10) CHAR(40);
Cada elemento desse array e' identificado pelo nome do array e seu
correspondente subscrito, por exemplo: C(1), C(2), ... C(10), represen-
tando o primeiro, segundo, ..., decimo elemento, respectivamente Pois
bem, como cada elemento ocupa 40 bytes de memoria, se o primeiro elemento
ocupar a posicao 1000 de memoria, poderemos referir-nos aos demais ele-
mentos pelos enderecos: 1040 para o segundo, 1080 para o terceiro, 1120
para o quarto e assim por diante, ate' o decimo elemento. Esses
enderecos, chamados enderecos absolutos, especificam, entao, as alocacoe
atuais de memoria do array denominado C.
DCL P POINTER;
DCL (Q,R,S) POINTER EXTERNAL;
DCL 1 EST, 2 X CHAR(10), 2 H POINTER, 2 Z(-6:6) POINTER;
Page 158
A referencia pela funcao NULL (essa nao tem argumento) faz com que a
variavel POINTER contenha um valor que nao identifique alocacao alguma de
memoria. E' como se fosse um endereco nulo. E' usada para limpar
variaveis pointers e para testar memoria nao alocada.
Como argumento de uma funcao ADDR pode-se ter uma variavel de elemento,
um array, um elemento de array, uma estrutura ou subestrutura e um ele-
mento de estrutura.
Podemos ter comandos de atribuicao usando variaveis pointer onde so' sao
permitidos os seguintes casos:
Podemos ter do lado esquerdo mais de uma variavel pointer, sendo que,
nesse caso, deverao estar separadas por virgulas.
Por exemplo:
___________________________________
│ │
│ variavel atributos BASED(pointer) │
│___________________________________│
Page 160
Vejamos o programa:
EX2C17:
PROC OPTIONS(MAIN);
DCL MEDIA RETURNS(FIXED)
,T(10) FIXED(5)
,P(10) POINTER
;
DO I = 1 TO 10;
GET EDIT(T(I)) (F(5));
P(I) = ADDR(T(I));
END;
PUT EDIT(T)(F(2));
PUT LIST('RESULTADO RETORNADO PELA FUNCAO "MEDIA" =',MEDIA(P))
;
MEDIA:
PROC(PP) RETURNS(FIXED(5));
DCL PP(*) POINTER
,VALOR BASED(S) FIXED(5)
(M,N) FIXED(5) INIT(0)
;
DO I = 1 TO HBOUND(PP,1);
IF PP(I) NE NULL THEN
DO;
S = PP(I);
M = M + VALOR; N = N + 1;
END;
END;
IF N = 0 THEN
RETURN(0)
ELSE
RETURN(M/N);
END MEDIA;
END EX2C17;
Page 161
PL/1 permite que uma variavel BASED seja associada com mais de uma area
de memoria ao mesmo tempo.
Essa multipla associacao e' possivel porque uma variavel BASED por si
so' nao especifica uma constante, mas somente uma descricao de memoria.
Uma variavel BASED especifica os atributos e a extensao de uma area de
memoria com a qual ela esta' associada (por meio da variavel POINTER).
Mesmo que somente um POINTER possa ser associado a uma variavel BASED (na
declaracao da variavel based), podemos associar simultaneamente dois ou
mais POINTERs a uma mesma variavel BASED. Essa multipla associacao e'
chamada "POINTER QUALIFICATION" (qualificacao por POINTER) e e' usada
para distinguir duas ou mais areas de memoria associada com uma mesma
variavel BASED, permitindo que outros POINTERS desfacam o POINTER especi-
ficado na declaracao da variavel BASED (no Declare).
Esse simbolo nao significa uma operacao. Tem uma funcao semelhante a do
ponto usado na referencia qualificada de um elemento de uma estrutura ,
ou seja, DCL 1 EST, 2 A, 2 B; onde poderiamos ter EST.B significando a
referencia ao elemento B da estrutura EST.
Page 162
Essa expressao indica a referencia para um dado que tem atributos decla-
rados em Q e alocacao de memoria especificada em P.
EX3C17:
PROC OPTIONS(MAIN);
DCL P(100) POINTER, T(100) FIXED
;
DO I = 1 TO 100;
GET EDIT(T(I))(F(5));
PUT SKIP LIST(T(I));
P(I) = ADDR(T(I));
END;
CALL TROCA(P)
DO I = 1 TO 100;
PUT SKIP LIST(' ',' ',T(I));
END;
END EX3C17;
TROCA:
PROC(P);
DCL (P(*),R,S) POINTER, VALOR BASED(S),
SALVA FIXED
;
DO I = 1 TO HBOUND(P,1) - 1 BY 2;
S = P(I);
R = P(I+1);
SALVA = S PT VALOR;
S PT VALOR = R PT VALOR;
R PT VALOR = SALVA;
END;
END TROCA;
Page 163
® Nao se podem transmitir valores de uma variavel BASED por meio do co-
mando DATA de entrada e saida.
O programa se propoe, lendo uma "acao" a ser tomada, que pode ser
INCLUIR,EXCLUIR,ALTERAR ou LISTAR, a ativar a sub-rotina correspondente
incluindo, excluindo ou alterando um elemento ou listando todos os ele-
mentos da lista .
EX4C17:
PROC OPTIONS(MAIN);
DCL NULL BUILTIN,XAV_FIM_SYSIN BIT(1) INIT('1'B)
,1 REGISTRO BASED(P)
,2 XAVEG CHAR(5)
,2 REG CHAR(3)
,2 SEGUINTE POINTER
,ACAO CHAR(7) VAR
,(PRIMEIRO,ULTIMO,ATUAL) POINTER
;
ON ENDFILE(SYSIN) XAV_FIM_SYSIN= '0'B;
PRIMEIRO = NULL;
GET FILE(SYSIN) EDIT(ACAO)(COL(1),A(7));
DO WHILE(XAV_FIM_SYSIN);
PUT FILE(SYSPRINT) SKIP EDIT(ACAO);
Page 164
Page 165
DO;
PUT FILE(SYSPRINT) EDIT
('REGISTRO A SER ALTERADO') (SKIP,A)
(ATUAL PT XAVREG,ATUAL PT REG) (SKIP,A,A);
ATUAL PT REG = ALTEG;
ATUAL = NULL;
END;
END;
END ALTERAR;
EXCLUIR:
PROC;
DCL CHAVE CHAR(5), ANTERIOR POINTER;
;
GET FILE(SYSIN) EDIT(CHAVE) (COL(1),A(5));
PUT FILE(SYSPRINT) SKIP EDIT(CHAVE) (A);
IF PRIMEIRO = NULL THEN
PUT FILE(SYSPRINT) SKIP LIST('NAO HA REGISTROS');
ANTERIOR, ATUAL = PRIMEIRO;
DO WHILE(ATUAL NE NULL);
IF ATUAL PT XAVREG NE CHAVE THEN
DO;
ANTERIOR = ATUAL;
ATUAL = ATUAL PT SEGUINTE;
END;
ELSE
DO;
IF ATUAL =PRIMEIRO THEN
PRIMEIRO = ATUAL PT SEGUINTE;
ELSE
ANTERIOR PT SEGUINTE = ATUAL PT SEGUINTE;
IF ATUAL = ULTIMO THEN
ULTIMO = ANTERIOR;
FREE ATUAL PT REGISTRO;
PUT FILE(SYSPRINT) SKIP EDIT
('REGISTRO ',CHAVE,'EXCLUIDO DA LISTA') (A);
ATUAL = NULL;
END;
END;
END EXCLUIR;
END EX4C17;
INCLUIR
AAAA111
INCLUIR
BBBBB222
INCLUIR
Page 166
CCCCC333
INCLUIR
DDDDD444
LISTAR
AAAAA111
BBBBB222
CCCCC333
DDDDD444
EXCLUIR
AAAAA
LISTAR
BBBBB222
CCCCC333
DDDDD444
INCLUIR
EEEEE555
ALTERAR
CCCCC777
CCCCC333
LISTAR
BBBBB222
CCCCC777
DDDDD444
EEEEE555
EXCLUIR
Page 167
EEEEE
FIM DO TRABALHO
Este topico trata dos espacos ocupados na memoria pelos diversos tipos de
variaveis existentes na linguagem e seus respecticos alinhamentos com re-
ferencia aos enderecamentos permitidos:
17. ALOCACAO DE MEMORIA
Page 168
Page 169
17.10. APLICACOES
_________________
1)Este programa e' para resolver sistemas lineares de M equacoes a N
incognitas, onde o valor de M e' lido, tornando o programa com
caracteristicas gerais.
EX5C17:
PROC OPTIONS(MAIN);
DCL (A(*,*),AUX(*),TETA(*)) FLOAT(10) CONTROLLED
,MULT FLOAT(10),(M,N,M1,I,J,K,II) FIXED(2)
,FRMAT LABEL
;
GET LIST(M) COPY;
N = M + 1; M1 = M - 1;
ALLOCATE A(M,N), AUX(N), TETA(M);
FRMAT2:
FORMAT((N)E(120/N,8));
GET LIST(A) COPY;
FRMAT = FRMAT2;
PUT SKIP(3) EDIT
(((A(I,J) DO J = 1 TO N) DO I = 1 TO M))
(R(FRMAT));
METODO:
DO K = 1 TO M1;
DO WHILE(A(K,K) = 0);
AUX = A(K,*);
A(K,*) = A(K + 1,*);
A(K + 1,*) = AUX;
END;
DO I = K + 1 TO M;
MULT = FLOAT(A(I,J))/A(K,K);
DO II = I TO M;
DO J = K TO N;
(II,J) = A(K,J) * MULT - A(II,J);
END METODO;
DO J = M TO │ BY -1;
TETA(J) = A(J,N)/A(J,J);
DO I = J + 1 TO M;
TETA(J) = TETA(J) - TETA(I)*A(J,I)/A(J,I);
END;
END;
PUT PAGE;
PUT SKIPE(5) EDIT(TETA)(R(FRMAT2));
END EX5C17;
A seguir , um lay-out da saida desse programa , para M = 5:
5
2.5
0.87153
-1.35355
-0.95079
0.5
Page 170
1.0
2.625
0.99653
-1.22855
-0.82579
0.625
1.0
3.0
1.35253
-0.92667
-0.80512
0.750
1.0
3.625
1.75008
-0.97855
-1.08797
0.625
1.0
4.5
3.01367
0.5
-0.24831
0.5
1.0
SOLUCAO
5.39435870E+00 -8.00143544E+00 3.19141891E+00 6.20689110E-01 ...
... -1.20503128E+00
Page 171
EX6C17:
PROC OPTIONS(MAIN);
DCL NUM(*) DEC FIXED(6) CONTROLLED EXTERNAL
,ORD CHAR(1), N DEC FIXED(6)
;
ON ENDFILE(SYSIN)
GOTO FINAL;
DO WHILE(1);
GET LIST(N,ORD);
ALLOCATE NUM(N);
CALL ORDENA(ORD,N);
IF ORD = 'C' THEN
PUT EDIT('ORDEM CRESCENTE') (SKIP(3),A);
ELSE
PUT EDIT('ORDEM DECRESCENTE') (SKIP(3),A);
PUT EDIT(NUM) (20 F(6));
END;
FINAL:
END EX6C17;
ORDENA:
PROC(ORD,N) OPTIONS(MAIN);
DCL NUM(*) FIXED(6) CONTROLLED EXTERNAL
,ORD CHAR(1), IND BIT(1);
,(J,N) FIXED(6), TROCA FIXED(6)
;
IF ORD = 'C' THEN
CALL CRESC;
ELSE
CALL DECRESC;
CRESC:
PROC;
CT = -1;
VOLTA:
IND ='0'B;
CT = CT + 1;
DO J = 2 TO N - CT;
IF NUM(J) LT NUM(J-1) THEN
CALL TROC;
END;
IF IND THEN
GOTO VOLTA;
END CRESC;
DECRESC:
PROC;
CT = -1;
VOLTA;
IND = '0'B;
CT = CT + 1;
DO J = 2 TO N - CT;
IF NUM(J) GT NUM(J - 1) THEN
CALL TROC;
END;
Page 172
IF IND THEN
GOTO VOLTA;
END DECRESC;
TROC:
PROC;
IND = '1'B;
TROCA = NUM(J);
NUM(J) = NUM(J - 1);
NUM(J - 1) = TROCA;
RETURN;
END TROC;
END ORDENA;
_____________________________
/ │
/ 10 'D' 3 4 2 1 5 6 7 10 9 8 │
│ │
│______________________________│
ORDEM CRESCENTE 1 2 3 4 5 6 7 8 9 10
ORDEM DECRESCENTE 10 9 8 7 6 5 4 3 2 1
3)Programa para classificar um array de estruturas usando variaveis
POINTER e BASED.
EX7C17:
PROC OPTIONS(MAIN);
DCL P(5) POINTER
,1 IMAGEM BASED(S)
,2 CHAVE CHAR(3)
,2 RESTO CHAR(77)
,1 CARTAO(5)
,2 CHAVE CHAR(3)
,2 RESTO CHAR(77)
;
GET EDIT(CARTAO) (A(3),A(77));
DO I = 1 TO 5;
P(I) = ADDR(CARTAO(I));
END;
CALL SORT(P);
DO I = 1 TO 5;
S = P(I);
PUT EDIT(S PT IMAGEM) (SKIP,2 A);
END;
Page 173
SORT:
PROC(PP);
DCL (PP(*),T POINTER
,IND BIT(1) INIT('1'B)
,1 IMAGEM BASED(S)
,2 CHAVE CHAR(3)
,2 RESTO CHAR(77)
;
DO WHILE(IND);
IND = '0'B;
DO I = 1 TO (DIM(PP,1) - 1);
S = PP(I);
T = PP(I + 1);
IF (S PT IMAGEM.CHAVE) GT
(T PT IMAGEM.CHAVE) THEN
DO;
IND = '1'B;
PP(I) = T;
PP(I + 1) = S;
END;
END;
END;
RETURN;
END SORT;
END EX7C17;
EX8C17:
PROC OPTIONS(MAIN);
DCL P(5) POINTER
,1 IMAGEM BASED(S)
,2 CHAVE CHAR(3)
,2 RESTO CHAR(77)
,1 CARTAO CTL
,2 CHAVE CHAR(3)
,2 RESTO CHAR(77)
;
DO I = 1 TO 5;
ALLOCATE CARTAO;
GET EDIT(CARTAO) (A(3),A(77));
P(i) = ADDR(CARTAO);
END;
CALL SORT(P);
DO I = 1 TO 5;
S = P(I);
PUT EDIT(S PT IMAGEM) (SKIP,2 A);
END;
END EX8C17;
Page 174
18. ARQUIVOS
____________
18.1. INTRODUCAO
________________
1)- o metodo que usa os comandos de entrada e saida, GET e PUT quando os
dados sao tratados como uma corrente continua de caracteres.
2)- o metodo que usa os comandos READ e WRITE - quando os dados sao tra-
tados como grupos separados, nao mais em fileiras continuas. E' o
aparecimento da nocao de "registros" (que sera' vista mais adiante).
18. ARQUIVOS
Page 175
_________________________________________
│ STREAM/RECORD │
│ INPUT/OUTPUT/UPDATE │
│ PRINT/RECORD │
│ SEQUENTIAL/DIRECT/TRANSIENT/STREAM │
│ ENVIRONMENT/'DCB' do arquivo │
│ EXTERNAL/INTERNAL │
│ KEYED/STREAM │
│ PRINT/RECORD │
│_________________________________________│
fig. 18.1
18. ARQUIVOS
Page 176
1) DCL ARQ FILE INPUT STREAM: onde ARQ e' um arquivo (FILE) de entrada a
ser usado na modalidade STREAM.
2) DCL ARQUIVO FILE OUTPUT RECORD SEQUENTIAL; onde ARQUIVO e' o nome de
um arquivo de saida (OUTPUT), a ser acessado na modalidade de registros
(RECORD) sequenciais.
18. ARQUIVOS
Page 177
.....
FILE(nome do arquivo) atributos;
CLOSE FILE(nome do arquivo), FILE(nome do arquivo),
....
FILE(nome do arquivo);
Um arquivo nao precisa ser fechado no final do programa, pois ele e'
automaticamente fechado quando o programa termina.
Os arquivos STREAM sao aqueles em que os dados sao tratados como uma
fileira continua de caracteres.
Os comandos de acesso aos arquivos sao os comandos ja' vistos ate' agora,
o GET e o PUT, cujas formas gerais sao:
18. ARQUIVOS
Page 178
EX1C18:
PROC OPTIONS(MAIN);
DCL REG (100) FIXED(2),
ARQREG FILE;
GET FILE(SYSIN) LIST(REG);
OPEN FILE(ARQREG) OUTPUT;
PUT FILE(ARQREG) LIST(REG);
CLOSE FILE(ARQREG);
OPEN FILE(ARQREG) INPUT;
GET FILE(ARQREG) LIST(REG);
PUT FILE(SYSPRINT) DATA(REG);
END EX1C18;
Esse programa le uma ordenacao de 100 elementos, cuja ordem de grandeza
varia entre -99 e +99 (para o array REG) da leitora-padrao do sistema
(SYSIN), grava-os no arquivo de nome ARQREG (arquivo STREAM) e em se-
guida, abre esse mesmo arquivo como um arquivo de entrada, le seu
conteudo e imprime na impressora-padrao do sistema (SYSPRINT).
EX2C18:
PROC OPTIONS(MAIN);
DCL ARQUIVO FILE;
GET FILE(SYSIN) DATA(X,Y,Z);
OPEN FILE(ARQUIVO) OUTPUT;
PUT FILE(ARQUIVO) EDIT(X,Y,Z) (3 F(6));
CLOSE FILE(ARQUIVO);
OPEN FILE(ARQUIVO) INPUT;
GET FILE(ARQUIVO) EDIT(A,B,C) (3 F(6));
PUT FILE(SYSPRINT) LIST(A,B,C);
END EX2C18;
Assim, para uma entrada formatada por X=10, Y=20, Z=30; (por forca do co-
mando GET FILE(SYSIN) DATA(X,Y,Z);) teriamos uma saida do tipo:
________________________________________________________________
│
18. ARQUIVOS
Page 179
EX3C18:
PROC OPTIONS(MAIN);
DCL TEST FILE INPUT;
ON ENDFILE(TEST) GO TO FIM;
DO WHILE('1'B);
GET FILE(TEST) EDIT(REG) (A(150));
PUT SKIP FILE(SYSPRINT) LIST(REG);
END;
FIM;
END EX3C18;
Page 180
______________________________________________________________
│ OPCOES │ LISTA DE FORMATOS │ COMANDOS │ FUNCAO │
│___________│___________________│_____________│________________│
│ │ │ │ │
│LINESIZE(w)│ --- │ OPEN │ nro. maximo │
│ │ │ │ de caracteres │
│ │ │ │ por linha. │
│ │ │ │ │
│PAGESIZE(w)│ --- │ PAGE │ nro. maximo │
│ │ │ │ de linhas por │
│ │ │ │ pagina. │
│ │ │ │ │
│PAGE │ PAGE │ PUT │ mudar de │
│ │ │ │ pagina antes │
│ │ │ │ da impressao │
│ │ │ │ │
│LINE(w) │ LINE(w) │ PUT │ mudar para a │
│ │ │ │ linha w antes │
│ │ │ │ da impressao │
│ │ │ │ │
│SKIP(w) │ SKIP(w) │ PUT │ pular w-1 │
│ │ │ │ linhas antes │
│ │ │ │ da impressao │
│ │ │ │ │
│COL(w) │ COL(w) │ PUT │ passar para a │
│ │ │ │ coluna w antes │
│ │ │ │ da impressao │
│ │ │ │ │
│X(w) │ X(w) │ PUT │ saltar w │
│ │ │ │ espacos antes │
│ │ │ │ da impressao │
│___________│___________________│_____________│________________│
Fig. 18.2
18. ARQUIVOS
Page 181
ou qualquer outra combinacao coerente com os atributos declarados.
EX4C18;
PROC OPTIONS(MAIN);
DCL TAB FILE OUTPUT PRINT,
TITULO CHAR(26) INIT('RAIZ QUADRADA E POTENCIA DE 2'),
(POT,RAIZ) FLOAT(10),
PAGIM DEC FIXED(2) INIT(0);
OPEN FILE(TAB) PAGESIZE(52) LINESIZE(72);
ON ENDPAGE(TAB)
BEGIN;
PUT FILE(TAB) PAGE;
PAGIM=PAGIM+1;
PUT FILE(TAB) EDIT('PAGINA',PAGIM) (COL(62),A,F(4));
PUT FILE(TAB) EDIT(TITULO) (X(10),A);
PUT FILE(TAB) SKIP(2);
KONT=0;
END;
PUT FILE(TAB) SKIP(60);
DO XI= 1.0 TO 10.0 BY 0.1;
KONT=KONT+1;
RAIX=SORT(XI);
POT=XI*XI;
PUT FILE(TAB) EDIT(XI,POT,RAIZ) (SKIP,F(4,2),2(X(5),
E(15,6)));
IF KONT=20
THEN PUT FILE(TAB) SKIP(60);
END;
CLOSE FILE(TAB);
END EX4C18;
18. ARQUIVOS
Page 182
Os arquivos RECORD sao aqueles em que os dados nao sao mais tratados como
uma fileira continua de caracteres, mas como grupos separados de caracte-
res, formando o que se denomina REGISTROS.
Para o caso de registros de tamanho fixo, o fator de bloco tem que ser
divisor exato do registro fisico, isto e', ele deve indicar exatamente
quantos registros logicos existem no registro fisico.
18. ARQUIVOS
Page 183
Em resumo, o acesso ao arquivo pelo programador e' sempre feito por meio
de registros logicos e o acesso ao arquivo pelo programa e' sempre feito
por meio de registros fisicos (area de buffer).
E' por meio desse atributo que se especificam os comprimentos dos regis-
tros logico e fisico, os tipos de registros (se fixo, variavel ou indefi-
nido) e as organizacoes dos arquivos (CONSECUTIVE, INDEXED, REGIONAL).
Mais uma vez deve ser lembrado que o tipo de organizacao de arquivos de
que estamos tratando e' o CONSECUTIVE (assumido automaticamente quando
nao se declara o atributo ENV ou nao se declara no atributo ENV).
18. ARQUIVOS
Page 184
O importante, nesse caso, e' saber que cada registro fisico e' composto
por apenas um registro logico, cujo comprimento pode variar ate' o seu
valor maximo especificado.
_____________________________________________________________
│ B │ A1 │ RL1 │ A2 │ RL2 │ A3 │ RL3 │ ..... │ An │ RLn │/////│
│___│____│_____│____│_____│____│_____│_______│____│_____│_____│
│ <---> <---> <---> <--->│ │
│ C1 C2 C3 Cn │ │
│ │ │
│ │ │
│<---------- tamanho do bloco ----------------------->│ │
│ │
│<---------- tamanho maximo do bloco -------------------->│
│ │
onde:
B - campo de 4 bytes colocado antes do registro fisico (bloco)
Ai - campo de 4 bytes colocado antes de cada registro logico-i
RLi - campo contendo o registro logico-i
Ci - comprimento do registro logico-i
18. ARQUIVOS
Page 185
┌───────────────────────────────────────────────────────────────────────┐
| |
| READ FILE(nome do arquivo) INTO(variavel); |
└───────────────────────────────────────────────────────────────────────┘
A variavel para onde e' lido o registro pode ser uma estrutura (nivel 1),
uma variavel array (sem subscrito) ou uma variavel simples.
Por exemplo, READ FILE(ENT) INTO(CAMPO); fara' com que um registro logico
seja lido do arquivo denominado ENT (arquivo RECORD INPUT ou UPDATE)para
a variavel denominada CAMPO (podendo ser uma estrutura, um array ou uma
variavel simples).
┌───────────────────────────────────────────────────────────────────────┐
18. ARQUIVOS
Page 186
| |
| WRITE FILE(nome do arquivo) FROM(variavel); |
└───────────────────────────────────────────────────────────────────────┘
A variavel de onde e' transmitido o registro pode ser uma qualquer das
apresentadas no comando READ.
┌───────────────────────────────────────────────────────────────────────┐
| |
| REWRITE FILE(nome do arquivo) FROM(variavel); |
└───────────────────────────────────────────────────────────────────────┘
EX5C18:
PROC OPTIONS(MAIN);
DCL (REG1,REG2) (100) PIC'99'
,REG PIC'99' ARQREG FILE RECORD ENV(F(50,2))
;
GET FILE(SYSIN) LIST(REG1);
OPEN FILE(ARQREG) OUTPUT;
DO I = 1 TO 100;
REG = REG1(I);
WRITE FILE(ARQREG) FROM(REG);
END;
CLOSE FILE(ARQREG);
OPEN FILE(ARQREG) INPUT;
DO I = 1 TO 100;
READ FILE(ARQREG) INTO(REG);
18. ARQUIVOS
Page 187
REG2(I) = REG;
END;
PUT FILE(SYSPRINT) DATA(REG2);
END EX5C18;
EX6C18:
PROC OPTIONS(MAIN);
DCL REG(100) PIC'99'
,ARQREG FILE RECORD ENV(F(200))
;
GET FILE(SYSIN) LIST(REG);
OPEN FILE(ARQREG) OUTPUT;
WRITE FILE(ARQREG) FROM(REG);
CLOSE FILE(ARQREG);
OPEN FILE(ARQREG) INPUT;
READ FILE(ARQREG) INTO(REG);
PUT FILE(SYSPRINT) DATA(REG);
CLOSE FILE(ARQREG);
END EX6C18;
EX7C18:
PROC OPTIONS(MAIN);
DCL ARQIN RECORD INPUT ENV(F(30))
,ARQ2000 RECORD ENV(F(30))
,1 EST
,2 NOME
,3 ULTIMO CHAR(15)
,3 PRIMEIRO CHAR(10)
,2 SALARIO PIC'99999'
;
ON ENDFILE(ARQIN)
GOTO SEG;
DO WHILE('1'B);
READ FILE(ARQIN) INTO(EST);
PUT FILE(SYSPRINT) SKIP DATA(EST);
IF SALARIO GT 2000 THEN
WRITE FILE(ARQ2000) FROM(EST);
END;
SEG:
CLOSE FILE(ARQ2000);
18. ARQUIVOS
Page 188
Este topico diz respeito ao uso dos parametros CTLASA e CTL360 para con-
trole do carro impressor em arquivos RECORD.
Os registros para esse tipo de arquivo deverao ter um byte a mais no seu
inicio, onde sera' armazenado o carater de controle do carro.
18. ARQUIVOS
Page 189
__________________________________________________________
│ │ │
│ VALOR │ │
│_____________│____________________________________________│
│ │ │
│ branco │ passar para linha seguinte │
│ 0 │ pular uma linha │
│ - │ pular duas linhas │
│ + │ nao mudar de linha │
│ 1 │ mudar de pagina (saltar p/ canal 1) │
│ 2 │ saltar para canal 2 │
│ . │ ... │
│ . │ ... │
│ 8 │ saltar para canal 8 │
│ 9 │ saltar para canal 9 │
│ A │ saltar para canal 10 │
│ B │ saltar para canal 11 │
│ C │ saltar para canal 12 │
│ V │ selecionar escaninho 1 │
│ W │ selecionar escaninho 2 │
│_____________│____________________________________________│
Todas essas funcoes da especificacao CTLASA sao tomadas antes que o re-
gistro seja gravado.
00000001 - WRITE
00001001 - WRITE e espaceja uma linha depois da impressao
00010001 - WRITE e espaceja duas linhas depois da impressao
....
10001001 - WRITE e SKIP para o canal 1 depois da impressao
....
00001011 - espacejar uma linha imediatamente e assim sucessivamente.
EX8C18:
PROC OPTIONS(MAIN);
DCL ARQUIVO RECORD ENV(V(73) CTLASA)
,1 CAB
,2 CONTROLE CHAR(1) INIT('1')
,2 BRANCO1 CHAR(13) INIT(' ')
,2 TITULO1 CHAR(5) INIT('VALOR')
,2 BRANCO2 CHAR(6) INIT(' ')
,2 TITULO2 CHAR(8) INIT('QUADRADO')
,2 BRANCO3 CHAR(10) INIT(' ')
18. ARQUIVOS
Page 190
18. ARQUIVOS
Page 191
**************************************************************
- 1 1 1
2 4 8
3 9 27
4 16 64
5 25 125
- 6 36 216
7 49 343
8 64 512
9 81 729
10 100 1000
- 11 121 1331
12 144 1728
... ... ...
... ... ...
26 676 17576
27 729 19683
28 784 21952
29 841 24389
30 900 27000
Essa parte e' a saida provocada pelo comando PUT FILE(SYSPRINT) SKIP
EDIT(DETALHE) (A,3(a,F(5)));
18. ARQUIVOS
Page 192
1 1 1
2 4 8
3 9 27
4 16 64
5 25 125
6 36 216
7 49 343
8 64 512
9 81 729
10 100 1000
11 121 1331
12 144 1728
13 169 2197
14 196 2744
15 225 3375
16 256 4096
17 289 4913
18 324 5832
19 361 6859
20 400 8000
21 441 9261
22 484 10648
23 529 12167
24 576 13824
25 625 15625
VALOR QUADRADO CUBO
26 676 17576
27 729 19683
28 784 21952
29 841 24389
30 900 27000
E' usada quando desejamos que varios arquivos sejam abertos e usados por
meio de um titulo especial.
18. ARQUIVOS
Page 193
_________________________________________________________
│ │
│ OPEN FILE(nome do arq) TITLE(titulo do arq) atributos; │
│_________________________________________________________│
Por exemplo:
EX10C18:
PROC OPTIONS(MAIN);
DCL ARQ FILE RECORD INPUT ENV(F(80))
,REGISTRO CHAR(80)
,TIT(3) CHAR(4) INIT('TIT1','TIT2','TIT3')
,TITN CHAR(4)
;
DO I = 1,2,3;
PUT SKIP(2) LIST(' ARQUIVO LIDO NUMERO',I);
ON ENDFILE(ARQ)
18. ARQUIVOS
Page 194
GOTO FORA;
TITN = TIT(I);
OPEN FILE(ARQ) TITLE(TITN);
LER:
READ FILE(ARQ) INTO(REGISTRO);
PUT SKIP LIST(REGISTRO);
GOTO LER;
FORA:
CLOSE FILE(ARQ);
END:
END EX10C18;
e, para esse programa, deverao existir 3 cartoes DD, cujos DDnames sao:
//TIT1 DD . . . .
//TIT2 DD . . . .
//TIT3 DD . . . .
18.11. APLICACAO
________________
EX11C18:
PROC OPTIONS(MAIN);
DCL PERFURA FILE STREAM OUTPUT
,DISCO FILE RECORD OUTPUT SEQUENTIAL
,1 REGISTRO
,2 (A,B,C,RAIZ1,RAIZ2) FLOAT DEC(6) COMPLEX
;
ON ENDFILE(SYSSIN)
GOTO FIM;
OPEN FILE(PERFURA), FILE(DISCO);
LER:
GET FILE(SYSIN) LIST(A,B,C);
RAIZ1 = (-B+SQRT(B*B-4*A*C)) / (2*A);
RAIZ2 = (-B-SQRT(B*B-4*A*C)) / (2*A);
PUT FILE(PERFURA) EDIT(REGISTRO) (C(E(16,9)));
WRITE FILE(DISCO) FROM(REGISTRO);
GOTO LER;
FIM:
CLOSE FILE(PERFURA), FILE(DISCO);
END EX11C18;
18. ARQUIVOS
Page 195
EX12C18:
PROC OPTIONS(MAIN);
DCL SOLUCAO FILE RECORD INPUT SEQUENTIAL
,1 REGISTRO
,2 (A,B,C,RAIZ1,RAIZ2) COMPLEX
;
ON ENDFILE(SOLUCAO)
GOTO FIM;
PUT FILE(SYSPRINT) EDIT('A','B','C','RAIZ1','RAIZ2')
(SKIP(5),3 (x(12),A,X(11)),2 (X(9),A,X(10)));
PUT SKIP EDIT((120)'*') (A);
OPEN FILE(SOLUCAO);
LER:
READ FILE(SOLUCAO) INTO(REGISTRO);
PUT FILE(SYSPRINT) SKIP EDIT(REGISTRO) (C(F(12,2)));
GOTO LER;
FIM;
CLOSE FILE(SOLUCAO);
PUT SKIP EDIT((120)'*') (A(120));
END EX12C18;
18. ARQUIVOS
Page 196
A B C RAIZ1 RAIZ2
**********************************************************************
5.00 0.00 12.00 0.00 4.00 0.00 -0.40 0.00 -2.00 0.00
4.00 0.00 -10.00 0.00 4.00 0.00 2.00 0.00 0.50 0.00
5.00 0.00 16.00 0.00 12.00 0.00 -1.20 0.00 -2.00 0.00
4.00 0.00 -12.00 0.00 10.00 0.00 1.50 0.50 1.50 -0.50
5.00 0.00 12.00 0.00 9.00 0.00 -1.20 0.60 -1.20 -0.60
29.00 0.00 -20.00 0.00 4.00 0.00 0.34 0.14 0.34 -0.14
**********************************************************************
18. ARQUIVOS
Page 197
SUMARIO
_______
1. CONCEITOS BASICOS . . . . . . . . . . . . . . . . . . . . . . . . 2
1.1 NOCOES ELEMENTARES . . . . . . . . . . . . . . . . . . . . . . . 2
1.2 FORMULARIO DE PROGRAMACAO . . . . . . . . . . . . . . . . . . . . 3
1.3 CONCEITO DE COMANDO . . . . . . . . . . . . . . . . . . . . . . . 4
1.4 LABEL OU ROTULO DE COMANDO . . . . . . . . . . . . . . . . . . . 4
1.5 EXEMPLO DE UM PROGRAMA EM PL/1 . . . . . . . . . . . . . . . . . 4
1.6 IDENTIFICADORES . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.7 CONJUNTOS DE CARACTERES . . . . . . . . . . . . . . . . . . . . . 5
1.8 REGRAS DOS IDENTIFICADORES . . . . . . . . . . . . . . . . . . . 9
2. OPERACOES E EXPRESSOES . . . . . . . . . . . . . . . . . . . . . . 10
2.1 INTRODUCAO . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2.2 OPERADORES . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2.3 HIERARQUIA DAS OPERACOES . . . . . . . . . . . . . . . . . . . . 12
2.4 EXPRESSAO ARITMETICA . . . . . . . . . . . . . . . . . . . . . . 13
2.5 EXPRESSAO DE COMPARACAO . . . . . . . . . . . . . . . . . . . . . 13
2.6 EXPRESSAO LOGICA - String de Bits . . . . . . . . . . . . . . . . 13
2.7 EXPRESSAO DE CONCATENACAO - String de Caracteres . . . . . . . . 14
2.8. CONSTANTES E VARIAVEIS . . . . . . . . . . . . . . . . . . . . . 15
3. PROGRAMACAO ELEMENTAR . . . . . . . . . . . . . . . . . . . . . . 16
3.1. DECLARACAO DE VARIAVEIS E CONSTANTES . . . . . . . . . . . . . . 16
3.2. COMANDO DE ATRIBUICAO . . . . . . . . . . . . . . . . . . . . . 17
3.3. COMANDO LIST . . . . . . . . . . . . . . . . . . . . . . . . . . 17
3.4. COPY . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
3.5. PAGE, SKIP e LINE . . . . . . . . . . . . . . . . . . . . . . . 20
3.6. UM PROGRAMA ELEMENTAR . . . . . . . . . . . . . . . . . . . . . 21
3.7. USO DE COMENTARIOS EM PROGRAMACAO . . . . . . . . . . . . . . . 23
3.8. APLICACAO . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
4. DECLARACOES DE VARIAVEIS . . . . . . . . . . . . . . . . . . . . . 26
4.1. COMANDO DECLARE . . . . . . . . . . . . . . . . . . . . . . . . 26
4.2. REAL DECIMAL FIXED(p,q) . . . . . . . . . . . . . . . . . . . . 27
4.3. REAL BINARY FIXED(p,q) . . . . . . . . . . . . . . . . . . . . . 28
4.4. REAL DECIMAL FLOAT(p) . . . . . . . . . . . . . . . . . . . . . 28
4.5. REAL BINARY FLOAT(p) . . . . . . . . . . . . . . . . . . . . . . 29
4.6. COMPLEX . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
4.7. CHARACTER(n) . . . . . . . . . . . . . . . . . . . . . . . . . . 30
4.8. BIT(n) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
4.9. VARYING . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
4.10. INITIAL(m) . . . . . . . . . . . . . . . . . . . . . . . . . . 31
4.11. LABEL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
4.12.DECLARACAO PARCIAL DE VARIAVEIS . . . . . . . . . . . . . . . . 32
4.13. ORDEM DOS ATRIBUTOS NO COMANDO DECLARE . . . . . . . . . . . . 33
4.14. MAIS EXEMPLOS DE APLICACAO DO COMANDO LIST . . . . . . . . . . 33
6. ARRAY . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
Sumario
Page 198
6.1 INTRODUCAO . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
6.2. DIMENSAO DE ARRAYS . . . . . . . . . . . . . . . . . . . . . . . 43
6.3. EXEMPLOS DE ARRAYS . . . . . . . . . . . . . . . . . . . . . . . 44
6.4. LIMITES INFERIORES E SUPERIORES NA DIMENSAO DE ARRAYS . . . . . 45
6.5. USO DE ARRAY EM EXPRESSOES E NO COMANDO LIST . . . . . . . . . . 46
6.6. USO DO ASTERISCO EM ARRAYS (Cross Sections) . . . . . . . . . . 47
6.7. APLICACOES . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
7. COMANDOS DE DESVIOS . . . . . . . . . . . . . . . . . . . . . . . 51
7.1. INTRODUCAO . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
7.2. COMANDO DE DESVIO INCONDICIONAL (GOTO) . . . . . . . . . . . . . 51
7.3. COMANDOS DE DESVIOS CONDICIONAIS . . . . . . . . . . . . . . . . 52
7.4. PREFIXO DE CONDICAO . . . . . . . . . . . . . . . . . . . . . . 62
7.5 APLICACOES . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
9. FUNCOES INTERNAS . . . . . . . . . . . . . . . . . . . . . . . . . 74
9.1. INTRODUCAO . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
9.2. FUNCOES ARITMETICAS . . . . . . . . . . . . . . . . . . . . . . 74
9.3. FUNCOES MATEMATICAS . . . . . . . . . . . . . . . . . . . . . . 76
9.4 FUNCOES " STRING " . . . . . . . . . . . . . . . . . . . . . . . 77
9.5. FUNCOES DE ARRAYS . . . . . . . . . . . . . . . . . . . . . . . 80
9.6. FUNCOES SEM ARGUMENTOS . . . . . . . . . . . . . . . . . . . . . 81
9.7. PSEUDOVARIAVEIS . . . . . . . . . . . . . . . . . . . . . . . . 81
9.8. APLICACOES . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
12. ESTRUTURAS . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
12.1. INTRODUCAO . . . . . . . . . . . . . . . . . . . . . . . . . . 96
12.2. REFERENCIA QUALIFICADA . . . . . . . . . . . . . . . . . . . . 98
12.3. ARRAY DE ESTRUTURAS . . . . . . . . . . . . . . . . . . . . . 100
12.4. EXPRESSAO DE ESTRUTURAS . . . . . . . . . . . . . . . . . . . 103
12.5. BY NAME . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
12.6. LIKE . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
12.7. APLICACAO . . . . . . . . . . . . . . . . . . . . . . . . . . 107
Sumario
Page 199
Sumario