Crie um Tipo Abstrato de Dados (TAD) que represente o tipo conjunto de inteiros, utilizando uma representação de vetor de inteiros e que contenha as seguintes funções:
Testa se os conjuntos são iguais

Passo 1

O enunciado pede para criarmos um TAD “Conjunto” de inteiros usando vetor e, dentre as operações, incluir uma função que teste se dois conjuntos são iguais.

Passo 2

Para representar o TAD vamos usar uma estrutura interna com um vetor de inteiros e um contador de quantos elementos estão efetivamente no conjunto. Assim garantimos a abstração e podemos controlar o tamanho.

Passo 3

Definimos a interface do TAD com as seguintes operações principais:
• inicializa(): cria um conjunto vazio
• insere(x): adiciona x se ainda não pertencer
• remove(x): retira x se pertencer
• pertence(x): verifica se x está no conjunto
• iguais(A,B): testa se os conjuntos A e B são iguais

Passo 4

Do ponto de vista lógico, dois conjuntos A e B são iguais se e somente se:
  1. eles têm o mesmo número de elementos (mesma cardinalidade)
  2. todo elemento de A pertence a B (e vice-versa, mas pela condição de mesma cardinalidade basta testar uma inclusão)

Passo 5

Pseudocódigo em estilo C para a função iguais:
bool iguais(Conjunto A, Conjunto B) {
    if (A.nElems != B.nElems) return false;
    for (int i = 0; i < A.nElems; i++) {
        int x = A.elems[i];
        if (!pertence(B, x)) return false;
    }
    return true;
}
Aqui pertence(B,x) faz uma busca linear em B.elems de 0 até B.nElems-1 e retorna true se encontrar x.

Resposta

// Definições gerais
#define MAX 100
typedef struct {
int elems[MAX]; // armazena os valores do conjunto
int nElems; // quantidade atual de elementos
} Conjunto;
// Operação que inicializa um conjunto vazio
void inicializa(Conjunto *C) {
C->nElems = 0;
}
// Insere x no conjunto se não estiver presente
void insere(Conjunto *C, int x) {
if (!pertence(*C, x) && C->nElems < MAX) {
C->elems[C->nElems++] = x;
}
}
// Remove x do conjunto se estiver presente
void removeElemento(Conjunto *C, int x) {
for (int i = 0; i < C->nElems; i++) {
if (C->elems[i] == x) {
C->elems[i] = C->elems[–C->nElems];
return;
}
}
}
// Verifica se x pertence ao conjunto
bool pertence(Conjunto C, int x) {
for (int i = 0; i < C.nElems; i++) {
if (C.elems[i] == x) return true;
}
return false;
}
// Testa se dois conjuntos são iguais
bool iguais(Conjunto A, Conjunto B) {
if (A.nElems != B.nElems) return false;
for (int i = 0; i < A.nElems; i++) {
if (!pertence(B, A.elems[i])) return false;
}
return true;
}

Exercícios relacionados