Ir para o conteúdo
pr0zin

Verificar se 3 números constituem triângulo

Mensagens Recomendadas

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;

Editado por Baderous

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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%.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Editado por thoga31
GeSHi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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! | Occasional Fortnite player

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Editado por pwseo

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.