From 3e821bebb9d0f7b4da125ed157e856027a19020a Mon Sep 17 00:00:00 2001
From: Pedro Folloni Pesserl <fpesserl7@gmail.com>
Date: Tue, 22 Nov 2022 00:22:03 -0300
Subject: [PATCH] add tp4

---
 tp4/lib_conjunto.h   | 136 +++++++++++++++++++++++++++++
 tp4/makefile         |  23 +++++
 tp4/testa_conjunto.c | 201 +++++++++++++++++++++++++++++++++++++++++++
 tp4/tp4.c            |  21 +++++
 4 files changed, 381 insertions(+)
 create mode 100644 tp4/lib_conjunto.h
 create mode 100644 tp4/makefile
 create mode 100644 tp4/testa_conjunto.c
 create mode 100644 tp4/tp4.c

diff --git a/tp4/lib_conjunto.h b/tp4/lib_conjunto.h
new file mode 100644
index 0000000..bae2d7a
--- /dev/null
+++ b/tp4/lib_conjunto.h
@@ -0,0 +1,136 @@
+/* 
+ * TAD conjunto
+ * Autores: 
+ *    Andre Ricardo Abed Gregio
+ *    Fabiano Silva
+ *    Luis Carlos Erpen de Bona
+ *    Marcos Alexandre Castilho 
+ *
+ * Versao 1.0.0 de 10/11/2021
+ * Versao 1.0.1 de 16/08/2022
+ * Versao 1.1.0 de 17/11/2022
+ */
+
+struct conjunto {
+    int max;    /* tamanho maximo do vetor atualmente alocado     */
+    int card;   /* cardinalidade, isto eh, tamanho usado ate max  */
+    int ptr;    /* ponteiro para algum indice do vetor (iterador) */
+    int *v;     /* vetor de inteiros com no maximo max elementos  */
+};
+typedef struct conjunto conjunto_t;
+
+/*
+ * Cria um conjunto vazio e o retorna, se falhar retorna NULL.
+ * max eh o tamanho maximo do conjunto, isto eh, o tamanho maximo do vetor
+ */
+conjunto_t *cria_cjt (int max);
+
+/*
+ * Remove todos os elementos do conjunto, libera espaco e devolve NULL.
+ */
+conjunto_t *destroi_cjt (conjunto_t *c);
+
+/*
+ * Retorna 1 se o conjunto esta vazio e 0 caso contrario.
+ */
+int vazio_cjt (conjunto_t *c);
+
+/*
+ * Retorna a cardinalidade do conjunto, isto eh, o numero de elementos presentes nele.
+ */
+int cardinalidade_cjt (conjunto_t *c);
+
+/*
+ * Insere o elemento no conjunto, garante que nao existam repeticoes.
+ * Retorna 1 se a operacao foi bem sucedida. Se tentar inserir elemento existente,
+ * nao faz nada e retorna 1 tambem. Retorna 0 em caso de falha por falta de espaco.
+ */
+int insere_cjt (conjunto_t *c, int elemento);
+
+/*
+ * Remove o elemento 'elemento' do conjunto caso ele exista.
+ * Retorna 1 se a operacao foi bem sucedida e 0 se o elemento nao existe.
+ */
+int retira_cjt (conjunto_t *c, int elemento);
+
+/*
+ * Retorna 1 se o elemento pertence ao conjunto e 0 caso contrario.
+ */
+int pertence_cjt (conjunto_t *c, int elemento);
+
+/*
+ * Retorna 1 se o conjunto c1 esta contido no conjunto c2 e 0 caso contrario.
+ */
+int contido_cjt (conjunto_t *c1, conjunto_t *c2);
+
+/*
+ * Retorna 1 se o conjunto c1 eh igual ao conjunto c2 e 0 caso contrario.
+ */
+int sao_iguais_cjt (conjunto_t *c1, conjunto_t *c2);
+
+/*
+ * Cria e retorna o conjunto diferenca entre c1 e c2, nesta ordem.
+ * Retorna NULL se a operacao falhou.
+ */
+conjunto_t *diferenca_cjt (conjunto_t *c1, conjunto_t *c2);
+
+/*
+ * Cria e retorna o conjunto interseccao entre os conjuntos c1 e c2.
+ * Retorna NULL se a operacao falhou.
+ */
+conjunto_t *interseccao_cjt (conjunto_t *c1, conjunto_t *c2);
+
+/*
+ * Cria e retorna o conjunto uniao entre os conjunto c1 e c2.
+ * Retorna NULL se a operacao falhou.
+ */
+conjunto_t *uniao_cjt (conjunto_t *c1, conjunto_t *c2);
+
+/*
+ * Cria e retorna uma copia do conjunto c e NULL em caso de falha.
+ */
+conjunto_t *copia_cjt (conjunto_t *c);
+
+/*
+ * Cria e retorna um subconjunto com elementos aleatorios do conjunto c.
+ * Se o conjunto for vazio, retorna um subconjunto vazio.
+ * Se n >= cardinalidade (c) entao retorna o proprio conjunto c.
+ * Supoe que a funcao srand () tenha sido chamada antes.
+ */
+conjunto_t *cria_subcjt_cjt (conjunto_t *c, int n);
+
+/*
+ * Imprime os elementos do conjunto sempre em ordem crescente,
+ * mesmo que a estrutura interna nao garanta isso.
+ * Na impressao os elementos sao separados por um unico espaco
+ * em branco entre os elementos, sendo que apos o ultimo nao
+ * deve haver espacos em branco. Ao final imprime um \n.
+ */
+void imprime_cjt (conjunto_t *c);
+
+/*
+ * As funcoes abaixo implementam um iterador que vao permitir
+ * percorrer os elementos do conjunto.
+ * O ponteiro ptr da struct (iterador) pode ser inicializado para apontar 
+ * para o primeiro elemento e incrementado ate' o ultimo elemento 
+ * do conjunto.
+ */
+
+/*
+ * Inicializa ptr usado na funcao incrementa_iterador 
+ */
+void inicia_iterador_cjt (conjunto_t *c);
+
+/*
+ * Devolve no parametro ret_iterador o elemento apontado e incrementa o iterador.
+ * A funcao retorna 0 caso o iterador ultrapasse o ultimo elemento, ou retorna
+ * 1 caso o iterador aponte para um elemento valido (dentro do conjunto).
+ */
+int incrementa_iterador_cjt (conjunto_t *c, int *ret_iterador);
+
+/*
+ * Escolhe um elemento qualquer do conjunto para ser removido, o remove e
+ * o retorna.
+ * Nao faz teste se conjunto eh vazio, deixa para main fazer isso       
+ */
+int retira_um_elemento_cjt (conjunto_t *c);
diff --git a/tp4/makefile b/tp4/makefile
new file mode 100644
index 0000000..3efd261
--- /dev/null
+++ b/tp4/makefile
@@ -0,0 +1,23 @@
+# Makefile de exemplo (Manual do GNU Make)
+     
+CFLAGS = -Wall -std=c90 -g  # flags de compilacao
+LDFLAGS = -lm
+
+CC = gcc
+
+# arquivos-objeto
+	objects = testa_conjunto.o lib_conjunto.o 
+     
+all: tp4.o lib_conjunto.o
+	$(CC) -o tp4 tp4.o lib_conjunto.o $(LDFLAGS)
+
+lib_conjunto.o: lib_conjunto.c
+	$(CC) -c $(CFLAGS) lib_conjunto.c
+
+tp4.o: tp4.c
+	$(CC) -c $(CFLAGS) tp4.c
+
+clean:
+	rm -f $(objects) tp4
+
+
diff --git a/tp4/testa_conjunto.c b/tp4/testa_conjunto.c
new file mode 100644
index 0000000..9cfeaf2
--- /dev/null
+++ b/tp4/testa_conjunto.c
@@ -0,0 +1,201 @@
+/*
+ * Testes para a lib_conjunto.c
+ * Disciplina CI1001 - Programacao I
+ * Autor: Marcos Castilho
+ * Data: 18/08/2022
+*/
+
+#include <stdio.h>
+#include "lib_conjunto.h"
+#define TAM 21
+
+int main (void) {
+    conjunto_t *a, *b, *u, *i, *d, *d1, *copia, *sub;
+    int k, ex;
+
+    /* Teste para conjunto vazio */
+    printf ("---> Teste 1\n");
+    if (! (a= cria_cjt (TAM))) {
+        printf ("falha na criacao do conjunto\n");
+        return 1;
+    }
+    if (! vazio_cjt (a)) {
+            printf("ERRO: criou conjunto nao vazio\n");
+            return 1;
+    }
+    printf("OK: conjunto vazio\n");
+
+    /* Teste de insercao de elementos no conjunto */
+    printf ("---> Teste 2\n");
+    for (k=1; k <= 10; k++){
+        ex= insere_cjt (a, 2*k);
+        if (ex == 0) {
+            printf ("acabou espaco ao tentar inserir %d! Pode aumentar se quiser\n",2*k);
+        }
+    }
+    printf ("Inseriu todos os elementos corretamente em a\n");
+
+    /* Teste de impressao em conjunto com segundo teste de conjunto vazio */
+    printf ("---> Teste 3\n");
+    if (vazio_cjt (a)) {
+        printf ("ERRO: conjunto a misteriosamente ficou vazio\n");
+        return 1;
+    }
+    imprime_cjt (a);
+    printf ("A saida deve ter sido os números pares de 2 a 20, senao esta errado\n");
+    printf ("Lembrando que a impressao eh sempre em ordem crescente, pelo enunciado\n");
+
+    /* Criando conjunto para testes de uniao, interseccao e diferenca */
+    printf ("---> Teste 4\n");
+    if (! (b= cria_cjt (TAM))) {
+        printf ("falha na criacao do conjunto\n");
+        return 1;
+    }
+    for (k=1; k <= 20; k++){
+        ex= insere_cjt (b, k);
+        if (ex == 0) {
+            printf ("acabou espaco ao tentar inserir %d!\n",k);
+        }
+    }
+    imprime_cjt (b);
+    printf ("A saida deve ter sido todos os números de 1 a 20, senao esta errado\n");
+
+    /* Teste para uniao de dois conjuntos */
+    printf ("---> Teste 5\n");
+    if (! (u= uniao_cjt (a, b))) {
+            printf ("falha na uniao de dois conjuntos\n");
+            return 1;
+    }
+    imprime_cjt (u);
+    printf ("uniao: A saida deve ter sido todos os números de 1 a 20, senao esta errado\n");
+
+    /* Teste para intersecao de dois conjuntos */
+    printf ("---> Teste 6\n");
+    if (! (i= interseccao_cjt (a, b))) {
+            printf ("falha na interseccao de dois conjuntos\n");
+            return 1;
+    }
+    imprime_cjt (i);
+    printf ("intersec: A saida deve ter sido os números pares de 2 a 20, senao esta errado\n");
+
+    /* Teste para diferenca de dois conjuntos */
+    printf ("---> Teste 7\n");
+    if (! (d= diferenca_cjt (a, b))) {
+            printf ("falha na diferenca de dois conjuntos\n");
+            return 1;
+    }
+    imprime_cjt (d);
+    printf ("A saida deve ter sido o conjunto vazio, senao esta errado\n");
+    if (! (d1= diferenca_cjt (b, a))) {
+            printf ("falha na diferenca de dois conjuntos\n");
+            return 1;
+    }
+    imprime_cjt (d1);
+    printf ("diferenca: A saida deve ter sido os impares entre 1 e 19, senao esta errado\n");
+
+    /* Teste de estar contido e contem */
+    printf ("---> Teste 8\n");
+    if (! contido_cjt (a, b)) {
+        printf("ERRO: o conjunto a esta garantidamente contido no conjunto b e o programa falhou\n");
+        return 1;
+    }
+    printf("OK: conjunto a esta contido no conjunto b\n");
+
+    if (contido_cjt (b, a)) {
+        printf("ERRO: o conjunto b nao esta contido no conjunto a e o programa falhou\n");
+        return 1;
+    }
+    printf("OK: conjunto b nao esta contido no conjunto a\n");
+
+    /* Teste de igualdade de conjunto */
+    printf ("---> Teste 9\n");
+    if (! sao_iguais_cjt (a, i)) {
+        printf ("ERRO: estes conjuntos sao iguais e o programa falhou\n");
+        return 1;
+    }
+    printf("OK: conjuntos iguais\n");
+
+    if (sao_iguais_cjt (a, b)) {
+        printf ("ERRO: estes conjuntos nao sao iguais e o programa falhou\n");
+        return 1;
+    }
+    printf("OK: conjuntos diferentes\n");
+    
+    /* Testes de remocao, retira do inicio do meio e do fim */
+    printf ("---> Teste 10\n");
+    if (! retira_cjt (a, 20))
+        printf("ERRO: nao retirou %d\n",20);
+    printf ("OK: retirou 20\n");
+
+    if (! retira_cjt (a, 2))
+        printf("ERRO: nao retirou %d\n",2);
+    printf ("OK: retirou 2\n");
+
+    if (! retira_cjt (a, 10))
+        printf("ERRO: nao retirou %d\n",10);
+    printf ("OK: retirou 10\n");
+
+    imprime_cjt (a);
+    printf ("Esta impressao deve ter resultado nos números pares de 4 a 18, menos o 10, senao esta errado\n");
+
+    for (k=1; k <= 20; k++) {
+        if (! retira_cjt (a, k))
+            printf("OK: nao retirou %d\n",k);
+        else
+            printf("OK: retirou %d\n",k);
+    }
+    printf ("Removeu todos os elementos? \n");
+    imprime_cjt (a);
+    printf ("Em caso afirmativo a linha anterior contem conjunto vazio\n");
+
+    /* Teste de copia de conjuntos */
+    printf ("---> Teste 11\n");
+    if (! (copia=copia_cjt (b))) {
+        printf ("ERRO: copia falhou\n");
+        return 1;
+    }
+    imprime_cjt (copia);
+    destroi_cjt (copia);
+    printf("se a copia deu certo foram impressos os numeros de 1 a 20\n");
+
+    /* Teste de subconjuntos */
+    printf ("---> Teste 12\n");
+    for (k=0; k <= cardinalidade_cjt (b); k++){
+        if (! (sub=cria_subcjt_cjt (b, k))) {
+            printf ("ERRO: criar subconjunto falhou\n");
+            return 1;
+        }
+        imprime_cjt (sub);
+        destroi_cjt (sub);
+        printf("deve ter impresso um subconjunto de tamanho %d\n",k);
+    }
+
+    /* Teste do iterador */
+    printf ("---> Teste 14\n");
+    inicia_iterador_cjt (b);
+    while (incrementa_iterador_cjt (b, &ex) != 0)
+        printf ("%d ", ex);
+    printf("\n");
+    printf("Teste do iterador, tem que ter impresso todos numeros de 1 a 20\n");
+
+    /* Teste do retira elemento */
+    printf ("---> Teste 15\n");
+    while (! vazio_cjt (b)){
+        ex= retira_um_elemento_cjt (b);
+        printf("%d ", ex);
+    }
+    printf("\n");
+    printf("Teste do retirar, tem que ter impresso todos numeros de 20 ate 1 que estao no conjunto, em alguma ordem definida por voce\n");
+    printf("depois tem que imprimir a mensagem 'conjunto vazio' logo abaixo\n");
+    imprime_cjt(b);
+
+    /* Destroi todos os conjuntos criados */
+    destroi_cjt (a);
+    destroi_cjt (b);
+    destroi_cjt (u);
+    destroi_cjt (i);
+    destroi_cjt (d);
+    destroi_cjt (d1);
+
+    return 0;
+}
diff --git a/tp4/tp4.c b/tp4/tp4.c
new file mode 100644
index 0000000..5f3e4f6
--- /dev/null
+++ b/tp4/tp4.c
@@ -0,0 +1,21 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include "lib_conjunto.h"
+#define MAX 100
+
+int main ()
+{
+
+    /* ler os herois e suas habilidades */
+
+    /* ler a missao */
+
+    /* ler as equipes de herois */
+
+    /* a solucao eh encontrada se a missao esta contido na uniao das 
+     * habilidades de uma equipe, mas tomando-se aquela de menor tamanho. */
+
+    /* libera toda a memoria alocada dinamicamente */
+
+    return 0;
+}
-- 
GitLab