Ir ao conteúdo
  • Cadastre-se

C União de dois conjuntos (vetores)


blvsman

Posts recomendados

Olá, estou fazendo uma função onde recebe dois conjuntos A e B e o número de elementos que cada um possui. O que eu quero é a união desses dois conjuntos. Estou com dois probleminhas:

1° eu quero printar a união dos dois conjuntos, só que sem números repetidos, caso haja 2 números iguais nos 2 conjuntos (não estou conseguindo fazer isso)

2° na hora de printar o conjunto uniao. ele está dando lixo de memória (números aleatórios) 

 

Citação

 

Exemplo: A = { 1, 2, 3} e B = { 1, 2, 4}

A união seria U = {1, 2 ,3, 4}, só que ao invés disso está saindo U = { 1, 2, 3, 9831024, 2}

 

void uniao(int conjuntoA[], int conjuntoB[], int nelementosA, int nelementosB){
    int uniao[60];
    int cont;
    cont = 0;

    for(int i = 0; i < nelementosA; i++){
         uniao[i] = conjuntoA[i]; // passando o conjunto A para o conjunto uniao
         cont++; // contador para saber quantos elementos terão no conjunto uniao
     }
                                   
    for(int i = 0; i < nelementosB; i++){
         uniao[i + cont] = conjuntoB[i]; // passando o conjunto B para o conjunto uniao
         cont++; // novamente, contador para saber quantos elementos terão no conjunto uniao
     }

    for(int i = 0; i < cont; i++){
         printf("%d ", uniao[i]);
     }
    printf("\n");
    
    return;
 }

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

#include <stdio.h>
#include <math.h>
 
void uniao(int conjuntoA[], int conjuntoB[], int nelementosA, int nelementosB){
    int uniao[60];
    int cont;
    cont = 0;

    for(int i = 0; i < nelementosA; i++){
         uniao[i] = conjuntoA[i];
         cont++;
     }
    for(int i = 0; i < nelementosB; i++){
         uniao[i + cont] = conjuntoB[i];
         cont++;
     }
    for(int i = 0; i < cont; i++){
         printf("%d ", uniao[i]);
     }
    printf("\n");
    
    return;
 }
                            
 int main(){
     int conjA, conjB;
     int elementosA[29], elementosB[29];

     scanf("%d", &conjA);
    // lendo os elementos de A
     for(int i = 0; i < conjA; i++){
         scanf("%d", &elementosA[i]);
     }
     
     scanf("%d", &conjB);
    // lendo os elementos de B
     for(int j = 0; j < conjB; j++){
         scanf("%d", &elementosB[j]);
     }

    uniao(elementosA, elementosB, conjA, conjB);
    

    return 0;
 }

 

 

Link para o comentário
Compartilhar em outros sites

#include <stdio.h>
#include <math.h>
 
void uniao(int conjuntoA[], int conjuntoB[], int nelementosA, int nelementosB){
    int uniao[60];
    int total=nelementosA+nelementosB;
    printf("total elementos: %d\n",total);

for (int i=0;i<total;i++)
	uniao[i] = conjuntoA[i];

for (int i=0;i<total;i++)
	uniao[i+nelementosA] = conjuntoB[i];

    for(int x = 0; x<total; x++){
         printf("%d ", uniao[x]);
     }
    printf("\n");
    
    return;
 }
                            
 int main(){
     int conjA, conjB;
     int elementosA[29], elementosB[29];
	printf("quantos elementos em a?");
     scanf("%d", &conjA);
    // lendo os elementos de A
     for(int i = 0; i < conjA; i++){
	
     printf("elemento %d de a?",i+1);
         scanf("%d", &elementosA[i]);
          }
     
     printf("quantos elementos em b?");
     scanf("%d", &conjB);
    // lendo os elementos de B
     for(int j = 0; j < conjB; j++){
     printf("elemento %d de a?",j+1);
         scanf("%d", &elementosB[j]);
 }

    uniao(elementosA, elementosB, conjA, conjB);
    

    return 0;
 }

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Você abriu outro tópico com o mesmo problema. 

 

Entenda que se quer a união de A e B só para imprimir não precisar colocar em A...

    for(int i = 0; i < nelementosB; i++){
         uniao[i + cont] = conjuntoB[i];
         cont++;
     }

Mas se vai colocar provavelmente não vai querer colocar na união elementos duplicados então deve fazer como faria no papel: para cada elemento de B compara com todos de A e se não estiver lá, e apenas nesse caso, coloca na união.

 

Entenda que se vai só imprimir pode imprimir assim que descobrir cada elemento que faz parte da união. Ainda mais que como declarou um vetor de união --- que não está usando na verdade --- dentro da função, assim que você retornar de uniao() esse vetor vai sumir para sempre. Então pra que gravar afinal ?

 

E se vai usar retorne o endereço dele e o total, mudando os argumentos da função.

 

Com esse número de elementos não perca seu tempo colocando em ordem. Pra valer a pena hoje em dia teria que ter ao menos uns 1000 int em cada vetor. Os processadores de hoje em dia são muito muito rápidos em comparar int em vetores na memória então chamar funções e ficar trocando e comparando não faz sentido. Muito menos se vai usar um printf() para cada item depois.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

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