Ir para conteúdo

POWERED BY:

Arquivado

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

ulfreitas

[Resolvido] uniao vetor

Recommended Posts

Boa tarde

Tenho duvida sobre o seguinte exercicio

Construa um algoritmo que permita informar dados para 2 vetores inteiros de 5 posiçoes e apresente o conjunto uniao dos vetores, ou seja, mostrar os elementos que existem em ambos os vetores sem repetição (cada numero pode aparecer uma unica vez no resultado).

 

Meu código funcionou, porem quando um numero se repete no mesmo vetor ele aparece 2 vezes.

algoritmo "semnome"
// Função :
// Autor : ulfreitas
// Data : 12/7/2011
// Seção de Declarações 
var
a, b : vetor[1..5] de inteiro
i, j : inteiro
inicio
// Seção de Comandos 
para i <- 1 ate 5 faca
    escreval("digite um numero inteiro para A")
    leia(a[i])
    escreval("digite um numero inteiro para B")
    leia(b[i])
fimpara
para i <- 1 ate 5 faca
    para j <- 1 ate 5 faca
         se a[i] = b[j] entao
            escreval(a[i])
         fimse
    fimpara
fimpara
fimalgoritmo

 

Como posso corrigir isso?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie um vetor C, ele irá auxiliar, assim na hora que for fazer a inserção nele, verifica se já existe ;D

 

[]s

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie um vetor C, ele irá auxiliar, assim na hora que for fazer a inserção nele, verifica se já existe ;D

 

[]s

Boa ideia quitZAUMMM, vo fazer a alteração depois posto aqui, valew pela dica

Compartilhar este post


Link para o post
Compartilhar em outros sites

quitZAUMMM, tentei fazer como você falou, fiz so o a parte que compara os valores digitados dentro do vetor A, testei aqui e funcionou, mas achei meio bagunçado. Voce poderia fazer do seu jeito para eu ver?

 

// Seção de Comandos 
para i <- 1 ate 5 faca
    escreval("digite um numero ")
    leia(a[i])
    para j <- 1 ate 5 faca
         enquanto a[i] = c[j] faca
                  escreval("Numero ja digitado, digite outro ")
                  leia(a[i])
         fimenquanto
    fimpara
    c[i] <- a[i]
fimpara
para i <- 1 ate 5 faca
    escreval(a[i])
fimpara
fimalgoritmo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom a lógica é assim:

 

Leia (vetorA); //claro foi exemplo, precisa fazer um loop e tal.

Leia (VetorB) e já verifica se esse valor está no vetorA, se tiver verifica se está no vetorC se não estiver adiciona.

 

Chego a entender?

 

[]s

Compartilhar este post


Link para o post
Compartilhar em outros sites

Leia (vetorA); //claro foi exemplo, precisa fazer um loop e tal.

Leia (VetorB) e já verifica se esse valor está no vetorA, se tiver verifica se está no vetorC se não estiver adiciona.

 

Depois é só mostrar o vetorC que já vai ser o conjunto união certo?

Se eu entendi direito seria algo assim?

 

var
a, b, c : vetor[1..5] de inteiro
i, j, k : inteiro
inicio
// Seção de Comandos
para i <- 1 ate 5 faca
    escreval("Digite um numero para o conjunto A")
    leia(a[i])
fimpara
para i <- 1 ate 5 faca
    escreval("Digite um numero para o conjunto B")
    leia(b[i])
    para j <- 1 ate 5 faca
         se (b[i] = a[j]) entao
            para k <- 1 ate 5 faca
                 se (b[i] <> c[k]) entao
                   c[i] <- b[i]
                 fimse
            fimpara
         fimse
    fimpara
fimpara
para i <- 1 ate 5 faca
    escreval(c[i])
fimpara
fimalgoritmo

 

Só q ta dando erro, se tiver dois numeros iguais no vetorB ele aparece repetido no vetorC, e acho q da forma q montei ele pode acabar pulando alguma posição no vetorC ficando vazio, o q você acha?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Aqui está minha implementação em C:

 

#include <stdio.h>

#define TAMANHO(vetor) (sizeof vetor / sizeof *vetor)
#define INIT           0


// Retorna o último índice do vetor manipulado após
// a inserção (ou não) do elemento dado

unsigned int inserir(int elemento, int vetor[])
{
   static unsigned int indice_uniao;
   int i;

   for (i = 0; i <= indice_uniao; i++)
       if (vetor[i] == elemento)
           return (indice_uniao == 0 && elemento == INIT) ? indice_uniao++ : indice_uniao;

   vetor[ indice_uniao++ ] = elemento;
   return indice_uniao;
}

int main(void)
{
   int vetor_1[] = { 0, 1, 2, 3, 4 },
       vetor_2[] = { 3, 4, 5, 6, 7 },
       uniao[ TAMANHO(vetor_1) + TAMANHO(vetor_2) ] = { INIT },
       i,
       ultimo_indice;

   for (i = 0; i < TAMANHO(vetor_1); i++)
       ultimo_indice = inserir(vetor_1[i], uniao);

   for (i = 0; i < TAMANHO(vetor_2); i++)
       ultimo_indice = inserir(vetor_2[i], uniao);

   for (i = 0; i < ultimo_indice - 1; i++)
       printf("%d, ", uniao[i]);
   printf("%d.", uniao[i]);

   return 0;
}

 

Para o caso especial em que o vetor uniao está vazio e o elemento a ser inserido tem mesmo valor que o usado nas inicializações do vetor uniao, a função de inserção deve incrementar seu contador de elementos, caso contrário o elemento em questão será apagado na próxima inserção. Esta é a desvantagem da implementação em C, que ocorre em conseqüência da minha vontade de eliminar do código a condição de que nenhum dos vetores sobre os quais operamos possuam elementos com mesmo valor que o de inicialização. Não dediquei muito tempo à resolução do problema, portanto se alguém tiver alguma idéia melhor que não torne o código dependente de algum valor indicando vazio, por favor compartilhem.

 

As vantagens da implementação são duas:

 

1. A função de inserção não percorre o vetor todo a cada chamada - apenas considera a quantidade de elementos atualmente no vetor resultado (uniao);

 

2. O programa pode ser facilmente adaptado para uniões de mais vetores;

 

 

Aos que forem brincar com o código, tomar cuidado com o fato de que, em inicializações de vetores, cada elemento cujo valor não é especificado é inicializado como se tivesse static storage (neste caso, recebem valor 0), ao invés do que pode parecer dada a inicialização de uniao via { INIT }. Exemplos:

 

int vetor[30] = { 0 }; // 30 posições contendo 0
int vetor[30] = { 1 }; // primeira posição contendo 1, as outras 29 contendo 0

Compartilhar este post


Link para o post
Compartilhar em outros sites

guidjos obrigado, ainda nao tive tempo mas vou dar uma olhada no codigo.

Johnny eu vi meio por cima o problema com algoritmo, é bem parecido, a diferença é q o meu tem q mostrar apenas os q se repetem, mas vou analisar o codigo q você forneceu tambem e ver o q eu consigo adaptar obrigado

 

Depois eu posto o resultado ;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ae Ulysses, bom cara eu achei uma forma de resolver esse seu problema não sei se é a melhor,não dediquei muito tempo, de qualquer maneira vou postar dê uma olhada e se achar melhor mude o codigo e poste ai pra galera :D

 

algoritmo "Uniao vetor"
// Função :
// Autor : Johnny Willer Gasperi Gonçalves
// Data : 11/08/2011
// Seção de Declarações 

var
vet_a, vet_b, vet_c: vetor [1..25] de inteiro
x, y, i: inteiro
terminado: logico

inicio
// Seção de Comandos 
para i de 1 ate 5 faca
    escrevaL (" Digite o ", i, "º número para o Vetor A")
    leia (vet_a[i])
    escrevaL (" Digite o ", i, "º número para o Vetor B")
    leia (vet_b[i])
fimpara
i <- 1
y <- 1
x <- 1

enquanto terminado = falso faca
    se vet_a[i] = vet_b[x] entao
       vet_c[y] <- vet_a[i]
       y <- y + 1
    fimse
    i <- i + 1
    se i > 5 entao
       i <- 1
       x <- x + 1
    fimse
    se x > 5 entao
       terminado <- verdadeiro
    fimse
fimenquanto
x <- 5
y <- 1
terminado <- falso
enquanto terminado = falso faca
        para i de 1 ate x faca
             se vet_c[y + i] = vet_c[y] entao
                vet_c[y + i] <- 0
             fimse
             se i = x entao
                y <- y + 1
                x <- x - 1
             fimse
             se y > 5 entao
                terminado <- verdadeiro
             fimse
        fimpara
fimenquanto

escrevaL ("---------------------- VETOR A ----------------------")

para i de 1 ate 5 faca
    escreva (vet_a[i], "  ")
fimpara

escrevaL ("")
escrevaL ("")
escrevaL ("---------------------- VETOR B ----------------------")

para i de 1 ate 5 faca
    escreva (vet_b[i], "  ")
fimpara

escrevaL ("")
escrevaL ("")
escrevaL ("---------------------- VETOR C ----------------------")

para i de 1 ate 5 faca
   se vet_c[i] <> 0 entao
       escreva (vet_c[i], "  ")
   fimse
fimpara



fimalgoritmo

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.