Ir para o conteúdo
Polmax

3 em 1

Mensagens Recomendadas

Polmax    0
Polmax

fiz a seguinte funçao

media ::[Aluno]->Float
media []=0
media l =(passaramAux l)/(numeroP l)
                       
  where passaramAux ::[Aluno]->Float
        passaramAux [] = 0
        passaramAux ((_,_,p1,p2):xs) |((p1>=8) && ((p1+p2)>=9.5)) =(p1+p2)+passaramAux xs
                                |otherwise = passaramAux xs
        numeroP ::[Aluno]->Float
        numeroP []=0
        numeroP ((_,_,p1,p2):xs) |((p1>=8) && ((p1+p2)>=9.5))=1+numeroP xs
                                |otherwise =numeroP xs

pega numa lista de alunos, selecciona os que passaram e faz a media destes.

eu fiz uma função principal que faz a soma dos que passaram / numero dos que passaram

fiz uma função para ver os que passaram

e uma para dar o numero de alunos que passaram

foi o que me veio a cabeça mas acho estúpido ter três funções para isso quando podia ter menos.

Alguém tem alguma dica para reduzir a duas funções ou a uma só ?

Não quero mesmo usar funções predefinidas , só em ultimo caso.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Rui Carlos    312
Rui Carlos

Usa um acumulador para criar um par com o número de alunos que passaram, e a some das notas.

No final, quando tiveres processado todos os valores da lista, usas os valores do acumulador para dar o resultado.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Baderous    31
Baderous

Podes fazer o cálculo das notas e do nº de alunos que passaram ao mesmo tempo, como disse o Rui Carlos. Vou deixar aqui um exemplo de como fazer isso, para ver se consegues adaptar ao teu caso:

break' :: (a -> Bool) -> [a] -> ([a],[a])
break' _ [] = ([],[])
break' f (x:xs) | f x = (x:a,b)
	| otherwise = ([],x:xs)
		where (a,b) = break' f xs

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Polmax    0
Polmax

Eu tive outra ideia tambem .

mediaAux ::[Aluno]->[Aluno]
mediaAux []=[]
mediaAux ((nu,no,p1,p2):xs) |(p1>=8) &&((p1+p2)>=9.5) =(nu,no,p1,p2):mediaAux xs

                                             

e depois na função principal pegava nesta lista e somava todos p1 com p2 e dividia por length da lista.

Mas tenho o mesmo problema que nas ideias que vocês me deram , a minha função principal tem que obrigatoriamente ser do tipo ::[Aluno]->Float.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Rui Carlos    312
Rui Carlos

O acumulador vai guardando resultados intermédios, e sempre que chamas a função recursivamente, o resultado intermédio é um dos argumentos da função.

Para usares apenas uma função (com a assinatura pretendida), também podes usar o filter, e depois o sum e length. Não estou a ver mais nenhuma solução simples para o problema.

Partilhar esta mensagem


Link 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