Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Desafio: Conversor de Moedas

algoritmo "Conversor de moedas"

funcao converter_para_dolar(valor: real, taxa: real): real

inicio

  se taxa <= 0 entao 
    escreva("Valor inválido")
  senao
    resultado <- valor / taxa
  fimse
  retorne resultado
fimfuncao

var

  resultado: real
  valor_em_reais, taxa_de_cambio, valor_convertido: real

inicio

  escreva("Digite o valor em reais: ")
  leia(valor_em_reais)
  escreva("Digite a taxa de cambio: ")
  leia(taxa_de_cambio)
  valor_convertido <- converter_para_dolar(valor_em_reais, taxa_de_cambio)
  escreva("O valor em dólares é: ", valor_convertido)

fimalgoritmo
1 resposta
solução!

Olá, Lucas. Como vai?

Parabéns pela resolução do desafio! Você estruturou muito bem a lógica do pensamento computacional utilizando o VisuAlg (Portugal). A separação do código criando uma função dedicada para o cálculo da conversão é uma excelente prática de programação, pois deixa o algoritmo modular e fácil de ler.

No entanto, o seu código possui um pequeno detalhe de sintaxe e escopo que pode gerar um erro de execução ou um resultado inesperado na hora de rodar. Vamos analisar juntos para corrigir!


O que precisa ser corrigido?

O problema está na variável resultado dentro da sua função converter_para_dolar.

  1. Variável global duplicada: Você declarou resultado: real na seção de variáveis globais do algoritmo principal (var), mas não a declarou como variável local dentro da função.
  2. O caminho do se inválido: Caso o usuário digite uma taxa menor ou igual a zero, o programa imprimirá "Valor inválido", mas a execução continuará e a função tentará retornar a variável resultado. Como nesse caminho (o do se) a variável não recebeu nenhum valor, ela retornará zero ou um valor indefinido.

Código Corrigido e Otimizado

Podemos resolver isso declarando a variável local dentro da função e garantindo que o programa não quebre caso a taxa seja inválida. Veja a estrutura correta:

algoritmo "Conversor de moedas"

funcao converter_para_dolar(valor: real, taxa: real): real
var
  // Declarando a variável local da função
  resultado_local: real
inicio
  se taxa <= 0 entao 
    escreval("Taxa de câmbio inválida! Não pode ser menor ou igual a zero.")
    resultado_local <- 0
  senao
    resultado_local <- valor / taxa
  fimse
  
  retorne resultado_local
fimfuncao

var
  valor_em_reais, taxa_de_cambio, valor_convertido: real

inicio
  escreva("Digite o valor em reais (R$): ")
  leia(valor_em_reais)
  
  escreva("Digite a taxa de câmbio atual (ex: 5.15): ")
  leia(taxa_de_cambio)
  
  valor_convertido <- converter_para_dolar(valor_em_reais, taxa_de_cambio)
  
  // Condicional na saída para exibir o resultado apenas se a conversão deu certo
  se taxa_de_cambio > 0 entao
    escreva("O valor convertido em dólares é: U$ ", valor_convertido)
  fimse

fimalgoritmo

O que mudou?

  • Escopo Local: Criamos a variável resultado_local dentro da própria função. Isso impede que a função misture dados com o programa principal.
  • Segurança: Se a taxa for zero ou negativa, definimos o retorno como 0 e tratamos o visual do programa no bloco principal para que ele não mostre uma mensagem de conversão confusa para o usuário.

Continue aplicando essa lógica e testando condições excepcionais (como divisões por zero). Esse tipo de atenção diferencia bons programadores!

Espero que possa ter lhe ajudado!