Función que diga si dos columnas/filas de una matriz son iguales.

Iniciado por hackersanfe, 4 Diciembre 2018, 19:10 PM

0 Miembros y 3 Visitantes están viendo este tema.

hackersanfe

#10
Lo sigo intentando y nada :( solo dime, asi esta bien para que te almacene los valores de la primera fila en un vector verdad?
   for(i=0;i<N&&!iguales;i++)
       for(j=0;j<M;j++)
           filaAComparar[j]=mat[i][j];

Es que no se que puede ser lo que escriba mal porque en mi cabeza pienso que esta bien
Edito: parece que ahora ya lo voy consiguiendo, os informo
Edito2: conseguido! muchisimas gracias por la ayuda, nada mejor que hacerse el programa a papel y boli... jeje
Edito3: Pues no, me funciona en algunos casos y otros no, no se que puedo tener mal...
int compararFilas(int mat[N][M],int v[M])
{
   int iguales=0,i,j,m,n;
   for(i=0; i<N&&!iguales; i++)
   {
       for(j=0; j<M; j++)
       {
           v[j]=mat[i][j];
       }

       for(m=0; m<M&&!iguales; m++)
       {
           iguales=1;
           for(n=i+1; n<N&&iguales; n++)
           {
               if(mat[n][m]!=v[m])
                   iguales=0;
           }
       }
   }
   return iguales;
}


K-YreX

Hay que darle la vuelta a la segunda parte:

int compararFilas(matriz[FILAS][COLUMNAS]){
    int filaAComparar[COLUMNAS];
    int iguales = 0;
    for(int i = 0; i < FILAS - 1 && !iguales; i++){
        for(int j = 0; j < COLUMNAS; j++)
            filaAComparar[j] = matriz[i][j];

        for(int m = i+1; m < FILAS && !iguales; m++){
            iguales = 1;
            for(int n = 0; n < COLUMNAS && iguales; n++)
                if(filaAComparar[n] != matriz[m][n])
                    iguales = 0;
        }
    }
    return iguales;
}


Si no me he equivocado esa función debería funcionar. Primero, la <i> tiene que ir hasta hasta la penúltima fila ya que no tiene sentido comparar la última con la siguiente (porque no hay siguiente).
Además el array auxiliar no hace falta pasarlo como parámetro, puede ser una variable local que "desaparezca" en cuanto acabe la función.
En la parte final el bucle exterior empieza en <i+1> y el interior en 0. Esto se traduce como: "para cada fila posterior a la fila <i> recorremos toda la fila". Si le das la vuelta fíjate que en el <if> usas <v[m]> y <m> en tu caso no va de 0 a COLUMNAS-1. En tu caso <m> se queda con un valor fijo y lo que se mueve es la <n>. Siempre varía más veces el valor del bucle interior que el exterior. Suerte. :-X
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;

MAFUS

Supongo que con este te irá bien.
Va comprobando desde la primera hasta la penúltima columna si las siguientes son iguales a ellas. En cuánto detecta que dos elementos no son iguales va no pierde más tiempo y va a buscar la siguiente columna. Si detecta que dos columnas son iguales se detiene e informa de ello.
Hay que usar stdbool, pero se puede cambiar el bool por int y true y false por 1 y 0 respectivamente.

bool columnas_iguales(int matriz[][COLUMNAS]) {
    bool retval = false;

    for(int i=0; !retval && i<COLUMNAS-1; ++i) {
        for(int j=i+1; !retval && j<COLUMNAS; ++j) {
            int m;
            for(m=0; m<FILAS; ++m) {
                if(matriz[m][i]!=matriz[m][j])
                    break;
            }
            if(m==FILAS)
                retval = true;
        }
    }

    return retval;
}

K-YreX

#13
Cita de: MAFUS en  8 Diciembre 2018, 17:40 PM
Supongo que con este te irá bien.
Va comprobando desde la primera hasta la penúltima columna si las siguientes son iguales a ellas. En cuánto detecta que dos elementos no son iguales va no pierde más tiempo y va a buscar la siguiente columna. Si detecta que dos columnas son iguales se detiene e informa de ello.
Hay que usar stdbool, pero se puede cambiar el bool por int y true y false por 1 y 0 respectivamente.

bool columnas_iguales(int matriz[][COLUMNAS]) {
   bool retval = false;

   for(int i=0; !retval && i<COLUMNAS-1; ++i) {
       for(int j=i+1; !retval && j<COLUMNAS; ++j) {
           int m;
           for(m=0; m<FILAS; ++m) {
               if(matriz[m][i]!=matriz[m][j])
                   break;
           }
           if(m==FILAS)
               retval = true;
       }
   }

   return retval;
}


Por lo que yo tengo entendido no es muy recomendable usar instrucciones como <break> (excepto en un <switch>), <goto>, etc. Entonces se puede conseguir lo mismo usando la propia variable <retval>. Supones que son iguales y cuando dos valores no coincidan, dejan de ser iguales. Quedaría así:

bool columnas_iguales(int matriz[][COLUMNAS]) {
   bool retval = false;
   for(int i=0; !retval && i<COLUMNAS-1; ++i) {
       for(int j=i+1; !retval && j<COLUMNAS; ++j) {
           retval = true;
           for(int m=0; retval && m<FILAS; ++m)
               if(matriz[m][i]!=matriz[m][j])
                   retval = false;
   }
   return retval;
}

A esto me refería cuando al principio le comenté a Hackersanfe que intentará hacerlo sin el array auxiliar.

PD: No sabía que para usar el tipo de dato <bool> en C se podía hacer con <stdbool>. Yo creaba una enumeración para poder usarlo. Algo así:

typedef enum {false, true} bool;
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;