Ankur Prem 0 Denunciar post Postado Novembro 14, 2012 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
AlexandreMota 22 Denunciar post Postado Novembro 15, 2012 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
Ankur Prem 0 Denunciar post Postado Novembro 15, 2012 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
AlexandreMota 22 Denunciar post Postado Novembro 15, 2012 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
Ankur Prem 0 Denunciar post Postado Novembro 15, 2012 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
Ankur Prem 0 Denunciar post Postado Novembro 16, 2012 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