Baixe o app para aproveitar ainda mais
Prévia do material em texto
Livro Eletrônico Aula 10 Desenvolvimento de Sistemas e Linguagem de Programação p/ BRB (Analista TI) - Pós-Edital Judah Reis 1 67 1 COBOL .............................................................................................................................2 1.1 INTRODUÇÃO ..........................................................................................................2 1.2 ESTRUTURA DA LINGUAGEM ................................................................................2 1.3 DIVISÕES E SEÇÕES DE UM PROGRAMA COBOL ............................................4 1.4 VARIÁVEIS, MATRIZES, TABELAS E COPY BOOKS ............................................ 7 1.5 OPERAÇÕES BÁSICAS........................................................................................... 13 1.6 CONTROLE DE FLUXO.......................................................................................... 19 1.7 MANIPULAÇÃO E PESQUISA EM TABELAS ..................................................... 24 1.8 MANIPULAÇÃO DE ARQUIVOS ..........................................................................27 1.9 SUBROTINAS.......................................................................................................... 30 1.10 QUESTÕES COMENTADAS: COBOL ................................................................. 33 2 LISTAS DE QUESTÕES ................................................................................................ 55 2.1 LISTA DE QUESTÕES: COBOL ............................................................................ 55 3 GABARITOS ...................................................................................................................67 3.1 GABARITO: COBOL ...............................................................................................67 Inserir aqui o nome do Curso www.estrategiaconcursos.com.br Judah Reis Aula 10 69360 r b m.o .cos s r ucn coiag e t a rst w.ew uagem de Programação p/ BRB (Analista TI) - Pós-Edital w g n i L es a mest Sie d o tenm i lv o nve s e D 2 67 1 COBOL 1.1 INTRODUÇÃO Mencionar JCL 1.2 ESTRUTURA DA LINGUAGEM Pessoal, em 1960 os computadores eram computadores "raiz", e não esses computadores nutelas que temos hoje. Esquece esse esquema de teclado, tela, gabinete... estamos falando de salas cheias de cabos, armários com equipamentos eletrônicos, talvez máquina de escrever, e provavelmente uma máquina de perfurar cartões. Isso mesmo, COBOL nasceu no mundo dos cartões perfurados. Para quem precisa programar em uma máquina de perfurar cartão, é fundamental o respeito à forma (tinha algum técnico que existia só para ler o que era digitado na máquina de escrever e passar pro cartão perfurado...). Por isso, todo código COBOL deve ser escrito em um "coding sheet" (tabela de codificação, ou formulário de codifição). Cada linha do programa COBOL tem 80 colunas, e cada coluna (ou conjunto de colunas) tem um significado: Colunas Área Descrição 01-06 Número da Linha É isso mesmo... você precisava numerar as linhas você mesmo (falar qual era a linha 1, a linha 2, e assim por diante... acredita?) 07 Indicador Um caractere que indica se aquela linha é um comentário (*), uma continuação da linha anterior (-) ou uma quebra de linha (/). 08-11 Área A Uma área onde você indica a DIVISION, SECTION ou PARAGRAPH. Vamos falar dessa estrutura a seguir. 12-72 Área B A área onde estão todos os STATEMENTS (comandos do programa). 73-80 Área de Identificação Para ser usada como quiser pelo programador. Um "Olá Mundo" em COBOL tem a seguinte aparência (as 3 linhas no início foram colocadas só para identificar as colunas, não fazem parte do programa): Inserir aqui o nome do Curso www.estrategiaconcursos.com.br Judah Reis Aula 10 69360 r b m.o .cos s r ucn coiag e t a rst w.ew uagem de Programação p/ BRB (Analista TI) - Pós-Edital w g n i L es a mest Sie d o tenm i lv o nve s e D 3 67 0--------1---------2---------3---------4---------5---------6---------7---------8 |-----||---|------------------------------------------------------------|------- 000100 IDENTIFICATION DIVISION. isso 000200 PROGRAM-ID. OLA-MUNDO. aqui 000210* Veja que isso é um comentário porque tem um * na coluna 7 nao 000300 PROCEDURE DIVISION. faz 000400 DISPLAY "TABELA DE CODIFICACAO" dif. 000500 STOP RUN. Alguma Na época que cobol surgiu, os recursos eram escassos! Se você esquecesse uma linha no seu código e tivesse que reescrever tudo, teria que perfurar 5 mil cartões de novo, só pra trocar a ordem de 1 ou 2 comandos (não é eufemismo, programas tinham milhares de cartões...). Por isso, permitir que o desenvolvedor controlasse a numeração das linhas permitia substituir uma linha específica, ou injetar uma série de comandos entre 2 linhas. Isso salvava algumas horas do trabalho. Hoje, os ambientes de desenvolvimento COBOL já são capazes de fazer uma numeração automática de linhas, para que você não coloque a linha 300 antes da 200. Também perdeu um pouco o sentido da Área de Identif icação (colunas 73 a 80), que quase não é mais utilizada. Na verdade, se você procurar algum compilador on-line de COBOL, dificilmente vai conseguir controlar essas 2 áreas. Mas, por definição, o coding sheet de 80 colunas ainda vale. Nos próximos exemplos dessa aula vamos suprimir a numeração para facilitar a leitura. Mas na sua prova, saiba que o programa pode vir com ou sem a numeração, e isso não vai invalidar a questão. 1.2.1 LITERAIS Literais são valores colocados diretamente no código, como é o caso de "TABELA DE CODIFICACAO" na linha 400 do exemplo anterior. Literais podem ser alfanuméricas ou numéricas. Inserir aqui o nome do Curso www.estrategiaconcursos.com.br Judah Reis Aula 10 69360 r b m.o .cos s r ucn coiag e t a rst w.ew uagem de Programação p/ BRB (Analista TI) - Pós-Edital w g n i L es a mest Sie d o tenm i lv o nve s e D 4 67 Literais alfanuméricas podem ter até 160 caracteres, e são delimitadas com aspas simples (') ou duplas ("). Elas devem obrigatoriamente terminar da mesma forma que foram abertas - se abriu com aspas símples, deve terminar com aspas símples, se abriu com duplas, termina com duplas. Por exemplo: "Minha Literal" (válido) 'Minha outra literal' (válido) 'Minha "nova" literal' (válido. As aspas duplas não terminam a literal aberta por aspas simples) 'Minha 'nova' literal' (inválido! As aspas simples antes de ‘nova’ vão ser interpretadas como fim da literal, o que torna o resto da linha um erro). 'Minha última literal" (inválido! Você precisa fechar do mesmo jeito que abriu) "Minha última literal' (inválido! Você precisa fechar do mesmo jeito que abriu) Literais numéricas são compostas por dígitos (0-9), um sinal (+ ou -) ou ponto (.), e podem ter até 18 dígitos. O sinal (+ ou -), quando presente, deve estar no início. O ponto, quando presente, não pode ser o último caractere. Por exemplo: 10 (válido) +10 (válido) -10 (válido) 10.1 (válido) -10.1 (válido) .1 (válido) +.1 (válido) 10+ (inválido, o sinal deve ser no início) 10,1 (inválido, o separador decimal é o '.', não ',') 10. (inválido, não pode terminar com '.') 1.3 DIVISÕES E SEÇÕES DE UM PROGRAMA COBOL Já deu pra perceber que COBOL é uma linguagem com organização muito rígida, digna de quartel militar. Para escrever seu programa você precisa conhecer a organização de “tópicos” do programa. Existem um lugar próprio para colocar o "cabeçalho" e para dar nome ao programa, um lugar em que você pode declararvariáveis, outro para colocar seu algoritmo, e assim por diante. As estruturas que controlam esses “tópicos” são, em ordem: PROGRAM (programa) > DIVISION (divisão) > SECTION (sessão)> PARAGRAPH (parágrafo)> SETENCE (sentença) > STATEMENT (comando). Sendo assim, quando você vai escrever um programa em COBOL, você começa com a estrutura PROGRAM. Dentro desse PROGRAM você Inserir aqui o nome do Curso www.estrategiaconcursos.com.br Judah Reis Aula 10 69360 r b m.o .cos s r ucn coiag e t a rst w.ew uagem de Programação p/ BRB (Analista TI) - Pós-Edital w g n i L es a mest Sie d o tenm i lv o nve s e D 5 67 vai criar algumas DIVISIONs. Dentro de cada DIVISION vai ter uma ou mais SECTIONs, e assim seguirá. A relação é sempre de 1-N. As estruturas terminam com um caractere de ‘.’ (um programa COBOL quase não tem o famoso ‘;’ de outras linguagens). PROGRAM é o agrupador maior que irá conter as DIVISIONs. Existem 4 DIVISIONs: IDENTIFICATION DIVISION, ENVIRONMENT DIVISION, DATA DIVISION, e PROCEDURE DIVISION. IDENTIFICATION DIVISION é o local onde se identifica o programa. Ela precisa ter um parágrafo obrigatório chamado PROGRAM-ID, que declara o nome do programa. As linhas abaixo criam um programa chamado OLA-MUNDO. IDENTIFICATION DIVISION. PROGRAM-ID. OLA-MUNDO. ENVIRONMENT DIVISION - é usado para declarar as relações com o ambiente de execução, arquivos e outras entradas e saídas de dados. Possui duas sessões: • CONFIGURATION SECTION - qual será o SOURCE-COMPUTER (sistema usado para compilar o programa) e o OBJECT-COMPUTER (sistema usado para executar o programa) • INPUT-OUTPUT SECTION - informa arquivos que serão lidos/manipulados pelo sistema. DATA DIVISION define os dados que serão utilizados no programa, bem como sua estrutura (tamanho, nome, tipo, etc.). Possui 4 sessões: • FILE SECTION - descreve a estrutura dos arquivos que serão lidos ou escritos pelo programa. Inserir aqui o nome do Curso www.estrategiaconcursos.com.br Judah Reis Aula 10 69360 r b m.o .cos s r ucn coiag e t a rst w.ew uagem de Programação p/ BRB (Analista TI) - Pós-Edital w g n i L es a mest Sie d o tenm i lv o nve s e D 6 67 • WORKING-STORAGE SECTION - Define as variáveis declaradas pelo desenvolvedor. As variáveis declaradas aqui são mantidas durante toda a vida do programa (veja ccomo variáveis globais). • LOCAL-STORAGE SECTION - Define as variáveis declaras pelo desenvolvedor mas, ao contrário do WORKING-STORAGE, as variáveis declaradas aqui são reiniciadas a cada chamada (veja como variáveis delcaradas dentro de funções). • LINKAGE SECTION - Define dados que foram disponibilizados por outros programas (veja como parâmetros recebidos pela função). Vamos falar bastante sobre declaração de variáveis daqui a pouco. PROCEDURE DIVISION é aonde você coloca o seu algoritmo em si, a lógica do seu programa. PARAGRAPHS são rótulos no código. Eles permitem que o programador possa desviar um código para um parágrafo específico, ou executar um parágrafo diversas vezes. O exemplo abaixo declara 2 parágrafos (TRECHO-A e TRECHO-B) faz um desvio GO TO para um parágrafo dependendo do valor de uma variável: PROCEDURE DIVISION. IF VAR1 > 5 THEN GO TO TRECHO-A ELSE GO TO TRECHO-B END-IF. TRECHO-A. (esta linha criou o parágrafo TRECHO-A) DISPLAY 'COMEÇO'. TRECHO-B. (esta linha criou o parágrafo TRECHO-B) DISPLAY 'FIM'. STOP RUN. Você pode criar um parágrafo simplesmente colocando um rótulo em uma linha terminada por “.”, como foi feito acima. SENTECES e STATEMENTS são os comandos utilizados para realizar o seu algoritmo. O bloco IF do exemplo acima é uma sentença (SENTECE), e o GO TO TRECHO-A é um comando (STATEMENT). SENTENSES e STATEMENTS só são utilizadas na Inserir aqui o nome do Curso www.estrategiaconcursos.com.br Judah Reis Aula 10 69360 r b m.o .cos s r ucn coiag e t a rst w.ew uagem de Programação p/ BRB (Analista TI) - Pós-Edital w g n i L es a mest Sie d o tenm i lv o nve s e D 7 67 PROCEDURE DIVISION. Nessa divisão você vai provavelmente manipular as variáveis declaradas no DATA DIVISION. 1.4 VARIÁVEIS, MATRIZES, TABELAS E COPY BOOKS Como vimos anteriormente, variáveis são declaradas na DATA DIVISION (divisão de dados). Na declaração da variável são utilizados: nível, nome, "picture" e valor. Vou deixar para falar do nível por último. O nome da variável é seu identificador. Vamos supor que você queira declarar uma variável para armazenar o login do usuário, alfanumérico, de 30 posições , e o estado (UF) com 2 posições, sendo exclusivamente letras. Isso ficaria mais ou menos assim: DATA DIVISION. WORKING-STORAGE SECTION. 01 USUARIO PIC X(30) VALUE 'VALOR INICIAL'. 01 UF-USER PIC A(2) VALUE 'DF'. O nome das variáveis são formados por letras, números ou hífen (-). Os identificadores devem conter, pelo menos, uma letra, não podem ser palavras reservadas, mas curiosamente, ao contrário da maior parte das linguagens, nomes de variáveis PODEM começar com números (mas não podem começar por hífen). Exemplos: • USUARIO • NOME-USUARIO • CONT1 • 1CONT • CALL (Inválido, palavra reservada) • $CONT (Inválido, caractere $) • 100 (Inválido, não contém letra) • -USUARIO (Inválido, começa com hífen) Nas primeiras versões do COBOL, os nomes precisavam ser maiúsculos. Contudo, a maior parte dos compiladores atuais são case-insensitive, o que significa que não diferem o nome com maiúsculas ou minúsculas. Em outras palavras, USUARIO e usuario são a mesma variável. Inserir aqui o nome do Curso www.estrategiaconcursos.com.br Judah Reis Aula 10 69360 r b m.o .cos s r ucn coiag e t a rst w.ew uagem de Programação p/ BRB (Analista TI) - Pós-Edital w g n i L es a mest Sie d o tenm i lv o nve s e D 8 67 O "PIC" ou "PICTURE" (pode ser escrito das duas maneiras, sem problemas) é a forma com que o COBOL define o tipo e a máscara das suas variáveis. Como vimos anteriormente, o PICTURE X(30) - ou PIC X(30) - define a variável com 30 posições alfanuméricas. Para definir um tipo numérico de 4 posições, faríamos 9(4), ou 9999. Os símbolos possíveis são: Símbolo Significado 9 Numérico A Alfabeto (exclusivamente letras) X Alfanumérico V Separador Decimal S Sinal (+ ou -) P Assumed Decimal - tem que estar no início ou fim. No início é um .0 a esquerda. No final é um 0 a direita (nunca vi ser cobrado...) A quantidade de dígitos do tipo pode ser determinada repetindo o símbolo, ou colocando a quantidade entre parêntesis. Ou seja, um tipo Alfabeto com 4 posições pode ser definido por A(4) ou AAAA. Veja alguns exemplos de declaração: - 9999 - números de 0000 até 9999 - 9(4) - números de 0000 até 9999 (mesmo de cima) - S9999 - números de -9999 até +9999 - 999V99 - números de 000.00 até 999.99. - 9(3)V9(2) - números de 000.00 até 999.99 (mesmo de cima). - 9(3).9(2) - números de 000.00 até 999.99 (mesmo de cima). Você pode usar o '.' ao invés do 'V' para marcar o separador decimal, desde que não use o sinal (marcador S). Se usar o S, obrigatoriamente o marcador de decimal precisa ser o V. A instrução VALUE durante a declaração da variável é opcional e, quando presente, define o valor inicial da variável. Deve ser uma literal que obedeça a máscara definida pelo PICTURE. Por último, voltamos ao "nível", aqueles números no início da declaração: Inserir aqui o nome do Curso www.estrategiaconcursos.com.br Judah Reis Aula 10 69360 r b m.o .cos s r ucn coiag e t a rst w.ew uagem de Programação p/ BRB (Analista TI) - Pós-Edital w g n i L es a mest Sie d o tenm i lv o nve s e D 9 67 vv 01 UF-USER PIC A(2) VALUE 'DF'. ^^ Nível é aforma com que COBOL consegue agrupar variáveis para criar estruturas. Digamos que o seu usuário tenha nome e login. Podemos fazer isso da seguinte forma: IDENTIFICATION DIVISION. PROGRAM-ID. MEU-PROGRAMA. DATA DIVISION. WORKING-STORAGE SECTION. 01 USUARIO. 02 NOME PIC X(10) VALUE 'MEU NOME'. 02 LOGIN PIC X(10) VALUE 'MEU.LOGIN'. PROCEDURE DIVISION. DISPLAY "USUARIO: "USUARIO. DISPLAY "NOME : "NOME. DISPLAY "LOGIN : "LOGIN. STOP RUN. Ao escrever que NOME e LOGIN estão no nível 2, isso significa que essas variáveis estão dentro de USUÁRIO que foi declarada no nível 1. O programa acima vai produzir a seguinte saída: USUARIO: MEU NOME MEU.LOGIN NOME : MEU NOME LOGIN : MEU.LOGIN Perceba que NOME e LOGIN ficam com o valor próprio, e USUÁRIO é o agrupamento das duas variáveis que o compõem. Isso é bem curioso, mas é uma característica muito marcante da linguagem: os tipos “pai” nada mais são do que o agrupamento dos tipos “filhos”. Os níveis vão de 01 a 49 de forma livre, e ainda temos os tipos “especiais” 66, 77 e 88. O nível 01 cria um registro. Os níveis 02 até 49 são disponíveis para criar os sub- itens, que podem ser dados elementares, ou outros grupos. Por exemplo, podemos ter ENDERECO para o USUARIO: Inserir aqui o nome do Curso www.estrategiaconcursos.com.br Judah Reis Aula 10 69360 r b m.o .cos s r ucn coiag e t a rst w.ew uagem de Programação p/ BRB (Analista TI) - Pós-Edital w g n i L es a mest Sie d o tenm i lv o nve s e D 10 67 WORKING-STORAGE SECTION. 01 USUARIO. 02 NOME PIC X(10). 02 LOGIN PIC X(10). 02 ENDERECO. 03 RUA PIC X(10). 03 NUMERO PIC 9(5). 03 CIDADE PIC X(10). 03 ESTADO PIC X(2). Não necessariamente você precisa incrementar do nível 01 para 02, e de 02 para 03. Você poderia ter 01, 05 e 10 (algumas pessoas gostam de deixar um gap de 5 em 5 ao invés de 1 em 1, não há problema nisso). Também é comum identar os grupos, mas isso não é obrigatório. O exemplo acima (com identação) é exatamente a mesma coisa que o código abaixo (sem identação): WORKING-STORAGE SECTION. 01 USUARIO. 05 NOME PIC X(10). 05 LOGIN PIC X(10). 05 ENDERECO. 10 RUA PIC X(10). 10 NUMERO PIC 9(5). 10 CIDADE PIC X(10). 10 ESTADO PIC X(2). Os 3 números “especiais” são: • Nível 66 – RENAMES – Para renomear uma variável, no formato “66 nome- velho RENAMES nome-novo”. Ex.: 66 USUARIO RENAMES USER • Nível 77 – Usado para declarar variáveis completamente independentes de outras, que não podem ser pais ou filhas de outras estruturas. • Nível 88 – Nomes Condicionais – São sempre filhos de uma outra variável primitiva, e definem “regras” para essas variáveis. Por exemplo, para definir que SEXO seja sempre uma variável M ou F, você poderia fazer como no exemplo abaixo: Inserir aqui o nome do Curso www.estrategiaconcursos.com.br Judah Reis Aula 10 69360 r b m.o .cos s r ucn coiag e t a rst w.ew uagem de Programação p/ BRB (Analista TI) - Pós-Edital w g n i L es a mest Sie d o tenm i lv o nve s e D 11 67 DATA DIVISION. WORKING-STORAGE SECTION. 01 SEXO PIC A(1) VALUE 'K'. 88 SEXO-VALIDO VALUE 'M' 'F'. PROCEDURE DIVISION. IF SEXO-VALIDO DISPLAY "SEXO : "SEXO ELSE DISPLAY "SEXO INVÁLIDO" END-IF. STOP RUN. O exemplo acima vai produzir o resultado: SEXO INVÁLIDO. 1.4.1 ARRAYS, TABELAS, MATRIZES N-DIMENSIONAIS Toda linguagem de programação precisa de uma estrutura de dados para armazenar coleções (ARRAYs). COBOL não é diferente, e a coleção é feita utilizando a palavra reservada OCCURS. A sintaxe para definição de um ARRAY contendo 5 TELEFONES dentro da estrutura ALUNO seria: WORKING-STORAGE SECTION. 01 ALUNO. 02 TELEFONE PIC 9(12) OCCURS 5 TIMES. Os valores individuais da coleção podem ser acessados usando subscripts com valores de 1 até o seu tamanho, no nosso caso TELEFONE(1) até TELEFONE(5). CUIDADO!!! A posição é acessada a partir do índice 1 (e não do 0, como a maior parte das linguagens)!!!. Também é possível criar uma variável de índice junto do ARRAY, para não precisar declará-la em uma linha separada. Suponha que você queira criar uma variavel 'I' para iterar sobre a lista de telefones. Você pode fazer isso com a seguinte sintaxe: WORKING-STORAGE SECTION. 01 ALUNO. 02 TELEFONE PIC 9(12) OCCURS 5 TIMES INDEXED BY I. Pois bem, aprendemos a criar uma lista simples. Agora imagine que eu tenho um curso, e que cada curso tem um nome, e uma lista de 30 alunos (e cada aluno tem Inserir aqui o nome do Curso www.estrategiaconcursos.com.br Judah Reis Aula 10 69360 r b m.o .cos s r ucn coiag e t a rst w.ew uagem de Programação p/ BRB (Analista TI) - Pós-Edital w g n i L es a mest Sie d o tenm i lv o nve s e D 12 67 uma lista de 5 telefones). Estamos querendo criar agora um ARRAY bi-dimensional (ou uma tabela). Isso pode ser feito da seguinte forma: 01 CURSO. 02 NOME-CURSO PIC X(8). 02 ALUNO OCCURS 30 TIMES. 03 TELEFONE PIC 9(12) OCCURS 5 TIMES. Continuamos podendo usar subscripts pra acessar o 3o. aluno - ALUNO(3). Para acessar o 1o. telefone do 3o. aluno, usamos TELEFONE(3,1). A ordem do índice de acesso no subscript é da estrutura mais externa para a mais interna. Vamos mais pra frente? Como você imagina que ficaria o programa se eu precisasse de uma lista com 10 cursos agora? Como você mudaria o programa? Como você faria para mostrar o 1o. telefone, do 3o. aluno, do 5o. curso? Tente fazer sozinho, e verifique se o resultado bate com o abaixo: DATA DIVISION. WORKING-STORAGE SECTION. 01 CURSO OCCURS 10 TIMES. 02 NOME-CURSO PIC X(8). 02 ALUNO OCCURS 3 TIMES. 03 TELEFONE PIC 9(12) OCCURS 5 TIMES. PROCEDURE DIVISION. DISPLAY "TELEFONE: "TELEFONE(5,3,1). STOP RUN. Só para reforçar: na estrutura TELEFONE(5,3,1), o “5” é referente ao CURSO, “3” referente ao ALUNO e “1” ao TELEFONE. 1.4.2 COPYBOOKS Pessoal, imagine uma estrutura de dados que é muito utilizada no seu sistema, digamos USUARIO. Um USUARIO tem uma série de dados como: LOGIN, NOME, DATA-NASCIMENTO, DATA-CADASTRO, LISTA-CURSOS, etc, etc, etc. Se essa estrutura é muito utilizada, não faz sentido declarar ela em todos os lugares... seria melhor declarar em um lugar só, e poder “copiar” (de onde será que veio o nome copybook?) a mesma estrutura em todos os lugares. É exatamente essa a função dos COPYBOOKS. Inserir aqui o nome do Curso www.estrategiaconcursos.com.br Judah Reis Aula 10 69360 r b m.o .cos s r ucn coiag e t a rst w.ew uagem de Programação p/ BRB (Analista TI) - Pós-Edital w g n i L es a mest Sie d o tenm i lv o nve s e D 13 67 Assim, para o nosso sistema, poderíamos criar um COPYBOOK com nome ESTRUTURAS-COMUNS definindo as estruturas USUARIO, CURSO, ALUNO, PROFESSOR, etc., e copiar todas para o nosso programa usando: DATA DIVISION. WORKING-STORAGE SECTION. COPY ESTRUTURAS-COMUNS. Pronto! Todas as estruturas declaradas no COPYBOOK foram parar no meu programa. O comando COPY deve ser utilizado dentro do WORKING-STORAGE SECTION. 1.5 OPERAÇÕES BÁSICAS As operações em COBOL são associadas a verbos, que instruem o sistema a fazer alguma coisa. Abaixo estão alguns verbos básicos. 1.5.1 DISPLAY (MOSTRE) Escreve algo na tela (é o printf do C, o System.out.println do Java, o console.log do Javascript). A concatenação dos textos é automática, você só lista as variáveis: DATA DIVISION. WORKING-STORAGE SECTION. 01 VALOR PIC 9(4) VALUE 1234. 01 OUTRO PIC 9(4) VALUE 5678. PROCEDURE DIVISION. DISPLAY VALOR OUTRO 'FINAL' STOP RUN. Vai produzir:12345678FINAL 1.5.2 ACCEPT (ACEITE) Recebe algum dado. Pode receber informações diretamente do sistema que está rodando o programa, ou algum input escrito pelo usuário (nesse caso, será necessário que o JCL declare que esse input será feito). Inserir aqui o nome do Curso www.estrategiaconcursos.com.br Judah Reis Aula 10 69360 r b m.o .cos s r ucn coiag e t a rst w.ew uagem de Programação p/ BRB (Analista TI) - Pós-Edital w g n i L es a mest Sie d o tenm i lv o nve s e D 14 67 DATA DIVISION. WORKING-STORAGE SECTION. 01 NOME PIC X(10). PROCEDURE DIVISION. ACCEPT NOME. DISPLAY 'NOME DIGITADO:' NOME. STOP RUN. 1.5.3 MOVE (MOVA) Copia um valor para uma variável (atribuição). Se o valor for uma string, você ainda pode copiar só uma parte dela usando a notação VAR(INI:FIM): DATA DIVISION. WORKING-STORAGE SECTION. 01 VALOR PIC 9(4). 01 TEXTO-A PIC X(10). 01 TEXTO-B PIC X(10). PROCEDURE DIVISION. MOVE 1234 TO VALOR. MOVE 'MOVENDO...' TO TEXTO-A. MOVE TEXTO-A(1:3) TO TEXTO-B. DISPLAY 'VALOR : ' VALOR. DISPLAY 'TEXTO-A: ' TEXTO-A. DISPLAY 'TEXTO-B: ' TEXTO-B. STOP RUN. Esse programa produz o resultado: VALOR : 1234 TEXTO-A: MOVENDO... TEXTO-B: MOV 1.5.4 INITIALIZE (INICIALIZE) Inicializa uma variável com o valor 0 (numéricas) ou espaço vazio (textuais). Exemplo: Inserir aqui o nome do Curso www.estrategiaconcursos.com.br Judah Reis Aula 10 69360 r b m.o .cos s r ucn coiag e t a rst w.ew uagem de Programação p/ BRB (Analista TI) - Pós-Edital w g n i L es a mest Sie d o tenm i lv o nve s e D 15 67 DATA DIVISION. WORKING-STORAGE SECTION. 01 VALOR-INICIAL PIC X(5) VALUE 'ABCD'. 01 NUMERO PIC 9(2) VALUE 10. 01 NUMERO-VAZIO PIC 9(2). PROCEDURE DIVISION. DISPLAY VALOR-INICIAL " " NUMERO " " NUMERO-VAZIO. INITIALIZE VALOR-INICIAL, NUMERO, NUMERO-VAZIO. DISPLAY VALOR-INICIAL " " NUMERO " " NUMERO-VAZIO. STOP RUN. Esse programa produz o resultado: ABCD 10 00 00 00 1.5.5 ADD TO (ADICIONE A) Adiciona um valor a uma variável. Por exemplo: DATA DIVISION. WORKING-STORAGE SECTION. 01 V1 PIC 9(4) VALUE 1. PROCEDURE DIVISION. ADD 10 TO V1. ADD 10 TO 20 GIVING V1. Usamos duas formas: • ADD 10 TO V1 é o mesmo que fazer V1 = V1 + 10. • ADD 10 TO 20 GIVING V1 é o mesmo que fazer V1 = 10 + 20. É possível adicionar diversas variáveis ao mesmo tempo: DATA DIVISION. WORKING-STORAGE SECTION. 01 V1 PIC 9(2) VALUE 1. 01 V2 PIC 9(2) VALUE 2. 01 V3 PIC 9(2) VALUE 4. 01 V4 PIC 9(2) VALUE 8. 01 V6 PIC 9(2). PROCEDURE DIVISION. ADD v1 v2 TO V3. (faz V3=V3+V1+V2=4+1+2=7) ADD V1 V2 TO V4 V5. (faz V4=V4+V1+V2=8+1+2=11 e V5=V5+V1+V2=16+1+2=19) ADD V1 V2 TO V4 V5. (faz V4=V4+V1+V2=8+1+2=11 e V5=V5+V1+V2=16+1+2=19) DISPLAY V1 " " V2 " " V3 " " V4 " " V5. STOP RUN. O programa acima vai produzir o resultado: 01 02 07 11 19. Inserir aqui o nome do Curso www.estrategiaconcursos.com.br Judah Reis Aula 10 69360 r b m.o .cos s r ucn coiag e t a rst w.ew uagem de Programação p/ BRB (Analista TI) - Pós-Edital w g n i L es a mest Sie d o tenm i lv o nve s e D 16 67 1.5.6 SUBTRACT FROM (SUBTRAIA DE) Análogo ao ADD, mas ao invés de ADD TO, você faz um SUBTRACT FROM. DATA DIVISION. WORKING-STORAGE SECTION. 01 V1 PIC 9(2) VALUE 3. 01 V2 PIC 9(2) VALUE 10. 01 V3 PIC 9(2). PROCEDURE DIVISION. SUBTRACT V1 FROM V2. SUBTRACT 2 FROM 10 GIVING V3. DISPLAY V1 " " V2 " " V3. STOP RUN. O programa acima vai produzir o resultado: 03 07 08. 1.5.7 MULTIPLY BY (MULTIPLIQUE POR) Multiplica valores. Muito semelhante ao ADD e ao SUBTRACT. DATA DIVISION. WORKING-STORAGE SECTION. 01 V1 PIC 9(2) VALUE 2. 01 V2 PIC 9(2) VALUE 4. 01 V3 PIC 9(2). PROCEDURE DIVISION. MULTIPLY V1 BY V2. MULTIPLY V1 BY V2 GIVING V3. DISPLAY V1 " " V2 " " V3. STOP RUN. 1.5.8 DIVIDE INTO (DIVIDA EM) Divide valores. Nenhuma novidade: Inserir aqui o nome do Curso www.estrategiaconcursos.com.br Judah Reis Aula 10 69360 r b m.o .cos s r ucn coiag e t a rst w.ew uagem de Programação p/ BRB (Analista TI) - Pós-Edital w g n i L es a mest Sie d o tenm i lv o nve s e D 17 67 DATA DIVISION. WORKING-STORAGE SECTION. 01 V1 PIC 9(2) VALUE 2. 01 V2 PIC 9(2) VALUE 8. 01 V3 PIC 9(2) VALUE 16. 01 V4 PIC 9(2). PROCEDURE DIVISION. DIVIDE V1 INTO V2. DIVIDE V1 INTO V3 GIVING V4. DISPLAY V1 " " V2 " " V3 " " V4. STOP RUN. O programa acima vai produzir o resultado: 02 04 16 08. 1.5.9 COMPUTE (CALCULE) COMPUTE é uma alternativa boa para escrever operações aritméticas de forma mais direta. Veja um exemplo abaixo: DATA DIVISION. WORKING-STORAGE SECTION. 01 N1 PIC 9(2) VALUE 10 . 01 N2 PIC 9(2) VALUE 20. 01 N3 PIC 9(2) VALUE 30. 01 N4 PIC 9(2) VALUE 40. PROCEDURE DIVISION. COMPUTE N4 = (N2/N1) + N3 * 2. DISPLAY "N4:" N4. STOP RUN. No COMPUTE você consegue realizar diversas operações em uma mesma linha, sem a burocracia do ADD, SUBTRACT, MULTIPLY e DIVIDE. 1.5.10 REDEFINES (REDEFINE) O verbo REDEFINES serve para criar uma variável a partir do conteúdo de outra variável. Por exemplo, se você tem uma variável que já está com o número de telefone completo da pessoa, uma outra variável pode ser definida para pegar somente o DDD da seguinte forma: Inserir aqui o nome do Curso www.estrategiaconcursos.com.br Judah Reis Aula 10 69360 r b m.o .cos s r ucn coiag e t a rst w.ew uagem de Programação p/ BRB (Analista TI) - Pós-Edital w g n i L es a mest Sie d o tenm i lv o nve s e D 18 67 DATA DIVISION. WORKING-STORAGE SECTION. 01 TELEFONE PIC X(11). 01 DDD REDEFINES TELEFONE PIC 9(2). PROCEDURE DIVISION. MOVE '61999998888' TO TELEFONE. DISPLAY "TELEFONE : "TELEFONE. DISPLAY "DDD : "DDD. MOVE '11' TO DDD. DISPLAY "TELEFONE : "TELEFONE. DISPLAY "DDD : "DDD. STOP RUN. TELEFONE : 61999998888 DDD : 61 TELEFONE : 11999998888 DDD : 11 Perceba que o DDD foi redefinido da variável TELEFONE. Quando atribuímos 61999998888 para telefone, a variável DDD assume o valor 61. Da mesma forma, quando atribuímos 11 para o DDD, TELEFONE muda para 11999998888. As duas variáveis apontam para a mesma estrutura de memória, mas tem definições diferentes. Para usar o verbo REDEFINES, tanto a variável original quanto a redefinida precisam estar no mesmo nível. 1.5.11 RENAMES (RENOMEIA) Cria uma nova variável a partir do agrupamento de outras variáveis (1 ou mais). No exemplo abaixo, criamos TELEFONE a partir de PARTES-TELEFONE. DATA DIVISION. WORKING-STORAGE SECTION. 01 PARTES-TELEFONE. 05 DDD PIC 9(2) VALUE 61. 05 PREFIXO PIC 9(5) VALUE 99999. 05 SUFIXO PIC 9(4) VALUE 8888. 66 TELEFONE RENAMES DDD THRU SUFIXO. PROCEDURE DIVISION. DISPLAY "TELEFONE : "TELEFONE. STOP RUN. O programa acima produz o resultado: 61999998888. Inserir aqui o nome do Curso www.estrategiaconcursos.com.br Judah Reis Aula 10 69360 r b m.o .cos s r ucn coiag e t a rst w.ew uagem de Programação p/ BRB (Analista TI) - Pós-Edital w g n i L es a mest Sie d o tenm i lv o nve s e D 19 67 1.6 CONTROLE DE FLUXO 1.6.1 IF (SE) É a instrução condicional SE, e tem a seguinte estrutura: IF condição THEN código_se ELSE código_else END-IF. Exemplo: DATA DIVISION. WORKING-STORAGE SECTION. 01 NUM1 PIC 9(2) VALUE 10. 01 NUM2 PIC 9(2) VALUE 20. PROCEDURE DIVISION. IF NUM1 > NUM2 THEN DISPLAY "NUM1 É MAIOR" ELSE IF NUM1 = NUM2 THEN DISPLAY "OS NÚMEROS SÃO IGUAIS" ELSE DISPLAY "NUM2 É MAIOR" END-IF END-IF. STOP RUN.O programa acima produz o seguinte output: NUM2 É MAIOR. Existem 2 coisas para se perceber no exemplo acima: 1. Uma vez no bloco IF só usamos o “.” no END-IF. 2. Não existe ELSE IF. Se existir mais de uma condição, devemos aninhar os IFs dentro de IFs, como fizemos no exemplo anterior. Os comparadores para operandos numéricos podem ser: • Comparação por Símbolo: > (maior), < (menor), >= (maior ou igual), <= (menor ou igual) ou = (igual). • Comparação por Palavras: IS [NOT] GREATER THAN, LESS THAN, EQUAL TO, GREATER THAN OR EQUAL, LESS THEN OR EQUAL. • Comparação de Sinal: IS [NOT] POSITIVE, NEGATIVE, ZERO. • Comparação de Classe: IS [NOT] NUMERIC, ALPHABETIC, ALPHABETIC- LOWER, ALPHABETIC-UPPER. Inserir aqui o nome do Curso www.estrategiaconcursos.com.br Judah Reis Aula 10 69360 r b m.o .cos s r ucn coiag e t a rst w.ew uagem de Programação p/ BRB (Analista TI) - Pós-Edital w g n i L es a mest Sie d o tenm i lv o nve s e D 20 67 • Negação: NOT (se uma condição qualquer é verdadeira, NOT condição é falsa e vice-versa). Os comparadores podem ser combinados com as palavra-chave AND (e) e OR (ou). Se os operandos forem texto, as comparações de maior, menor e igual ainda valem mas são feitas de forma alfabética, da esquerda para direita (se o tamanho das variáveis for diferente, a menor é ‘completada’ com espaços em branco). 1.6.2 EVALUATE (CALCULE) É a instrução condicional ESCOLHA CASO. Tem a seguinte estrutura: EVALUATE valor_esperado WHEN expressão_1 código_1 WHEN expressão_2 código_2 WHEN OTHER código_default END-EVALUATE. Pode ser utilizado para testar uma variável, contra vários tipos: PROCEDURE DIVISION. EVALUATE TIPO-CARRO WHEN 'SEDAN' DISPLAY 'É SEDAN' WHEN 'COMPACTO' DISPLAY 'É COMPACTO' WHEN OTHER DISPLAY 'É OUTRO' END-EVALUATE. ou para fazer diversas condições que seriam IFs aninhados: Inserir aqui o nome do Curso www.estrategiaconcursos.com.br Judah Reis Aula 10 69360 r b m.o .cos s r ucn coiag e t a rst w.ew uagem de Programação p/ BRB (Analista TI) - Pós-Edital w g n i L es a mest Sie d o tenm i lv o nve s e D 21 67 PROCEDURE DIVISION. EVALUATE TRUE WHEN VAR1 > 0 DISPLAY 'É POSITIVO' WHEN VAR1 < 0 DISPLAY 'É NEGATIVO' WHEN OTHER DISPLAY 'É ZERO' END-EVALUATE. 1.6.3 PERFORM Galera, ATENÇÃO: Esse é um dos tópicos que mais cai em prova! Existem 4 formas de usar o verbo PERFORM para realizar loops: • PERFORM TIMES. • PERFORM UNTIL. • PERFORM VARYING. • PERFORM THRU – Executa o código entre um parágrafo inicial e um final. PERFORM TIMES repete um comando ou parágrafo ‘N’ vezes. Por exemplo: PROCEDURE DIVISION. PERFORM 3 TIMES DISPLAY 'VAI APARECER 3 VEZES' END-PERFORM. PERFORM PARAGRAFO-A 5 TIMES. STOP RUN. PARAGRAFO-A. DISPLAY 'Parágrafo A VAI APARECER 5 VEZES'. O código acima vai produzir o seguinte resultado: VAI APARECER 3 VEZES VAI APARECER 3 VEZES VAI APARECER 3 VEZES Parágrafo A VAI APARECER 5 VEZES Parágrafo A VAI APARECER 5 VEZES Parágrafo A VAI APARECER 5 VEZES Parágrafo A VAI APARECER 5 VEZES Parágrafo A VAI APARECER 5 VEZES Inserir aqui o nome do Curso www.estrategiaconcursos.com.br Judah Reis Aula 10 69360 r b m.o .cos s r ucn coiag e t a rst w.ew uagem de Programação p/ BRB (Analista TI) - Pós-Edital w g n i L es a mest Sie d o tenm i lv o nve s e D 22 67 PERFORM UNTIL repete um comando ou parágrafo até que uma condição seja atendida (verdadeira). DATA DIVISION. WORKING-STORAGE SECTION. 01 QDE PIC 9(2) VALUE 1. PROCEDURE DIVISION. PERFORM PARA-A UNTIL QDE > 3. STOP RUN. PARA-A. DISPLAY 'ITERACAO: 'QDE. ADD 1 TO QDE. Vai produzir o seguinte resultado: ITERACAO: 01 ITERACAO: 02 ITERACAO: 03 PERFORM VARYING repete um comando ou parágrafo com uma variável de controle. O código anterior poderia ser reescrito para usar PERFORM VARYING da seguinte maneira: PROCEDURE DIVISION. PERFORM PARA-A VARYING QDE FROM 1 BY 1 UNTIL QDE > 3. STOP RUN. PARA-A. DISPLAY 'ITERACAO: 'QDE. A vantagem de usar o PERFORM VARYING é que ele já prevê uma variável de controle no loop, o que deixa o código mais limpo que o PERFORM UNTIL (nos casos em que uma variável de controle é necessária, é claro). Tanto o UNTIL quanto o VARYING podem definir se o teste será feito ANTES da execução quanto depois. Isso é definido da seguinte forma: PERFORM PARA-A WITH TEST BEFORE UNTIL QDE>3. (teste antes) PERFORM PARA-A WITH TEST AFTER UNTIL QDE>3. (teste depois) Também é possível fazer LOOPs de 2 ou mais níveis aninhando os loops através da palavra-chave AFTER. Inserir aqui o nome do Curso www.estrategiaconcursos.com.br Judah Reis Aula 10 69360 r b m.o .cos s r ucn coiag e t a rst w.ew uagem de Programação p/ BRB (Analista TI) - Pós-Edital w g n i L es a mest Sie d o tenm i lv o nve s e D 23 67 PERFORM PARA-A VARYING A FROM 1 BY 1 UNTIL A GREATER THAN 3 AFTER B FROM 1 BY 1 UNTIL B GREATER THAN 2 O código acima vai iterar com A indo de 1 até 3 (sai com 4) e, para cada valor de A, vai iterar B de 1 até 2 (sai com 3). Ou seja, vai iterar para: A=1, B=1 A=1, B=2 A=2, B=1 A=2, B=2 A=3, B=1 A=3, B=2 Quando o programa sair, o valor de A vai valer 4 (condição de saída), mas vai sair com B valendo 1 (condição de inicialização de B, que não vai executar por A está valendo 4). PERFORM THRU é a quarta e última forma de iterar, e recebe como parâmetro um parágrafo de início, e um parágrafo de fim. Por exemplo: PERFORM B THRU D. STOP RUN. A. DISPLAY "A". B. DISPLAY "B". C. DISPLAY "C". D. DISPLAY "D". E. DISPLAY "E". Vai produzir o resultado: B C D Apenas como observação, se o comando STOP RUN não fosse colocado logo após o PERFORM, todos os parágrafos seriam executados após o PERFORM. Veja como ficaria: Inserir aqui o nome do Curso www.estrategiaconcursos.com.br Judah Reis Aula 10 69360 r b m.o .cos s r ucn coiag e t a rst w.ew uagem de Programação p/ BRB (Analista TI) - Pós-Edital w g n i L es a mest Sie d o tenm i lv o nve s e D 24 67 PERFORM B THRU D. A. DISPLAY "A". B. DISPLAY "B". C. DISPLAY "C". D. DISPLAY "D". E. DISPLAY "E". E o resultado: B C D A B C D E 1.7 MANIPULAÇÃO E PESQUISA EM TABELAS Já falamos que COBOL permite a criação de estruturas de repetição durante a declaração de variáveis usando a palavra OCCURS. Essas estruturas também são conhecidas como tabelas. Veja no exemplo abaixo a definição de uma tabela com 1 dimensão e 2 dimensões: DATA DIVISION. WORKING-STORAGE SECTION. 01 TAB-1DIMENSAO. 05 REGISTRO PIC A(5) VALUE 'TESTE' OCCURS 5 TIMES. 01 TAB-2DIMENSOES. 05 DIM1 OCCURS 2 TIMES. 10 DIM2 PIC A(6) VALUE 'TESTE2' OCCURS 3 TIMES. PROCEDURE DIVISION. DISPLAY "1 DIMENSÃO : "TAB-1DIMENSAO. DISPLAY "2 DIMENSÕES: "TAB-2DIMENSOES. STOP RUN. Inserir aqui o nome do Curso www.estrategiaconcursos.com.br Judah Reis Aula 10 69360 r b m.o .cos s r ucn coiag e t a rst w.ew uagem de Programação p/ BRB (Analista TI) - Pós-Edital w g n i L es a mest Sie d o tenm i lv o nve s e D 25 67 O resultado da execução desse programa é: 1 DIMENSÃO : TESTETESTETESTETESTETESTE 2 DIMENSÕES: TESTE2TESTE2TESTE2TESTE2TESTE2TESTE2 Você acessa os dados de uma tabela a partir de um subscript colocando o índice da posição entre parêntesis, sendo que o índice começa em 1. Para acessar o 1º elemento da TAB-1DIMENSAO, temos TAB-1DIMENSAO(1). Para acessar o último elementode TAB-2DIMENSOES temos TAB-2DIMENSOES(2,3). Uma tabela em COBOL nada mais é do que uma forma de acessar dados sequenciais através de subscript. Por isso você consegue mandar mostrar todos os dados de uma vez através da variável, bem como atribuir todos os valores da tabela com uma única atribuição. Veja o exemplo: DATA DIVISION. WORKING-STORAGE SECTION. 01 TAB. 05 REG1 OCCURS 2 TIMES. 10 REG2 PIC A(2) OCCURS 3 TIMES. PROCEDURE DIVISION. MOVE '112233445566' TO TAB. DISPLAY 'TAB : 'TAB. DISPLAY 'REG1(1) : 'REG1(1). DISPLAY 'REG2(1, 1): 'REG2(1, 1). DISPLAY 'REG2(1, 2): 'REG2(1, 2). DISPLAY 'REG2(1, 3): 'REG2(1, 3). DISPLAY 'REG1(2) : 'REG1(2). DISPLAY 'REG2(2, 1): 'REG2(2, 1). DISPLAY 'REG2(2, 2): 'REG2(2, 2). DISPLAY 'REG2(2, 3): 'REG2(2, 3). STOP RUN. O programa acima produz o resultado: TAB : 112233445566 REG1(1) : 112233 REG2(1, 1): 11 REG2(1, 2): 22 REG2(1, 3): 33 REG1(2) : 445566 REG2(2, 1): 44 REG2(2, 2): 55 REG2(2, 3): 66 Veja que ao mover a string ‘112233445566’ para a variável TAB preenchemos todas as suas posições. Inserir aqui o nome do Curso www.estrategiaconcursos.com.br Judah Reis Aula 10 69360 r b m.o .cos s r ucn coiag e t a rst w.ew uagem de Programação p/ BRB (Analista TI) - Pós-Edital w g n i L es a mest Sie d o tenm i lv o nve s e D 26 67 Podemos criar índices para uma tabela usando o termo INDEXED BY. Também já falamos nisso anteriormente (aqui). Existem 2 métodos de pesquisas em tabelas – SEARCH e SEARCHALL. SEARCH faz a busca linear sobre qualquer tabela. Veja o exemplo abaixo: DATA DIVISION. WORKING-STORAGE SECTION. 01 TAB. 05 REC OCCURS 3 TIMES INDEXED BY I. 10 COD PIC 9. 10 NOME PIC AAAAA. PROCEDURE DIVISION. MOVE '1 ANA2 BIA3 CAIO' TO TAB. SET I TO 1. SEARCH REC AT END DISPLAY 'NÃO ENCONTREI!!!' WHEN NOME(I) = ' CAIO' DISPLAY 'ACHEI O CAIO NA POSICAO 'I END-SEARCH. STOP RUN. O exemplo acima produz o resultado ACHEI O CAIO NA POSICAO +000000003 SEARCH possui uma cláusula AT END para ser executada caso nenhum registro seja encontrado - DISPLAY 'NÃO ENCONTREI!!!' no exemplo. Também uma cláusula que será executada caso . O teste é feito através do WHEN, e o as linhas que seguem são o código executado caso a condição de satisfação seja realizada. A grande diferença do SEARCH para o SEARCHALL é que os registros da tabela em SEARCHALL precisam estar ordenados de forma crescente (ASCENDING) ou decrescente (DESCENDING). Veja o exemplo abaixo: Inserir aqui o nome do Curso www.estrategiaconcursos.com.br Judah Reis Aula 10 69360 r b m.o .cos s r ucn coiag e t a rst w.ew uagem de Programação p/ BRB (Analista TI) - Pós-Edital w g n i L es a mest Sie d o tenm i lv o nve s e D 27 67 DATA DIVISION. WORKING-STORAGE SECTION. 01 TAB. 05 REC OCCURS 3 TIMES ASCENDING KEY IS COD INDEXED BY I. 10 COD PIC 9. 10 NOME PIC AAAAA. PROCEDURE DIVISION. MOVE '1 ANA2 BIA3 CAIO' TO TAB. SEARCH ALL REC AT END DISPLAY 'NÃO ENCONTREI!!!' WHEN COD(I) = ' CAIO' DISPLAY 'ACHEI O CAIO NA POSICAO 'I END-SEARCH. STOP RUN. A busca binária é, em média, muito mais rápida que a busca sequencial, mas tem duas limitações: a coleção deve estar ordenada por uma chave (KEY), e a comparação sempre deve ser através da chave (veja que a chave do nosso exemplo é COD, e o teste é feito exatamente quando COD(I) = “ CAIO”). Uma observação muito importante: a declaração de ASCENDING/DESCENDING KEY não faz a ordenação da estrutura!!! Ela simplesmente “declara” que está ordenado! Se a estrutura de fato não estiver ordenada, a busca simplesmente não vai funcionar. 1.8 MANIPULAÇÃO DE ARQUIVOS Pessoal, muito antes dos bancos SQL existirem, já existia a necessidades de sistemas trabalharem com armazenamento. Se você precisa armazenar um dado, e não tem um banco, provavelmente deve fazer isso em um arquivo estruturado – um arquivo em que informações são salvas em um layout. O layout é definido pelo próprio programador, que diz que cada registro vai ter N caracteres, sendo que nos primeiros 3 caracteres eu vou guardar um identificador, os próximos 10 são o nome da pessoa, os 8 seguintes são a data de nascimento, e assim por diante. A partir dessa regra, é possível gravar e buscar registros dentro do arquivo. COBOL se dá muito bem com a manipulação de arquivos de dados. Inserir aqui o nome do Curso www.estrategiaconcursos.com.br Judah Reis Aula 10 69360 r b m.o .cos s r ucn coiag e t a rst w.ew uagem de Programação p/ BRB (Analista TI) - Pós-Edital w g n i L es a mest Sie d o tenm i lv o nve s e D 28 67 Figura 1 - de https://www.tutorialspoint.com/pg/cobol/cobol_file_handling.htm Imagine que os registros da figura acima são gravados sequencialmente em um arquivo. Para utilizá-lo, você precisa declarar essa dependência no ENVIRONMENT DIVISION, dentro do FILE-CONTROL SECTION. Veja o exemplo abaixo: 1: ENVIRONMENT DIVISION. 2: INPUT-OUTPUT SECTION. 3: FILE-CONTROL. 4: SELECT ESTUDANTE ASSIGN TO 'estudantes.txt' 5: ORGANIZATION IS LINE SEQUENTIAL. 6: 7: DATA DIVISION. 8: FILE SECTION. 9: FD ESTUDANTE. 10: 01 ESTUDANTE-ARQUIVO 11: 05 MATRICULA PIC 9(5). 12: 05 NOME PIC A(50). 13: 05 CURSO PIC X(25). As linhas 4-6 declaram que existe um arquivo com o layout ESTUDANTE (declarada nas linhas 9-13), armazenados no arquivo “estudantes.txt”. Veja que a declaração do arquivo acontece no ENVIRONMENT DIVISION, INPUT-OUTPUT SECTION, mas só é feita a referência ao layout. A declaração de fato do layout acontece no DATA DIVISION, FILE SECTION. O exemplo também declara o tipo de arquivo como sequencial, o que quer dizer que não existe nenhuma chave ordenada. Os registros estão linearmente um após o outro, sem nenhum índice. Além do tipo sequencial, existem outros 2 tipos randômicos (RANDOM) de arquivos: indexados (INDEXED) e relativos (RELATIVE). No indexado, os registros são Inserir aqui o nome do Curso www.estrategiaconcursos.com.br Judah Reis Aula 10 69360 r b m.o .cos s r ucn coiag e t a rst w.ew uagem de Programação p/ BRB (Analista TI) - Pós-Edital w g n i L es a mest Sie d o tenm i lv o nve s e D 29 67 organizados por um campo denominado chave (KEY). No relativo, os arquivos são organizados por uma chave relativa. No exemplo acima, se o arquivo fosse indexado pela chave MATRICULA, teríamos: 3: FILE-CONTROL. 4: SELECT ESTUDANTE ASSIGN TO 'estudantes.txt' 5: ORGANIZATION IS INDEXED 6: ACCESS MODE IS RANDOM 7: RECORD KEY IS MATRICULA Depois da declaração do arquivo e do layout, é preciso, de fato, abrir o arquivo (OPEN) para ler (READ) ou escrever (WRITE) algum registro. Para abrir um arquivo em COBOL utilizamos o verbo OPEN na PROCEDURE DIVISION, com a seguinte sintaxe: OPEN <modo> <nome_do_arquivo>. Os modos são: • INPUT - Abre um arquivo preexistente para somente para leitura. • OUTPUT - Abre um arquivo para escrita a partir do início. • EXTEND - Abre um arquivo para escrita, colocando novos registros no final. • I-O - Abre um arquivo para leitura e escrita. O verbo READ vai ser usado para registro dos arquivos. Veja o exemplo abaixo: READ <nome_do_arquivo> NEXT RECORD INTO estrutra-arquivo AT END DISPLAY 'alguma coisa' NOT AT END DISPLAY 'li a estrutra:' estrutura-arquivo END-READ. No exemplo, estrutura-arquivo é um layout definido em FILE SECTION. Para cada registro lido, será executado o trecho “NOT AT END”. Ao final do arquivo, será executado o trecho “AT END”. Inserir aqui o nome do Curso www.estrategiaconcursos.com.brJudah Reis Aula 10 69360 r b m.o .cos s r ucn coiag e t a rst w.ew uagem de Programação p/ BRB (Analista TI) - Pós-Edital w g n i L es a mest Sie d o tenm i lv o nve s e D 30 67 O verbo WRITE é usado para escrever registros dentro de um arquivo. A estrutura segue o exemplo a seguir: WRITE estrutura-arquivo END-WRITE. Este exemplo escreve um registro em um arquivo sequencial (sem chaves). Se o arquivo for indexado por alguma chave, é possível executar trechos de código para o caso de chave válida ou inválida: WRITE estrutura-arquivo INVALID KEY <a chave era inválida... execute algo> NOT INVALID KEY <a chave era válida. Execute algo> END-WRITE. Se você abrir um arquivo no modo I-O (leitura e escrita), você pode usar o verbo REWRITE logo depois de um READ para sobrescrever o registro lido. Isso só serve para reescrever um registro lido, e tem a mesma sintaxe de um WRITE. O mesmo vale para o verbo DELETE, que apaga o último registro lido. O verbo START vai posicionar o ponteiro de leitura/escrita do arquivo a partir de uma condição. Veja um exemplo: START <nome_do_arquivo> KEY IS <= 100 INVALID KEY DISPLAY 'A chave fornecida não é válida' NOT INVALID KEY DISPLAY 'Ponteiro de acesso atualizado' END-START. O código acima posiciona o ponteiro no local onde a chave do registro encontrada for menor ou igual a 100. Se o verbo para abrir é OPEN, é apenas lógico que o verbo para fechar o arquivo se chame CLOSE. A sintaxe, como é de se esperar é: CLOSE <nome_do_arquivo>. 1.9 SUBROTINAS Pessoal, uma das primeira necessidades que temos que resolver em uma linguagem de programação é como “modularizar”. Se um algoritmo é executado em diversos momentos do meu sistema, é fundamental que esse trecho de código possa ser mantido como uma parte isolada, e invocado sempre que preciso (não faria lógica Inserir aqui o nome do Curso www.estrategiaconcursos.com.br Judah Reis Aula 10 69360 r b m.o .cos s r ucn coiag e t a rst w.ew uagem de Programação p/ BRB (Analista TI) - Pós-Edital w g n i L es a mest Sie d o tenm i lv o nve s e D 31 67 reescrever sempre o mesmo algoritmo, especialmente no mundo de recursos escassos em que surgiu o COBOL). Assim, para que um programa chame outro, existe o verbo CALL. Veja o exemplo abaixo. Programa que vai chamar (invocador): 1: IDENTIFICATION DIVISION. 2: PROGRAM-ID. TESTA-CALL. 3: 4: DATA DIVISION. 5: WORKING-STORAGE SECTION. 6: 01 MINHA-VAR PIC X(30) VALUE 'VALOR INICIAL'. 7: 8: PROCEDURE DIVISION. 9: DISPLAY 'VALOR MINHA-VAR ANTES : ' MINHA-VAR. 10: CALL 'MUDA-PAR-ENTRADA' USING MINHA-VAR. 11: DISPLAY 'VALOR MINHA-VAR DEPOIS: ' MINHA-VAR. 12: STOP RUN. Programa que será chamado (invocado): 1: IDENTIFICATION DIVISION. 2: PROGRAM-ID. MUDA-PAR-ENTRADA. 3: 4: DATA DIVISION. 5: LINKAGE SECTION. 6: 01 PAR-ENTRADA PIC X(30). 7: 8: PROCEDURE DIVISION USING PAR-ENTRADA. 9: DISPLAY 'RECEBI 'PAR-ENTRADA. 10: MOVE 'MUDEI PARA SAIDA' TO PAR-ENTRADA. 11: EXIT PROGRAM. Resultado do programa: VALOR MINHA-VAR ANTES : VALOR INICIAL RECEBI VALOR-INICIAL VALOR MINHA-VAR DEPOIS: MUDEI PARA SAIDA Vejamos alguns detalhes desses programas, e como eles estão relacionados. Primeiramente veja que o comando CALL na linha 10 do arquivo “invocador” passa como parâmetro da chamada o nome do arquivo na linha 2 do arquivo “invocado” (MUDA-PAR-ENTRADA). Veja também que, para receber um parâmetro como entrada, o programa invocado precisou definir a variável PAR-ENTRADA na LINKAGE-SECTION (sessão de linkagem) e depois listar declaração da PROCEDURE - Inserir aqui o nome do Curso www.estrategiaconcursos.com.br Judah Reis Aula 10 69360 r b m.o .cos s r ucn coiag e t a rst w.ew uagem de Programação p/ BRB (Analista TI) - Pós-Edital w g n i L es a mest Sie d o tenm i lv o nve s e D 32 67 DIVISION (linha 8 do segundo arquivo). Por último, veja que o conteúdo da variável foi modificado dentro da subrotina, mas isso se refletiu na variável inicial. Em outras palavras, por padrão, o COBOL faz passagem de parâmetros por referência, o que significa que qualquer modificação nas variáveis dentro das sub-rotinas vai mudar o seu valor externo. Para evitar que a subrotina invocada modifique o valor inicial da variável, você pode mandar o programa passar uma cópia da variável, e não a variável em si, usando: 10: CALL 'MUDA-PAR-ENTRADA' USING BY CONTENT MINHA-VAR. Pronto! Se agora você alterar o valor da variável passada dentro do programa MUDA-PAR-ENTRADA, o valor de MINHA-VAR no programa inicial não vai mudar. Por último, para fecharmos o conteúdo de sub-rotinas, vale citar que ao compilar o seu programa você pode indicar se vai querer fazer a chamada estática ou dinâmica. Se a chamada for dinâmica, significa que os dois programa serão independentes, e o link só será feito em tempo de execução. Se você compilar o seu programa com a opção estática, significa que o compilador vai “puxar” todo o código da sub-rotina e inserir no mesmo programa em tempo de compilação, ou seja, não haverá necessidade de fazer link na hora da execução, pois tudo será carregado junto no executável do programa principal. 10 Linguagem JCL (Job Control Language) e Procedure. 10.1 Interpretação de trechos de código. 10.2 Cartões JOB e PROC. 10.3 Parâmetros para cartões EXEC. 10.4 Cartão DD: parâmetros, cartões especiais, definição e utilização de arquivos sequenciais. 10.5 Cartões especiais IF, ELSE e ENDIF. Inserir aqui o nome do Curso www.estrategiaconcursos.com.br Judah Reis Aula 10 69360 r b m.o .cos s r ucn coiag e t a rst w.ew uagem de Programação p/ BRB (Analista TI) - Pós-Edital w g n i L es a mest Sie d o tenm i lv o nve s e D 33 67 1.10 QUESTÕES COMENTADAS: COBOL 1. CESPE / Auditor Municipal de Controle Interno (CGM João Pessoa) / 2018 / Desenvolvimento de Sistemas / Tecnologia da Informação / Julgue o seguinte item, relativo aos servidores de aplicação e às linguagens de implementação de regras de negócio. Na codificação de um programa em COBOL, a ser compilado por um compilador rígido com as regras de codificação da linguagem, todos os nomes de divisão, de seção e de parágrafos precisam começar na Area B, e todas as demais sentenças, na Area A. Gabarito: ERRADO. É exatamente ao contrário. Os nomes de divisão, seção e parágrafos precisam começar na Area A, entre as colunas 8 e 11. Para ser um sentença, precisa começar na área B, a partir do caractere 12, (ou seja, manter as posições 8 a 11 vazias). Cada linha de um comando em COBOL contém 80 caracteres, com a seguinte divisão: Colunas 1-6 - Numeração da Linha Coluna 7 - Indicador (comentário, continuação, etc) Colunas 8-11 - Area A Coluna 12-72 - Area B Colunas 73-80 - Área de identificação (uso livre) 2. CESPE / Perito Criminal Federal / 1997 / / Área 3 Considerando os comandos COBOL apresentados, julgue os valores fornecidos para a variável ITEM em cada execução do parágrafo ROTINA. No comando PERFORM ROTINA VARYING ITEM FROM 10 BY -3 UNTIL ITEM LESS THAN -4 Inserir aqui o nome do Curso www.estrategiaconcursos.com.br Judah Reis Aula 10 69360 r b m.o .cos s r ucn coiag e t a rst w.ew uagem de Programação p/ BRB (Analista TI) - Pós-Edital w g n i L es a mest Sie d o tenm i lv o nve s e D 34 67 a variável ITEM assume os valores 1 0, 7, 4. 1, -2 e a execução para com ITEM = -5. Gabarito: CERTO. PERFORM VARYING repete um comando ou parágrafo com uma variável de controle até que uma condição seja atendida. Assim, o comando acima vai iterarsobre a variável ITEM com valor inicial 10, de -3 em -3, até que esse valor seja menor que -4. Ou seja: 10, 7, 4, 1, -2 e, quando ITEM decrescer para -5, o loop será interrompido. 3. CESPE / Perito Criminal Federal / 1997 / / Área 3 No comando PERFORM ROTINA VARYING A FROM 2 BY 3 UNTIL A GREATER THAN 7 AFTER B FROM 5 BY -1 UNTIL B LESS THAN 3 AFTER ITEM FROM 1 BY 1 UNTIL ITEM GREATER THAN 3 a variável ITEM assume os valores 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3 e a execução para com ITEM = 1. Gabarito: CERTO. PERFORM VARYING repete um comando ou parágrafo com uma variável de controle até que uma condição seja atendida. Quando combinado com AFTER, os loops são aninhados. Ou seja: • A vai iniciar com valor 2, e crescer de 3 em 3 até que seja maior de 7. Ou seja: 2, 5, 8 (não executa para 8). • Para cada valor de A, B vai iniciar com valor 5, e decrescer de -1 em -1 até que seja menor que 3. Ou seja: 5, 4, 3, 2 (não executa para 2). • Para cada valor de B, ITEM vai iniciar com valor 1, e crescer de 1 em 1, até que seja maior que 3. Ou seja: 1, 2, 3, 4 (não executa para 4). Em outras palavras, vamos executar: A=2 B=5 ITEM=1 A=2 B=5 ITEM=2 A=2 B=5 ITEM=3 A=2 B=4 ITEM=1 A=2 B=4 ITEM=2 A=2 B=4 ITEM=3 A=2 B=3 ITEM=1 A=2 B=3 ITEM=2 Inserir aqui o nome do Curso www.estrategiaconcursos.com.br Judah Reis Aula 10 69360 r b m.o .cos s r ucn coiag e t a rst w.ew uagem de Programação p/ BRB (Analista TI) - Pós-Edital w g n i L es a mest Sie d o tenm i lv o nve s e D ==10ef0== 35 67 A=2 B=3 ITEM=3 A=5 B=5 ITEM=1 A=5 B=5 ITEM=2 A=5 B=5 ITEM=3 A=5 B=4 ITEM=1 A=5 B=4 ITEM=2 A=5 B=4 ITEM=3 A=5 B=3 ITEM=1 A=5 B=3 ITEM=2 A=5 B=3 ITEM=3 Acompanhando a execução do programa, temos ITEM valendo 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3. No final, A vale 8, e o loop termina, mas não antes de incializar as variáveis B com valor 5 e ITEM com 1. Portanto a execução para com A=8, B=5 e ITEM=1. Item CORRETO. 4. CESPE / Perito Criminal Federal / 1997 / / Área 3 No comando PERFORM ROTINA VARYING ITEM FROM 5 BY 5 UNTIL ITEM GREATER THAN 25 a variável ITEM assume os valores 5 , 10, 15 , 20, 25 e a execução para com ITEM = 30. Gabarito: CERTO. PERFORM VARYING repete um comando ou parágrafo com uma variável de controle até que uma condição seja atendida. No caso, ITEM vai do valor inicial 5, crescendo de 5 em 5 (BY 5), até que ITEM seja maior que 25. Ou seja 5, 10, 15, 20, 25 e termina quando ITEM vale 30. Item correto. 5. CESPE / Perito Criminal Federal / 1997 / / Área 3 No comando PERFORM ROTINA VARYING ITEM FROM 2 BY 2 UNTIL ITEM GREATER THAN 8 AFTER A FROM 5 BY - 1 UNTIL A LESS THAN 4 Inserir aqui o nome do Curso www.estrategiaconcursos.com.br Judah Reis Aula 10 69360 r b m.o .cos s r ucn coiag e t a rst w.ew uagem de Programação p/ BRB (Analista TI) - Pós-Edital w g n i L es a mest Sie d o tenm i lv o nve s e D 36 67 a variável ITEM assume os valores 2, 2, 4, 4, 6, 6, 8, 8 e a execução termina com ITEM = 8. Gabarito: ERRADO. PERFORM VARYING repete um comando ou parágrafo com uma variável de controle até que uma condição seja atendida. Quando combinado com AFTER, os loops são aninhados. No caso, ITEM vai do valor inicial 2, crescendo de 2 em 2 (BY 2), até que ITEM seja maior que 8. Ou seja 2, 4, 6, 8 e termina quando ITEM vale 10. Para cada valor de ITEM, A vai variar do valor inicial 5, de -1 em -1 até que seja menor que 4. Ou seja, A vai valer 5, 4, e termina quando A vale 3. ITEM=2, A=5 ITEM=2, A=4 ITEM=4, A=5 ITEM=4, A=4 ITEM=6, A=5 ITEM=6, A=4 ITEM=8, A=5 ITEM=8, A=4 Ou seja, a variável ITEM assume os valores, 2, 2, 4, 4, 6, 6, 8, 8. Mas termina com ITEM=10, justamente a condição de saída. Portanto, item errado. 6. VUNESP / Profissional Básico (BNDES) / 2002 / / Análise de Sistemas – Desenvolvimento A divisão de um programa escrito na linguagem Cobol, que armazena todos os dados a serem processados ou manipulados pelo programa durante o processamento é a: a) Identification Division. b) Data Division. c) Environment Division. d) Procedure Division. e) Screen Division. Gabarito: LETRA B. Inserir aqui o nome do Curso www.estrategiaconcursos.com.br Judah Reis Aula 10 69360 r b m.o .cos s r ucn coiag e t a rst w.ew uagem de Programação p/ BRB (Analista TI) - Pós-Edital w g n i L es a mest Sie d o tenm i lv o nve s e D 37 67 a) Identification Division. - ERRADO. É o local onde se identifica o programa. b) Data Division. - CERTO. Define os dados que serão utilizados no programa, bem como sua estrutura (tamanho, nome, tipo, etc.) c) Environment Division. - ERRADO. É usado para declarar as relações com o ambiente de execução, entradas e saídas de dados d) Procedure Division. - ERRADO. É aonde você coloca o seu algoritmo em si, a lógica do seu programa. e) Screen Division.- ERRADO. Não existe! 7. VUNESP / Profissional Básico (BNDES) / 2002 / / Análise de Sistemas – Desenvolvimento Um programa escrito na linguagem é composto de divisões. O define os arquivos a serem utilizados no programa, a sua organização, meio de acesso, chaves primárias e/ou secundárias. Assinale a alternativa que completa, correta e respectivamente, os espaços do texto a) Cobol; quatro; Environment Division b) Cobol; cinco; Identification Division c) Natural 3; cinco; Environment Division d) IBM s/360; quatro; Data Division e) IBM s/360; cinco; Data Division Gabarito: Letra A. O examinador aparentemente não conhece direito a linguagem COBOL. Aí entrou no GOOGLE, digitou "apostila de COBOL" e achou o link https://www.ebah.com.br/content/ABAAABgaYAC/apostila-cobol. Pegou uma frase no meio, e usou a mesma técnica que sua professora do ensino fundamental usava... ainda bem que ele não mandou ligar os pontos! De qualquer maneira, temos 4 divisões: • IDENTIFICATION DIVISION é o local onde se identifica o programa. • ENVIRONMENT DIVISION é usado para declarar as relações com o ambiente de execução, arquivos e outras entradas e saídas de dados . • DATA DIVISION define os dados que serão utilizados no programa, bem como sua estrutura (tamanho, nome, tipo, etc.). Inserir aqui o nome do Curso www.estrategiaconcursos.com.br Judah Reis Aula 10 69360 r b m.o .cos s r ucn coiag e t a rst w.ew uagem de Programação p/ BRB (Analista TI) - Pós-Edital w g n i L es a mest Sie d o tenm i lv o nve s e D 38 67 • PROCEDURE DIVISION é aonde você coloca o seu algoritmo em si, a lógica do seu programa. Portanto, letra A. 8. CESGRANRIO / Técnico Bancário Novo (CEF) / 2012 / / Tecnologia da Informação Considere as três estruturas abaixo, selecionadas para representar a organização dos campos do registro de um arquivo em um programa de controle de empréstimos de livros de uma biblioteca, elaborado em COBOL. (vide figura abaixo) Sobre essas estruturas, pode-se concluir que: a) L1 e L2 representam a mesma organização física de campos do arquivo ARQ1. b) L1 e L3 representam a mesma organização física de campos do arquivo ARQ1. c) L2 e L3 representam a mesma organização física de campos do arquivo ARQ1. d) L1, L2 e L3 representam a mesma organização física de campos do arquivo ARQ1. e) o registro REG de ARQ1(layout L2) possui 192 caracteres. Inserir aqui o nome do Curso www.estrategiaconcursos.com.br Judah Reis Aula 10 69360 r b m.o .cos s r ucn coiag e t a rst w.ew uagem de Programação p/ BRB (Analista TI) - Pós-Edital w g n i L es a mest Sie d o tenm i lv o nve s e D 39 67 Gabarito: Letra A, mas eu achoque deveria ser anulada... Pessoal, eu não sou especialista em COBOL, mas para mim temos um erro nessa questão. O comando REDEFINES permite que uma mesma variável seja reutilizada com outra semântica. Por exemplo: 01 TELEFONE PIC X(11) VALUE '11999998888'. 01 PARTES REDEFINES TELEFONE. 03 DDD PIC X(2). 03 PREFIXO PIC X(5). 03 SUFIXO PIC X(4). Inserir aqui o nome do Curso www.estrategiaconcursos.com.br Judah Reis Aula 10 69360 r b m.o .cos s r ucn coiag e t a rst w.ew uagem de Programação p/ BRB (Analista TI) - Pós-Edital w g n i L es a mest Sie d o tenm i lv o nve s e D 40 67 Nesse exemplo, a variável TELEFONE de 11 alfanuméricos foi redefinida em PARTES, sendo os primeiros 2 dígitos são DDD, os próximos 5 são PREFIXO e os últimos 4 são SUFIXO. Pois bem, voltando à questão, o Layout L1 não usa REDEFINES, o que significa que REG-TIPO1 e REG-TIPO2 estão um seguido do outro em memória, e seus tamanhos devem, portanto, ser somados. Nesse caso, L1 tem tamanho 102 + 102 = 204 caracteres. O Layout L2 tem uma parte comum de 12 caracteres, e duas versões de registro. REG- TIPO1 no layout L2 possui 90 caracteres. REG-TIPO2 redefine o REG-TIPO1, então usa as mesmas 90 caracteres. Portanto, o arquivo tem 12 + 90 = 102 caracteres. Por último, o Layout L3 tem uma parte comum de 12 caracteres, e REG-TIPO1 tem 90 caracteres. O REG-TIPO2 redefine REG-TIPO1, porém, tem 102 caracteres. Logo, o tamanho do registro será 12 + 102 (o maior entre 90 e 102) = 114 caracteres. Portanto, todos os arquivos têm estrutura física diferente (o que elimina os itens A, B, C e D). O Layout L2 tem 102 caracteres (o que elimina o item E). Assim, a questão deveria ser ANULADA. Eu ACHO que o examinador esqueceu de colocar um REDEFINES no REG-TIPO2 do Layout L1. Se tivesse feito isso, o Layout teria 102 caracteres, e ficaria com a mesma estrutura do Layout L2, o que tornaria a Letra A a alternativa correta (como foi o gabarito oficial). 9. CESPE / Técnico Bancário Novo (CEF) / 2010 / / Tecnologia da Informação / Nacional Inserir aqui o nome do Curso www.estrategiaconcursos.com.br Judah Reis Aula 10 69360 r b m.o .cos s r ucn coiag e t a rst w.ew uagem de Programação p/ BRB (Analista TI) - Pós-Edital w g n i L es a mest Sie d o tenm i lv o nve s e D 41 67 A tabela acima apresenta quatro trechos de programas COBOL, numerados de 1 a 4. Os posicionamentos dos códigos em linhas e colunas estão destacados na tabela. No que diz respeito às informações apresentadas e à linguagem COBOL, assinale a opção correta. a) O trecho de código 1 poderia ocorrer na IDENTIFICATION DIVISION de um programa COBOL. b) NOME-MES, no trecho de código 1, pode ser chamada de uma variável de ocorrência simples. c) O trecho de código 2 não constitui um programa COBOL válido, compilável ou passível de execução. d) Suponha que o trecho de código 3 esteja presente em um programa COBOL válido. Nesse caso, a sua execução não provocará a ocorrência de um ABEND. e) No trecho de código 4, a linha de código 5 está comentada e POST-STARTUP- INFO é uma procedure. Gabarito: ANULADA. Todas as alternativas estão erradas. a) ERRADO. Declarações de variáveis sempre devem acontecer na DATA DIVISION. b) ERRADO. NOME-MES é vetor de 12 posições (OCCURS 12 TIMES). c) ERRADO. O procedimento está correto, sem erros. Inserir aqui o nome do Curso www.estrategiaconcursos.com.br Judah Reis Aula 10 69360 r b m.o .cos s r ucn coiag e t a rst w.ew uagem de Programação p/ BRB (Analista TI) - Pós-Edital w g n i L es a mest Sie d o tenm i lv o nve s e D 42 67 d) ERRADO. Haverá uma ABEND por causa de uma divisão por zero. e) ANULADA. POST-STARTUP-INFO é um parágrafo, não uma procedure, mas isso é preciosismo técnico... Inicialmente, esse era o item certo, mas a banca anulou a questão, pois é muito difícil garantir que o “*” na linha 5 está exatamente na coluna 7, local onde significa um comentário. Portanto, anulada. 10. CESPE / Técnico Bancário Novo (CEF) / 2010 / / Tecnologia da Informação / RJ e SP 1 $ SET SOURCEFORMAT”FREE” 2 IDENTIFICATION DIVISION. 3 PROGRAM-ID. Iteration-If. 4 AUTHOR. Michael Coughlan. 5 DATA DIVISION. 6 WORKING-STORAGE SECTION. 7 01 Num1 PIC 9 VALUE ZEROS. 8 01 Num2 PIC 9 VALUE ZEROS. 9 01 Result PIC 99 VALUE ZEROS. 10 01 Operator PIC X VALUE SPACE. 11 01 Num3 PIC 9 VALUE ZEROS. 12 PROCEDURE DIVISION. 13 Calculator. 14 PERFORM 3 TIMES 15 DISPLAY “Enter First Number : “ WITH NO ADVANCING 16 ACCEPT Num1 17 DISPLAY “Enter Second Number : “ WITH NO ADVANCING 18 ACCEPT Num2 19 DISPLAY “Enter operator (+ or *) : “ WITH NO ADVANCING 20 ACCEPT Operator 21 IF Operator = “*” THEN 22 ADD Num1, Num2 GIVING Result 23 END-IF 24 IF Operator = “+” THEN 25 MULTIPLY Num1 BY Num2 GIVING Num3 26 END-IF 27 DISPLAY “Result is = “, Result 28 END-PERFORM. 29 STOP RUN. Considerando o código acima, em Cobol, plenamente compilável e funcional, adaptado de www.csis.ul.ie, assinale a opção correta. a) Todas as divisões e seções características de um programa Cobol que manipula arquivos estão presentes nesse código. b) O programa declara cinco variáveis de tipo numérico e um parágrafo de código executável. c) Se a entrada de dados do usuário for iniciada com os valores 8, 8 e +, a saída de dados será Result is = 64. Inserir aqui o nome do Curso www.estrategiaconcursos.com.br Judah Reis Aula 10 69360 r b m.o .cos s r ucn coiag e t a rst w.ew uagem de Programação p/ BRB (Analista TI) - Pós-Edital w g n i L es a mest Sie d o tenm i lv o nve s e D 43 67 d) Se a entrada de dados do usuário forem os valores 4, 4 e *, a saída de dados será Result is = 8. e) Se a entrada de dados do usuário for iniciada com 8, 8 e +, então, imediatamente antes da execução da linha de código 29, o valor da variável Operator será +. Gabarito: ANULADA. a) Todas as divisões e seções características de um programa Cobol que manipula arquivos estão presentes nesse código. ERRADO. Existem 4 divisões em COBOL. Somente 3 estão presentes, falta a ENVIRONMENT DIVISION que é usada para declarar as relações com o ambiente de execução, arquivos e outras entradas e saídas de dados b) O programa declara cinco variáveis de tipo numérico e um parágrafo de código executável. ERRADO. São 4 variáveis numéricas (PIC 9 e PIC 99) e uma variável alfanumérica (PIC X). c) Se a entrada de dados do usuário for iniciada com os valores 8, 8 e +, a saída de dados será Result is = 64. ERRADO. Quando o operador é "+", é executado MULTIPLY Num1 BY Num2 GIVING Num3, ou seja Result não é alterada. d) Se a entrada de dados do usuário forem os valores 4, 4 e *, a saída de dados será Result is = 8. CERTO. Quando o operador é "*", é executado ADD Num1, Num2 GIVING Result, ou seja, Result sera 4 + 4 = 8. e) Se a entrada de dados do usuário for iniciada com 8, 8 e +, então, imediatamente antes da execução da linha de código 29, o valor da variável Operator será +. CERTO. O valor "+" será atribuído para Operator na linha 20, e não é mais modificado até o fim do programa. Portanto, 2 itens corretos, questão ANULADA. 11. CESGRANRIO / Escriturário (BB) / 2013 / / Tecnologia da Informação / 2 Inserir aqui o nome do Curso www.estrategiaconcursos.com.br Judah Reis Aula 10 69360 r b m.o .cos s r ucn coiag e t a rst w.ew uagem de Programação p/ BRB (Analista TI) - Pós-Edital w g n i L es a mest Sie d o tenm i lv o nve s e D 44 67 Um programa COBOL possui a seguinte linha de comando em sua PROCEDUREDIVISION. COMPUTE A = B + C * D + E. Essa linha pode ser substituída por qual sequência de comandos de forma a sempre calcular corretamente o valor de A? a) ADD C TO B. MULTIPLY C BY D. ADD D TO E. ADD B TO E GIVING A. b) ADD B TO C. MULTIPLY C BY D. ADD E TO D. ADD B TO E GIVING A. c) MULTIPLY C BY D. ADD B TO C. ADD D TO E. ADD C TO E GIVING A. d) MULTIPLY C BY D. ADD C TO B. ADD B TO E GIVING A. e) ADD B TO E. MULTIPLY C BY D. ADD E TO D GIVING A. Gabarito: Letra E. ADD X TO Y é o mesmo que X=X+Y. ADD X TO Y GIVING Z é o mesmo que Z=X+Y. Lembramos que multiplicação tem prioridade sobre a soma. a) B=B+C D=D*C E=E+D*C A=B+C+E+D*C (ERRADO) b) C=C+B D=D*(C+B) D=D*(C+B)+E A=B+E (ERRADO) c) D=D*C C=C+B E=E+D*C Inserir aqui o nome do Curso www.estrategiaconcursos.com.br Judah Reis Aula 10 69360 r b m.o .cos s r ucn coiag e t a rst w.ew uagem de Programação p/ BRB (Analista TI) - Pós-Edital w g n i L es a mest Sie d o tenm i lv o nve s e D 45 67 A=C+B+E+D*C (ERRADO) d) D=D*C B=B+C A=B+C+E (ERRADO) e) E=E+B D=D*C A=E+B+D*C = B+C*D+E (CERTO) 12. CESGRANRIO / Escriturário (BB) / 2013 / / Tecnologia da Informação / 2 Um dado programa COBOL possui os trechos abaixo em sua estrutura: • na working-storage section 77 VAR PIC 9(2). • na procedure division INICIO. MOVE ZEROS TO VAR. PERFORM A THRU C. PERFORM B. PERFORM C. A. ADD 1 TO VAR. B. ADD 2 TO VAR. C. ADD 3 TO VAR. D. DISPLAY VAR. STOP RUN. O valor de VAR apresentado pelo comando DISPLAY, na execução do programa, é a) 11 b) 09 c) 17 d) 08 e) 10 Gabarito: Letra C. Inserir aqui o nome do Curso www.estrategiaconcursos.com.br Judah Reis Aula 10 69360 r b m.o .cos s r ucn coiag e t a rst w.ew uagem de Programação p/ BRB (Analista TI) - Pós-Edital w g n i L es a mest Sie d o tenm i lv o nve s e D 46 67 Primeiramente, é preciso saber que ADD x TO VAR é o mesmo que fazer VAR=VAR+X. Assim, o programa inicializa com MOVE ZEROS TO VAR (faz VAR=0). Depois, temos PERFORM A THRU C, que vai executar os parágrafos A até C. Logo, VAR vai acumular os valore 1 + 2 + 3 = 6. Depois, temos PERFORM B, e VAR acumula +2 e vale 8. Depois temos PERFORM C, e VAR acumula +3, e vale 11. Como não existe nenhuma cláusula de término, o programa segue linearmente e executa ADD 1 TO VAR depois ADD 2 TO VAR, e por último ADD 3 TO VAR, fazendo 11 + 1 + 2 +3 = 17. Logo, a alternativa correta é Letra C, 17. 13. CESGRANRIO / Escriturário (BB) / 2013 / / Tecnologia da Informação / 2 Um dado programa COBOL possui os trechos abaixo em sua estrutura: • na working-storage section 01 TAB. 03 VALOR PIC X(26) VALUE ‘COBOL3BRASIL2BRASIL4COBOL1’. 03 TABELA REDEFINES VALOR. 05 ELEMENTO OCCURS 2. 07 ELEM PIC X(3). 07 TAB2 OCCURS 5. 09 ELEM2 PIC X(2). • na procedure division INICIO. DISPLAY ELEM2(2,2). STOP RUN. O valor apresentado pelo comando DISPLAY, na execução do programa, é a) BR b) 3B c) L1 d) SI e) L4 Gabarito: LETRA E. Inserir aqui o nome do Curso www.estrategiaconcursos.com.br Judah Reis Aula 10 69360 r b m.o .cos s r ucn coiag e t a rst w.ew uagem de Programação p/ BRB (Analista TI) - Pós-Edital w g n i L es a mest Sie d o tenm i lv o nve s e D 47 67 O valor de TABELA possui ELEMENTO 2 vezes (OCCURS 2). Cada ELEMENTO contém ELEM com 3 posições, e uma TAB2 com 5 itens ELEM2 de 2 posições, totalizando 10 posições (5 x 2). Logo, ELEMENTO possui, to total 10 + 3 = 13 posições. Como temos 2 ocorrências, fechamos as 26 posições - bateu certinho. ELEMENTO(1) = "COBOL3BRASIL2" ELEM(1) = "COB" TAB2(1) = "OL3BRASIL2" ELEM2(1,1) = "OL" ELEM2(1,2) = "3B" ELEM2(1,3) = "RA" ELEM2(1,4) = "SI" ELEM2(1,5) = "L2" ELEMENTO(2) = "BRASIL4COBOL1" ELEM(2) = "BRA" TAB2(2) = "SIL4COBOL1" ELEM2(2,1) = "SI" ELEM2(2,2) = "L4" (Letra E) ELEM2(2,3) = "CO" ELEM2(2,4) = "BO" ELEM2(2,5) = "L1" 14. CESGRANRIO / Escriturário (BB) / 2013 / / Tecnologia da Informação / 2 Um dado programa COBOL possui os trechos abaixo em sua estrutura: • na working-storage section 01 TABELA. 05 ELEMENTO OCCURS 70 TIMES ASCENDING CURSO, MATRICULA INDEXED BY IND. 10 CURSO PIC X(10). 10 MATRICULA PIC X(05). 10 NOME PIC X(30). • na procedure division SEARCH ALL ELEMENTO AT END DISPLAY "NAO ACHOU" WHEN CURSO (IND) = "COBOL" AND MATRICULA (IND) = "99887" Inserir aqui o nome do Curso www.estrategiaconcursos.com.br Judah Reis Aula 10 69360 r b m.o .cos s r ucn coiag e t a rst w.ew uagem de Programação p/ BRB (Analista TI) - Pós-Edital w g n i L es a mest Sie d o tenm i lv o nve s e D 48 67 DISPLAY "ACHOU" END-SEARCH. Ao analisar os trechos acima, verifica-se que a) a cláusula ASCENDING garante que a tabela está ordenada crescentemente pelos campos CURSO e MATRICULA, e o comando SEARCH ALL executa uma pesquisa binária na tabela. b) o comando SEARCH ALL executa uma pesquisa binária corretamente na tabela desde que a mesma esteja previamente ordenada, pois a cláusula ASCENDING não garante que a tabela está ordenada crescentemente pelos campos CURSO e MATRICULA. c) a cláusula ASCENDING garante que a tabela está ordenada crescentemente pelos campos CURSO e MATRICULA, e o comando SEARCH ALL executa uma pesquisa sequencial abrangendo todos os elementos da tabela. d) o comando SEARCH ALL executa uma pesquisa sequencial abrangendo todos os elementos da tabela, porém a cláusula ASCENDING não garante que a tabela está ordenada crescentemente pelos campos CURSO e MATRICULA e) a definição da cláusula ASCENDING é desnecessária para executar o comando SEARCH ALL, se a tabela se encontra ordenada. Gabarito: Letra B. Existem 2 formas de se realizar pesquisas em tabelas: SEARCH (pesquisa sequencial) e SEARCH ALL (pesquisa binária). No SEARCH ALL é preciso informar quais são os elementos ordenados, e se estão em ordem crescente (ASCENDING) ou decrescente (DESCENDING). Existem 3 limitações da pesquisa binária sobre a sequencial: Os elementos precisam estar ordenados previamente. A declaração de ordem (ASCENDING/DESCENDING) apenas indica qual o tipo de ordenação, mas não faz a organização dos elementos caso a estrutura não esteja ordenada. A comparação "WHEN" pode usar somente os elementos ordenados. Assim: a) ERRADO. A cláusula ASCENDING não garante que a tabela está ordenada. b) CERTO. Está de acordo com as características do SEARCH ALL. c) ERRADO. A cláusula ASCENDING não garante que a tabela está ordenada. d) ERRADO. O comando SEARCH ALL executa uma pesquisa binária, e não sequencial. e) ERRADO. É necessário indicar os campos que estão ordenados, bem com se estão em ordem crescente ou decrescente. Inserir aqui o nome do Curso www.estrategiaconcursos.com.br Judah Reis Aula 10 69360 r b m.o .cos s r ucn coiag e t a rst w.ew uagem de Programação p/ BRB (Analista TI) - Pós-Edital w g n i L es a mest Sie d o tenm i lv o nve s e D 49 67 15. CESGRANRIO / Escriturário (BB) / 2013 / / Tecnologia da Informação / 2 Considere o seguinte programa escrito na linguagem COBOL: IDENTIFICATION DIVISION. PROGRAM-ID. COB14. ENVIRONMENT DIVISION. DATA DIVISION. WORKING-STORAGE SECTION.
Compartilhar