[C++] Matriz resultante bien calculada pero mal presentada

Iniciado por snoopty, 8 Diciembre 2021, 12:33 PM

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

snoopty

Hola ! La sig Matriz C resultante del producto de A ( 2 Filas, 3 Columnas ) * B ( 3 Filas, 4 Columnas ) arroja los Valores correctos, pero no logro que la Matriz C salga por pantalla como debe ser, presentada bajo 2 Filas y 4 Columnas ya que es Condición del Producto entre dos Matrices que la Matriz Resultante tenga la misma cantidad de Columnas qude la 1 er Matriz ( Y )   la misma cantidad de Filas qude la 2 da Matriz .
//////
Por otra parte, si me explicaran porqué " el FOR de k " sólo tiene en cuenta las Columnas de A;
¿ No debería de haber a continuación " un FOR de k que recorra las Filas de " B " ????  
Lo digo porque:
"i" ( Y ) "j" recorren las Filas y Columnas de " C " ........ y ...
"k" realiza cada Operación recorriendo TANTO las Columnas de " A " ....
...... PERO TAMBIÉN las Filas de " B " !
El Comentario al lado " del FOR de k " lo tomé del razonamiento de quien explicó - súper didácticamente - el Código, pero, " que haya un único FOR de k " no lo entiendo

Código (cpp) [Seleccionar]

#include <iostream>
using namespace std;

int main( ){

  short int fa, ca, fb, cb, i, j, k;

  cout << "Ingrese Nro de Filas de la 1er Matriz: ";
  cin >> fa;

  cout << "Ingrese Nro de Columnas de la 1er Matriz: ";
  cin >> ca;


  cout << "Ingrese Nro de Filas de la 2da Matriz: ";
  cin >> fb;

  cout << "Ingrese Nro de Columnas de la 2da Matriz: ";
  cin >> cb;

  // DECLARACIÓN DE LAS TRES MATRICES
  int A[fa][ca];
  int B[fb][cb];
  int C[fa][cb];


  if ( ca == fb ) { // Si se cumple la Condición " 1 ) " del Producto e/ 2 Matrices se procede ...
    // Ingresar Valores de la matriz A
    cout << "\n\tIntroduzca los valores de la 1er Matriz: " << endl;

    for ( i = 0; i < fa; i++ ) // BUCLE para las Filas " i " de A
      // " i < fa " Porque fa va desde fa[0] hasta fa[\0] x lo q a todas las Filas de A le " sobrará fa[\0] "
      for ( j = 0; j < ca; j++ ) { // BUCLE para las Columnas " j " de A
      // " j < ca " Porque ca va desde ca[0] hasta ca[\0] x lo q a todas las Columnas de A le " sobrará ca[\0] "
        cout << "A["<<i<<"]["<<j<<"] :";
        cin >> A[i][j];
      }

    // Ingresar Valores de la matriz B
    cout << "\n\tIntroduzca los valores de la 2da Matriz: " << endl;

    for ( i = 0; i < fb; i++ ) // BUCLE para las Filas " i " de B
      for ( j = 0; j < cb; j++ ) { // BUCLE para las Columnas " j " de B
        cout << "B["<<i<<"]["<<j<<"] :";
        cin >> B[i][j];
      }

    // Cálculo de la Matriz C = A * B  ( C conformada a partir de Filas de A ( Y ) Columnas de B
    for ( i = 0; i < fa; i++ ) // BUCLE para las Filas " i " de A
      for ( j = 0; j < cb; j++ ) { // BUCLE para las Columnas " j " de B
        C[i][j] = 0;

        for ( k = 0; k < ca; k++ ) // PORQUÉ ????? sólo Col de A ...... y las Filas de B ? ; no era que k recorre ambas ??
          C [i][j]  =  C [i][j]  +  ( A [i][k]  *  B [k][j] );
      }

    cout << endl;

    for ( i = 0; i < fa; i++ ) // BUCLE para las Filas " i " de A
      for ( j = 0; j < cb; j++ ) // BUCLE para las Columnas " j " de B
        cout << C[i][j] << " ";

  } else cout << "\n\tLA MULTIPLICACIÓN ENTRE AMBAS MATRICES NO SE PUEDE REALIZAR" << endl;

  return 0;
}


Gracias x leer el mensaje.




MOD: Modificado el asunto del tema. No escribir todo en mayúsculas.
MOD: Indentar el código para que sea legible.

K-YreX

La matriz no se muestra correctamente porque eso no es automático, tienes que hacerlo tú.

En el último for() estás mostrando todos los valores en una línea seguido de un espacio entre cada elemento.
Si quieres que se muestre como una matriz, tienes que agregar un salto de línea después de mostrar cada fila.


Sobre la otra pregunta. Imagina las matrices:

A = | 1  2 |          B = | 5  6 |
    | 3  4 |              | 7  8 |

Si hacemos C = A * B, el resultado es:

C = | (1 * 5 + 2 * 7)    (1 * 6 + 2 * 8) |
    | (3 * 5 + 4 * 7)    (3 * 6 + 4 * 8) |

Cada vez que avanzamos una columna de la matriz A (1 -> 2 | 3 -> 4) también avanzamos una fila de la matriz B (5 -> 7 | 6 -> 8)
Al avanzar ambas a la vez, sólo se utiliza un for(). Como ca == fb, da igual hacer el for() usando ca o fb como condición. Si te fijas la K se utiliza tanto en A como en B pero en A hace variar las columnas y en B hace variar las filas.

Si se usase otro for() dentro para B, entonces estarías haciendo combinatoria (todos con todos) porque no avanzarías filas (de B) y columnas (de A) a la vez:

(1 * 5 + 1 * 7 + 2 * 5 + 2 * 7)    (1 * 6 + 1 * 8 + 2 * 6 + 2 * 8)
(3 * 5 + 3 * 7 + 4 * 5 + 4 * 7)    (3 * 6 + 3 * 8 + 4 * 6 + 4 * 8)
Código (cpp) [Seleccionar]

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

snoopty

#2
2da ) Respuesta : Enorme explicación. Clara y precisa. Gracias !
Respecto de la 1era ) veré entonces cómo resolverlo. Saludos !


Ya logré el formato de Salida correcto. Faltaban ciertas llaves, y .... :
Código (cpp) [Seleccionar]

for ( i = 0; i < fa; i++ ) // BUCLE para las Filas " i " de A
{
for ( j = 0; j < cb; j++ ) // BUCLE para las Columnas " j " de B
{

cout << C[i][j] << " ";
}
cout << endl; // SALTO DE LÍNEA DEL FOR DE LAS FILAS
             // p q quede un " blank " e/ la 1er FILA y la 2da
}
}



MOD: No hacer doble post: Modificar el mensaje anterior para agregar lo que se quiera.