• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Gomesss

Função abreviar

19 mensagens neste tópico

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Vê as funções words, head, e last.

Se as poderes usar, tens o problema resolvido.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

:S

Não consegues fazer o programa?

:)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Sorry.

:)

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

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

:S

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

Não me está a dar.

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

:)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

É de mim a apenas leste as primeiras linhas do meu último post?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu sei estas coisas mas estou todo comido da cabeça.

Quando chegar aos monades é que vai ser!

:)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Vê lá se é isto ...

module Main where
import Char

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

abrevf2 :: String -> String

abrevf2 a = head (reverse (words a))

Porque não usar a função last directamente?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não vale a pena invocar words 2 vezes:

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

tu complicas para caraças!

:P

Já está feita.

Podem fechar ou apagar.

:)

0

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