Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
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






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

×