Ir para conteúdo

POWERED BY:

Arquivado

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

srlima

união de vetores em c

Recommended Posts

pessoal estou com um pequeno problema na execuçao de um programa em c. O problema pede:

 

contruçao de um programa em C que recebe 2 vetores de 10 elementos inteiros e que calcule e retorne o vetor dos dois primeiros (não se repete os valores iguais).

 

até o momento o que eu tenho é o seguinte: (não estou conseguindo o ver o vetor união corretamente sem repetição)

 

#include <stdio.h>
#include <stdlib.h>
#include<conio.h>


       int main ()
       {
           int vet1[10], vet2[10], i, j, uniao[20];


           for (i = 0; i <10; i++)
           {
           printf ("digite o  vetor 1: ");
           scanf ("%d/n", &vet1[i]);
           }
           for (j=0; j<10; j++){
           printf ("digite o vetor 2: ");
           scanf ("%d/n", &vet2[j]);
           }

//mostrar os números dos vetores

                   for(i = 0; i < 10; i++){
                   printf("\nvet1: ");
                   printf("%d ",vet1[i]);
           }
                   for(i = 0; i < 10; i++){
                   printf("\nvet2: ");
                   printf("%d ",vet2[i]);
           }

//união dos vetores

           printf("\n\nA uniao e': ");

for(j=0;j<20;j++)
{if((uniao[0] != vet1[j]) && (uniao[1] != vet1[j]) && (uniao[2] != vet2[j]))
printf("%d ", vet1[j]);
}
for(i=0; i<20; i++) 
{printf("%d ",uniao[i]);
}

for(j=0;j<20;j++)
{if((uniao[0] != vet2[j]) && (uniao[1] != vet2[j]) && (uniao[2] != vet2[j]))
printf("%d ", vet2[j]);
}


getch();

}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Qual a pergunta?

não estava conseguindo o ver o vetor união corretamente sem repetição. mas ja consegui resolver venDo outros tópicos por aqui. agora meu problema é outro.

consigo achar o vetor união, mas nao consigo fazer com que o valores repitidos apareçam apenas uma vez.

 

#include <stdio.h>

#include <stdlib.h>

#include<conio.h>

 

 

int main (){

int vet1[10], vet2[10], i, j,l, uniao[20];

 

for (i = 0; i <10; i++){

printf ("digite o [%d] vetor 1: ", i);

scanf ("%d/n", &vet1);

}

for (j=0; j<10; j++){

printf ("digite o [%d] vetor 2: ", j);

scanf ("%d/n", &vet2[j]);

}

for(i = 0; i < 10; i++){

printf("\nvet1: ");

printf("%d ",vet1);

}

for(i = 0; i < 10; i++){

printf("\nvet2: ");

printf("%d ",vet2);

}

 

printf("\n\nA uniao e': ");

 

for(j=0;j<10;j++)

{if((uniao[0] != vet1[j]) && (uniao[1] != vet1[j]) && (uniao[2] != vet2[j]))

printf("%d ", vet1[j]);

}

for(i=0; i<l; i++) //1 ou 20

{printf("%d ",uniao);

}

 

for(j=0;j<10;j++)

{if((uniao[0] != vet2[j]) && (uniao[1] != vet2[j]) && (uniao[2] != vet2[j]))

printf("%d ", vet2[j]);

}

 

 

getch();

 

}

 

 

 

 

 

 

DUVIDA: COMO FAZER OS VALORES REPETIDOS APARECEREM APENAS UMA VEZ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

#include <stdio.h>
#include <string.h>

int has_element(int * array, int array_limit, int element) {
  for(int i=0; i < array_limit; i++) {
 	if (array[i] == element)
    	return i;
  }
  return -1;
}

void build_union_array(int * array, int array_limit, int element) {
  // Verificar se o array já possui o elemento.
  if (has_element(array, array_limit, element) == -1) {
 	// Encontrar a última posição vazia.
 	int i=0;
 	while (i < array_limit && array[i] != -1) i++;
 	if (i < array_limit)
    	target[i] = element;
  }
}

int main(void) {
  int v1[10] = {1,4,7,2,56,98,34,721,87,17};
  int v2[10] = {4,67,284,82,47,9,72,2,58,4};
  int v3[20];
  memset(v3, -1, 20 * sizeof(int)); // Isso serve p/ preencher toda a área de memória que v3 ocupa com o valor '-1' sem usar for.
  int i;

  for(i=0; i < 10; i++) {
 	build_union_array(v3, 20, v1[i]);
 	build_union_array(v3, 20, v2[i]);
  }

  // Impressão
  for(i=0;i < 20; i++) {
 	if (v3[i] != -1)
    	printf("%d ", v3[i]);
  }

  return 0;
}

 

Óbvio que tem a desvantagem de você não poder usar '-1' como dado p/ inserir no array.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Terá de testar se cada novo valor que você quer mostrar não é igual aos elementos anteriores do vetor, ou seja, terá de comparar a posição atual com todas as posições anteriores do vetor.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Aqui vou assumir que todos os n elementos de entrada são distintos (pior caso).

 

A forma simples de resolver é O(n^2), sendo a busca por um elemento (equivalente ao `has_element` da Isis) linear.

 

Basicamente, o problema a ser resolvido é o de construir um conjunto a partir de uma lista de valores potencialmente repetitivos, e depois construir um vetor com todos os elementos do conjunto. Isto pode ser feito em O(n).

 

Se você usar, para a criação do conjunto, estruturas de dados como heaps, árvores AVL, Red-Black ou B, a complexidade de tempo da construção é O(nlog n), que fica sendo a complexidade geral da solução.

 

Admitindo que pro seu conjunto de entrada exista uma função de hashing perfeita (injetora), a complexidade de tempo da criação do conjunto é O(n). A criação do vetor resultante também pode ser feita em O(n), que é, para este caso, a complexidade de tempo da solução.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.