Ir ao conteúdo
  • Cadastre-se

VisualG Bug de resposta triplicada


Posts recomendados

Boa tarde rapeize
Sou iniciante na grande área da programação, começando fazer ADS.
Estou tentando fazer um programa pra calcular o IMC(índice de massa corporal)
Mas quando eu boto o ultimo comando, a resposta é triplicada

Se tiver uma forma mais fácil de fazer as condições também, mandem ai 
Desde já, agradeço a atenção!

erro triplicado.jpg

erro triplicado 0.jpg

erro triplicado 2.jpg

Link para o comentário
Compartilhar em outros sites

Algoritmo "medidor_de_IMC"
Var
   imc, p, a: real
   imcint: inteiro

Inicio
   escreva("Digïte sua altura em centimetros(cm)")
   leia (a)
   escreva("Digite seu peso em kilogramas(kg)")
   leia (p)
   imc <- p/(a^2)
   imcint <- int(imc)

   se imc > 40  entao
      escreva("Seu IMC é de "),imcint,("consta que você está no nível obesidade morbida")
   fimse
          
   se imc > 30 entao
      escreva("Seu IMC é de:",imcint," você está no nível de obeso")
   fimse
                  
   se imc > 25 entao
      escreva("Seu IMC é de:",imcint," você está com sobrepeso")
   fimse
                     
   se imc > 20 entao
      escreva("Seu IMC é de:",imcint," você está normal")
   fimse
   se imc > 16 entao
      escreva("Seu IMC é de:",imcint," você está com subpeso")
   fimse

   se imc > 0 entao
      escreva("Seu IMC é :",imcint," você está com subpeso severo")
   fimse
   
fimAlgoritmo

 

Link para o comentário
Compartilhar em outros sites

  • Membro VIP
3 horas atrás, Iago Anjos disse:

Mas quando eu boto o ultimo comando, a resposta é triplicada

 

Nops! Não houve triplicações, pois as respostas não são iguais. Apenas o IMC resultante foi válido para 3 condições lá nos se.

 

Pense assim: o VisualG não sabe do que se trata o programa... ele apenas vai executando linha a linha... da esquerda para direita, de cima para baixo.

 

No caso, para cada se ele vai verificar se a expressão resulta em verdadeiro.. no exemplo do IMC dando 21, as três primeiras vão resultar em falso (o IMC não é o maior que o valor comparado), logo não exibindo a resposta que está dentro. Já as três últimas vão resultar em verdade, logo exibindo a resposta de cada um. Se fosse 35, apenas o primeiro vai ser falso, e o resto vai ser verdadeiro. Se for algum IMC maior que 40, todas as respostas vão ser exibidas! Etc.

 

 

Dê uma pesquisa sobre "Operadores Lógicos no VisualG". Veja exemplos... você vai entender o que está acontecendo e o que falta fazer para corrigir o teu código.

 

 

No aguardo.

Link para o comentário
Compartilhar em outros sites

Certo mano, vou dar uma olhada. Se eu não conseguir posso voltar pra esse tópico?

Obrigado!

adicionado 4 minutos depois

Eu tava tentando fazer, mas tava dando errado.

No caso aqui, eu tenho q criar uma variavel logica? pra calcular se eh verdadeiro e a partir dai fazer o algoritmo?

logico.jpg

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Oi.

 

1 hora atrás, Iago Anjos disse:

No caso aqui, eu tenho q criar uma variavel logica? pra calcular se eh verdadeiro e a partir dai fazer o algoritmo?

 

Não, o código (imagem) que você postou seria apenas um exemplo de demonstração de como funciona os operadores citados (E, OU e NÃO). Veja meu complemento abaixo, depois dê novas pesquisas. Se aprofunde no entendimento dessa questão. Será útil não só para esse tema em si, mas para ideia de entender temas em si... ou seja: aprender a aprender.

 

 

 

 

A solução é relativamente bem simples. Mas a ideia é que acostume a entender os problemas, interpretar as orientações (que nem sempre serão tão boas, como as minhas) e vestir a "roupa de sapo". Vá treinando a capacidade de interpretação (dos problemas, e das orientações, rs).

 

 

Vamos lá... nos baseamos nesse trecho:

 

20 horas atrás, Iago Anjos disse:

   se imc > 25 entao
      escreva("Seu IMC é de:",imcint," você está com sobrepeso")
   fimse
                     
   se imc > 20 entao
      escreva("Seu IMC é de:",imcint," você está normal")
   fimse
     
   se imc > 16 entao
      escreva("Seu IMC é de:",imcint," você está com subpeso")
   fimse

 

Temos 3 estruturas de seleções ("3 se"). Um se basicamente vai verificar se a sentença que está entre o se e o entao resulta em verdadeiro ou não. Não importa o que significa para o contexto... ou que tem lá! SEMPRE vai resultar em VERDADEIRO ou FALSO. Se for verdadeiro, vai executar o que vem depois até encontrar o fimSe. Caso seja falso, vai para próximo linha após o fimSe. Até aqui tudo normal, né?

 

Então, se o IMC deu 21 (não importa o cálculo em si, apenas que o valor a ser comparado é esse), o VisualG vai calcular:

 

- "21 é maior que 25?". Não, logo vai pular para o fim desse se;

- "21 é maior que 20?". É, logo vai executar o que está dentro desse se;

- "21 é maior que 16?". É, logo vai executar o que está dentro desse se;

 

Entende? Desses 3 trechos, 2 foram verdadeiros. Isso vale para cada um dos se. Todos que forem verdadeiro, vai executar o que está dentro... é isso que está lá no código!

 

 

Lembre-se: o VisualG vai executando da esquerda para direita, de cima para baixo. De um modo geral, ele vai apenas fazer o que está escrito lá.

 

 

Daí, um possível problema estaria nas condições desses se... as "perguntas" que estão sendo feitas não estão satisfazendo o que você precisa!!! É preciso assimilar que o computador não entende contexto, entende apenas instruções! Ele não faz ideia o que é IMC... você poderia chamar de banana ou fahfaraegre e o programa se comportaria exatamente da mesma forma.

 

 

"Vamos a parte que interessa":

 

Em vez de:

21 horas atrás, Iago Anjos disse:

   se imc > 30 entao
      escreva("Seu IMC é de:",imcint," você está no nível de obeso")
   fimse

 

Faria algo como:

 

   se (imc <=30) E (imc > 25) entao
      escreva("Seu IMC é de:",imcint," você está com sobrepeso")
   fimse

 

Observe que além do "operador lógico E", precisou-se inserir uns "()". Isso é apenas para não bugar o VisualG. Faz parte da sintaxe do contexto...

 

Ou poderia ficar assim:

   se ((imc <=30) E (imc > 25)) entao
      escreva("Seu IMC é de:",imcint," você está com sobrepeso")
   fimse

 

Dá na mesma. Em outras linguagem é mais comum (senão obrigatório) ter esses parênteses mais externos.

 

Ou seja: não basta ser maior que 25, tem que ser também menor ou igual a 30. Sacou? A condição precisa ser restrita ao caso. Para 40, não importa o valor máximo, apenas se é maior que 40.

 

 

É basicamente isso! Basta fazer o mesmo para todas as sentenças. (Da segunda em diante, é claro).

 

Tente aí.

 

ADENDO: lembre-se de posta o texto do código, em vez de uma imagem.

 

ADENDO 2: após conseguir implementar, pesquise novamente sobre "Operadores lógicos". Entenda o que significa e reforce esse entendimento. 

 

Qualquer dúvidas é só postar.

 

  • 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!