#include "Conjunto.h" #include #include using namespace std; unsigned rand (unsigned limiteSuperior) { unsigned long l = rand(); return l % limiteSuperior; } const int MaxSetElement = 100; int checkSetContents (const Conjunto& s, const int* expectedMembers) { int expectedSize = 0; int discoveredSize = 0; int result = 1; for (int i = 0; i < MaxSetElement; i++) { if (expectedMembers[i]) { expectedSize++; if (s.esMiembro(i)) { discoveredSize++; } else { cout << "Falta elemento esperado: " << i << endl; result = 0; } } else { if (s.esMiembro(i)) { discoveredSize++; cout << "Contiene elemento no esperado: " << i << endl; result = 0; } } } if (expectedSize != discoveredSize) { cout << "Número de elementos del conjunto: " << discoveredSize << " no corresponde al esperado: " << expectedSize << endl; result = 0; } if (s.cardinalidad() != discoveredSize) { cout << "Número de elementos del conjunto: " << discoveredSize << " no corresponde al reportado (cardinalidad): " << s.cardinalidad() << endl; result = 0; } return result; } void generateSet (int numElements, Conjunto& s, int *expected) { int elements[MaxSetElement]; for (int i = 0; i < MaxSetElement; i++) { elements[i] = i; expected[i] = 0; } // Ahora desordenamos los elementos del arreglo for (int i = 0; i < MaxSetElement; i++) { int j = rand(MaxSetElement); int t = elements[i]; elements[i] = elements[j]; elements[j] = t; } // Insertamos los primeros numElements valores en s s.clear(); for (int i = 0; i < numElements; i++) { s.agregar(elements[i]); expected[elements[i]] = 1; } } int testSet (const Conjunto & s, const int *expected) { Conjunto s1 = s; // Chequeo de consistencia interna if (!checkSetContents(s, expected)) { s1.clear(); delete &s1; return 0; } if (!checkSetContents(s1, expected)) { s1.clear(); delete &s1; return 0; } // Axioma 1: Despues de s.clear(), s.cardinalidad()==0 int noneExpected[MaxSetElement] = {0}; s1.clear(); if (!checkSetContents(s1, noneExpected)) { s1.clear(); delete &s1; return 0; } // Axioma 2: Agregando un elemento X ... s1 = s; int x = rand(MaxSetElement); if (s1.esMiembro(x)) { // ...ya está en s, no cambia a s s1.agregar(x); if ((!checkSetContents(s1, expected)) || (s.cardinalidad() != s1.cardinalidad())) { s1.clear(); delete &s1; return 0; } } else { // ... no está en s, un nuevo mienbro va a s y cambia su cardinalidad s1.agregar(x); int moreExpected[MaxSetElement]; for (int ii = 0; ii < MaxSetElement; ii++) moreExpected[ii] = expected[ii]; moreExpected[x] = 1; if ((!checkSetContents(s1, moreExpected)) || (s.cardinalidad() != s1.cardinalidad()-1)) { s1.clear(); delete &s1; return 0; } } s1.clear(); delete &s1; return 1; } int main () { int expected[MaxSetElement]; int testSize; srand(1); int ok = 1; cout << "\n\nProbando sus Conjuntos" << endl; for (testSize = 0; ok && (testSize < MaxSetElement); testSize = 2*testSize + 1) { Conjunto s; cout << "Size: " << testSize << endl; generateSet (testSize, s, expected); ok = testSet (s, expected); } { Conjunto A(2), B(3), C(4); A.agregar(3); if ( A*(B+C) == (A*B+A*C) ) cout << "Se cumple propiedad distributiva" << endl; else cout << "NO se cumple propiedad distributiva" << endl; Conjunto D; if (A*C == D) cout << "Pasó intersección vacía y comparación con vacío" << endl; else cout << "NO pasó intersección vacía y comparación con vacío" << endl; } if (Node::contador > 0) cout << Node::contador << " nodo construido pero no destruido." << endl; else cout << "Todos los nodos construidos fueron destruidos." << endl; if (ok) return 0; else return 1; }