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

BlodyGrl

Listas de strings

13 mensagens neste tópico

Bem, eu sou caloirinha  :biggrin:  E portanto ainda não "pesco" muito de programação mas até me vou safando... No entanto começaram-me a aparecer dúvidas (se é que se pode chamar dúvidas quando não sabemos a mínima ideia de como fazer o programa) em exercícios relacionados com listas de Strings... O que eu gostava era que vocês me fizessem um ou outro programa mas que me explicassem porque é que os fizeram assim. Porque a copiar por copiar não vou aprender nada, queria perceber... Agradecida a todos que me responderem.  :P

1)Implemente uma função invPal que dada uma String (frase e não apenas palavra) s, retorna uma string que contém as palavras em ordem inversa. Por exemplo:

Main>invPal "Esta frase tem cinco palavras"

"palavras cinco tem frase Esta"

2)Escreva uma função que dada uma string, representando uma linha de texto, produza uma lista de strings correspondentes às palavras que ocorrem na frase. Exemplo:

Main>separa "Esta frase tem cinco palavras"

["Esta","frase","tem","cinco","palavras"]

Já agora gostaria que explicassem este programa para factorizar números. :)

primo = 2 : filter ((==1) . length . factoriza) [3,5..]

factoriza::Int->[int]
factoriza n = factor n primo
		where factor n (p:ps) | p*p > n        = [n]
							  | n `mod` p == 0 = p : factor (n `div` p) (p:ps)
							  | otherwise      = factor n ps

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O que eu gostava era que vocês me fizessem um ou outro programa mas que me explicassem porque é que os fizeram assim.

Bem, fazer não fazemos, não faz parte da politica do fórum fazer o trabalho dos outros. Mas estamos completamente disponíveis para ir ajudando na tua tentativa de resolução dos problemas.

Entretanto deixo umas dicas.

É melhor começares pelo problema 2. Vais percorrendo a String e vais desfragmentando sempre que encontras um espaço.

Depois de teres a função do problema 2 a funcionar, o problema 1 fica mais fácil. Só precisas de fazer uma função inversa da função do problema 2, ou seja, vais percorrendo a lista de strings e vais juntando tudo inserindo espaços entre as mesmas. Depois de teres isto feito, o problema 1 fica apenas em separar a frase, inverter a lista obtida, voltar a juntar a frase.

A função primo vai gerar uma lista infinita de primos. Vai começar pelo elemento 2 e depois vai ter todos os elementos da lista infinita de números impares ([3,5..]) que passem a seguinte condição (==1) . length . factoriza, usando a função filter

A condição (==1) . length . factoriza pode ser dividida em vários blocos de lógica

* factoriza -> Esta função dado um Int gera uma lista com todos os números que são divisores para esse número.

* length -> Função que calcula o tamanho de uma dada lista. Neste caso irá calcula o tamanho da lista devolvida pela função factoriza.

* (==1) -> Função que verifica se um dado número é igual a 1.

Ou seja, tudo junto verifica se um dado número só tem um divisor. Se tal for significa que é primo, senão filtra e não é adicionado à lista de primos gerada.

A função factoriza não há muito a explicar. Esta função usa a função factor auxiliar. A função factor limita-se a percorrer a lista de primos e coleccionar os primos que são divisores do número em questão.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Sim, percebo mas pelo menos deste-me dicas que acho que me vão ajudar...

Quanto ao primo eu percebi como ele funciona, não percebi é porque dá os primos... Porque afinal depois ela vai pedir os nºs impares e nem todos os impares são primos... É essa parte que me confunde...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Aí é que entra a função filter. Aquela condição filtra todos os números impares que têm mais do que 1 divisor. Por exemplo, factoriza 9 irá devolver [3,9], ou seja, tamanho 2, logo não é primo.

Mais qualquer dúvida estás a vontade.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Acho que o problema é eu nunca ter usado essa conatação... Mas resumindo o que isso faz é:

ver se é 1 o tamanho do factoriza para a lista dos impares, certo?

Pois, eu bem estou farta de tentar mas a unica coisa que consigo e fazer uma lista com a primeira palavra ou então pô-las todas juntas como se fosse o mesmo elemento...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Se mostrares como tens o código uma pessoa pode ter uma melhor ideia do que estás a pensar, assinalar possíveis erros e consecutivamente ajudar-te melhor.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
separa::[Char]->String
separa [] = "Não há frase para separar."
separa (x:xs) =  if x==' ' then [] else [x]++separa xs

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

separa::[Char]->String
separa [] = "Não há frase para separar."
separa (x:xs) =  if x==' ' then [] else [x]++separa xs

String e [Char] são exactamente o mesmo tipo de dados...

O tipo dessa função devia ser String -> [string].

Eu se fosse a ti, usava dois acumuladores: um para guardar uma palavra que estarás a ler da frase num determinado momento, e outro para a lista de palavras que já leste (e que no final será o resultado).

Tipo, se tiveres a frase "ab cd e" os acumuladores iam conter o seguinte

"" / [] <- no início estão vazios

"a" / [] <- lês o 'a' e acrescentas-lo ao primeiro acumulador

"ab" / [] <- lês o 'b' e acrescentas-lo ao primeiro acumulador

"" / ["ab"] <- lês o ' ' e acrescentas o que está no primeiro acumulador à lista do segundo e o primeiro passa a estar vazio

"c" / ["ab"] <- lês o 'c' e acrescentas-lo ao primeiro acumulador

"cd" / ["ab"] <- ...

"" / ["ab","cd"] <- ...

"e" / ["ab","cd"] <- lês o 'e' e acrescentas-lo ao primeiro acumulador

"" / ["ab","cd","e"] <- a lista de input está vazia, logo acrescentas a string do primeiro acumulador à lista, e devolves-la como resultado.

PS: Coisa como separa [] = "Não há frase para separar." não fazem qualquer sentido. Se recebes uma lista vazia, então devolves uma lista vazia e nunca uma mensagem a dizer que a lista está vazia.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

1º aquilo foi um pequeno engano na escrita...  :-[

Eu queria por:

separa::[Char]->[string]

2º aquilo faz sentido porque a prof pedia isso no exercicío... Uma mensagem de erro se a String ([Char]) estivesse vazia...

3º foi outro pequeno erro...  :-[ Eu queria escrever:

error "Não há frase para separar."

4º o que eu queria fazer era 2 funções:uma que me desse as palavras uma a uma e outra que as juntasse numa lista. Essa é a primeira. A segunda (a que eu optei por não escrever porque achei demasiado disparatada) era mais ou menos assim:

separa2::String->[string]
separa2 = [separa xs] : [separa (drop (separa xs) xs)]

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pois, com esses requisitos da prof era melhor teres da seguinte maneira.

separa :: String -> [string]
separa [] = error "Não há frase para separar."
separa frase = separa2 frase [] []

separa2 :: String -> String -> [string] -> [string]

Ou seja, a ideia é já passares dois acumuladores (inicialmente vazios) para ires guardando as palavras que encontras. É só seguires o caso de uso que o Rui Carlos indicou.

Se ainda tiveres alguma dificuldade, já sabes :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Nem me acredito... Hoje fui a recurso e houve um exercício parecido.Era para fazer um IO [string] em que eu lhe dava duas frases e ele me via quais eram as palavras em comum às duas frases... Para isso tinha que as separar e depois comparar as palavras mas claro que me estalei ao comprido em metade do exercício porque não tinha percebido bem a parte do Rui. Agora já percebi mas é tarde demais!  ;) Esperemos que ela me dê pelo menos metade da cotação por ter a 1ª bem e o IO com a estrutura devida... Mas obrigado pela vossa ajuda!  :) Agora vamos ver o resto deste exercicío...  :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Nem me acredito... Hoje fui a recurso e houve um exercício parecido.Era para fazer um IO [string] em que eu lhe dava duas frases e ele me via quais eram as palavras em comum às duas frases... Para isso tinha que as separar e depois comparar as palavras mas claro que me estalei ao comprido em metade do exercício porque não tinha percebido bem a parte do Rui. Agora já percebi mas é tarde demais!  ;) Esperemos que ela me dê pelo menos metade da cotação por ter a 1ª bem e o IO com a estrutura devida... Mas obrigado pela vossa ajuda!  :) Agora vamos ver o resto deste exercicío...  :P

Se não der, vai lá e vê o exame, não perdes nada e se tiveres sorte, ainda consegues kk coisa...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Nem me acredito... Hoje fui a recurso e houve um exercício parecido.Era para fazer um IO [string] em que eu lhe dava duas frases e ele me via quais eram as palavras em comum às duas frases... Para isso tinha que as separar e depois comparar as palavras mas claro que me estalei ao comprido em metade do exercício porque não tinha percebido bem a parte do Rui. Agora já percebi mas é tarde demais!  ;) Esperemos que ela me dê pelo menos metade da cotação por ter a 1ª bem e o IO com a estrutura devida... Mas obrigado pela vossa ajuda!  :) Agora vamos ver o resto deste exercicío...  :P

Pois chatice, espero que tenhas sorte com a prof.

Entretanto, se te lembrares de como fizeste o código, mete aqui que a malta corrige, diz o que fizeste bem e o que fizeste mal, e dá-te uma explicações na resolução. Pode ser que sirva de aprendizagem para um caso futuro.

Em relação aos problemas originais. Conseguíste resolver?

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