Alura > Cursos de Programação > Cursos de > Conteúdos de > Primeiras aulas do curso Praticando Cobol: Decisões com evaluate

Praticando Cobol: Decisões com evaluate

Decisões com evaluate - Apresentação

Certamente, você já utilizou o EVALUATE em diversas situações em programas. Meu nome é Ivan Petrucci e irei te acompanhar ao longo dessa prática de COBOL!

Audiodescrição: Ivan Petrucci se descreve como uma pessoa de pele branca, com cabelo castanho-escuro curto e liso, olhos castanho-claros, barba castanho-escura e sobrancelhas castanho-escuras. Usa óculos de armação retangular preta, veste uma camisa preta lisa, e está sentado em uma cadeira preta em frente a uma parede clara iluminada em gradiente azul.

O que vamos aprender?

A ideia deste treinamento é apresentar algumas possibilidades de EVALUATE, como:

Vamos explorar todas as formas de expandir o uso do EVALUATE para obter um código mais claro.

Conclusão

Convidamos você para participar dessa jornada!

Decisões com evaluate - Evaluate

Neste vídeo, vamos discutir o comando EVALUATE e explorar suas possibilidades.

Utilizando o comando EVALUATE

Entendendo o EVALUATE TRUE

Para começar, temos o EVALUATE tradicional, que é o EVALUATE TRUE, onde comparamos a variável A com a variável B, e a variável C com D. Por fim, um bloco OTHER é utilizado como exceção.

TRUE:

EVALUATE TRUE
WHEN A > B
   ACAO
WHEN C > D
   ACAO
WHEN OTHER
   ACAO
END-EVALUATE.

No EVALUATE TRUE, qualquer condição válida será a primeira a ser executada.

Importante! Não devem existir condições iguais que possam ocorrer simultaneamente, como A maior que B e B menor que A, por exemplo, pois ambas seriam verdadeiras.

Utilizando o EVALUATE com variável como entrada

Por outro lado, temos o EVALUATE quando comparamos uma variável. Observe o exemplo de código abaixo, onde temos uma variável como entrada:

VARIAVEL:

EVALUATE MEDIA
WHEN 10
   ACAO
WHEN 7
   ACAO
WHEN OTHER
   ACAO
END-EVALUATE.

Usamos valores fixos, como 10, 7 e OTHER. Dessa forma, se a nota for 10, a ação (ACAO) pode ser aprovar; se for 7, indicar que haverá uma segunda prova; e o OTHER indica recuperação.

Esses são os dois tipos mais básicos: TRUE e usando uma variável como entrada.

Explorando o comando THRU

Vamos explorar outras possibilidades?

O THRU funciona como um intervalo. Por exemplo: se temos uma ação que verifica se a nota é maior que 7, ela cobre de 7 a 10. Se a média for 12, ela será considerada, pois 12 é maior que 7.

VARIAVEL:

EVALUATE MEDIA
WHEN >= 7
   ACAO
WHEN >= 2
   ACAO
WHEN OTHER
   ACAO
END-EVALUATE.

No entanto, podemos utilizar o comando THRU para definir um intervalo específico, como de 7 a 10, por exemplo, bem como para tratar números decimais, como de 2 até 6.99.

THRU:

EVALUATE MEDIA
WHEN 7 THRU 10
   ACAO
WHEN 2 THRU 6.99
   ACAO
WHEN OTHER
   ACAO
END-EVALUATE.

Utilizando o comando ALSO para comparações múltiplas

Além disso, temos o comando ALSO, que é muito interessante. Ele permite utilizar duas variáveis como premissas, como GRAU e PROVA no exemplo abaixo:

ALSO:

EVALUATE GRAU  ALSO PROVA
WHEN "MEDIO" ALSO "UNICAMP"
   ACAO -> TREINEIRO
WHEN "MEDIO" ALSO "FMP"
   ACAO -> APTO
WHEN "FUNDAMENTAL" ALSO ANY
   ACAO -> NAO PODE FAZER
END-EVALUATE.

O GRAU pode corresponder a ensino fundamental, médio ou superior, enquanto a PROVA pode ser realizada por entidades como Unicamp ou FMP.

No exemplo acima, se a pessoa estudante é do ensino médio e faz a prova na Unicamp, ela pode ser treineira. Na FMP, mesmo no ensino médio, ela está apta, pois há aproveitamento de crédito.

O ALSO compara se o grau é médio e se a prova é na Unicamp ou na FMP.

Abaixo, há uma ramificação diferente: se a pessoa estudante é do ensino fundamental, ela não pode fazer a prova, independentemente da faculdade.

Analisando exemplos práticos de EVALUATE

Vamos entender na prática como aplicar THRU e ALSO? Separamos 5 exemplos para explicar o uso de EVALUATE. No primeiro (arquivo Evaluate1.cob), temos a média de três notas:

Evaluate1.cob:

IDENTIFICATION DIVISION.
PROGRAM-ID. CALCULA-MEDIA.

ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 NOTA1          PIC 99V99 VALUE 0.
01 NOTA2          PIC 99V99 VALUE 0.
01 MEDIA          PIC 99V99 VALUE 0.

PROCEDURE DIVISION.
INICIO.
    DISPLAY "Digite a primeira nota: ".
    ACCEPT NOTA1.
    DISPLAY "Digite a segunda nota: ".
    ACCEPT NOTA2.

    COMPUTE MEDIA = (NOTA1 + NOTA2) / 2.

    DISPLAY "A media das notas e: " MEDIA.

    EVALUATE TRUE
        WHEN MEDIA = 10
            DISPLAY "Parabens, voce foi aprovado com louvor!"
        WHEN MEDIA >= 7 AND MEDIA < 10
            DISPLAY "Aprovado"
        WHEN MEDIA >= 2 AND MEDIA < 7
            DISPLAY "Recuperacao"
        WHEN MEDIA < 2
            DISPLAY "Reprovado com nota menor que 2"
    END-EVALUATE.

    STOP RUN.

Após a entrada dos dados e o cálculo da média (MEDIA), usamos EVALUATE para verificar se a MEDIA é igual a 10, entre 7 e menor que 10, entre 2 e menor que 7, ou menor que 2.

Nesse caso, se a média for igual a 10, a pessoa é aprovada com louvor; com a média entre 7 e 9.99, ela é aprovada; entre 2 e 6.99, ela faz recuperação; e com média menor que 2, é reprovada.

Comparando o comando EVALUATE com AND e THRU

No arquivo Evaluate2-0.cob, temos o mesmo programa, mas o EVALUATE muda:

Evaluate2-0.cob:

IDENTIFICATION DIVISION.
PROGRAM-ID. CALCULA-MEDIA.

ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 NOTA1          PIC 99V99 VALUE 0.
01 NOTA2          PIC 99V99 VALUE 0.
01 MEDIA          PIC 99V99 VALUE 0.

PROCEDURE DIVISION.
INICIO.
    DISPLAY "Digite a primeira nota: ".
    ACCEPT NOTA1.
    DISPLAY "Digite a segunda nota: ".
    ACCEPT NOTA2.

    COMPUTE MEDIA = (NOTA1 + NOTA2) / 2.

    DISPLAY "A media das notas e: " MEDIA.

    EVALUATE MEDIA
        WHEN 10
            DISPLAY "Parabens, voce foi aprovado com louvor!"
        WHEN 7 THRU 9.99
            DISPLAY "Aprovado"
        WHEN 2 THRU 6.99
            DISPLAY "Recuperacao"
        WHEN < 2
            DISPLAY "Reprovado com nota menor que 2"
    END-EVALUATE.

    STOP RUN.

A MEDIA 10 garante aprovação com louvor. Comparando os dois códigos, usamos AND no primeiro e THRU no segundo. O THRU facilita a visualização, pois cobre de 7 a 9.99, de 2 a 6.99, e menor que 2.

Nesse caso, não há risco de médias maiores que 10, pois comparamos de 10 para baixo.

O THRU faz um AND implícito, mas é mais fácil de entender.

Utilizando o EVALUATE para dias da semana

No próximo exemplo, do arquivo Evaluate2-1.cob, mudamos um pouco o foco: em vez de utilizar a média (MEDIA), usamos um tipo de constante com ACCEPT.

Nesse caso, fazemos o recebimento do dia da semana (day-of-week) via ACCEPT. Esse recurso é interessante, pois nos devolve o dia da semana, com 1 sendo segunda-feira, 2 terça-feira, até 7 domingo. Assim, recebemos na variável DIA-SEMANA numérica a constante day-of-week.

Na sequência, mostramos o dia da semana com DISPLAY. Se o retorno for de 1 a 5, consideramos dia de trabalho; se for de 6 a 7, é dia de folga. Para alguns, vai até 6, sendo apenas domingo dia de folga.

Evaluate2-1.cob:

IDENTIFICATION DIVISION.
PROGRAM-ID. CALCULA-MEDIA.

ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 DIA-SEMANA      PIC 9 VALUE 0.

PROCEDURE DIVISION.
INICIO.
    ACCEPT DIA-SEMANA FROM day-of-week.
    DISPLAY "Dia da Semana " DIA-SEMANA.

    EVALUATE DIA-SEMANA
        WHEN 1 THRU 5
            DISPLAY "DIA DE TRABALHO"
        WHEN 6 THRU 7
            DISPLAY "FOLGA"
    END-EVALUATE.

    STOP RUN.

Aplicando o comando EVALUATE para comparações de estado

No quarto exemplo (Evaluate3.cob), mudamos o foco novamente, alterando os exemplos para oferecer mais possibilidades de recursos, numéricos e textuais.

Evaluate3.cob:

IDENTIFICATION DIVISION.
PROGRAM-ID. CALCULA-MEDIA.

ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 PRODUTO         PIC X(02) VALUE SPACES.
01 ESTADO          PIC X(30) VALUE SPACES.

PROCEDURE DIVISION.
INICIO.
    DISPLAY "Digite O nome do produto: ".
    ACCEPT PRODUTO.
    DISPLAY "Digite o estado onde sera entregue: ".
    ACCEPT ESTADO.

    EVALUATE ESTADO
        WHEN "SP"
        WHEN "RJ"
        WHEN "MG"
            DISPLAY "FRETE DISPONIVEL"
        WHEN "ES"
            DISPLAY "RETIRAR NA LOJA"
        WHEN OTHER
            DISPLAY "NAO ATENDEMOS"
    END-EVALUATE.

    STOP RUN.

Neste exemplo, consideramos o seguinte: o produto será vendido e a pessoa que vai comprar mora em determinado estado, como São Paulo, Rio de Janeiro ou Minas Gerais.

Portanto, perguntamos o nome do produto e o estado onde será entregue. Em seguida, usamos o recurso do EVALUATE para verificar os estados. Se precisássemos comparar, por exemplo, São Paulo, Rio de Janeiro e Minas Gerais, poderíamos fazer isso com WHEN "SP" AND "RJ" AND "MG".

O THRU não se aplica a este caso, pois ele compara alfabeticamente.

Em situações onde há uma série de departamentos de uma empresa e queremos comparar todos de uma vez, podemos usar esse recurso: abrimos um WHEN e, logo em seguida, abrimos outro.

O código entende que os 3 WHEN vão virar a ação ao final. No caso, se o estado for São Paulo, Minas Gerais e Rio de Janeiro, o frete está disponível. Se for Espírito Santo, só é possível retirar na loja. Por fim, qualquer outro estado não é atendido. Esse recurso é bem interessante.

Analisando um exemplo complexo com ALSO

O último exemplo, do arquivo Evaluate4.cob, é um pouco mais complexo.

A ideia é a seguinte: determinada pessoa funcionária trabalha um número de anos na empresa (WS-TEMPO-TRABALHO), tem um cargo (WS-CARGO) e um salário (WS-SALARIO).

A empresa quer dar um bônus para funcionários, mas há uma regra: para gerentes e diretores, os bônus são maiores, pois estão há mais tempo e têm cargos maiores; para demais funcionários, também há bônus, mas é necessário ter pelo menos um ano de empresa.

Com isso, temos as variáveis disponíveis. Na sequência, perguntamos o cargo, o salário da pessoa funcionária, e há quanto tempo ela trabalha na empresa. Com o comando ALSO, se o cargo for DIRETOR e a pessoa tiver mais de 5 anos na empresa, damos 15% de bônus.

Se o cargo for GERENTE e a pessoa tiver mais de 3 anos na empresa, damos 10%. Não basta ser diretor, é preciso ter mais de 5 anos. Portanto, não basta ser gerente; é preciso ter um tempo de trabalho na empresa. Além disso, qualquer cargo com mais de 2 anos recebe 5% de bônus.

No final, mostramos o cargo, o tempo de trabalho, e o salário original.

Evaluate4.cob:

IDENTIFICATION DIVISION.
PROGRAM-ID. BONUS.

ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.

DATA DIVISION.
FILE SECTION.

WORKING-STORAGE SECTION.
01 WS-TEMPO-TRABALHO       PIC 99.
01 WS-CARGO                PIC X(20).
01 WS-SALARIO              PIC 9(5).
01 WS-SALARIO-AJUSTADO     PIC 9(5).

PROCEDURE DIVISION.
MAIN-PROCEDURE.

    DISPLAY "Cargo: ".
    ACCEPT WS-CARGO.

    DISPLAY "Salario atual: ".
    ACCEPT WS-SALARIO.

    DISPLAY "Tempo de trabalho (em anos): ".
    ACCEPT WS-TEMPO-TRABALHO.

    EVALUATE WS-CARGO   ALSO WS-TEMPO-TRABALHO

        WHEN  "DIRETOR" ALSO >= 5
            COMPUTE WS-SALARIO-AJUSTADO = WS-SALARIO * 1.15

        WHEN "GERENTE"  ALSO >= 3
            COMPUTE WS-SALARIO-AJUSTADO = WS-SALARIO * 1.10

        WHEN ANY        ALSO >=2
            COMPUTE WS-SALARIO-AJUSTADO = WS-SALARIO * 1.05

    END-EVALUATE.


    DISPLAY " ".
    DISPLAY "--------------".
    DISPLAY "Cargo:           : " WS-CARGO.
    DISPLAY "Tempo de Trabalho: " WS-TEMPO-TRABALHO.
    DISPLAY "Salario Original : " WS-SALARIO.
    IF WS-SALARIO-AJUSTADO > 0
        DISPLAY "Salario Ajustado : " WS-SALARIO-AJUSTADO
    ELSE
        DISPLAY "SEM BONUS !! Sorry"
    END-IF.
    STOP RUN.

Nessa etapa, podemos realizar alguns testes: uma pessoa diretora com 6 anos de trabalho ganha 15%; uma pessoa gerente com 4 anos ganha 10%; uma gerente com 2 anos de trabalho entra na regra de qualquer cargo e ganha 5% de bônus; já uma gerente com 1 ano de empresa não recebe bônus.

Qualquer pessoa com menos de 2 anos de empresa não terá salário ajustado (WS-SALARIO-AJUSTADO). Se for ajustado, mostraremos o bônus recebido; no entanto, se a pessoa não tiver mais de 2 anos de trabalho na empresa, independentemente do cargo, não haverá bônus.

Testando o código

Vamos testar o arquivo Evaluate4.cob executando o seguinte comando:

cobc -x -o bin\evaluate4.exe evaluate4.cob

No Prompt de Comando, enviaremos o comando abaixo:

EVALUATE4

Passaremos o cargo DIRETOR; o salário de 10 mil reais (10000); e o tempo de trabalho de 5 anos. O resultado é um salário ajustado de 11.500, com 15% de bônus aplicado.

Cargo:
DIRETOR
Salario atual:
10000
Tempo de trabalho (em anos):
5

Retorno do comando:

Cargo:           : DIRETOR
Tempo de Trabalho: 05
Salario Original : 10000
Salario Ajustado : 11500

Podemos fazer outro teste com os seguintes dados:

Cargo:
DIRETOR
Salario atual:
10000
Tempo de trabalho (em anos):
3

Retorno do comando:

Cargo:           : DIRETOR
Tempo de Trabalho: 03
Salario Original : 10000
Salario Ajustado : 10500

Nesse caso, a pessoa funcionária entra na classe dos 5%. Observe outro exemplo:

Cargo:
DIRETOR
Salario atual:
10000
Tempo de trabalho (em anos):
1

Retorno do comando:

Cargo:           : DIRETOR
Tempo de Trabalho: 01
Salario Original : 10000
SEM BONUS !! Sorry

Como resultado de não entrar em nenhuma regra, a pessoa não tem direito ao bônus.

Conclusão

Com o ALSO, podemos comparar duas variáveis, e utilizando o AND, ampliamos as possibilidades.

Temos o EVALUATE tradicional; o EVALUATE com THRU, que cria um intervalo; o EVALUATE que testa várias condições; e o ALSO. Assim, expandimos bastante as nossas possibilidades de uso do comandoEVALUATE. No final, tudo é comparação. Podemos resolver com o comando IF ou com EVALUATE, mas este oferece opções mais nítidas para programar e entender.

Agradecemos a sua participação. Nos encontramos em outros conteúdos!

Sobre o curso Praticando Cobol: Decisões com evaluate

O curso Praticando Cobol: Decisões com evaluate possui 16 minutos de vídeos, em um total de 17 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:

Aprenda acessando integralmente esse e outros cursos, comece hoje!

Conheça os Planos para Empresas