gRoOvE 0 Denunciar post Postado Agosto 3, 2008 estou tentando implementar esta função na unha, eis o que consegui fazer, não sei se estou no caminho certo, ta dificil pra acertar a lógica quando S1 > S2 e S2 > S1, se alguém puder dar uma ajuda :D int ComparaString(char *string1, char *string2) { int i = 0; int str1 = 0, str2 = 0; int maior = 0, menor = 0; int igual = 0; while((i < ContaString(string1)) || (i < ContaString(string2))) { if(*(string1+i) == *(string2+i)) { str1 = str1 + (int)*(string1+i); str2 = str2 + (int)*(string2+i); igual++; } else if(*(string1+i) > *(string2+i)) { str1 = str1 + (int)*(string1+i); str2 = str2 + (int)*(string2+i); maior++; } else if(*(string1+i) < *(string2+i)) { str1 = str1 + (int)*(string1+i); str2 = str2 + (int)*(string2+i); menor++; } i++; } if((str1 == str2) && (ContaString(string1) == igual)) { return(0); } else if((str1 == str2) && (maior > menor)) { return(1); } else if((str1 == str2) && (menor > maior)) { return(-1); } else if((str1 > str2) && (maior > 0)) { return(1); } else if((str1 < str2) && (menor > 0)) { return(-1); } } Compartilhar este post Link para o post Compartilhar em outros sites
Kandrade 7 Denunciar post Postado Agosto 3, 2008 Eu acho que tem um jeito mais fácil de fazer isso. Se voce comparar caracteres. Ex: 'a' > 'b' Isso será falso, pois 'a' tem um valor ascii menor que 'b'. Tomando isso como ponto de partida voce pode comparar caracteres na busca pela igualdade. Se os caracteres forem iguais continue a comparação senão ache quem é maior. O caracter da string1 ou o caracter da string2 ai retorne o que tiver que retornar. Não sei se ficou claro. Ps: não precisa passar por todos os caracteres. Quando achar um maior que o outro já pode retornar. http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif Compartilhar este post Link para o post Compartilhar em outros sites
gRoOvE 0 Denunciar post Postado Agosto 3, 2008 Boas dicas, consegui resolver, veja se é possível otimizar mais um pouco. Estava meio confuso de como funcionava essa parte de uma string ser maior que a outra, pensei que tivesse que comparar todos os caracters "/ int ComparaString(char *string1, char *string2) { int i = 0; int igual = 0; while((i < ContaString(string1)) || (i < ContaString(string2))) { if(*(string1+i) == *(string2+i)) { igual++; } else if(*(string1+i) > *(string2+i)) { return(1); } else if(*(string1+i) < *(string2+i)) { return(-1); } i++; } if(ContaString(string1) == igual) { return(0); } } Compartilhar este post Link para o post Compartilhar em outros sites
Kandrade 7 Denunciar post Postado Agosto 3, 2008 No último "if else" não precisa do "if" só um "else" resolve. Precisa resolver o caso de uma string estar contida na outra. Compartilhar este post Link para o post Compartilhar em outros sites
gRoOvE 0 Denunciar post Postado Agosto 3, 2008 Como assim uma string estar contida na outra? Compartilhar este post Link para o post Compartilhar em outros sites
Kandrade 7 Denunciar post Postado Agosto 3, 2008 Vamos a um exemplo. string1 = "Imasters"; string2= "ImastersForum"; Isso no final do seu programa vai retornar 0 e não deveria, pois string2 é maior que string1. Ve se consegue resolver. Dica: Faça um teste na saída do laço comparando tamanho das strings. http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif Como assim uma string estar contida na outra? Compartilhar este post Link para o post Compartilhar em outros sites
gRoOvE 0 Denunciar post Postado Agosto 3, 2008 Aliás, qual a utillidade de quando você comparar as strings, saber que uma é "maior" ou "menor" que a outra? Sempre que usei esta função, só uso pra verificar se são idênticas Compartilhar este post Link para o post Compartilhar em outros sites
gRoOvE 0 Denunciar post Postado Agosto 3, 2008 Vamos a um exemplo. string1 = "Imasters"; string2= "ImastersForum"; Isso no final do seu programa vai retornar 0 e não deveria, pois string2 é maior que string1. Ve se consegue resolver. Dica: Faça um teste na saída do laço comparando tamanho das strings. http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif Como assim uma string estar contida na outra? Ah isso eu já tratei, veja, tem uma variável chamada "igual", que vai incrementando a cada iteração que a comparação dos caraters são iguais, ai no final pra retornar 0, o valor da variável "igual" tem que ser igual ao número de iterações :D Compartilhar este post Link para o post Compartilhar em outros sites
Kandrade 7 Denunciar post Postado Agosto 3, 2008 Faça os testes e verifique se está mesmo correto. Se estiver é isso ai. Ah isso eu já tratei, veja, tem uma variável chamada "igual", que vai incrementando a cada iteração que a comparação dos caraters são iguais, ai no final pra retornar 0, o valor da variável "igual" tem que ser igual ao número de iterações Pode usar essa função para fazer ordenação de strings. Aliás, qual a utillidade de quando você comparar as strings, saber que uma é "maior" ou "menor" que a outra? Sempre que usei esta função, só uso pra verificar se são idênticas http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif Compartilhar este post Link para o post Compartilhar em outros sites
gRoOvE 0 Denunciar post Postado Agosto 3, 2008 hmm, saquei ^^ Então, eu coloquei a função original e a minha, testei de várias formas e as duas retornar valores iguais, acredito que seja isso ^^ vlw Kandrade :D Compartilhar este post Link para o post Compartilhar em outros sites
gRoOvE 0 Denunciar post Postado Agosto 3, 2008 Mas ta gerando um warning aqui, diz que pode em alguma ocasião não retornar nada...mas como vou descobrir? warning C4715: 'ComparaString' : not all control paths return a value Compartilhar este post Link para o post Compartilhar em outros sites
Kandrade 7 Denunciar post Postado Agosto 3, 2008 Se passar pelo loop sem retornar será executado esse teste: if(ContaString(string1) == igual) Só assim terá retorno. Se o teste for falso qual retorno a função deve ter? Compartilhar este post Link para o post Compartilhar em outros sites
gRoOvE 0 Denunciar post Postado Agosto 3, 2008 Eu entendi o que você quis dizer, mas se o teste for falso, já terá retornado dentro do laço mesmo...não tem pq colocar um else ali, seria só pra retirar o warning msm... Compartilhar este post Link para o post Compartilhar em outros sites
Kandrade 7 Denunciar post Postado Agosto 3, 2008 Voce encerra o laço quando string1 ou string2 atinge o tamanho dela. Imagine string2 com menos caracteres que string1 cai naquele caso que te falei só que o inverso. string2 = "Imasters" string1 = "ImastersForum" entendeu? Eu entendi o que você quis dizer, mas se o teste for falso, já terá retornado dentro do laço mesmo...não tem pq colocar um else ali, seria só pra retirar o warning msm... Compartilhar este post Link para o post Compartilhar em outros sites
gRoOvE 0 Denunciar post Postado Agosto 3, 2008 ta mais se string2 for menor que string1, já está previsto dentro do for, e já vai encerrar a função por lá mesmo Compartilhar este post Link para o post Compartilhar em outros sites
gRoOvE 0 Denunciar post Postado Agosto 3, 2008 Se passar pelo loop sem retornar será executado esse teste: if(ContaString(string1) == igual) Só assim terá retorno. Se o teste for falso qual retorno a função deve ter? Cite um exemplo, onde este teste seja falso. Compartilhar este post Link para o post Compartilhar em outros sites
Kandrade 7 Denunciar post Postado Agosto 4, 2008 Só agora que fui rodar o código. A única coisa que eu faria é tirar o último if. Se o programa passar pelo laço as strings são iguais retorne 0. ta mais se string2 for menor que string1, já está previsto dentro do for, e já vai encerrar a função por lá mesmo Compartilhar este post Link para o post Compartilhar em outros sites
gRoOvE 0 Denunciar post Postado Agosto 4, 2008 vlw brother, agora deu :D Compartilhar este post Link para o post Compartilhar em outros sites
Kandrade 7 Denunciar post Postado Agosto 5, 2008 Boa. http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif vlw brother, agora deu :D Compartilhar este post Link para o post Compartilhar em outros sites
gRoOvE 0 Denunciar post Postado Agosto 6, 2008 B) Compartilhar este post Link para o post Compartilhar em outros sites