Jump to content
thinkabout

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

Recommended Posts

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] );
}
}

}

}

Edited by thinkabout

Share this post


Link to post
Share on other 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!

Share this post


Link to post
Share on other 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.

Edited by polska

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

Share this post


Link to post
Share on other 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]);
}
}

Share this post


Link to post
Share on other sites
polska

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

Edited by polska

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

Share this post


Link to post
Share on other 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.

Edited by thinkabout

Share this post


Link to post
Share on other 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!

Share this post


Link to post
Share on other 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 . . .

Edited by thinkabout

Share this post


Link to post
Share on other 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

Edited by polska

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

Share this post


Link to post
Share on other 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

Edited by thinkabout

Share this post


Link to post
Share on other 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]);
}

Edited by 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!

Share this post


Link to post
Share on other 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] ...

Edited by polska

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

Share this post


Link to post
Share on other 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

Edited by thinkabout

Share this post


Link to post
Share on other 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

Edited by 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!

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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 . . .

Edited by thinkabout

Share this post


Link to post
Share on other 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!

Share this post


Link to post
Share on other 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");

Share this post


Link to post
Share on other 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

Edited by HappyHippyHippo

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.