PI-ITBA / 2024_02

Consultas 2C 2024
4 stars 0 forks source link

ej 14 de la guia 6 #61

Open marr64 opened 1 month ago

marr64 commented 1 month ago

Buenas noches! queria saber quetan eficiente y de buen estilo es mi codigo del ej 14 de la guia 6. `#include

include

define UNO 1

define DOS 2

define UNOoDOS 2

define NINGUNO 0

int contiene(const int v1[], unsigned int dim1, const int v2[], unsigned int dim2); int pertenece(const int vM[], unsigned int dimM, const int vm[], unsigned int dimm);

int main(void) { int v1[] = {1,6,5,3,2}; int v2[] = {1,2}; assert(contiene(v1, 5, v2, 2) == DOS); assert(contiene(v2, 2, v1, 5) == UNO); assert(contiene(v1, 1, v2, 2) == UNO); assert(contiene(v1, 0, v2, 2) == UNO); assert(contiene(v1, 5, v2, 0) == DOS);

int v3[] = {1,2,3,4,5,6};
assert(contiene(v1, 5, v3, 6) == UNO);

int cnt = contiene(v1, 0, v3, 0);
assert(cnt == UNO || cnt == DOS);

int v4[] = {10, 20, 30, 1, 2};
assert(contiene(v2, 2, v4, 4) == NINGUNO);
assert(contiene(v2, 2, v4, 5) == UNO);
assert(contiene(v4, 5, v2, 2) == DOS);

int v5[] = {1,1,1,1,1,2,1,2};
int v6[] = {1,2,3};
assert(contiene(v5, 8, v6, 3) == UNO);
assert(contiene(v6, 3, v5, 8) == DOS);

printf("OK!\n");
return 0;

}

int contiene(const int v1[], unsigned int dim1, const int v2[], unsigned int dim2) { int es = NINGUNO;

if (pertenece(v1, dim1, v2, dim2)) {
    es = DOS;  // v2 está contenido en v1
}

if (pertenece(v2, dim2, v1, dim1)) {
    if (es == DOS) {
        es = UNOoDOS;  // Ambos contienen al otro
    } else {
        es = UNO;  // v1 está contenido en v2
    }
}

return es;

}

int pertenece(const int vM[], unsigned int dimM, const int vm[], unsigned int dimm) { for (unsigned int i = 0; i < dimm; i++) { int encontrado = 0; for (unsigned int j = 0; j < dimM; j++) { // Si encontramos el elemento, lo marcamos como encontrado if (vm[i] == vM[j]) { encontrado = 1; } } // Si el elemento no fue encontrado en vM, retornamos 0 if (encontrado == 0) { return 0; } } return 1; // Todos los elementos de vm están en vM }

`

marcelogarberoglio commented 1 month ago

Si cuando hacés pertenece(v1, dim1, v2, dim2) te retorna 1, no tiene sentido verificar si v2 está en v1, ya podés retornar 1

Cuando hacés for (unsigned int j = 0; j < dimM; j++) {
si en algún momento encontrado vale 1 igual seguís haciendo el ciclo, sin necesidad

Y en cuanto a estilo, en vez de este último ciclo podrías hacer una función que te diga si un elemento está en un vector (la función belongs que hicimos en clase)

Y también marcamos varias veces que en vez de if (encontrado == 0) { return 0; } } return 1; // Todos los elementos de vm están en vM }

hagan

return encontrado

marr64 commented 1 month ago

Nueva versión:

include

include

define UNO 1

define DOS 2

define UNOoDOS 2

define NINGUNO 0

int contiene(const int v1[], unsigned int dim1, const int v2[], unsigned int dim2); int belongs(const int v[], unsigned int dim, int elem);

int main(void) { int v1[] = {1,6,5,3,2}; int v2[] = {1,2}; assert(contiene(v1, 5, v2, 2) == DOS); assert(contiene(v2, 2, v1, 5) == UNO); assert(contiene(v1, 1, v2, 2) == UNO); assert(contiene(v1, 0, v2, 2) == UNO); assert(contiene(v1, 5, v2, 0) == DOS);

int v3[] = {1,2,3,4,5,6};
assert(contiene(v1, 5, v3, 6) == UNO);

int cnt = contiene(v1, 0, v3, 0);
assert(cnt == UNO || cnt == DOS);

int v4[] = {10, 20, 30, 1, 2};
assert(contiene(v2, 2, v4, 4) == NINGUNO);
assert(contiene(v2, 2, v4, 5) == UNO);
assert(contiene(v4, 5, v2, 2) == DOS);

int v5[] = {1,1,1,1,1,2,1,2};
int v6[] = {1,2,3};
assert(contiene(v5, 8, v6, 3) == UNO);
assert(contiene(v6, 3, v5, 8) == DOS);

printf("OK!\n");
return 0;

}

// Solo utiliza belongs para verificar si un vector contiene todos los elementos del otro int contiene(const int v1[], unsigned int dim1, const int v2[], unsigned int dim2) { int es = NINGUNO; int v1_contiene_v2 = 1, v2_contiene_v1 = 1;

// Verificamos si v1 contiene todos los elementos de v2
for (unsigned int i = 0; i < dim2; i++) {
    if (!belongs(v1, dim1, v2[i])) {
        v1_contiene_v2 = 0;  // Si algún elemento no está, lo marcamos
    }
}

// Verificamos si v2 contiene todos los elementos de v1
for (unsigned int i = 0; i < dim1; i++) {
    if (!belongs(v2, dim2, v1[i])) {
        v2_contiene_v1 = 0;  // Si algún elemento no está, lo marcamos
    }
}

if (v1_contiene_v2 && v2_contiene_v1) {
    es = UNOoDOS;  // Ambos vectores contienen todos los elementos del otro
} else if (v1_contiene_v2) {
    es = DOS;  // v2 está contenido en v1
} else if (v2_contiene_v1) {
    es = UNO;  // v1 está contenido en v2
}

return es;

}

// Función que verifica si un elemento pertenece a un vector int belongs(const int v[], unsigned int dim, int elem) { for (unsigned int i = 0; i < dim; i++) { if (v[i] == elem) { return 1; // El elemento está en el vector } } return 0; // El elemento no está en el vector }