Hola!
Les adjunto el ejercicio 2 de la clase de hoy, sobre hacer la interseccion entre vectores de strings:
#include<stdio.h>
#include<assert.h>
#include<string.h>
#define LARGO_VECTOR 30
#define LARGO_STRING 30
size_t interseccion(
char deportes_izq[LARGO_STRING][LARGO_VECTOR],
char deportes_derecha[LARGO_STRING][LARGO_VECTOR],
char resultado[LARGO_STRING][LARGO_VECTOR],
size_t tope_izq,
size_t tope_der
){
size_t indice_izq=0, indice_der=0, indice_resultado=0;
while (indice_izq < tope_izq && indice_der < tope_der){
int comparacion = strcmp(
deportes_izq[indice_izq],
deportes_derecha[indice_der]
);
if(comparacion<0){// izq menor
indice_izq++;
}else if(comparacion>0){// der menor
indice_der++;
} else{ //iguales
strcpy(resultado[indice_resultado], deportes_izq[indice_izq]);
indice_der++;
indice_izq++;
indice_resultado++;
}
}
return indice_resultado;
}
int main(){
char deportes_argentina[LARGO_STRING][LARGO_VECTOR] = {
"ajedrez",
"arqueria",
"basket",
"futsal",
"laser"
};
size_t tope_argentina = 5;
char deportes_brasil[LARGO_STRING][LARGO_VECTOR] = {
"arqueria",
"basket",
"futsal",
"polo",
"rugby"
};
char resultado[LARGO_STRING][LARGO_VECTOR];
size_t tope_brasil = 5;
size_t largo_interseccion = interseccion(deportes_argentina, deportes_brasil, resultado, tope_argentina, tope_brasil);
printf("%lu\n", largo_interseccion);
assert(largo_interseccion == 3);
assert(!strcmp("arqueria",resultado[0]));
assert(!strcmp("basket",resultado[1]));
assert(!strcmp("futsal",resultado[2]));
return 0;
}
También adjunto una versión modularizada con algunas pruebillas más ✨.
#include<stdio.h>
#include<assert.h>
#include<string.h>
#define LARGO_VECTOR 30
#define LARGO_STRING 30
size_t interseccion(
char deportes_izq[LARGO_STRING][LARGO_VECTOR],
char deportes_derecha[LARGO_STRING][LARGO_VECTOR],
char resultado[LARGO_STRING][LARGO_VECTOR],
size_t tope_izq,
size_t tope_der
){
size_t indice_izq=0, indice_der=0, indice_resultado=0;
while (indice_izq < tope_izq && indice_der < tope_der){
int comparacion = strcmp(
deportes_izq[indice_izq],
deportes_derecha[indice_der]
);
if(comparacion<0){// izq menor
indice_izq++;
}else if(comparacion>0){// der menor
indice_der++;
} else{ //iguales
strcpy(resultado[indice_resultado], deportes_izq[indice_izq]);
indice_der++;
indice_izq++;
indice_resultado++;
}
}
return indice_resultado;
}
void assert_vector_equality(char izq[LARGO_STRING][LARGO_VECTOR],char der[LARGO_STRING][LARGO_VECTOR], size_t len){
for (size_t i =0; i<len; i++){
assert(!strcmp(izq[i],der[i]));
}
}
void prueba_no_vacios_interseccion(){
char deportes_argentina[LARGO_STRING][LARGO_VECTOR] = {
"ajedrez",
"arqueria",
"basket",
"futsal",
"laser"
};
size_t tope_argentina = 5;
char deportes_brasil[LARGO_STRING][LARGO_VECTOR] = {
"arqueria",
"basket",
"futsal",
"polo",
"rugby"
};
char resultado[LARGO_STRING][LARGO_VECTOR];
size_t tope_brasil = 5;
size_t largo_interseccion = interseccion(deportes_argentina, deportes_brasil, resultado, tope_argentina, tope_brasil);
char esperado[LARGO_STRING][LARGO_VECTOR] = {
"arqueria",
"basket",
"futsal"
};
assert(largo_interseccion == 3);
assert_vector_equality(resultado, esperado, 3);
}
void prueba_no_vacios_interseccion_vacia(){
char deportes_argentina[LARGO_STRING][LARGO_VECTOR] = {
"ajedrez",
"arqueria",
"futsal",
"laser"
};
size_t tope_argentina = 4;
char deportes_brasil[LARGO_STRING][LARGO_VECTOR] = {
"basket",
"polo",
"rugby"
};
char resultado[LARGO_STRING][LARGO_VECTOR];
size_t tope_brasil = 3;
size_t largo_interseccion = interseccion(deportes_argentina, deportes_brasil, resultado, tope_argentina, tope_brasil);
assert(largo_interseccion == 0);
}
void prueba_uno_vacio(){
char deportes_argentina[LARGO_STRING][LARGO_VECTOR] = {
"ajedrez",
"arqueria",
"futsal",
"laser"
};
size_t tope_argentina = 4;
char deportes_brasil[LARGO_STRING][LARGO_VECTOR] = {};
char resultado[LARGO_STRING][LARGO_VECTOR];
size_t tope_brasil = 0;
size_t largo_interseccion = interseccion(deportes_argentina, deportes_brasil, resultado, tope_argentina, tope_brasil);
assert(largo_interseccion == 0);
}
void pruba_unico_elemento_es_interseccion(){
char deportes_argentina[LARGO_STRING][LARGO_VECTOR] = {
"ajedrez",
"arqueria",
"basket",
"futsal",
"laser"
};
size_t tope_argentina = 5;
char deportes_brasil[LARGO_STRING][LARGO_VECTOR] = {
"arqueria"
};
char resultado[LARGO_STRING][LARGO_VECTOR];
size_t tope_brasil = 1;
size_t largo_interseccion = interseccion(deportes_argentina, deportes_brasil, resultado, tope_argentina, tope_brasil);
char esperado[LARGO_STRING][LARGO_VECTOR] = {
"arqueria"
};
assert(largo_interseccion == 1);
assert_vector_equality(resultado, esperado, 1);
}
int main(){
prueba_no_vacios_interseccion();
prueba_no_vacios_interseccion_vacia();
prueba_uno_vacio();
pruba_unico_elemento_es_interseccion();
return 0;
}
Saludos, Capu >^.^<.