Ir ao conteúdo
  • Cadastre-se

VisualG Função no VisualG retornando opção não escolhida


Ir à solução Resolvido por Simon Viegas,

Posts recomendados

Olá a todos, estou testando uma função de calculadora no VisualG, e está me retornando o outrocaso, mesmo que digite os números das opções corretas(1,2,3 ou 4). O código está assim:

algoritmo "semnome"
funcao calc(): inteiro
   var
   n1,n2:real
   res:inteiro
   opcao:caracter
   
   inicio
   
   escolha opcao
   
      caso "1"
      res <- n1 + n2
      
      caso "2"
      res <- n1 / n2
      
      caso "3"
      res <- n1 * n2
      
      caso "4"
      res <- n1 - n2
      
      outrocaso
      escreval("Opção inválida")
      
   fimescolha
   
   retorne res

fimfuncao

var
n1,n2:real
opcao:caracter
resultado:inteiro
inicio
   escreval("Digite um número")
   leia(n1)

   escreval("Digite outro número")
   leia(n2)

   escreval("Escolha uma opção: ")
   escreval("1 - somar")
   escreval("2 - dividir")
   escreval("3 - multiplicar")
   escreval("4 - subtrair")
   leia(opcao)
   
   resultado <- calc()
   
   escreval(resultado)
fimalgoritmo

Obrigado pela atenção, gostaria de saber o que há de errado.

erro visualg.JPG

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Membro VIP
  • Solução

@qwerty78987, temos 2 probleminhas relacionados ao gerenciamento de escopo de variáveis:

  • dupla declaração de variáveis "iguais";
  • não passagem de valores por parâmetros.

 

Você declarou a variável opcao duas vezes. Uma com escopo global, e outra dentro da função, que tem escopo local... são variáveis distintas!!!. Daí, você leu o valor na variável de escopo global, mas a função está utilizando a variável de escopo local.... (Como as variáveis com o mesmo nome, o VisualG escolhe o que está "mais próximo", que é o local.)

 

Obs.: outro problema é que está utilizando valores inteiro, mas deveriam ser reais. Já inseri uma sugestão de correção:

 

SOLUÇÃO 1:
Simplesmente apague as variáveis locais da função.

 

algoritmo "Minha Calculadora"

funcao calc(): real
var
   res: real
inicio
   escolha opcao
   caso "1"
      res <- n1 + n2
   caso "2"
      res <- n1 / n2
   caso "3"
      res <- n1 * n2
   caso "4"
      res <- n1 - n2
   outroCaso
      escreval("Opção inválida")
   fimEscolha
   
   retorne res
fimFuncao

var
   n1, n2: real
   opcao: caracter
   resultado: real
inicio
   escreval("Digite um número")
   leia(n1)
   escreval("Digite outro número")
   leia(n2)
   escreval("Escolha uma opção: ")
   escreval("1 - somar")
   escreval("2 - dividir")
   escreval("3 - multiplicar")
   escreval("4 - subtrair")
   leia(opcao)

   resultado <- calc()

   escreval(resultado)
fimAlgoritmo

 

 

 

SOLUÇÃO 2:

Passando os valores por parâmetros:
 

algoritmo "Minha Calculadora"

funcao calc(n1, n2: real; op:caractere): real
var
   res: real
inicio
   escolha op
   caso "1"
      res <- n1 + n2
   caso "2"
      res <- n1 / n2
   caso "3"
      res <- n1 * n2
   caso "4"
      res <- n1 - n2
   outroCaso
      escreval("Opção inválida")
   fimEscolha

   retorne res
fimFuncao

var
   n1, n2: real
   opcao: caracter
   resultado: real
inicio
   escreval("Digite um número")
   leia(n1)
   escreval("Digite outro número")
   leia(n2)
   escreval("Escolha uma opção: ")
   escreval("1 - somar")
   escreval("2 - dividir")
   escreval("3 - multiplicar")
   escreval("4 - subtrair")
   leia(opcao)

   resultado <- calc(n1, n2, opcao)

   escreval(resultado)
fimAlgoritmo

 

 

ADENDO:

Entenda que as variáveis ali nos parâmetros da função são diferentes das variáveis globais. É fácil entender que op não é igual a opcao, certo? Dá mesma forma as variáveis n1 e n2 são distintas das que estão no escopo global... apenas deixei com o mesmo nome. Daí, ao chamar a função e passar os valores pelos parâmetros, o VisualG vai copiar cada um dos valores que foi enviado e jogar nas variáveis correspondentes que estão na função...

 

A diferença desse segundo código para o teu código postado, é que o valor da variável global está sendo repassado para as variáveis locais. No teu código, as variáveis locais estão "vazias", sacou? Essa é a maneira mais clássica de usar funções... resumidamente funciona assim: tudo que é usado numa função, "deve" ser criado dentro da função ou passado por parâmetro, ou seja: devem-se evitar uso de variáveis globais diretamente na função.

 

RESUMINDO:

O primeiro código que postei funciona e é mais simples. Não tem problema utilizar assim nesse momento.

O segundo código é mais elegante e desejável. É a forma que dá mais segurança e flexibilidade para função.

 

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!