Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: FranAI en 17 Mayo 2020, 18:23 pm



Título: Comparar matrices
Publicado por: FranAI en 17 Mayo 2020, 18:23 pm
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
  1. #include <iostream>
  2. #include <cstring>
  3. using namespace std;
  4. int main(){
  5.    char verificacion1[5];
  6.    char verificacion2[2]="v";
  7.    int num12, num13, num21, num22, num31, num33;
  8.    int matriz1[3][3]=
  9. {
  10. {3, 0, 0},
  11. {0, 0, 3},
  12. {0, 3, 0}
  13. };
  14. int matriz1correcta[3][3] =
  15. {
  16.    {3, 1, 2},
  17.    {1, 2, 3},
  18.    {2, 3, 1},
  19. };
  20. int i, j;
  21. int m;
  22. cout << "Esta es la matriz!" << endl;
  23. for(int i = 0; i < 3; i++) {//Muestro en pantalla la matriz incompleta.
  24.     for(int j = 0; j < 3; j++) {
  25.         printf("%d ", matriz1[i][j]);
  26.     }
  27.    printf("\n");
  28. }
  29.     cout << "Ingresa un numero en la fila 1, columna 2: ";
  30. cin >> num12;
  31. matriz1[0][1] = num12;
  32. cout << "Ingresa un numero en la fila 1, columna 3: ";
  33. cin >> num13;
  34. matriz1[0][2] = num13;
  35. cout << "Ingresa un numero en la fila 2 , columna 1: ";
  36. cin >> num21;
  37. matriz1[1][0] = num21;
  38. cout << "Ingresa un numero en la fila 2, columna 2: ";
  39. cin >> num22;
  40. matriz1[1][1] = num22;
  41. cout << "Ingresa un numero en la fila 3, columna 1: ";
  42. cin >> num31;
  43. matriz1[2][0] = num31;
  44. cout << "Ingresa un numero en la fila 3 , columna 3: ";
  45. cin >> num33;
  46. matriz1[2][2] = num33;
  47. cout << endl << endl;
  48. cout << "Este es la matriz que acabas de armar!" << endl;
  49. for(i = 0; i < 3; i++) {
  50.     for(j = 0; j < 3; j++) {
  51.         printf("%d ", matriz1[i][j]);
  52.     }
  53.    printf("\n");
  54. }
  55.  
  56.    do{
  57. cout << endl << "Presiona la tecla 'v' para determinar si es correcto o no: ";
  58. cin >> verificacion1;
  59. if (strcmp(verificacion1,verificacion2)==0){
  60.        for(i=0; i<3; i++)
  61. {
  62.            for (j=0; j<3; j++)
  63. {
  64.                if(matriz1[i][j]!= matriz1correcta[i][j])
  65. {
  66.                    m=1;
  67.                }
  68.                else
  69. {
  70.                 m=0;
  71. }
  72.            }
  73.        }
  74. if(m==1){
  75. cout << "no son iguales!";
  76. break;
  77. }
  78. if(m==0){
  79. cout << "son iguales!";
  80. }
  81. }
  82. else {
  83. cout << "Por favor, ingrese la letra que se le pide.";
  84.  
  85. }    
  86. }while(strcmp(verificacion1,verificacion2)!=0);
  87.  
  88.    return 0;
  89. }


Título: Re: Comparar matrices
Publicado por: K-YreX en 17 Mayo 2020, 19:16 pm
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
  1. bool iguales = true;
  2. for(int i = 0; i < filas && iguales; ++i){
  3.  for(int j = 0; j < columnas && iguales; ++j){
  4.    iguales = (matriz1[i][j] == matriz2[i][j]);
  5.  }
  6. }
  7.  
  8. if(iguales)
  9.  cout << "Las matrices son iguales" << endl;
  10. else
  11.  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
  1. // cabeceras...
  2. const int FILAS = 3;
  3. const int COLUMNAS = 3;
  4.  
  5. int main(){
  6.  int matriz[FILAS][COLUMNAS];
  7.  //...
  8. }

  • Para pedir los valores al usuario, utiliza un bucle. Así valdrá para cualquier tamaño y te ahorras las variables auxiliares:
Código
  1. for(int i = 0; i < FILAS; ++i){
  2.  for(int j = 0; j < COLUMNAS; ++j){
  3.    cout << "Introduce el valor M[" << i << "][" << j << "]: ";
  4.    cin >> matriz[i][j];
  5.  }
  6. }


Título: Re: Comparar matrices
Publicado por: FranAI en 17 Mayo 2020, 21:02 pm
Muchas gracias por la respuesta.