PI-ITBA / 2024_02

Consultas 2C 2024
4 stars 0 forks source link

TP6 EJ 18 #40

Open ssommerr opened 1 month ago

ssommerr commented 1 month ago

Hola! Cómo están? Quería consultar por el ej 18, ya que no estoy pudiendo encararlo bien; no se como hacer para ir chequeando de a 2 matrices a la vez para ver si una es amiga de la otra o al reves; yo principalmente pensaba hacer el ciclo 2 veces, lo cual no se si es lo más eficiente pero me pareció que me iba a quedar mucho mas legible. Esto hasta que me di cuenta que las variables en parametros era de tipo const por lo que no podia intercambiar valores entre ellas o algo del estilo. Iba a hacer una variable maux y definirlo segun cuantas vueltas de. Y mi idea principal era llamar al programa 2 veces, almacenar no lo que devolviesen y de ahi ver si tenia 2 0s o un 1 o 1 2. No se si se podrá modificar algo o si debo pensarlo todo de 0. M e podrían decir? Gracias!

include

include

include

define COLS 4

int sonAmigas(const int (m1[])[COLS], unsigned int fils1,const int (m2[])[COLS], unsigned int fils2 ) { int filas1=0, filas2=0, elemento1=0, elemento2=0, vuelta=0, nosonamigas, maux[][]; while(vuelta<2 && nosonamigas==0) { while(filas1<fils1)

 {
     nosonamigas=1;

    if (m1[filas1][elemento1]==m2[filas2][elemento2])
    {
        do
        {
            elemento1++;
        }
        while(m1[filas1][elemento1]==m1[filas1][elemento1-1] && elemento1<COLS);
        do
        {
            elemento2++;
        }
        while(m1[filas2][elemento2]==m1[filas2][elemento2-1] && elemento2<COLS);
    }
    else if( (m1[filas1][elemento1]> m2[filas2][elemento2]) && (elemento2+1)<COLS)
    {
        elemento2++;
    }
    else
    {
        if ((filas2+1)== fils2)
        {
            nosonamigas=0;
        }
        filas2++;
        elemento2=0;
        elemento1=0;
        }
    if(elemento1==COLS-1 && m1[filas1][elemento1]==m2[filas2][elemento2])
    {
        filas1++;
        filas2=0;
        elemento1=0;
        elemento2=0;
    }
}
 vuelta++;
}
if (vuelta==2 && nosonamigas==0)
return 0;
else if (vuelta==1)
return 1;
else 
return 2;

}

marcelogarberoglio commented 1 month ago

Hola!. No es necesario que modifiques las matrices, de hecho estaría mal que cuando te dicen que verifiques alguna condición sobre vectores los modifiques. Para verificar lo que te piden hay que hacer muchas cosas, entonces verlo como una sola función no te va a resultar. Para verificar si son amigas tenés que: 1) Ver si la matriz 1 es amiga de la 2, o la matriz 2 es amiga de la 1 2) Para ver si una matriz es amiga de otra, todas sus filas deben estar contenidas en la otra matriz 3) Para que una fila está contenida en otra matriz sus elementos tienen que estar contenidos en alguna de las filas de la otra matriz (en la fila 0, o sinó en la fila 1, o sinó en la fila 2, etc.) 4) Para que un vector esté contenido en otro todos sus elementos tienen que pertenecer al segundo vector

Tenés que ir descomponiendo en problemas más pequeños, te van a quedar varias funciones, pero cada una debería ser sencilla de hacer Cualquier duda avisanos

ImNotGone commented 1 month ago

Agregando a lo de Marcelo, siempre q revises rango, tenes que hacerlo antes de desreferenciar. Porque podrias estar exediendote de los limites antes de revisar si elemento1 < COLS No asi:

while(m1[filas1][elemento1]==m1[filas1][elemento1-1] && elemento1<COLS);

Sino asi:

while(elemento1<COLS && m1[filas1][elemento1]==m1[filas1][elemento1-1] );
ssommerr commented 1 month ago

Ok genial! No lo había tenido en cuenta eso, tenes razón!! Gracias!