Ir ao conteúdo
  • Cadastre-se
YgorCFR

União de vetores por alocação dinâmica.

Recommended Posts

Boa tarde, poderiam me ajudar com uma questão relacionada à alocação dinâmica com união de dois vetores? Esta é a questão:

2) Considere dois vetores de inteiros organizados em ordem crescente. Dentro de cada vetor não há

valores repetidos, mas entre eles pode haver coincidências de valores. Por exemplo, v1 = {1, 3, 5, 9,

12, 16, 23} e v2 = {1, 2, 6, 7, 9, 15, 21, 25}. Escreva uma função que crie um novo vetor contendo

o conjunto de números inteiros definido pela união dos dois conjuntos originais, também em ordem

crescente. Por exemplo, o vetor u = {1, 2, 3, 5, 6, 7, 9, 12, 15, 16, 21, 23, 25} corresponde à união

de v1 e v2. A função recebe como parâmetros o ponteiro e o tamanho de cada vetor e ponteiro p. A

função deve alocar dinamicamente o novo vetor, armazenar o seu tamanho na variável apontada por

p e retornar o ponteiro para o início do vetor. O protótipo da função é:

int* uniao(int* v1, int n, int* v2, int m, int *p);

 

A solução que eu achei e criei foi: 

 

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

int* uniao(int* v1, int n, int* v2, int m, int *p){
    int i, j, cont;
    for(i = 0; i<n;++i){
        for(j=0;j<m;++j){
            if(v1!= v2[j])
                cont++;
        }
    }
    int x = cont + n;
    int *uniao;
    uniao = (int*)malloc(x*sizeof(int));
    int z=0;
    for(i=0; i<n;++i){
        for(j=0;j<m;++j){
            while(z<x){
                v1= uniao[z];
                z++;
                v2[j] = uniao[z];
            }
        }

    }

    *p = x;
    return p;
}

int main(){
    int n, m;
    printf("Digite o valor de n e m: \n");
    scanf("%d %d", &n, &m);
    int i, j;
    int v1[n], v2[m];
    for(i=0;i<n;++i){
        printf("Elemento %d: \n",i);
        scanf("%d", &v1);
    }
    for(j=0;j<m;++j){
        printf("Elemento %d: \n", j);
        scanf("%d", &v2[j]);
    }
    int *p;
    int* unir = uniao(v1,n,v2,m,p);
    printf("A uniao tera tamanho de %d", unir);
    return 0;
}
*/

 

Mesmo compilando, o programa dá erro durante a execução após a entradas dos valores nos dois vetores, poderiam me ajudar?

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@YgorCFR        seu código está bom, mas ele está dando erro porque você não zerou

a variável cont, mas além disso ele não está calculando certo o tamanho de união.

Então modifiquei o código e acrescentei algumas linhas, então ele ficou assim :

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
int* uniao(int* v1, int n, int* v2, int m, int *p){
    int h=0,g,i,j,k,q,w=0,cont=0;
    int v3[n+m];
    for(i=0;i<n;i++){     /*coloca numeros de v1 em v3*/
        v3[i]=v1[i];
        if(v1[i]==0){w=1;}/*se tiver zero em v1*/
    }
    for(j=0;j<m;j++){     /*coloca numeros de v2 em v3*/
        v3[i]=v2[j];
        if(v2[j]==0){w=1;} /*se tiver zero em v2*/
        i++;
    }
    for(j=0;j<i-1;j++){   /*verifica numeros repetidos*/
        for(k=0;k<i-1;k++){
            if(k!=j){
                if(v3[j]==v3[k]){
                    v3[j]=0;   /*deleta numeros repetidos*/
                }
            }
        }
    }
    for(j=0;j<i-1;j++){   /*coloca em ordem crescente*/
        for(k=j+1;k<i;k++){
            if(v3[j]>v3[k]){
                q=v3[j];
                v3[j]=v3[k];
                v3[k]=q;
            }
        }
    }
    for(k=0;k<i;k++){
        if(v3[k]!=0){h++;} /*ver o tamanho de uniao*/
    }
    g=0;
    if(w==1){h++;}
    int x = h;
    int *uniao;
    uniao = (int*)malloc(x*sizeof(int));
    if(w==1){uniao[0]=0;g=1;}
    h=g;
    for(k=g;k<i;k++){
        if(v3[k]!=0){
            uniao[h]=v3[k];
            h++;
        }
    }
    if(w==1){printf("valor de uniao 0\n");}
    for(k=g;k<h;k++){
        if(uniao[k]!=0){
          printf("valor de uniao %d \n",uniao[k]);
        }
    }
    printf("\n");
    *p = x;
    return *p;
}
int main(void){
    int n, m;
    printf("Digite a Quantidade De Numeros em N: ");
    scanf("%d" , &n);
    printf("\n");
    printf("Digite a Quantidade De Numeros em M: ");
    scanf("%d",&m);
    int i, j;
    int v1[n], v2[m];
    for(i=0;i<n;++i){
        printf("%d - Elemento em v1 --> : ",i+1);
        scanf("%d", &v1[i]);
    }
    printf("\n");
    for(j=0;j<m;++j){
        printf("%d - Elemento em v2 --> : ", j+1);
        scanf("%d", &v2[j]);
    }
    int p;
    int* unir = uniao(v1,n,v2,m,p);
    printf("\n A uniao tera tamanho de %d", unir);
    getch();
    return 0;
}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro 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 publicações 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

×