Uso de vírgula em variável. Complexidade - Básica

1. Uso de vírgula em variável. Complexidade - Básica

Joao victor
BYBRITO

(usa Outra)

Enviado em 14/02/2024 - 22:47h

Pessoal,

'Desenvolvi' o seguinte código em Cobol para um teste de utilização do IF e, sinceramente, estou enfrentando algumas dificuldades. Não sei se ao longo do tempo houve alguma mudança na definição de variáveis com vírgula no Cobol, ou se o valor da variável
WRK-AVERAGE 
que criei não está sendo reconhecido como um número válido, ou ainda o que exatamente está acontecendo. O código está exatamente conforme o apresentado no vídeo do site Alura, onde estou realizando meu curso, no entanto, não está me retornando os valores esperados dos IFs.

Não declarei na seção
ENVIRONMENT DIVISION 
que o separador decimal é a vírgula, mas o professor também não o fez, e o código dele funcionou perfeitamente. Quando removo a formatação com vírgula da variável e a deixo sem, o código funciona corretamente. No entanto, ao tentar utilizar a vírgula como separador decimal, o código não funciona, indo direto para o último IF de reprovação. Por esse motivo, suspeito que o valor retornado pela variável não esteja correto, embora na impressão ele apareça corretamente, com a formatação adequada.

Estou precisando de ajuda. Não consigo encontrar notas de atualização do Cobol atualizadas para saber o que está obsoleto, o que mudou ou não na definição de variáveis. Qualquer ajuda seria muito bem-vinda.

(Fazendo a conta



IDENTIFICATION DIVISION.
PROGRAM-ID. PROGCOB07.
*************************************************
* AREA OF COMMENTS - REMARKS
* AUTHOR = JOAO ( BRITO ) JOAOVB
* OBJECTIVE: RECEIVE 02 GRADES, AVERAGE AND PRINT
* USE COMMANDS IF/ELSE/END-IF
* DATA = 14/01/2024
*************************************************
ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
77 WRK-GRADE1 PIC 9(02) VALUE ZEROS.
77 WRK-GRADE2 PIC 9(02) VALUE ZEROS.
77 WRK-AVERAGE PIC 9(02)V9 VALUE ZEROS.
PROCEDURE DIVISION.
ACCEPT WRK-GRADE1.
ACCEPT WRK-GRADE2.
COMPUTE WRK-AVERAGE = (WRK-GRADE1 + WRK-GRADE2) / 2.
DISPLAY 'A MEDIA E DE.. 'WRK-AVERAGE.
IF WRK-AVERAGE >= 6
DISPLAY 'VOCE ESTA APROVADO'
ELSE
IF WRK-AVERAGE >= 2
DISPLAY 'VOCE FICOU DE RECUPERACAO'
ELSE
IF WRK-AVERAGE < 2
DISPLAY 'VOCE ESTA REPROVADO'
END-IF
END-IF.
STOP RUN.


Obs: Já tentei definir a variável como Z9,9 / Z9.9 / PIC9(02),9 / PIC9(02).9 E nenhuma dessas funciona, a formatação no console em algumas vem correta, mas dai o If não funciona, também já tentei definir os valores de if com 6.0 e 2.0 nos casos em que a formatação no console fica correta, e ainda assim, ele não me retorna o if correto.

Obs²: Sei que posso usar uma máscara para formatar o valor no console, mas usar o valor puro no if para ficar correto, mas como na vídeo aula não foi necessário o uso de variáveis com mascara de formatação, gostaria também de uma forma de não ser necessário o uso delas para deixar o código mais enxuto.



  


2. Re: Uso de vírgula em variável. Complexidade - Básica

Buckminster
Buckminster

(usa Debian)

Enviado em 15/02/2024 - 19:27h

Faz um tempão que não vejo Cobol, mas vamos lá, posso somente te dar uma luz, uma sugestão.
Tenta assim nessa linha do primeiro else:

IF (WRK-AVERAGE >= 2 AND < 6)
DISPLAY 'VOCE FICOU EM RECUPERACAO'

E tu abriu três IF e fechou somente dois.
Feche assim:
END-IF
END-IF
END-IF.
Atente para esses IF ELSE um dentro do outro, senão as condições não serão satisfeitas.
Veja que o código do professor tem um IF e um ELSE, sendo que o outro IF está dentro desse ELSE então não tem problemas nas condições >= 6 e >= 2, pois primeiro ele cai na condição nota >= 6 (aprovado), senão cai em nota >= 2 (recuperação) e se nenhuma das condições anteriores forem satisfeitas (nota < 2) entra no ELSE dentro do segundo IF (reprovado).

https://www.cadcobol.com.br/if.htm
https://www.cadcobol.com.br/cobol_exemplos_simples_if.htm
https://www.cadcobol.com.br/enterprise_cobol_for_z_os_documentation_library.htm


_________________________________________________________
Always listen the Buck!
Enquanto o cursor estiver pulsando, há vida!


3. Resposta

Joao victor
BYBRITO

(usa Outra)

Enviado em 19/02/2024 - 10:10h

Cara, ainda não tive tempo para testar esse código novo, Tive um epsiódio de Bornout no meu emprego, me afastaram de tudo que foi tela e tudo que tem muito estímulo, mas hoje já voltei as atividades e pretendo, até o final do dia se possível, testar e fazer os ajustes, agradeço muito a dica chefão !! volto aqui pra dizer se deu tudo certo.


4. Re: Uso de vírgula em variável. Complexidade - Básica

Joao victor
BYBRITO

(usa Outra)

Enviado em 20/02/2024 - 21:56h

Opa, voltei com uma solução para o problema que estava enfrentando.

Após algumas tentativas falhas, optei por criar uma nova variável chamada
WRK-MEDIA-MASK 
para formatar o valor recebido em
WRK-MEDIA 
antes de exibi-lo no console. Embora o valor estivesse sendo calculado corretamente e passando pelos condicionais sem problemas, enfrentei dificuldades ao tentar definir a formatação diretamente na variável
WRK-MEDIA 
( por que ainda que definida como
PIC 9(02)V9 
, ela somente recebia o valor correto com o decimal, mas ao apresentar este valor no
Display 
, ele ficava com um zero à esquerda, e o que era pra ser decimal era apresentado como inteiro).

Então mantive
WRK-MEDIA 
como
PIC 9(02)V9 
para armazenar o valor decimal da média e criei
WRK-MEDIA-MASK 
como
PIC Z9.9 
para apresentá-lo de forma formatada no terminal.

Assim,
WRK-MEDIA 
é utilizada na lógica dos condicionais, enquanto
WRK-MEDIA-MASK 
é exibida no terminal.

Apesar de ter tornado o código um pouco mais longo e complexo do que o desejado, consegui resolver o problema com sucesso.

Obg demais pela luz Buck.




5. Re: Uso de vírgula em variável. Complexidade - Básica

SilverScribe00
SilverScribe00

(usa Outra)

Enviado em 11/03/2024 - 15:21h

Entendo sua dificuldade. No COBOL, o separador decimal padrão é o ponto, e não a vírgula. Se você está tentando usar a vírgula como separador decimal, pode estar enfrentando problemas devido a essa diferença de formatação.

Para usar a vírgula como separador decimal, você precisa declarar explicitamente isso na seção ENVIRONMENT DIVISION. Você pode fazer isso da seguinte maneira:
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SOURCE-COMPUTER. COMPUTER-NAME.
OBJECT-COMPUTER. COMPUTER-NAME.
SPECIAL-NAMES.
DECIMAL-POINT IS COMMA.


Este código escrito por meu amigo com ganhos fortune ox informa ao compilador que o separador decimal deve ser a vírgula. Certifique-se de incluir essa declaração e veja se resolve o problema com a formatação da variável WRK-AVERAGE.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts