Jump to content
dardevil

problema com contador

Recommended Posts

dardevil

Precisava daqui de uma ajudinha, é que já ando aqui às voltas e nada :s

Dadas duas Strings, crie uma funcao que percorra os elementos das duas Strings e compare, os primeiros, os segundos e os terceiros elementos das Strings, e que devolda um triplo de Int, em que:

- o primeiro elemento representa o nº de elementos da primera String maiores que os seus correspondentes na segunda String;

- o segundo elemento representa o nº de elementos iguais nas posicoes correspondentes das Strings;

- o terceiro elemento representa o nº de elementos da primeira String menores que o seus correspondentes na segunda String.

Exemplo:

compareSt "023" "013"

(1,2,0)

ou seja:

- compara o 0 na primeira String com o 0 da segunda e o triplo ficou em (0,1,0)

- de seguida comparou o 2 da primeira String com o 1 da segunda e ficou (1,1,0)

- depois comparou o 3 da primeira String com o 3 da segunda e ficou o resultado final em (1,2,0)

Já tenho este código feito, mas não sei porque razao nao funciona, agradecia a vossa ajuda pa corrigir o problema

compareSt :: String -> String -> (Int,Int,Int)
compareSt _ _ = (0,0,0)
compareSt x y = contaResultados x y (0,0,0)


contaResultados :: String -> String -> (Int,Int,Int) -> (Int,Int,Int)
contaResultados a b  (v,e,d) = (v,e,d)
contaResultados (x:xs) (y:ys) (v,e,d)
	|x == y = contaResultados xs ys (v,e+1,d)
	|x < y = contaResultados xs ys (v,e,d+1)
	|x > y = contaResultados xs ys (v+1,e,d) 

cumps ppl

Share this post


Link to post
Share on other sites
Betovsky

Sem ver mais. A tua função compareSt irá devolver sempre (0,0,0)


"Give a man a fish and he will eat for a day; Teach a man to fish and he will eat for a lifetime. The moral? READ THE MANUAL !"

Sign on a computer system consultant's desk

Share this post


Link to post
Share on other sites
dardevil

Pois esse é o meu problema e que ja tentei várias coisas e não consigo pôr a funcionar correctamente :s, alguma sugestão?

Share this post


Link to post
Share on other sites
jpedro20

Pois esse é o meu problema e que ja tentei várias coisas e não consigo pôr a funcionar correctamente :s, alguma sugestão?

tal como o Betovsky disse claro que vai retornar sempre (0,0,0).

compareSt _ _ = (0,0,0)

o probelma é aqui. Tu estás a dizer que recebendo 2 parametros quaisquer entao retorna (0,0,0).

Share this post


Link to post
Share on other sites
dardevil

Já tentei pôr esse caso base como comentário e correr, mas mesmo assim vai devolver (0,0,0). Não tou mesmo a entender como resolver este problema, já tou com isto algum tempo e nada :wallbash:

Share this post


Link to post
Share on other sites
jpedro20

Eu posso dizer-te o que está mal:

na função contaResultados o teu caso de paragem está mal... o caso de paragem deve ser quando for lista vazia.

e na função compareSt não vais precisar de caso de paragem porque já é feito na função contaResultados.

Entao fica

contaResultados :: String -> String -> (Int,Int,Int) -> (Int,Int,Int)
contaResultados ...        --aqui tens de coloar o caso de paragem quando as listas são vazias
contaResultados (x:xs) (y:ys) (v,e,d)
                |x == y = contaResultados xs ys (v,e+1,d)
                |x < y = contaResultados xs ys (v,e,d+1)
                |x > y = contaResultados xs ys (v+1,e,d)
          
compareSt :: String -> String -> (Int,Int,Int)
compareSt x y = contaResultados x y (0,0,0)

Share this post


Link to post
Share on other sites
daj

Olá,

Não te esqueças que o match de padrões é efectuado por ordem. No código

contaResultados :: String -> String -> (Int,Int,Int) -> (Int,Int,Int)
contaResultados a b  (v,e,d) = (v,e,d)
contaResultados (x:xs) (y:ys) (v,e,d) ...

qualquer String pode ser associada a "a" e a "b", logo é sempre esse ramo que é escolhido. Sugeria que visses melhor a ordem que realmente pretendes para os vários ramos de contaResultados.

Share this post


Link to post
Share on other sites
dardevil

Ahhh ok, já entendi então fica assim

contaResultados [ ] [ ] (v,e,d) = (v,e,d)

e já fica a funcionar penso eu :)

thanks ppl

Share this post


Link to post
Share on other sites
jpedro20

Ahhh ok, já entendi então fica assim

contaResultados [ ] [ ] (v,e,d) = (v,e,d)

e já fica a funcionar penso eu :)

thanks ppl

é mesmo isso... quando as strings têm igual comprimento.

Caso as strings possam ter comprimentos diferentes então:

contaResultados [] _ (v,e,d) = (v,e,d)
contaResultados _ [] (v,e,d) = (v,e,d)

Share this post


Link to post
Share on other sites
jp_neto

Boa noite,

caro utilizador dardevil, curiosamente essas funções são do meu enunciado de Principios De Programação no curso de informática da Faculdade de Ciências da Universidade de Lisboa. Espero que não seja um aluno da mesma pois caso um dos projectos tiver esse código apresentado por OUTROS utilizadores, será automaticamente reprovado à disciplina. A melhor das sortes para o programa,

                                                                                                                                                                                                João Neto

Share this post


Link to post
Share on other sites
dardevil

Por favor nao copiem o código acima referido, isto tópico foi inicializado para tirar uma dúvida da função que tinha criado, sem o intuito de prejudicar ninguém. Esta função é da minha autoria, por favor não copiem o código.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • 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.