Jump to content
pr0zin

Verificar se 3 números constituem triângulo

Recommended Posts

pr0zin

Bons dias, eu tenho uma duvida num exercicio(estou a iniciar a programaçao em haskell)

O que eu pretendia era verificar se 3 numeros constituem um triangulo.

em C isto era muito facil, mas em haskell eu nao sei muito bem como isto funciona.

Podem me ajudar/corrigir?

Bool :: triangulo a b c = if ((a + b) > c) || (a + c) > b) || (b + c) > a)) return True; else return False;

Edited by Baderous

Share this post


Link to post
Share on other sites
brunoais

Podem me ajudar/corrigir?

Bool :: triangulo a b c = if ((a + b) > c) || (a + c) > b) || (b + c) > a)) return True; else return False;

Acho que seria algo mais... (não testado)

triangulo a b c = if ((a + b) > c) || (a + c) > b) || (b + c) > a)) then True else False


"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Share this post


Link to post
Share on other sites
pr0zin

ja consegui resolver!

triangulo :: Int -> Int -> Int -> Bool
triangulo a b c = if(a + b)>c then True
                   else if(a + c)>b then True
                   else if(b + c)>a then True
                   else False

obrigado :P

Edited by thoga31
GeSHi

Share this post


Link to post
Share on other sites
thoga31

Atenção! Convém referir isto: o return do Haskell não tem o mesmo significado que o return de outras LP's, como C! O return do Haskell é utilizado para outros fins totalmente distintos.

Para este caso, eu recomendo o uso de guards, fica muito mais legível ;)

triangulo :: (Num a, Ord a) => a -> a -> a -> Bool
triangulo a b c | (a + b) > c = True
               | (a + c) > b = True
               | (b + c) > a = True
               | otherwise   = False

Também alterei o tipo de dados de entrada de modo à função ter um alcance a mais tipos de dados, neste caso que são numéricos e "comparáveis pela ordem".

Agora uma outra questão: isto é suposto fornecer 3 números e verificar se eles constituem os lados de um triângulo? É que se for isso, estas condições são insuficientes.

Cumprimentos.


Knowledge is free!

Share this post


Link to post
Share on other sites
pwseo

Se calhar para quem está a começar é melhor utilizar tipos de dados concretos (ex.: Integer), porque nem sempre estamos completamente a par de todas as type classes necessárias para o que queremos fazer. Uma boa solução é deixar o Haskell inferir o tipo de dados e depois usarmos isso como base para uma assinatura mais específica.

A tua solução falha porque estás a utilizar o operador ou (||) em vez do e (&&).

Aqui ficam soluções com piada (sem corrigir directamente o código do OP):

import Data.List (permutations)

-- 'dt' vem de "desigualdade triangular"
dt a b c = and $ map (\[a,b,c] -> a + b > c) (permutations [a,b,c])

-- outra solução, sem 'permutations'
dt a b c = and [ a + b > c, a + c > b, b + c > a ]

Em ambos os casos, o tipo de dados inferido pelo compilador é dt :: (Num a, Ord a) => a -> a -> a -> Bool, mas poderíamos utilizar uma assinatura mais específica como dt :: Int -> Int -> Int -> Bool ou então dt :: Integer -> Integer -> Integer -> Bool.

A vantagem de utilizar a assinatura geral (ou deixar o compilador inferir o tipo de dados) é que podemos utilizar a função com outros tipos de dados, como já foi referido pelo thoga31.

Edited by pwseo

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.