[Ajuda] C

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.
 
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:
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...
 
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

Mas o objectivo nao é esse mesmo? mostrar so ate ao ponto de repetição?
 
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.
 
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;
}
 
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:
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

Fiz meio a pressa (durante uma aula teorica, senão adormecia!) e nem me preocupei em fazer comentários!
 
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:
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

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:
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
 
Back
Topo