Ir ao conteúdo
  • Cadastre-se

VisualG cod com algoritmos para iniciantes - procedimento


Posts recomendados

Boa noite, estou fazendo um cursotécnico de algoritmo no site cursoemvideo, estou na AULA 12, onde fala sobre PROCEDIMENTO, no entanto, não estou conseguido executar o algoritmo abaixo, alguém pode me informar onde está o erro?

Algoritmo "semnome"


Var
   ANOA, ANON, IDADE :inteiro

Procedimento IDADE(A,B:inteiro)
inicio
      IDADE <-(A-B)
      Se (IDADE>=18)então
         Escreval ("IDADE: ", IDADE," ANOS")
         Escreval ("APTO A DIRIGIR")
      senao
           Escreval ("IDADE: ", IDADE," ANOS")
           Escreval ("NÃO ESTÁ APTO A DIRIGIR")
      FimSe
FimProcedimento
Inicio
      Escreval ("------------------------")
      Escreval ("DEPARTAMENTO DE TRANSITO")
      Escreval ("------------------------")
      Escreva ("ANO ATUAL (yyyy): ")
      Leia (ANOA)
      Escreva ("ANO DE NASCIMENTO (yyyy): ")
      Leia (ANON)
      Escreval ("----------STATUS-------")
      IDADE (ANOA,ANON)
      
Fimalgoritmo

image.png

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

  • Membro VIP

Olá, @Eduardo2022.

 

9 horas atrás, Eduardo2022 disse:

alguém pode me informar onde está o erro?

 

Basicamente está utilizando a nomenclatura idade tanto para uma variável, tanto para o procedimento. Não pode ser igual, pois estão no mesmo escopo e o VisualG não sabe diferenciar uma da outras. Mude uma delas. Exemplo:

 

algoritmo "Calculadora de idade"

procedimento calcularIdade (anoAtual, anoNascimento : inteiro)
var
   idade : inteiro
inicio
   idade <- anoAtual-anoNascimento

   escrevaL()
   escrevaL("IDADE: ", idade:1," ANOS")
   se (idade >= 18) então
      escrevaL("APTO A DIRIGIR")
   senao
      escrevaL("NÃO ESTÁ APTO A DIRIGIR")
   fimSe
fimProcedimento

var
   anoAtual, anoNascimento :inteiro

inicio
   escrevaL("------------------------")
   escrevaL("DEPARTAMENTO DE TRANSITO")
   escrevaL("------------------------")
   escreva ("ANO ATUAL (yyyy): ")
   leia (anoAtual)
   escreva ("ANO DE NASCIMENTO (yyyy): ")
   Leia (anoNascimento)
   escrevaL("----------STATUS-------")
   calcularIdade(anoAtual, anoNascimento)
fimAlgoritmo


Adendo 1: propositalmente eu deixe os mesmo nomes nas variáveis (anoAtual e anoNascmento) globais, e nas variáveis locais, lá do procedimento. Entenda de antemão que são variáveis distintas!!! Nesse caso é permitido utilizar nomenclaturas iguais (são escopos diferentes... 2 são globais, 2 são locais). Já no outro caso, tanto a variável, tanto o procedimento são globais, daí dá conflito, ou seja, como o programa vai saber qual é qual?)

 

Adendo 2: "Ah! Mas para a, por exemplo, variável anoAtual, como o VisualG vai saber qual utilizar já que tem duas com a mesma nomenclatura?". É simples: no escopo global, vai utilizar a variável global, já que as variáveis locais NÃO são enxergadas globalmente (fora do procedimento só existe uma variável mesmo)... e dentro do procedimento vai enxergar o local e global??? Vai utilizar apenas a local mesmo (que está "mais perto"). No VisualG não é possível diferenciar uma da outro (limitação da linguagem -  em linguagens mais novas/populares, dá de boa... mas não vem ao caso agora).

 

Adendo 3: só para exemplificar, poderia fazer assim:
 

procedimento calcularIdade (a, b : inteiro)
var
   idade : inteiro
inicio
   idade <- a-b

   escrevaL()
   escrevaL("IDADE: ", idade:1," ANOS")
   se (idade >= 18) então
      escrevaL("APTO A DIRIGIR")
   senao
      escrevaL("NÃO ESTÁ APTO A DIRIGIR")
   fimSe
fimProcedimento


Vai funcionar exatamente da mesma forma. Beleza? Tanto utilizar a, quanto utilizar anoAtual, o VisualG vai criar OUTRA variável especificamente para o procedimento... 

 

Adendo 4: Ah! evite utilizar variáveis globais diretamente nos procedimentos. O ideal é passar os valores por parâmetro. Como assim? Veja, poderia fazer assim:

 

algoritmo "Calculadora de idade"

procedimento calcularIdade()
var
   idade : inteiro
inicio
   idade <- anoAtual-anoNascimento

   escrevaL()
   escrevaL("IDADE: ", idade:1," ANOS")
   se (idade >= 18) então
      escrevaL("APTO A DIRIGIR")
   senao
      escrevaL("NÃO ESTÁ APTO A DIRIGIR")
   fimSe
fimProcedimento

var
   anoAtual, anoNascimento :inteiro

inicio
   escrevaL("------------------------")
   escrevaL("DEPARTAMENTO DE TRANSITO")
   escrevaL("------------------------")
   escreva ("ANO ATUAL (yyyy): ")
   leia (anoAtual)
   escreva ("ANO DE NASCIMENTO (yyyy): ")
   Leia (anoNascimento)
   escrevaL("----------STATUS-------")
   calcularIdade()
fimAlgoritmo

 

A variável idade poderia ser global também que iria funcionar... esqueci de tirar... deixo aí como exemplo mesmo...

Mas observe que o procedimento está utilizando duas variáveis globais... isso não é desejável...   Não é proibiiiido, mas tende a trazer problemas e não é uma boa prática!!! Veja também que a variável idade NÃO poderia ser utilizada lá como está no teu código original... ou seja: porque passou os anos por parâmetro e idade usou global? Entende? Precisaria manter a coerência... ou declarar a variável dentro procedimento, assim como fiz acima, ou usar tudo como global mesmo...
 

Qualquer dúvida é só perguntar.

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Um exemplo utilizando funções:

 

algoritmo "Calculadora de idade"

funcao RetornarIdade (anoAtual, anoNascimento : inteiro) : inteiro
inicio
   se (anoAtual < anoNascimento) então
      escreval("Ano atual não pode ser menor que o ano de nascimento!")
      retorne -1
   senao
      retorne anoAtual-anoNascimento
   fimSe

fimFuncao

procedimento VerificarAptoADirigir (anoAtual, anoNascimento : inteiro)
var
   idade : inteiro
inicio
   idade <- RetornarIdade(anoAtual, anoNascimento)

   escrevaL()
   se (idade <> -1) então
      escrevaL("IDADE: ", idade:1," ANOS")
      se (idade >= 18) então
         escrevaL("APTO A DIRIGIR")
      senao
         escrevaL("NÃO ESTÁ APTO A DIRIGIR")
      fimSe
   fimSe
fimProcedimento

var
   anoAtual, anoNascimento :inteiro

inicio
   escrevaL("------------------------")
   escrevaL("DEPARTAMENTO DE TRANSITO")
   escrevaL("------------------------")
   escreva ("ANO ATUAL (yyyy): ")
   leia (anoAtual)
   escreva ("ANO DE NASCIMENTO (yyyy): ")
   Leia (anoNascimento)
   escrevaL("----------STATUS-------")
   VerificarAptoADirigir(anoAtual, anoNascimento)
fimAlgoritmo


 

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

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!