Skip to content

tp6_ej18 #15

@pkorenblit

Description

@pkorenblit

Hola, tengo dudas de porque esta fallando el programa de prueba.

//a.out: 12.c:19: main: Assertion `sonAmigas(m1,3,m2,4)==1' failed.
// Aborted (core dumped)


#define COLS 4

int sonAmigas( int (m1[])[COLS], unsigned int fils1, int (m2[])[COLS], unsigned int fils2 );
int contiene( int v1[], int v2[], unsigned int dim); 
int esAmiga( int (m1[])[COLS], unsigned int fils1,  int (m2[])[COLS], unsigned int fils2); 
int filaEnMatriz( int fil[],  int (m[])[COLS], unsigned int fils); 

int 
main(void)
{
  int m1[][COLS] = {{0,1,2,3}, {4,4,5,6}, {7,8,8,9}};
  int m2[][COLS] = {{0,1,2,3}, {-3,7,8,9}, {-1,3,4,7}, {4,5,6,8}};
  int m3[][COLS] = {{2,3,3,7}};
  assert(sonAmigas(m1,3,m2,4)==1);
  assert(sonAmigas(m1,1,m2,4)==1);
  assert(sonAmigas(m1,2,m2,4)==1);
  assert(sonAmigas(m1,2,m2,2)==0);
  assert(sonAmigas(m2,4,m1,3)==2);
  assert(sonAmigas(m1,3,m3,1)==0);
  assert(sonAmigas(m3,1,m1,3)==0);
  int res = sonAmigas(m1,3,m1,3);
  assert(res==1 || res==2);
  
  printf("OK !\n");

  return 0;
}

int sonAmigas( int (m1[])[COLS], unsigned int fils1,  int (m2[])[COLS], unsigned int fils2)
{

    if(esAmiga(m1,fils1,m2,fils2))
    {
        return 1; 
    }
    if(esAmiga(m2,fils2,m1,fils1))
    {
        return 2; 
    }
    return 0; 
}

int esAmiga( int (m1[])[COLS], unsigned int fils1,  int (m2[])[COLS], unsigned int fils2)
{
    for(int i = 0; i < fils1; i++) // recorro las filas de m1
    {
        if(!filaEnMatriz(m1[i], m2,fils2)) // si alguna de las filas de m1 no esta en m2 entonces no es fila amiga
        {
            return false; 
        }
    }
    return true; 
}

int filaEnMatriz(int fil[], int (m[])[COLS], unsigned int fils)
{
    for(int i = 0; i < fils; i++)
    {
        if(contiene(fil,m[i],fils))
        {
            return true; 
        }
    }
    return false; 
}

int contiene( int v1[],  int v2[], unsigned int dim)
{

    int i,j;   // indices de lectura para recorrer los dos vectores
    for( i = 0; i < dim; i++)
    {
        int found = false; // asumo que no encontre el elemento todavia
        for( j = 0; j < dim && !found; j++) // mientras no haya llegado al final del segundo arreglo y no encontre j, sigo incrementando
        {

            if(v1[i] == v2[j]) // si son iguales marco que encontre el elemento
            {
                found = true; 
            }
            if(!found) // si no encontre el elemento en el segundo arreglo aborta el programa ya que las filas no estan incluidas
            {
                return 0; 
            }
        }
    }
    return 1; 

}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions