Comparar matrices

Iniciado por FranAI, 17 Mayo 2020, 18:23 PM

0 Miembros y 1 Visitante están viendo este tema.

FranAI

Hace poco que  comencé a aprender c++.
Quiero comparar una matriz que ingresa el usuario con una ya almacenada en una variable y determinar si son o no iguales. El problema es que al comparar, hay casos donde me dice que le matriz ingresada es igual a la otra pero claramente no es así! La comparación no está funcionando como debe.
Código (cpp) [Seleccionar]
#include <iostream>
#include <cstring>
using namespace std;
int main(){
   char verificacion1[5];
   char verificacion2[2]="v";
   int num12, num13, num21, num22, num31, num33;
   int matriz1[3][3]=
{
{3, 0, 0},
{0, 0, 3},
{0, 3, 0}
};
int matriz1correcta[3][3] =
{
   {3, 1, 2},
   {1, 2, 3},
   {2, 3, 1},
};
int i, j;
int m;
cout << "Esta es la matriz!" << endl;
for(int i = 0; i < 3; i++) {//Muestro en pantalla la matriz incompleta.
    for(int j = 0; j < 3; j++) {
        printf("%d ", matriz1[i][j]);
    }
   printf("\n");
}
    cout << "Ingresa un numero en la fila 1, columna 2: ";
cin >> num12;
matriz1[0][1] = num12;
cout << "Ingresa un numero en la fila 1, columna 3: ";
cin >> num13;
matriz1[0][2] = num13;
cout << "Ingresa un numero en la fila 2 , columna 1: ";
cin >> num21;
matriz1[1][0] = num21;
cout << "Ingresa un numero en la fila 2, columna 2: ";
cin >> num22;
matriz1[1][1] = num22;
cout << "Ingresa un numero en la fila 3, columna 1: ";
cin >> num31;
matriz1[2][0] = num31;
cout << "Ingresa un numero en la fila 3 , columna 3: ";
cin >> num33;
matriz1[2][2] = num33;
cout << endl << endl;
cout << "Este es la matriz que acabas de armar!" << endl;
for(i = 0; i < 3; i++) {
    for(j = 0; j < 3; j++) {
        printf("%d ", matriz1[i][j]);
    }
   printf("\n");
}

   do{
cout << endl << "Presiona la tecla 'v' para determinar si es correcto o no: ";
cin >> verificacion1;
if (strcmp(verificacion1,verificacion2)==0){
       for(i=0; i<3; i++)
{
           for (j=0; j<3; j++)
{
               if(matriz1[i][j]!= matriz1correcta[i][j])
{
                   m=1;
               }
               else
{
                m=0;
}
           }
       }
if(m==1){
cout << "no son iguales!";
break;
}
if(m==0){
cout << "son iguales!";
}
}
else {
cout << "Por favor, ingrese la letra que se le pide.";

}    
}while(strcmp(verificacion1,verificacion2)!=0);
   
   return 0;
}

K-YreX

El problema está en que en la parte de verificar si son iguales o no, lo que realmente estás haciendo es comprobar si el último elemento de la matriz es igual o no. Para comprobarlo correctamente puedes hacerlo declarando una variable de tipo bool y usándola como condición de salida de los bucles:
Código (cpp) [Seleccionar]

bool iguales = true;
for(int i = 0; i < filas && iguales; ++i){
  for(int j = 0; j < columnas && iguales; ++j){
    iguales = (matriz1[i][j] == matriz2[i][j]);
  }
}

if(iguales)
  cout << "Las matrices son iguales" << endl;
else
  cout << "Las matrices no son iguales" << endl;




Además de eso, otras mejoras serían:
  • No utilizar un char[] para guardar la respuesta. Si solo es un carácter, usa un char.
  • Para comparar varias cadenas char[] es mejor usar strncmp() que strcmp(). La primera permite indicar la cantidad de caracteres a comparar.
  • C++ tiene la ventaja de las variables tipo <string>. Úsalas y te ahorrarás quebraderos de cabeza con char[].
  • Declara el tamaño de las matrices como constantes. Así podrás modificar su tamaño modificando el valor en un único lugar.
    Código (cpp) [Seleccionar]

    // cabeceras...
    const int FILAS = 3;
    const int COLUMNAS = 3;

    int main(){
      int matriz[FILAS][COLUMNAS];
      //...
    }


  • Para pedir los valores al usuario, utiliza un bucle. Así valdrá para cualquier tamaño y te ahorras las variables auxiliares:
    Código (cpp) [Seleccionar]

    for(int i = 0; i < FILAS; ++i){
      for(int j = 0; j < COLUMNAS; ++j){
        cout << "Introduce el valor M[" << i << "][" << j << "]: ";
        cin >> matriz[i][j];
      }
    }
Código (cpp) [Seleccionar]

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

FranAI

Muchas gracias por la respuesta.