Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

thinkabout

[Resolvido] - O número faz parte do vector ? - (intersecção de A com B), (reunião de A com B) e A – B

Mensagens Recomendadas

thinkabout

Boas Pessoal,

O meu problema para já, é conseguir que ele faça a comparação a ver se o número pertence ao vector ao não.

Também já tentei andar com a, mas não consegui ter o output desejado.


#include<stdio.h>

/*

Um vector pode servir para representar conjuntos de números inteiros. Considerando que o
domínio é [0, 9], um vector de 10 elementos pode indicar quando é que cada um dos
números pertence ou não a um determinado conjunto. Para isso, basta colocar o valor de a[i]
a 0 se o elemento i não fizer parte do conjunto e a[i] a 1, se i fizer parte do conjunto.

O vector
1 0 1 1 0 1 1 1 0 0

indica que os elementos 0, 2, 3, 5, 6, 7 fazem parte do conjunto especificado pelo vector.
Desenvolva um programa que, após obter e armazenar dois conjuntos A, B com domínio
[0, 9], calcule as seguintes operações: A B (intersecção de A com B), A B (reunião de
A com B) e A – B (elementos de A que não pertencem a B).
*/

main()
{
int i,j,c;
int comum[10] = {0,1,2,3,4,5,6,7,8,9};
int a[3];



for (j = 0; j < 3; j++)
{
printf("Quais os elementos do conjunto A ?\n" );
scanf("%d" , &a[j]);
}

for (i = 0; i < 10; i++)
{
for (j = 0; j < 3; j++)
{
if (a[j] == comum[i])
printf("O elemento %d pertence ao vector \n", a[j] );
else
printf("O elemento %d nao pertence ao vector \n", a[j] );
}
}

}

}

Editado por thinkabout

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg

Quando fazes ciclos for dentro um do outro, o numero total de instrucoes executadas dentro do ciclo interior é a multiplicacao do numero de ciclos de cada for.

No teu caso acima é 10 * 3 ou seja 30.

Vais executar o if 30 vezes.

De cada uma dessas vezes vais imprimir ou que pertence ou que nao pertence ...

... mas se o vector tem 3 elementos estas a imprimir vezes de mais.

Sugestoes:

(1) troca a ordem dos ciclos

(2) passa a(s) instrucao(oes) de print para fora do ciclo interior

(3) o ciclo interior serve apenas para comparar valores


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
polska

O programa corre direitinho, o problema ai é que um número do vector a , mesmo que pertença ao vector comum, o programa vai dizer que não pertence e mais tarde que pertence, ou vice-versa.... Isto porque estás a comparar os números mais vezes do que o necessário.

Troca os ciclos for, e pára de percorrer o for interior mal encontres o número, caso seja comum.

Editado por polska

Corrige um sábio e ele mais sábio ficará. Corrige um ignorante e um inimigo ganharás.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
thinkabout

Penso que a primeira parte está, agora tenho que ir ver o restante problema.

main()
{
int i,j;
int comum[10] = {0,1,2,3,4,5,6,7,8,9};
int a[3];

for (j = 0; j < 3; j++)
{
printf("Quais os elementos do conjunto A ?\n" );
scanf("%d" , &a[j]);
}
for (j = 0; j < 3; j++)
{
for (i = 0; i < 10; i++)
{
if (a[j] == comum[i])
break;
}

if (a[j] == comum[i])
printf("O elemento %d pertence ao vector \n",a[j]);
else
printf("O elemento %d nao pertence ao vector \n",a[j]);
}
}

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
polska

QUal é o restante do problema? Não entendi :b

Editado por polska

Corrige um sábio e ele mais sábio ficará. Corrige um ignorante e um inimigo ganharás.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
thinkabout

(intersecção de A com B), (reunião de A com B) e A – B , no 1 post vê o comentário do código.

Editado por thinkabout

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg

Se nao tiver sido encontrado um elemento com o mesmo valor, no fim do ciclo interior a variavel i tem o valor 10 ... e aceder ao elemento comum[10] (na segunda comparacao) é ilegal.

Tens que rever a maneira de verificar se o elemento existe no array.

Hint: usa uma variavel temporaria auxiliar.


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
thinkabout

Se nao tiver sido encontrado um elemento com o mesmo valor, no fim do ciclo interior a variavel i tem o valor 10 ... e aceder ao elemento comum[10] (na segunda comparacao) é ilegal.

Tens que rever a maneira de verificar se o elemento existe no array.

Hint: usa uma variavel temporaria auxiliar.

Não entendi, a comparação com o vector A está a funcionar pelo menos das vezes que tentei.

Output

Quais os elementos do conjunto A ?
4
2
44

O elemento 4 pertence ao vector A
O elemento 2 pertence ao vector A
O elemento 44 nao pertence ao vector A
Press any key to continue . . .

Editado por thinkabout

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
polska

Se nao tiver sido encontrado um elemento com o mesmo valor, no fim do ciclo interior a variavel i tem o valor 10 ... e aceder ao elemento comum[10] (na segunda comparacao) é ilegal.

Tens que rever a maneira de verificar se o elemento existe no array.

Hint: usa uma variavel temporaria auxiliar.

A variável i não incrementa para 10, ou estou errado ?

EDIT: Tens razão, não estava a perceber.. Se não encontrar vai incrementar..

Não entendi, a comparação com o vector A está a funcionar pelo menos das vezes que tentei.

Output

Quais os elementos do conjunto A ?
4
2
44

O elemento 4 pertence ao vector A
O elemento 2 pertence ao vector A
O elemento 44 nao pertence ao vector A
Press any key to continue . . .

Ao procurares valores que não estejam no vector comum, por exemplo 20.. o i atinge o valor 10, e depois a comparação não é válida porque o teu vector comum só tem 9 posições.. Por acaso o output vai sair correcto penso, mas está mal fazer assim né.. :D

Editado por polska

Corrige um sábio e ele mais sábio ficará. Corrige um ignorante e um inimigo ganharás.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
thinkabout

Já tentei por exemplo o 44, e deu ok

Ve o output

Quais os elementos do conjunto A ?
4
2
44
O elemento 4 pertence ao vector A
O elemento 2 pertence ao vector A
O elemento 44 nao pertence ao vector A

Editado por thinkabout

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg

O problema é que a comparacao vai aceder a um elemento invalido.

Experimenta o printf antes do if ...

for (j = 0; j < 3; j++)
{
   for (i = 0; i < 10; i++)
   {
       if (a[j] == comum[i])
           break;
   }

   printf("a tentar aceder a a[%d] e comum[%d] ...\n", j, i);
   if (a[j] == comum[i])
       printf("O elemento %d pertence ao vector \n",a[j]);
   else
       printf("O elemento %d nao pertence ao vector \n",a[j]);
}

Editado por pmg

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
polska

Já tentei por exemplo o 44, e deu ok

Ve o output

Quais os elementos do conjunto A ?
4
2
44
O elemento 4 pertence ao vector A
O elemento 2 pertence ao vector A
O elemento 44 nao pertence ao vector A

Foi o que eu disse, tinha razão... Mas está incorrecto fazer desta maneira...

Tu procuras o valor 44, o ciclo for não encontra e então o i atinge o valor 10 correcto?

Se isto acontece o que depois estas a fazer é uma comparação assim: (a[j] == comum[10])

Mas o teu vector comum só tem 9 posições, só podes aceder a posição comum[9] , não a comum[10], logo estás a fazer uma comparação inválida..

Tenta um printf de: comum[10] ...

Editado por polska

Corrige um sábio e ele mais sábio ficará. Corrige um ignorante e um inimigo ganharás.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
thinkabout

Já entendi. Logo o i = 10, é descartável.

printf("O elemento %d nao pertence ao vector A\n",comum[10]);
printf("O elemento %d nao pertence ao vector A\n",comum[9]);


Output

O elemento -858993460 nao pertence ao vector A
O elemento 9 nao pertence ao vector A

Obrigado

Editado por thinkabout

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg
Mas o teu vector comum só tem 9 posições

Hmmm, de facto tem 10 posicoes. Os indices das 10 posicoes vao de 0 a 9 inclusive. O indice mais alto que se pode usar é 9.

int comum[10];

comum[0] // ok
comum[1] // ok
...
comum[9] // ok

Editado por pmg

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
polska

Hmmm, de facto tem 10 posicoes. Os indices das 10 posicoes vao de 0 a 9 inclusive. O indice mais alto que se pode usar é 9.

int comum[10];

comum[0] // ok
comum[1] // ok
...
comum[9] // ok

Sim, com as posições queria-me referir aos indices :) , mas obrigado pela correcção :thumbsup:


Corrige um sábio e ele mais sábio ficará. Corrige um ignorante e um inimigo ganharás.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
thinkabout

Agradeço ideias para melhoramento :)

main()
{
int i,j;
int comum[10] = {0,1,2,3,4,5,6,7,8,9};
int auxa[10]  = {0,0,0,0,0,0,0,0,0,0} ,auxb[10]  = {0,0,0,0,0,0,0,0,0,0};
int a[3],b[3];

printf("Quais os elementos do conjunto A ?\n" );
for (j = 0; j < 3; j++)
{
scanf("%d" , &a[j]);
}

printf("Quais os elementos do conjunto B ?\n" );
for (i = 0; i < 3; i++)
{
scanf("%d" , &b[i]);
}

for (j = 0; j < 3; j++)
{
for (i = 0; i <= 9; i++)
{
if (a[j] == comum[i])
 auxa[i]=1;

if (b[j] == comum[i])
 auxb[i]=1;
}
}
puts("\n");
for (i = 0; i <=9; i++)
{
printf("%d ",auxa[i]);
}
puts("\n");
for (i = 0; i <=9; i++)
{
printf("%d ",auxb[i]);
}

puts("\n\nA reunido com B");
for (i = 0; i <= 9; i++)
{
if (auxa[i] == 1 || auxb[i] == 1  )
 {
  printf("%d " , comum[i]);
 }
}
puts("\n\nInterseccao de A com B");
for (i = 0; i <= 9; i++)
{
if (auxa[i] == 1 && auxb[i] == 1  )
 {
  printf("%d " , comum[i]);
 }
}

puts("\n\nA - B ");
for (i = 0; i <= 9; i++)
{
if (auxa[i] == 1 - auxb[i] == 1  )
 {
  printf("%d " , comum[i]);
 }
}
puts("\n");
}

Output

Quais os elementos do conjunto A ?

22

1

2

Quais os elementos do conjunto B ?

2

3

4

0 1 1 0 0 0 0 0 0 0

0 0 1 1 1 0 0 0 0 0

A reunido com B

1 2 3 4

Interseccao de A com B

2

A - B

1 3 4

Press any key to continue . . .

Editado por thinkabout

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg
Agradeço ideias para melhoramento
if (auxa[i] == 1 - auxb[i] == 1  )
 {
  printf("%d " , comum[i]);
 }

Hmmmm ... grande Hmmmm!

Isto esta certo. Faz o que eu acho que tu queres.

mas o resultado nao é o pedido, pois nao?

Se A tem 1, e 2 como é que A-B tem 3 e 4? ???

E AINDA: mas tu percebes o que isto faz?

Sugestao: escreve a condicao de outra forma. Nao mistures operadores condicionais (o ==) com operadores aritmeticos (o menos)


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
thinkabout

Hmmmm ... grande Hmmmm!

Isto esta certo. Faz o que eu acho que tu queres.

mas o resultado nao é o pedido, pois nao?

Se A tem 1, e 2 como é que A-B tem 3 e 4? ???

E AINDA: mas tu percebes o que isto faz?

Sugestao: escreve a condicao de outra forma. Nao mistures operadores condicionais (o ==) com operadores aritmeticos (o menos)

E não foi fácil entender confesso.

puts("\n\nA - B ");
for (i = 0; i <= 9; i++)
{
if (auxa[i] == 1 && auxb[i] == 0 )
{
printf("%d " , comum[i]);
}
}
puts("\n");

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

não vou comentar o teu código, porque pareceu demasiado complicado para perceber (arrays auxiliares ?)

mas se dizes que está bem, ok, vou acreditar

a minha solução:

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

#define LIST_SIZE 4

void output(int *list, int size)
{
   int i;

   for (i = 0; i < size; i++)
   {
       printf("%d ", list[i]);
   }
   printf("\n");
}

int compare (const void * a, const void * b)
{
   return (*(int*)a - *(int*)b);
}

int main()
{
   int a[] = {5, 3, 8, 4};
   int b[] = {9, 4, 5, 6};
   int a_iter, b_iter;

   int res_union[list_SIZE * 2], res_union_count = 0;
   int res_inter[list_SIZE],     res_inter_count = 0;
   int res_sub[list_SIZE],       res_sub_count = 0;

   /*
    * ordenar os arrays
    *
    * ISTO É FUNDAMENTAL PARA OS ALGORITMOS IMPLEMENTADOS A SEGUIR
    */
   qsort (a, LIST_SIZE, sizeof(int), compare);
   qsort (b, LIST_SIZE, sizeof(int), compare);

   printf("Lista A : ");
   output(a, LIST_SIZE);

   printf("Lista B : ");
   output(b, LIST_SIZE);

   printf("\n");

   /* ciclo de uniao dos dois arrays */
   for (a_iter = 0, b_iter = 0;                             // iniciar os iteradores dos arrays
        a_iter < LIST_SIZE || b_iter < LIST_SIZE;           // enquanto houver elementos em algum dos arrays
       )
   {
       if (b_iter == LIST_SIZE ||                           // se ja nao existir mais elementos do array B
           (a_iter < LIST_SIZE && a[a_iter] < b[b_iter]))   // ou se existir elementos do array A e se o elemento iterado em A for menor que o elemento iterado em B
       {
           /* verificar se não é para repetir o elemento */
           if (res_union[res_union_count - 1] != a[a_iter])
           {
               /* inserir o elemento de A */
               res_union[res_union_count] = a[a_iter];
               res_union_count++;
           }

           /* iterar os elementos de A */
           a_iter++;
       }
       else
       {
           /* verificar se não é para repetir o elemento */
           if (res_union[res_union_count - 1] != b[b_iter])
           {
               /* inserir o elemento de B */
               res_union[res_union_count] = b[b_iter];
               res_union_count++;
           }

           /* iterar os elementos de B */
           b_iter++;
       }
   }
   printf("Resultado A ou B : ");
   output(res_union, res_union_count);

   /* ciclo de interseccao dos dois arrays */
   for (a_iter = 0, b_iter = 0;                             // iniciar os iteradores dos arrays
        a_iter < LIST_SIZE && b_iter < LIST_SIZE;           // enquanto houver elementos nos dois arrays
       )
   {
       /* se o elemento iterado dos dois arrays for igual */
       if (a[a_iter] == b[b_iter])
       {
           /* verificar se não é para repetir o elemento */
           if (res_inter[res_inter_count - 1] != a[a_iter])
           {
               /* inserir o elemento de A */
               res_inter[res_inter_count] = a[a_iter];
               res_inter_count++;
           }

           /* iterar os elementos de A e de B */
           a_iter++;
           b_iter++;
       }
       else
       {
           /* verificar qual dos elementos é mais pequeno */
           if (a[a_iter] < b[b_iter])
           {
               /* iterar os elementos de A */
               a_iter++;
           }
           else
           {
               /* iterar os elementos de B */
               b_iter++;
           }
       }
   }
   printf("Resultado A  e B : ");
   output(res_inter, res_inter_count);

   /* ciclo da subtracao do segundo array ao primeiro */
   for (a_iter = 0, b_iter = 0;                             // iniciar os iteradores dos arrays
        a_iter < LIST_SIZE && b_iter < LIST_SIZE;           // enquanto houver elementos nos dois arrays
        a_iter++)
   {
       /* ciclo para manter os elementos a subtrair iguais ou superiores ao elemento iterado de A */
       while (b_iter < LIST_SIZE && a[a_iter] > b[b_iter])
       {
           /* iterar os elementos de B */
           b_iter++;
       }

       /* se o elemento iterado de A for diferente do elemento iterado de B */
       if (b_iter == LIST_SIZE ||
           (b_iter < LIST_SIZE && a[a_iter] != b[b_iter]))
       {
           /* verificar se não é para repetir o elemento */
           if (res_inter[res_inter_count - 1] != a[a_iter])
           {
               /* inserir o elemento de A */
               res_sub[res_sub_count] = a[a_iter];
               res_sub_count++;
           }
       }
   }
   printf("Resultado A  - B : ");
   output(res_sub, res_sub_count);

   return 0;
}

EDIT : corrigido bug

Editado por HappyHippyHippo

IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.