Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #57 da revista programar. Faz já o download aqui!

Gomesss

Função abreviar

Mensagens Recomendadas

Gomesss    0
Gomesss

Escreva uma fun¸c˜ao abrev que receba uma string contendo nome de uma pessoa e

retorne uma string com o primeiro nome e apelido1

(e.g. (abrev ‘‘Joao Carlos Martins Sarmento’’)=’’Joao Sarmento’’)

Alguém me ajude!

Abraço

Já tentei quase tudo menos a resposta certa.

:S

Partilhar esta mensagem


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

Eu sei disso. O problema é que me dá erros com isso.

:S

Não consegues fazer o programa?

:)

Coloca aqui o que já fizeste, e o pessoal dá uma ajuda. Mas não fiques à espera que façam o trabalho por ti.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Gomesss    0
Gomesss

Sorry.

:)

abrev :: String -> String
abrev [l] = head (words[l]):tail (words[l])

Dá-me mal porque basicamente não sei utilizar a words!

:S

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Baderous    31
Baderous

A função words pega numa string e separa as substrings que estão divididas por espaços ou \n (mudança de linha).

Ex: words "Joao Carlos Martins Sarmento" = ["Joao","Carlos","Martins","Sarmento"]

Após usares esta função sobre a string de input, apenas tens de usar as funções head e last que te dao o 1º e último elemento de uma lista para obteres o que pretendes.

Partilhar esta mensagem


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

Aparentemente não é só a função words que não sabes utilizar...

abrev [l]

Está a obrigar que a string recebida como argumento tenha um e um só caracter.

Devias ter apenas abrev l, e depois também retiras os outros parêntesis rectos.

head (words l):tail (words l)

head x:tail x é sempre igual a x. Não é o tail que queres, é o last.

Depois é só juntar as duas strings. Pegas na primeira palavra, e na última, e fazes primeira ++ " " ++ última.

Também podes criar uma lista e usar a função unwords.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
lesiano    0
lesiano

abrevf1 :: String -> String

abrevf1 a = head (words a)

abrevf2 :: String -> String

abrevf2 a = head (reverse (words a))

abrev :: String -> String

abrev a = (abrevf1 a)++" "++(abrevf2 a)

E já agr a pergunta seguinte:

abrevcp :: String -> String

abrevcp a = (head (reverse (words a)))++","++(head (head (words a)):[])++". "++

Eu sei que isto é um pouco dar o peixe em vez de ensinar a pescar. Mas neste caso, como de raciocínio há pouco, prefiro dar.

E já agora Gomes, vê lá se este ano fazes mais do que uma cadeira.

Partilhar esta mensagem


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

Não vale a pena invocar words 2 vezes:

abrev l = let x = words l
  in head x ++ " " ++ last x

Não é por isso que vais deixar de invocar o words duas vezes... O let é apenas açucar sintáctico, e na realidade o compilador vai substituir as ocorrências de x por words l.

No entanto, um bom compilador, quer uses o let, quer não uses, apenas deverá calcular a função uma vez, visto que, sendo uma função, ele sabe que dá sempre o mesmo resultado. Na segunda invocação, ele usará o resultado da primeira.

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 a nossa Política de Privacidade