Ir ao conteúdo

Dúvida com SETs (Conjuntos)


gustavolm

Posts recomendados

Postado

Olá,

Preciso implementar um codigo em C que trabalhe com conjuntos. Dentre as funcões do programa, tem a int Gerar_Conjunto(int L[], int tamL, int C[]) em que ela recebe uma lista de numeros inteiros L de tamanho tamL (já ordenados) e trata essa lista a fim de eliminar termos duplicados e, então, coloca os termos no conjunto C (já ordenados e sem elementos duplicados). Eu comecei a elaborar o código, mas não estou conseguindo pensar em como tratar quando os termos L forem iguais a L[i+1].

 int Gerar_Conjunto(int L[], int tamL, int C[])
{
int i, nElem;
for(i=0; i<tamL; i++)
{
if(L[i]!=L[i+1])
{
C[i]=L[i];
nElem++;
}
}
return nElem;
}

Agradeço desde já,

Postado

Tá tudo errado.

Passos para fazer o que você quer:

-Bubble sort.

-Remoção de duplicatas (só criar um novo vetor do tamanho do passado para a função e inserir um elemento na posição indicada por um contador separado,que é incrementado a cada inserção,e dai fazer uma cópia de contador elementos para um vetor de tamanho contador).

-Retorno do tal contador (o vetor de retorno é passado como parametro).

Pesquisa e faz.

Att. regreth

Postado

LOL, como assim tudo errado ?

A lista de números ja vem ordenada a partir de outra função (que usa o cocktail sort, obrigatoriamente), então nessa função eu dispenso um algoritmo de ordenação. Outra coisa, não entendi porque você disse que o contador precisa ser recebido como parâmetro!? Eu vou receber o retorno dessa função em uma variavel do main e ela é necessária apenas para dizer quantos elementos tem o conjunto. Sua explicação de como remover elementos duplicados não foi clara o suficiente. E outra, eu não estaria perguntando aqui se já não tivesse pesquisado e tentado. Dispenso sua hipocrisia.

Postado

Gustavo, deixa eu tentar entender o seu problema:

1- Você irá 'ler' uma lista de numeros, que poderá conter numeros repitidos, porém, outra função já fez a ordenação dos elementos certo?

2-Ao passar a lista já ordenada para a função Gerar_Conjunto, ela ira retornar o conjunto de numeros, porém, sem numeros repetidos, ou seja, esta função apenas retira quaisquer elementos que estejam repetidos no vetor?

Fiz um esboço aqui, mas estou sem compilador para testar:



int Gerar_Conjunto(int L[], int tamL, int C[])
{
int x=0, nElem,y;
while(x!=tamL) //Enquanto todos os elementos não serem tratados
{
if(L[x]==L[x+1]) //Se a posição é igual a proxima
{
for(y=x;x<tamL;y++) //Para y igual a posição atual até o final do vetor
{
L[y]=L[y+1]; //Puxa todos os elementos após o elemento repetido para o inicio;
}
}
else
{
x=x+1; //Se não for repetido, ele pula para o proximo campo, para testa-lo
nElem=nElem+1; //Não entendi direito para que você quer retornar este valor
}
}
return nElem;
}

No caso do nElem, você pode usalo para criar o segundo vetor com este tamanho, já que este lhe retornara o tamanho do vetor sem as repetições....

Da uma analisada e se conseguir corrigir algum erro poste aqui.. achei interessante este exercicio :)

Postado

O professor pediu desse jeito ou você decidiu fazer assim?

Se eu fosse você tentava deixar as funções mais genéricas.

Uma função CriarSet() que retorna um objeto do tipo set (esse objeto teria apenas como propriedade um tamanho e a lista de objetos)... Depois outra função pra adicionar objetos ao set, outra pra remover, pra procurar... e no final uma pra organizar o set, se for preciso.

Fazendo cada uma delas assim individualmente você terá menos dor de cabeça. Recomendo uma classe com um template simples pra ficar mais legal.

Postado

É simples de resolver.

Sempre que achar um número repetido, incremente o 'i' e rode a comparação novamente. Assim, ele pulará a posição do número repetido, tendo então, o resultado que você espera.

Basta colocar um 'else' assim:


int Gerar_Conjunto(int L[], int tamL, int C[])
{
int i, nElem;
for(i=0; i<tamL; i++)
{
if(L[i]!=L[i+1])
{
C[i]=L[i];
nElem++;
}
else
i++;
}
return nElem;
}

  • mês depois...
Postado

Aoo galera, muito obrigado pelas respostas!

Ajudaram muito! Peço desculpas pela demora em postar aqui também, acabei ficando sem internet por um tempo. Estava de mudança. Enfim, a solução que acabei adotando foi a seguinte.

int Gerar_Conjunto(int L[], int tamL) {     int i, j, k;     for ( i = 0; i < tamL; i++ ) {                     // Contadores usados para percorrer a lista recebida         for ( j = i; j < tamL; ) {                     //e verificar se há elementos repetidos            if ( i != j && L[i] == L[j] ) {             //Caso não esteja verificando mesmo elemento e eles forem iguais                for ( k = j; k < tamL - 1; k++ )                    L[k] = L[k + 1];                    //O elemento é deletado do vetor, no caso, da lista            --tamL;                                         //Como valor foi deletado, diminui-se o tamanho da lista            }            else                ++j;        }    }return tamL;}

Hehehe, muito obrigado a todos pelas respostas!

Abraço

  • mês depois...

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...