Open marr64 opened 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
Nueva versión:
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 }
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 contiene(const int v1[], unsigned int dim1, const int v2[], unsigned int dim2) { int es = NINGUNO;
}
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 }
`