ron_lima
(usa Slackware)
Enviado em 21/03/2009 - 22:16h
Lendo este tópico e outro que você deixou aqui no fórum, percebi que seu problema é algoritmo, e não linguagem C. Seria muito cômodo para você se eu colocasse aqui a implementação do código, o que não lhe acrescentaria absolutamente nada em termos de conhecimento. Portanto, prefiro um "approach" um pouco diferente.
O que você precisa fazer é implementar a operação de igualdade entre dois conjuntos. Antes de partir para a implementação do seu código, sugiro os seguintes passos:
1. Entenda completamente o problema que lhe foi proposto.
2. Uma vez entendido, modele a solução do problema e exercite-a para verificar se ela é suficientemente genérica para resolver completamente o problema.
3. Implemente o seu modelo.
Voltando ao seu problema: dados dois conjuntos A e B, como é que se verifica a igualdade de ambos? Seja o exemplo:
A = { a1, a2, a3, ..., an}
B = { b1, b2, b3, ..., bn}
A e B serão iguais se, e somente se, a1 = b1, a2 = b2, ..., an = bn. Porém, pela definição matemática, um conjunto é definido como uma coleção desordenada de elementos. Portanto, você precisa encontrar a correspondência entre cada elemento do conjunto A no conjunto B.
É interessante verificar que:
Se A = B, então A está contido em B e B está contido em A. A consequência desse pensamento é que todos os elementos de A pertencem a B, visto que A está contido em B. Portanto, uma solução computacional possível e completa seria verificar se cada elemento de A está contido em B.
Desta forma, a maneira mais completa de resolver este problema é percorrer o conjunto A verificando se cada elemento de A está contido também em B. Isso significa fazer uma busca no conjunto B para cada elemento de A. A forma mais trivial de realizar uma busca é através do algoritmo linear, ou seja, avaliar elemento por elemento de B, comparando-o com A. Tendo em mente que um conjunto pode estar desordenado, a busca binária não seria útil, a não ser que fosse uma premissa que seus conjuntos tivessem de estar ordenados por algum critério.
Partindo-se da suposição de que seus conjuntos estão desordenados, eu escreveria algo assim:
Algoritmo
Declare
A[10]: numérico;
B[10]: numérico;
i: numérico;
j: numérico;
quantos: numérico;
quantos <- 0;
Para i <-0 até 9 Faça
Para j <- 0 até 9 Faça
Se A[i] = B[j] Então
quantos <- quantos + 1;
pare;
Fim-se;
Fim-para;
Fim-para;
Se quantos <> 10 Então
Escreva "São diferentes";
Senão
Escreva "São iguais";
Fim-se.
Fim-algoritmo.
Este algoritmo bem simples percorre A em busca de itens que tenham correspondência em B. Aqui considerei que ambos os conjuntos têm o mesmo tamanho (10). Rigorosamente, o algoritmo deveria primeiro testar a quantidade de itens em cada conjunto e só depois avaliar os itens. A avaliação dos itens é feita indiretamente: para cada correspondência encontrada, um contador é incrementado. Os conjuntos serão iguais se o contador for igual à quantidade de elementos de um dos conjuntos, lembrando que é condição sine qua non que a quantidade de elementos de ambos os conjuntos seja igual para que a avaliação de cada item seja necessária.
Alguns poderão criticar esse algoritmo pela sua eficiência O(n2). Porém, o problema proposto não identificou qual a eficiência requerida e isso faz com que a solução mais simples seja mais do que adequada.
Transformar esse algoritmo em C é trivial e um trabalho direto. Sugiro que você gaste um tempo lendo o livro "A Linguagem C" de Brian Kernighan e Dennis Ritchie, a melhor obra sobre o assunto.
Espero haver lançado alguma luz no seu caminho.