Aniversário
Alura 12 anos

20% OFF

Falta pouco!

00

DIAS

00

HORAS

00

MIN

00

SEG

Alura > Cursos de Programação > Cursos de > Conteúdos de > Primeiras aulas do curso Praticando Cobol: Laços

Praticando Cobol: Laços

Laços - Apresentação

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.

O que aprenderemos?

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.

Laços - Laços

Neste curso, abordaremos o uso do VARYING em laços. Para relembrar, utilizamos geralmente:

Conhecendo o VARYING no COBOL

O 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.

Aplicando no programa de laços

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.

Usando o PERFORM VARYING para ler nomes

Na 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

Acrescentando o 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.

Exportando dados para CSV

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.

Testando o programa

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.

Usando a variável TEMP e o loop invertido

Esse 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.

Conclusão

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!

Sobre o curso Praticando Cobol: Laços

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:

Escolha a duração
do seu plano

Conheça os Planos para Empresas