Ir ao conteúdo

Posts recomendados

Postado

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
  • Membro VIP
Postado

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.

  • Membro VIP
Postado

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


 

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