thinkabout Posted January 6, 2013 at 01:58 PM Report #489877 Posted January 6, 2013 at 01:58 PM (edited) 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 January 6, 2013 at 09:12 PM by thinkabout
pmg Posted January 6, 2013 at 02:35 PM Report #489880 Posted January 6, 2013 at 02:35 PM 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!
polska Posted January 6, 2013 at 02:42 PM Report #489881 Posted January 6, 2013 at 02:42 PM (edited) 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 January 6, 2013 at 02:48 PM by polska Corrige um sábio e ele mais sábio ficará. Corrige um ignorante e um inimigo ganharás.
thinkabout Posted January 6, 2013 at 03:01 PM Author Report #489882 Posted January 6, 2013 at 03:01 PM 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]); } }
polska Posted January 6, 2013 at 03:08 PM Report #489884 Posted January 6, 2013 at 03:08 PM (edited) QUal é o restante do problema? Não entendi :b Edited January 6, 2013 at 03:10 PM by polska Corrige um sábio e ele mais sábio ficará. Corrige um ignorante e um inimigo ganharás.
thinkabout Posted January 6, 2013 at 03:15 PM Author Report #489885 Posted January 6, 2013 at 03:15 PM (edited) (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 January 6, 2013 at 03:16 PM by thinkabout
pmg Posted January 6, 2013 at 03:18 PM Report #489886 Posted January 6, 2013 at 03:18 PM 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!
thinkabout Posted January 6, 2013 at 03:22 PM Author Report #489887 Posted January 6, 2013 at 03:22 PM (edited) 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 January 6, 2013 at 03:23 PM by thinkabout
polska Posted January 6, 2013 at 03:28 PM Report #489888 Posted January 6, 2013 at 03:28 PM (edited) 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é.. 😄 Edited January 6, 2013 at 03:35 PM by polska Corrige um sábio e ele mais sábio ficará. Corrige um ignorante e um inimigo ganharás.
thinkabout Posted January 6, 2013 at 03:32 PM Author Report #489889 Posted January 6, 2013 at 03:32 PM (edited) 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 January 6, 2013 at 03:32 PM by thinkabout
pmg Posted January 6, 2013 at 03:40 PM Report #489891 Posted January 6, 2013 at 03:40 PM (edited) 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 January 6, 2013 at 03:42 PM 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!
polska Posted January 6, 2013 at 03:40 PM Report #489892 Posted January 6, 2013 at 03:40 PM (edited) 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 January 6, 2013 at 03:41 PM by polska Corrige um sábio e ele mais sábio ficará. Corrige um ignorante e um inimigo ganharás.
thinkabout Posted January 6, 2013 at 03:45 PM Author Report #489893 Posted January 6, 2013 at 03:45 PM (edited) 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 January 6, 2013 at 03:46 PM by thinkabout
pmg Posted January 6, 2013 at 03:46 PM Report #489894 Posted January 6, 2013 at 03:46 PM (edited) 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 January 6, 2013 at 03:46 PM 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!
polska Posted January 6, 2013 at 03:50 PM Report #489895 Posted January 6, 2013 at 03:50 PM 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 👍 Corrige um sábio e ele mais sábio ficará. Corrige um ignorante e um inimigo ganharás.
thinkabout Posted January 6, 2013 at 07:32 PM Author Report #489921 Posted January 6, 2013 at 07:32 PM (edited) 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 January 6, 2013 at 07:36 PM by thinkabout
pmg Posted January 6, 2013 at 07:42 PM Report #489925 Posted January 6, 2013 at 07:42 PM Agradeço ideias para melhoramentoif (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!
thinkabout Posted January 6, 2013 at 07:51 PM Author Report #489927 Posted January 6, 2013 at 07:51 PM 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");
HappyHippyHippo Posted January 6, 2013 at 08:16 PM Report #489930 Posted January 6, 2013 at 08:16 PM (edited) 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 January 7, 2013 at 05:44 AM by HappyHippyHippo IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now