Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Ankur Prem

[Resolvido] Problema com algoritmo no VisuAlg

Recommended Posts

Olá galera,

 

Estou inserindo um algoritmo no VisuAlg que me parece realmente certo, contudo o programa não roda da forma esperada.

 

 

Segue o enunciado do problema:

 

Dados 3 valores A, B e C, verificar se eles podem ser os comprimentos dos lados de um triângulo e, se forem, verificar se compõem um triângulo eqüilátero, isósceles ou escaleno. Informar se não compuserem nenhum triângulo.

O que é um triângulo?

R: Figura geométrica de 3 lados, onde cada um é menor do que a soma dos outros dois

O que é um triângulo eqüilátero? R. Um triângulo com 3 lados iguais.

O que é um triângulo isóscele? R. Um triângulo com 2 lados iguais.

O que é um triângulo escaleno? Um triângulo com todos os lados diferentes.

 

 

Agora, o algoritmo que elaborei:

 

algoritmo "semnome"
//Dados 3 valores A, B e C, verificar se eles podem ser os comprimentos dos
//lados de um triângulo e, se forem, verificar se compõem um triângulo
//eqüilátero, isósceles ou escaleno. Informar se não compuserem nenhum
//triângulo.
var
l1, l2, l3: real
validade: logico
inicio
escreva ("Insira o lado 1 do triângulo: ")
leia (l1)
escreva ("Insira o lado 2 do triângulo: ")
leia (l2)
escreva ("Insira o lado 3 do triângulo: ")
leia (l3)

se (l1 < (l2 + l3)) e (l2 < (l1 + l3)) e (l3 < (l1 + l2)) entao
  validade <- VERDADEIRO
senao
  validade <- FALSO
fimse

se (validade = VERDADEIRO) entao
  se (l1 = l2) e (l1 = l3) e (l2 = l3) entao
     escreva ("Triângulo equilátero")
  fimse
  se (l1 <> l2) xou (l1 <> l3) xou (l2 <> l3) entao
     escreva ("Triângulo isóceles")
  fimse
  se (l1 <> l2) e (l1 <> l3) e (l2 <> l3) entao
     escreva ("Triângulo escaleno")
  fimse
senao
  escreva ("Não é um triângulo")
fimse

fimalgoritmo

 

 

O que acontece:

- se as medidas não formam um triângulo, ok, a mensagem correta é retornada.

- se é um triângulo equilátero, também ok, a mensagem correta é retornada.

- se é um triângulo isóceles, nada aparece!

- se é um triângulo escaleno, aparece as mensagens tanto do isóceles como do escaleno.

 

E ai meus caros, o que acham? Pra mim o algoritmo está ok!

Compartilhar este post


Link para o post
Compartilhar em outros sites

O principal erro é que você colocou as condições do triângulo isósceles tendo que ser 2 lados diferentes, sendo que são 2 lado iguais. Eu nunca usei esse VisuAlg, mas testando aqui vi que o xou não está servindo de nada, porque a função dele deveria só fazer o que está dentro do "se" se apenas UMA das condições fosse verdadeira (pelo menos é o que eu sei), mas ele está funcionando da mesma forma que o ou, quando pode ser de uma a todas as condições verdadeiras. Modificando essa condição do triângulo vai ficar bem grande, mas só assim é garantido que só vai funcionar se for isósceles.

 

algoritmo "semnome"

//Dados 3 valores A, B e C, verificar se eles podem ser os comprimentos dos

//lados de um triângulo e, se forem, verificar se compõem um triângulo

//eqüilátero, isósceles ou escaleno. Informar se não compuserem nenhum

//triângulo.

var

l1, l2, l3: real

validade: logico

inicio

escreva ("Insira o lado 1 do triângulo: ")

leia (l1)

escreva ("Insira o lado 2 do triângulo: ")

leia (l2)

escreva ("Insira o lado 3 do triângulo: ")

leia (l3)

 

se (l1 < (l2 + l3)) e (l2 < (l1 + l3)) e (l3 < (l1 + l2)) entao

validade <- VERDADEIRO

senao

validade <- FALSO

fimse

 

se (validade = VERDADEIRO) entao

se (l1 = l2) e (l1 = l3) e (l2 = l3) entao

escreva ("Triângulo equilátero")

fimse

se ( (l1 = l2 ) e (l3 <> l1) e (l3 <> l2) ) ou ( (l1 = l3) e (l2 <> l1) e (l2 <> l3) ) ou ( (l2 = l3) e (l1 <> l2) e (l3 <> l2) ) entao

escreva ("Triângulo isóceles")

fimse

se (l1 <> l2) e (l1 <> l3) e (l2 <> l3) entao

escreva ("Triângulo escaleno")

fimse

senao

escreva ("Não é um triângulo")

fimse

 

fimalgoritmo

 

 

Se não for assim, se o triângulo for equilátero, ele vai também dizer que é isósceles, porque as 3 condições são verdadeiras. Se com você o xou funciona, simplesmente use o seu código mesmo, trocando os "<>" por "=".

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Alexandre.

 

O seu algoritmo faz bastante sentido, mas acho que algoritmicamente está igual ao meu (a não ser que eu eu esteja confundindo alguma coisa), pois veja o seguinte:

 

Para ser isóceles, apenas um lado pode ser diferente. Ok.

 

O XOU permite que apenas uma das proposições possa ser verdadeira, senão ele retorna falso.

 

Sendo assim, se eu colocar que se apenas (xou) um dos lados é diferente, é isóceles, ele deveria retornar como verdadeiro. Ou seja: se l1 é diferente de l2, (x)OU l1 é diferente de l3, (x)OU l2 é diferente de l3, então...

 

Isso tudo com o condicional xou denotanto a exclusão dos demais... ou seja, se tiverem 2 dessas afirmações corretas, o resultado deveria ser falso para a condição... o que não imprimiria o isóceles. Para essa condição retornar verdadeira, apenas uma proposição pode ser verdadeira, ou seja, apenas um lado pode ser diferente (o que resulta em isóceles).

 

Não está certo esse raciocínio?

 

Eu pensei em fazer desta forma justamente para encurtar o algoritmo que você postou, que também está correto eu meu ver.

 

Alguma idéia ou correção?

 

E obrigado pela resposta!

 

Se não for assim, se o triângulo for equilátero, ele vai também dizer que é isósceles, porque as 3 condições são verdadeiras.

 

Adendum: no caso de equilátero ele responde ok. o problema é quando é escaleno, ai ele fala que é tanto escaleno como isóceles, o que não faz sentido pois no escaleno todos são diferentes (e aí só se eu tivesse usado o ou comum... aí sim ele poderia retornar esse resultado, já que o escaleno tem, realmente, ao menos um dos lados diferentes (os 3 na verdade).

Compartilhar este post


Link para o post
Compartilhar em outros sites

Realmente seu raciocínio está certo, é que eu respondi já meio com sono e nem observei. Na verdade o que parece é que o xou desse VisuAlg não funciona, mas seu código realmente também está certo. O "xou" está agindo como um "ou" normal.

 

Adendum: no caso de equilátero ele responde ok. o problema é quando é escaleno, ai ele fala que é tanto escaleno como isóceles, o que não faz sentido pois no escaleno todos são diferentes (e aí só se eu tivesse usado o ou comum... aí sim ele poderia retornar esse resultado, já que o escaleno tem, realmente, ao menos um dos lados diferentes (os 3 na verdade).

 

Sim, com esse "xou" que não funciona, se você usar as condições do isósceles como =, quando for equilátero ele também vai dizer que é isósceles porque agindo como "ou" as outras condições também são verdadeiras e ele aceita, e se as condições forem <>, quando for escaleno ele também vai dizer que é isósceles pelo mesmo motivo. O problema não está no seu código, está no compilador.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Alexandre,

 

Poxa, que estranho hein... porque eu peguei a referência ao xou no próprio manual do programa :-T vou dar uma pesquisada e se for o caso vou entrar em contato com o suporte.

 

Mas que bom que o problema não está no algoritmo... pois corrigir uma informação no cérebro pode ser mais difícil do que no software! rs

 

Obrigado pela atenção meu caro!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Caso resolvido!

 

O problema é realmente do algoritmo...

 

Vejam:

 

No caso de um triângulo isóceles, aonde...

 

l1=5

l2=5

l3=3

 

... não somente o l1 é diferente do l3, mas o l2 também é diferente do l3!

 

Como o XOU é excludente, ele retorna como FALSO ao encontrar duas proposições verdadeiras.

 

O erro é de lógica: apenas um dos lados é diferente, mas ele é diferente dos outros dois lados!

 

Ah, e quem se interessar pela solução:

 

algoritmo "semnome"
//Dados 3 valores A, B e C, verificar se eles podem ser os comprimentos dos
//lados de um triângulo e, se forem, verificar se compõem um triângulo
//eqüilátero, isósceles ou escaleno. Informar se não compuserem nenhum
//triângulo.
var
l1, l2, l3: real
validade: logico
inicio
escreva ("Insira o lado 1 do triângulo: ")
leia (l1)
escreva ("Insira o lado 2 do triângulo: ")
leia (l2)
escreva ("Insira o lado 3 do triângulo: ")
leia (l3)

se (l1 < (l2 + l3)) e (l2 < (l1 + l3)) e (l3 < (l1 + l2)) entao
  validade <- VERDADEIRO
senao
  validade <- FALSO
fimse

se (validade = VERDADEIRO) entao
  se (l1 = l2) e (l1 = l3) e (l2 = l3) entao
     escreva ("Triângulo equilátero")
  fimse
  se ((l1 = l2) e (l1 <> l3)) xou ((l1 = l3) e (l1 <> l2)) xou ((l2 = l3) e (l2 <> l1)) entao
     escreva ("Triângulo isóceles")
  fimse
  se (l1 <> l2) e (l1 <> l3) e (l2 <> l3) entao
     escreva ("Triângulo escaleno")
  fimse
senao
  escreva ("Não é um triângulo")
fimse

fimalgoritmo

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.