Jump to content
Gomesss

Função abreviar

Recommended Posts

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

Share this post


Link to post
Share on other sites
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.

Share this post


Link to post
Share on other sites
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

Share this post


Link to post
Share on other sites
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.

Share this post


Link to post
Share on other sites
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.

Share this post


Link to post
Share on other sites
Gomesss

abrev l = ((head(words(l))):tail(words(l)))

Não me está a dar.

Acho que preciso de uns comprimidos para a concentração.

:)

Share this post


Link to post
Share on other sites
mystics

Vê lá se é isto ...

module Main where
import Char

abrev :: String -> String
abrev l = (head (words l) ++ " " ++ last (words l))

Share this post


Link to post
Share on other sites
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.

Share this post


Link to post
Share on other sites
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.

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.