1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

[Ajuda] C

Discussão em 'Programação' iniciada por Barril, 20 de Abril de 2008. (Respostas: 22; Visualizações: 1609)

  1. Barril

    Barril Power Member

    Boas.

    Preciso de arranjar maneira de retirar de uma palavra as suas letras repetidas, por exemplo:

    Banana - ficaria - ban
    Teste - ficaria - tes

    e por aí fora.

    Alguem tem ideia de como fazer?

    Cumpz.
     
  2. Boo

    Boo

    mantens um array por exemplo q te diz se ja encontraste cada uma das letras, por exemplo um array de inteiros 26 posiçoes (ou la quantas letras ha lol) e sempre q encontras uma letra, poes la na posiçao respectiva do array um 1, e pa proxima vez q vires essa letra, ves q tem la um 1, q quer dizer q ja apareceu e mandas a letra co crl


    Dicas..

    - nas comparaçoes passa a letra pa lower case pk senao 'A' é diferente de 'a'
    - letra - 'a' -> dá-te o numero da letra.. pa saberes qual o indice do array a verificar
     
    Última edição: 20 de Abril de 2008
  3. metralha761

    metralha761 1st Folding then Sex

    faz um print do decimal a e do decimal A fazes a diferença e ta andar de mota :)
     
  4. raVemjr

    raVemjr I'm cool cuz I Fold

    Tens duas soluções...

    1-Ou percorres o vector e quando encontrares uma letra nessa posição, vês se se repete até ao fim, e se encontrares, escreves nessa posicao alguma coisa para saberes (tipo $, ou um char qualquer que ninguém use) e repetes até teres percorrido o vector todo.

    2-Percorres o vector um a um, passando as letras para outro vector por ordem (precisas de um indice para cada), e cada vez que vais pa passar uma, verificas se há ocorrência dessa letra no vector alvo. Se houver, passas para a proxima letra do vector original.

    Bom coding...era capaz de jurar que eras do tagus, que hoje vi lá gente a fazer esse ex...
     
  5. metralha761

    metralha761 1st Folding then Sex

    Pode escrever '\0' nessa posição :)
     
  6. raVemjr

    raVemjr I'm cool cuz I Fold

    Lol, não digas isso que ele ainda faz :P
     
  7. Tyran

    Tyran Power Member

    e ao fazer print não se vê o resto que está para a frente :P

    Eu percorreria o array e ia passando os valores para outro, a cada passagem do ciclo verificava se essa letra já estava na palavra, se já estivesse, passava à próxima


    cumpzz
     
  8. metralha761

    metralha761 1st Folding then Sex

    Mas o objectivo nao é esse mesmo? mostrar so ate ao ponto de repetição?
     
  9. Tyran

    Tyran Power Member

    e se tiveres letras não repetidas depois dessas??

    exemplo:

    arauto -> aruto

    cumpzz
     
  10. souto

    souto To fold or to FOLD?

    Para cada letra na frase:
    - Procurar e remover todas as ocorrências seguintes dessa letra.
    - Rebobinar, avançar para a letra seguinte e recomeçar.
     
  11. LuisFP

    LuisFP Power Member

    Deu-me um bocadinho de trabalho mas aqui esta ;):

    Código:
    #include <stdio.h>
    #include <string.h>
    
    
    int main()
    {
     
     char texto[50], *aux, *aux2;
     int i,c;
    
     
     aux=texto;
     aux2=texto;
    
     scanf(" %s",&texto);
    
     while(*aux)
     {
       c=0;
       while(*aux2)
       {
         if(*aux==*aux2)
         {
           c++;
           if(c>1)
           {
                *aux2='\0';
           }
           
         }
         aux2++;
       }
      
       aux++;
       aux2=aux;
     }
    
    
    
     printf("\n %s \n", texto); 
    
     
    return 0;
    }
     
  12. Baderous

    Baderous Banido

    Isso está a funcionar??

    Código:
    scanf(" %s",[color=red]&[/color]texto);
     
  13. LuisFP

    LuisFP Power Member

    Funciona, mas pode-se tirar o & porque ja se esta a ler o endereco inicial!
     
  14. LuisFP

    LuisFP Power Member

    Codigo alterado e melhorado (agora funciona a 100%! antes não funcionava para todas as palavras):

    Código:
    #include <stdio.h>
    #include <string.h>
    
    
    int main()
    {
     
     char texto[50], *aux, *aux2, temp[50];
     int i,c;
    
     
     aux=texto;
     aux2=texto;
    
     scanf(" %s",texto);
    
     while(*aux)
     {
       c=0;
       while(*aux2)
       {
         if(*aux==*aux2)
         {
           c++;
           if(c>1)
           {
                *aux2='0';
           }
           
         }
         aux2++;
       }
      
       aux++;
       aux2=aux;
     }
    
     int t=0;
     for(i=0;i<strlen(texto);i++)
     {
        if(texto[i]!='0')
        {
           temp[t]=texto[i];
           t++;
        }
           
     }
     
     temp[t]='\0';
    
     strcpy(texto,temp);
    
     printf("\n %s \n", texto); 
    
     
    return 0;
    }
     
    Última edição: 23 de Abril de 2008
  15. metralha761

    metralha761 1st Folding then Sex

    Depois da ultima aula teorica de C q tive, isso podia ser usar o conceito de fila ou de listas :)
     
  16. Tyran

    Tyran Power Member

    Sem testar, só lendo parece que está. Antes não te funcionava pela razão que disse aqui, assim parece bem, só te faltam uns comments no código ;)

    cumpzz
     
  17. LuisFP

    LuisFP Power Member

    Fiz meio a pressa (durante uma aula teorica, senão adormecia!) e nem me preocupei em fazer comentários!
     
  18. Boo

    Boo

    procurar para cada letras a ocorrencias dela a seguir é bue pouco eficaz.. implica montes varrimentos do array...

    qnd se pode fazer com um so varrimento como eu disse :P
     
    Última edição pelo moderador: 27 de Abril de 2008
  19. souto

    souto To fold or to FOLD?

    Não há algoritmos perfeitos. O teu por exemplo, se funcionar, implica usar uma array auxiliar. Atenção que é um array com o tamanho da string.

    Se pensares um pouco vês que o algoritmo de "montes de varrimentos" não faz "montes de varrimentos". Tendo em conta que cada caracter pode ter 2^8 combinações possíveis, estamos a falar de 256 varrimentos. Isto assumindo que não existem caracteres repetidos, porque se existirem serão menos.

    Conselho: modera as palavras, não gosto de pessoas mal educadas.
     
    Última edição pelo moderador: 27 de Abril de 2008
  20. Boo

    Boo

    nao tou a querer ofender ninguem.. é so a pegar co povo xD

    e o q eu disse so requer um array com o tamanho da quantidade de caracteres diferentes que hajam, q suponho eu, sejam tantos quantas letras diferentes ha.. prai 26 ou 27.. para ir la marcando as q ja encontrou

    bem feitinho consegue se num so varrimento encontrar as letras repetidas e ir fazendo logo o shift para tras sempre q remove uma letra ja existente :P


    nao leves a mal.. eu é q curto bue de eficiencia de algoritmos.. e keria elevar a discussao pra esse nivel :P
     

Partilhar esta Página