Ir ao conteúdo
  • Cadastre-se
Josesousa

C Unir vetores por meio de recursividade

Recommended Posts

Olá, bom dia.

 

Estava a resolver um exercicio proposto pelo professor (na verdade como comecamos a materia agora ele iria resolver para nos ensinar, so que ele nao conseguiu encontrar o erro que tinha no seu codigo, aliás nem rodou). Pois bem, eu tentei resolver o problema da mesma forma que resolveria se nao pedisse recursividade, a diferença seria que no caso teria dois if, porém nao da certo quando faco dessa forma.

 

Entao, tentei fazer num if apenas, porém está apresentando problemas na hora de unir os vetores. Não sei bem o que esta acontecendo, sei que algumas posições do vetor é preenchido por lixo na memoria.

 

(Se puderem me ajudar no que eu coloco no primeiro if , agradeceria. Fico na dúvida no que ponho pois sem recursividade não precisamos testar nada)

 

Segue o código:

 


#include <stdio.h>
#include <stdlib.h>
int unir(int *vet1, int *vet2, int *vet3, int tam1, int tam2, int l, int m);
main(){
    int tam1, tam2, i;
    printf("Qual o tamanho do vetor 1: ");scanf("%d", &tam1);
    printf("Qual o tamanho do vetor 2: ");scanf("%d", &tam2);

    int  *vet1, *vet2, *vet3;

    vet1 = (int *) malloc(tam1*sizeof(int *));
    vet2 = (int *) malloc(tam2*sizeof(int *));
    vet3 = (int *) malloc((tam1+tam2) * sizeof(int *));

    printf("\nPrencha agora o vetor 1.\n");
    for(i=0;i<tam1;i++){
        printf("Vetor [%d]: ",i); scanf("%d", &vet1[i]);
    }
    printf("\nPrencha agora o vetor 2.\n");
    for(i=0;i<tam2;i++){
        printf("Vetor [%d]: ",i); scanf("%d", &vet2[i]);
    }

    int l,m; l=0,m=tam1-1;

    unir(vet1, vet2, vet3, tam1-1, tam2-1, l,m);

    printf("\nAgora serao impressos o vetor 3.\n");
    for(i=0;i<tam2+tam1;i++){
        printf("Vetor [%d]: %d.\n",i,vet3[i]);
    }
}
int unir(int *vet1, int *vet2, int *vet3, int tam1, int tam2, int l, int m){
    int i, a=tam2, b=tam1, j=0;
    if(i==0){  /// O QUE EU PONHO AQUI?????, coloquei i == 0, pois sei que é falso. Pelo menos assim esta rodando, o que
      /// nao acontece se eu colocasse tam1==0 && tam2==0. 

    }
    /*else if(tam1>0){
        vet3[l]=vet1[l];
        //vet3[tam2]=vet2[tam2];
        vet3[m]=vet2[l];
        return unir(vet1, vet2, vet3, tam1, tam2, l+1, m+1); /// A um erro Aqui
    }*/
    else if(tam1!=0){
        vet3[l] = vet1[l];
        vet3[m] = vet2[l];
        unir(vet1, vet2, vet3, tam1, tam2, l+1, m+1);
    }

}

 

 

Editado por Josesousa

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá, tudo bem?

 

Mais o que é união de vetores, já vi que não é mesmo que união de conjuntos.

 

Eu não sei se entendi o conceito de união, a partir do código, porém ao que me consta é uma soma dos elementos. Ou seja, dados A =  {1 , 2, 3, 4, 5}, e B =  {6, 7, 8, 9, 10}. A união de A com B é igual a A + B =  {1...5, 6...10}. É isso?

 

O.k ?!

Editado por AnsiC
  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@AnsiCSim, é isso. Acho que seria juntar os dois vetore em um só, que no caso seria o vetor 3.

 

E no exercicio pede para desconsiderar a existencia de numeros reperidos no vetor. Que facilita a vida. 

Mas estou tendo problemas de lixo de memoria em algumas posições.

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

...

Então, observe se escrito desta forma faz um pouco mais de sentido, para mim fez.

/**2. Escreva as funções recursivas que unem dois (arrays), sem elementos repetidos,
classificadas considerando que as duas listas não têm elementos em comum.*/

int unir (int *, int *, int *, int, int, int, int);

int main (void)
      {
      int tam1, tam2, i;
      printf("Qual o tamanho do vetor 1: ");  scanf(" %d", &tam1);
      printf("Qual o tamanho do vetor 2: ");  scanf(" %d", &tam2);
    
      int  *vet1, *vet2, *vet3;
      vet1 =  (int *) malloc (sizeof (int) * tam1);
      vet2 =  (int *) malloc (sizeof (int) * tam2);
      vet3 =  (int *) malloc (sizeof (int) * (tam1 + tam2));

      printf ("\nPrencha agora o vetor 1.\n");
      for(i =  0; i  <  tam1; ++ i)
            {
            printf("Vetor [%d]: ", i);  scanf (" %d", &vet1[i]);
            }
      
      printf ("\nPrencha agora o vetor 2.\n");
      for(i =  0; i  <  tam2; ++ i)
            {
            printf("Vetor [%d]: ", i);  scanf (" %d", &vet2[i]);
            }

      int l, m; l =  0, m =  0;
      unir (vet1, vet2, vet3, tam1, tam2, l, m);

      printf("\nAgora serao impressos o vetor 3.\n");
      for(i =  0; i  <  tam2 + tam1; ++ i)
            {
            printf("Vetor [%d]: %d.\n",i,vet3[i]);
            }
      return 0;
      }


int unir (int *vet1, int *vet2, int *vet3, int tam1, int tam2, int i1, int i2)
      {
      if (i1  <  tam1)
            {
            vet3[i1] =  vet1[i1];
            unir (vet1, vet2, vet3, tam1, tam2, i1 + 1, i2);
            }
      else 
      if (i2  <  tam2)
            {
            vet3[i1 + i2] = vet2[i2];
            unir (vet1, vet2, vet3, tam1, tam2, i1, i2 + 1);
            }
      else 
      if((tam1 + tam2)  ==  (i1 + i2))
            {
            return 1;
            }
      return 0;
      }

 

O.k. !?

  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
54 minutos atrás, AnsiC disse:

if (i2 < tam2) {

vet3[i1 + i2] = vet2[i2];

unir (vet1, vet2, vet3, tam1, tam2, i1, i2 + 1);

}

Nessa parte , o vetor 3 será preenchido depois ja esta ter sido totalmente preenchido com o vetor 1.

Ai o i1 tem o valor do vetor 1, e na hora de preenchar o vetor 3 comecar daí em diante. É isso?

 

(O meu tava bem diferente, hein!?!, Ia da certo nunca (talvez desse). Estava tentando seguir a mesma logica de quando é sem recursão)

 

Valeu! :)

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
17 minutos atrás, Josesousa disse:

É isso?

... Exatamente, isso mesmo. É bem mais fácil de entender ou não é?.

 

 

E me perdi nas linhas do raciocínio do código original. 

Ficou difícil descifrar as intensões nas entrelinhas do algoritmo. Ainda sim, de fato, talvez com pouco mais de trabalho; tempo e vontade. Você, somente você, chegaria a resolver daquela forma.

 

O.k. Valeu !!!

 

 

Editado por AnsiC
  • Curtir 1

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

×