Olá! Meu nome é Ivan Petrucci. Boas-vindas a mais um curso de COBOL.
Audiodescrição: Ivan se identifica como uma pessoa de pele branca. Possui cabelos curtos, barba curta e bigode castanhos, além de olhos castanhos. Usa óculos de grau, de armação escura, e uma camiseta escura. Ao fundo, uma parede lisa, iluminada em tons de azul.
Neste curso, aprenderemos mais sobre o PERFORM VARYING
, que é um laço onde aproveitamos variáveis. Convidamos você a aprender mais sobre isso no próximo vídeo.
Neste curso, abordaremos o uso do VARYING
em laços. Para relembrar, utilizamos geralmente:
PERFORM
em linha;PERFORM
básico;PERFORM
de repetições;PERFORM
com uma condição eVARYING
, que será nosso foco de estudo.VARYING
no COBOLO VARYING
direciona o PERFORM
para uma determinada seção, utilizando uma variável de apoio, o segredo do processo. O VARYING
possui um início, um passo e uma condição.
PERFORM <onde> VARYING <var> FROM <início> BY [passo] 1 <condição>.
Supondo que o passo seja 1, a variável começa em 1 e vai de 1 em 1 até que seja igual a 5. Assim, ela percorre 1, 2, 3, 4, 5, e para ao chegar em 5. Essa é a ideia do PERFORM
.
PERFORM A-PARA VARYING A FROM 1 BY 1 UNTIL A = 5.
No exemplo abaixo, se a variável WS-A
vale 0, podemos dizer: PERFORM
, vá ao parágrafo B, utilize essa variável como apoio, inicie em 2 e avance de 2 em 2 até chegar em 8. O parágrafo mostrará o valor dela.
01 WS-A PIC 9(2) VALUE 0.
PARAG-A.
PERFORM PARAG-B VARYING WS-A FROM 2 BY 2 UNTIL WS-A = 08
PARAG-B.
DISPLAY 'PARAG-B ' WS-A.
A saída seria 2, 4 e 6, pois o início é 2 e termina em 8:
Saída |
---|
PARAG-B 02 |
PARAG-B 04 |
PARAG-B 06 |
O valor 8 não aparece porque, ao chegar em 8, o processo para, indo apenas até 6, já que o passo é 2. Temos, então, um parágrafo acionado, uma variável de controle, um início, um passo e uma condição de término.
Vamos aplicar isso em um exemplo prático. No Visual Studio, acessaremos um programa base chamado LACOS
:
lacos.cob
:
IDENTIFICATION DIVISION.
PROGRAM-ID. LACOS.
ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WRK-QUANTOS PIC 9(002) VALUE 3.
01 FILLER.
05 WRK-DADOS PIC X(020) OCCURS 3.
*--------- APOIO ---------*
01 WRK-TEMP PIC X(020).
01 WRK-CONTA PIC 9(001) VALUE 1.
01 POSICAO PIC 9(002) VALUE 0.
PROCEDURE DIVISION.
ACCEPT WRK-DADOS(CONTA)
GOBACK.
A ideia é ter uma variável chamada QUANTOS
, que indica quantos nomes vamos digitar. Definimos 3 para ela. Há também uma variável DADOS
, que ocorre 3 vezes.
Também há as variáveis TEMP
, CONTA
e POSICAO
, com as quais trabalharemos em breve. A variável CONTA
será inicializada como 1.
No final do código, indicamos que queremos receber a variável DADOS
no primeiro índice.
PERFORM VARYING
para ler nomesNa primeira linha da PROCEDURE
, usaremos o PERFORM VARYING
para ler 3 nomes. O PERFORM
será deixado em linha, sem direcionamento para uma seção específica, mas chamaremos o VARYING
.
A variável a ser variada é WRK-CONTA
, que inicia em 1 e avança de 1 em 1 até ser maior que QUANTOS
. Assim, ela será 1, 2, 3, mas não 4, pois parará quando for maior que QUANTOS
, que vale 3.
Por fim, o ACCEPT
dentro do PERFORM
recolherá o nome de cada um.
PROCEDURE DIVISION.
PERFORM VARYING WRK-CONTA FROM 1 BY 1 UNTIL
UNTIL WRK-CONTA > WRK-QUANTOS
ACCEPT WRK-DADOS(WRK-CONTA)
END-PERFORM.
GOBACK.
Vamos salvar e compilar o programa LACOS
, utilizando a seguinte compilação no terminal:
cobc -x -o bin\lacos.exe lacos.cob
Acessando o prompt de comando, executaremos o programa LACOS
:
lacos
Na execução, o programa esperará o primeiro nome. Não há DISPLAY
para retornar, pois está no ACCEPT
.
Vamos inserir "ana", "silvio" e "carla". O programa recolherá 3 nomes.
ana
silvio
carla
DEPENDING ON
Vamos melhorar isso com uma dica-bônus: na seção WORKING-STORAGE
, adicionaremos a cláusula DEPENDING ON WRK-QUANTOS
após o OCCURS
:
05 WRK-DADOS PIC X(020) OCCURS
DEPENDING ON WRK-QUANTOS.
O DEPENDING ON
permite definir quantos elementos ocorrerão. Definiremos a quantidade de 1 a 1000, dependendo do valor especificado:
05 WRK-DADOS PIC X(020) OCCURS 1 TO 1000
DEPENDING ON WRK-QUANTOS.
Assim, a variável poderá ocorrer de 1 a 1000, mas seu valor será gerada dinamicamente conforme o valor passado em QUANTOS
. Isso não altera o processamento atual, mas se colocarmos 4, ele pedirá 4 nomes. O DEPENDING
é uma funcionalidade interessante.
Vamos realizar uma tarefa interessante: utilizar o VARYING
para exportar dados para um arquivo, como um CSV, onde os campos são separados por ponto e vírgula.
Entretanto, temos 20 posições para os nomes e podemos receber nomes de tamanhos diferentes — por exemplo, "Ana" não ocupa 20 posições. Precisamos resolver isso.
Abaixo do END-PERFORM
, faremos um loop para exportar o nome e adicionar um ponto e vírgula ao final. Em seguida, precisamos colocar esse ponto e vírgula logo após o término do nome.
Vamos começar com o comando PERFORM VARYING
. Utilizaremos a variável WRK-CONTA
, incrementando de 1 em 1. Podemos repetir a estrutura inicial do PERFORM
anterior.
PERFORM VARYING WRK-CONTA FROM 1 BY 1
UNTIL WRK-CONTA > WRK-QUANTOS
Para mostrar os dados digitados, basta substituir ACCEPT
no código anterior por DISPLAY
, mas não queremos fazer apenas isso. Nosso objetivo é incluir um ponto e vírgula ao final do nome, portanto, acrescentaremos a string ";" no final.
PERFORM VARYING WRK-CONTA FROM 1 BY 1
UNTIL WRK-CONTA > WRK-QUANTOS
DISPLAY WRK-DADOS(WRK-CONTA) ";"
END-PERFORM.
Assim, pegaremos cada elemento dentro do loop e acrescentaremos um ponto e vírgula. Isso resolve parte do problema, pois temos um loop para receber e outro para mostrar os dados.
Vamos testar com os nomes "Ana", "Marcos" e "Paulo". Todos terão o ponto e vírgula ao final, iniciando o processo de transformação para um modelo CSV.
ANA ;
MARCOS ;
PAULO ;
No entanto, precisamos garantir que o ponto e vírgula fique colado ao nome, pois cada nome tem um tamanho diferente. Para isso, utilizaremos outro loop.
TEMP
e o loop invertidoEsse loop usará uma variável chamada TEMP
. Dentro do segundo PERFORM
, acima do DISPLAY
que exibe os três elementos, faremos um MOVE
para mover os DADOS
com o elemento CONTA
para TEMP
. Assim, ao passar por esse trecho, TEMP
será atualizado.
PERFORM VARYING WRK-CONTA FROM 1 BY 1
UNTIL WRK-CONTA > WRK-QUANTOS
MOVE WRK-DADOS(WRK-CONTA) TO WRK-TEMP
* Código omitido
Precisamos saber até onde cada nome vai. Para isso, faremos um PERFORM
abaixo do MOVE
, invertendo a variável, começando do final. Usaremos a variável POSICAO
, começando em 20 e decrementando até que POSICAO
seja igual a 0.
PERFORM VARYING WRK-CONTA FROM 1 BY 1
UNTIL WRK-CONTA > WRK-QUANTOS
MOVE WRK-DADOS(WRK-CONTA) TO WRK-TEMP
PERFORM VARYING POSICAO FROM 20 BY -1 UNTIL POSICAO = 0
* Código omitido
A lógica do PERFORM
será: ao encontrar um caractere diferente de espaço, mostraremos o nome desde o início até essa posição, acrescentando o ponto e vírgula. Após isso, usaremos EXIT-PERFORM
para sair do loop, fechando o IF
e o PERFORM
em seguida.
PERFORM VARYING POSICAO FROM 20 BY -1 UNTIL POSICAO = 0
IF WRK-TEMP(POSICAO:1) NOT EQUAL spaces
DISPLAY "Nome.. " WRK-TEMP(1:POSICAO) ";"
EXIT PERFORM
END-IF
END-PERFORM
Por fim, removeremos o DISPLAY WRK-DADOS(WRK-CONTA) ";"
, que não será mas necessário. O bloco de código completo pode ser consultado abaixo:
PERFORM VARYING WRK-CONTA FROM 1 BY 1
UNTIL WRK-CONTA > WRK-QUANTOS
MOVE WRK-DADOS(WRK-CONTA) TO WRK-TEMP
PERFORM VARYING POSICAO FROM 20 BY -1 UNTIL POSICAO = 0
IF WRK-TEMP(POSICAO:1) NOT EQUAL spaces
DISPLAY "Nome.. " WRK-TEMP(1:POSICAO) ";"
EXIT PERFORM
END-IF
END-PERFORM
END-PERFORM.
Com o bloco de código acima, ao encontrar o primeiro caractere diferente de espaço, saberemos onde o nome termina. Por exemplo, ao inverter "Ana de Sousa", teremos "Sousa Ana". Quando encontrarmos o primeiro caractere, saberemos a posição final do nome.
Vamos entender o funcionamento: ao inverter o nome "Ana", começaremos a ler da 20ª posição, que estará vazia, até a 3ª posição, onde está o último "a" de "Ana", e exibiremos o nome completo da posição 1 até 3. Para "Marcos", que tem 6 posições, o processo é similar, até encontrar o "s" de "Marcos".
Com essa técnica, podemos pegar qualquer estrutura e evitar espaços sobrando.
Vamos compilar e testar com os nomes "Ana", "Paulo" e "Carlos Alberto". O resultado mostra que o ponto e vírgula é adicionado corretamente ao final de cada nome, mesmo com espaços no meio.
Ana;
Paulo;
Carlos Alberto;
Este exemplo de PERFORM
com VARYING
é bastante útil, permitindo manipular variáveis de forma eficiente. Esperamos que tenha gostado deste conteúdo!
O curso Praticando Cobol: Laços possui 17 minutos de vídeos, em um total de 16 atividades. Gostou? Conheça nossos outros cursos de em Programação, ou leia nossos artigos de Programação.
Matricule-se e comece a estudar com a gente hoje! Conheça outros tópicos abordados durante o curso:
Impulsione a sua carreira com os melhores cursos e faça parte da maior comunidade tech.
1 ano de Alura
Assine o PLUS (1 ANO) e garanta:
Formações com mais de 1500 cursos atualizados e novos lançamentos semanais, em Programação, Inteligência Artificial, Front-end, UX & Design, Data Science, Mobile, DevOps e Inovação & Gestão.
A cada curso ou formação concluído, um novo certificado para turbinar seu currículo e LinkedIn.
No Discord, você tem acesso a eventos exclusivos, grupos de estudos e mentorias com especialistas de diferentes áreas.
Faça parte da maior comunidade Dev do país e crie conexões com mais de 120 mil pessoas no Discord.
Acesso ilimitado ao catálogo de Imersões da Alura para praticar conhecimentos em diferentes áreas.
Explore um universo de possibilidades na palma da sua mão. Baixe as aulas para assistir offline, onde e quando quiser.
Acelere o seu aprendizado com a IA da Alura e prepare-se para o mercado internacional.
1 ano de Alura
Todos os benefícios do PLUS (1 ANO) e mais vantagens exclusivas:
Luri é nossa inteligência artificial que tira dúvidas, dá exemplos práticos, corrige exercícios e ajuda a mergulhar ainda mais durante as aulas. Você pode conversar com a Luri até 100 mensagens por semana.
Aprenda um novo idioma e expanda seus horizontes profissionais. Cursos de Inglês, Espanhol e Inglês para Devs, 100% focado em tecnologia.
Transforme a sua jornada com benefícios exclusivos e evolua ainda mais na sua carreira.
1 ano de Alura
Todos os benefícios do PRO (1 ANO) e mais vantagens exclusivas:
Mensagens ilimitadas para estudar com a Luri, a IA da Alura, disponível 24hs para tirar suas dúvidas, dar exemplos práticos, corrigir exercícios e impulsionar seus estudos.
Envie imagens para a Luri e ela te ajuda a solucionar problemas, identificar erros, esclarecer gráficos, analisar design e muito mais.
Brinde aniversário Alura
Escolha os ebooks da Casa do Código, a editora da Alura, que apoiarão a sua jornada de aprendizado para sempre.
Enquanto durarem os estoques