Ejercicio 2 de la clase de hoy

20 views
Skip to first unread message

Juan Pablo Capurro

unread,
Oct 18, 2018, 10:43:35 AM10/18/18
to algoritmos7540-mm

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 >^.^<.

Reply all
Reply to author
Forward
0 new messages