Guest id194 Posted October 28, 2006 at 04:13 PM Report Share #60580 Posted October 28, 2006 at 04:13 PM Em determinado exercício tenho o seguinte definido: type Aluno = (Int, String, Float) -- Nº Aluno, Nome, Nota type Curso = [Aluno] listaAlunos :: Curso listaAlunos = [(1234, "Jose Azevedo", 13.2), (2345, "Carlos Lopes", 9.7), (3456, "Rosa Mota", 17.9)] O objectivo é calcular a média das notas deste 3 alunos. Eu fiz da seguinte forma: mediaNotas :: Curso -> Float mediaNotas [] = 0 mediaNotas (x) = (somaNotas x)/3 somaNotas :: Curso -> Float somaNotas [] = 0 somaNotas ((_,_,x):xs) = x + (somaNotas xs) As minhas dúvidas/problemas: a) No caso de eu modificar listaAlunos removendo ou adicionando alunos, terei de mudar o cálculo da média, alterando o 3 para o número total de alunos. Como é que é possível eu saber este número automaticamente no caso de ter uma lista de alunos dinâmica em que eu esteja constantemente a adicionar/remover alunos? 😄 É possível fazer o calcula da média de algo (como no exemplo que eu dei) sem usar uma função auxiliar como a somaNotas? Ou tenho mesmo de ter smpre uma função auxiliar que vai somar as notas todas e só depois dividir pelo total noutra função? É que eu tentei na função de somar, englobar o "x + (somaNotas xs)" dentro () e dps / 3, mas o resultado não era o mesmo, não é suposto? A mim parece-me que ele vai somar tudo primeiro, chamado a função recursivamente e, só no fim é que divide por 3. Não funciona, mas não devia? Não tem lógica? Link to comment Share on other sites More sharing options...
Rui Carlos Posted October 28, 2006 at 06:59 PM Report Share #60604 Posted October 28, 2006 at 06:59 PM a) media :: [(Int,String,Float)]->Float media l=(sum (map (\(_,_,n)->n) l))/(lenght l) pegas na lista de alunos, através de um 'map' retiras a nota de cada aluno (eu recorri a funções lambda mas podes usar uma função auxiliar), soma todas as notas ('sum') e divide pelo comprimento da lista. 😄 não percebi muito bem o que queres dizer, coloca aqui a outra versão da função e posso tentar ver qual é o problema. Rui Carlos Gonçalves Link to comment Share on other sites More sharing options...
Guest id194 Posted October 28, 2006 at 07:12 PM Report Share #60609 Posted October 28, 2006 at 07:12 PM a) mas eu ainda não dei o map nem funções lambda e não queria estar a usar isso sem ter dado... uma função auxiliar foi o que eu usei como podes ver no tópico inicial. eu tentei usar o length na meu código mas deu-me erros, não devo tar aplicar isso correctamente... 😄 o que eu tentei fazer foi isto: media :: Curso -> Float media [] = 0 media ((_,_,x):xs) = (x + (media xs))/3 mas os calculos não foram feitos correctamente... Link to comment Share on other sites More sharing options...
Rui Carlos Posted October 28, 2006 at 07:22 PM Report Share #60611 Posted October 28, 2006 at 07:22 PM relativamente ao (a) podes usar a função 'somaNotas' que funciona na mesma... quanto ao (😄 , tu estás a dividir por 3 em todas as chamadas da função... suponhamos que as notas eram 1,2 e 3: media [1,2,3] = (1 + (media [2,3]))/3 = (1 + ( (2 + (media [3]))/3 ))/3 = (1 + ( (2 + ( (3+media [])/3 ))/3))/3 que é diferente de (1+2+3)/3... Rui Carlos Gonçalves Link to comment Share on other sites More sharing options...
Guest id194 Posted October 28, 2006 at 08:17 PM Report Share #60619 Posted October 28, 2006 at 08:17 PM eu sei que é diferente, mas sempre pensei que ele fizesse mais algo do género: media [1,2,3] = (1 + (media [2,3]))/3 = (1 + (2 + (media [3])))/3 = (1 + (2 + (3 + (media []))))/3 anyway, vou tentar usar o length a ver se consigo chegar lá, se não conseguir, depois digo qq coisa... Link to comment Share on other sites More sharing options...
Guest id194 Posted October 28, 2006 at 09:17 PM Report Share #60632 Posted October 28, 2006 at 09:17 PM pronto, já consegui usando uma função auxiliar para somar as notas mais o length. o meu problema no length é que o gajo tava a devolver um inteiro e o divisor tinha de ser float, usei a função "fromIntegral" e já está a funcionar. thanks 😄 Link to comment Share on other sites More sharing options...
Keps Posted November 12, 2006 at 06:18 PM Report Share #63873 Posted November 12, 2006 at 06:18 PM podes mostrar como é que meteste o fromInt na funçao? Qd tento meter esta funçao: media :: Float -> Float -> Float -> Float media a b c = (a + b + c) / 3 mas assim: media :: Int -> Int -> Int -> Float media a b c = fromInt (a + b + c) / 3 dá erro (Undefined variable "fromInt") e nao consigo perceber pq, visto que foi assim que me foida da na aula. Link to comment Share on other sites More sharing options...
Rui Carlos Posted November 12, 2006 at 06:25 PM Report Share #63874 Posted November 12, 2006 at 06:25 PM não é 'fromInt', é 'fromIntegral'. Rui Carlos Gonçalves Link to comment Share on other sites More sharing options...
Keps Posted November 12, 2006 at 06:38 PM Report Share #63876 Posted November 12, 2006 at 06:38 PM Pois, assim já dá, já tinha tentado com fromInteger devido a umas coisas que tive a ver a net mas tb nao tinha dado, pensei que fosse preciso mais que isso, sou um noob nisto. Obrigado 🙂 Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now