/* Produits d'une matrice par une matrice       */
/* en versions matrices carrees                 */
/* et matrices generales                        */

public class ProduitsMatriceMatriceEnConsole {

/* Fonction d'affichage des valeurs contenues   */
/* dans un tableau de double a 2 indices        */

  static void affichageMatrice(double [][] t) {
    for ( int i = 0 ; i < t.length ; i++ ) {
      for ( int j = 0 ; j < t[i].length ; j++ ) {
        Console.formater("%7.3f",t[i][j]); }
      Console.sautDeLigne(); }
  }

/* Fonction de creation d'une matrice de double */
/* initialisee avec des nombres aleatoires      */
/* compris dans l'intervalle [0.0,max]          */
/* et un chiffre apres la virgule               */

  static double [][] initRandMatrice(int lignes,
                                     int colonnes,
                                     double max) {
    double [][] tab = new double[lignes][colonnes];
    for ( int i = 0 ; i < lignes ; i++ ) {
      for ( int j = 0 ; j < colonnes ; j++ ) {
        tab[i][j] = ((int) (Math.random()*max*1000.0))/1000.0; } }
    return tab;
  }

//////////////////////////////////////////////////

/* Fonction de calcul du produit d'un tableau   */
/* de dimension 2 de taille n.m                 */
/* par un tableau de dimension 2 de taille m.p  */
/* n, m et p quelconques                        */
/* Retour: Un tableau de dimension 2            */
/* de taille n.p                                */

  static double [][] produit(double [][] m1,
                             double [][] m2) {
    int n = m1.length;
    int m = m2.length;
    int p = m2[0].length;
    double [][] r = new double[n][p];
    for ( int i = 0 ; i < n ; i++ ) {
      for ( int j = 0 ; j < p ; j++ ) {
        r[i][j] = 0.0;
        for ( int k = 0 ; k < m ; k++ ) {
          r[i][j] = r[i][j] + m1[i][k]*m2[k][j]; } } }
    return r;
  }

/* Fonction de calcul du produit d'un tableau   */
/* de dimension 2 de taille n.n (n quelconque)  */
/* par un tableau de dimension 2 de taille n.n  */
/* Retour: Un tableau de dimension 2            */
/* de taille n.n                                */

  static double [][] produitCarre(double [][] m1,
                                  double [][] m2) {
    int n = m1.length;
    double [][] r = new double[n][n];
    for ( int i = 0 ; i < n ; i++ ) {
      for ( int j = 0 ; j < n ; j++ ) {
        r[i][j] = 0.0;
        for ( int k = 0 ; k < n ; k++ ) {
          r[i][j] = r[i][j] + m1[i][k]*m2[k][j]; } } }
    return r;
  }

//////////////////////////////////////////////////

/* Programme principal                          */

  public static void main(String [] args) {
    Console.setTitle("ProduitsMatriceMatrice");
    int n;
    int m;
    int p;
    double [][] m1;
    double [][] m2;
    double [][] mp;
    Console.afficher("n? ");
    n = Console.saisirInt();
    Console.sautDeLigne();
    { Console.afficherln("Génération M1");
      m1 = initRandMatrice(n,n,1.0);
      Console.afficherln("Génération M2");
      m2 = initRandMatrice(n,n,1.0);
      Console.afficherln("Début du calcul du produit");
      mp = produit(m1,m2);
      Console.afficherln("Fin du calcul du produit"); }
    Console.sautDeLigne();
    Console.afficher("n? ");
    n = Console.saisirInt();
    Console.afficher("m? ");
    m = Console.saisirInt();
    Console.afficher("p? ");
    p = Console.saisirInt();
    Console.sautDeLigne();
    { Console.afficherln("Génération M1");
      m1 = initRandMatrice(n,n,1.0);
      Console.afficherln("Génération M2");
      m2 = initRandMatrice(n,n,1.0);
      Console.afficherln("Début du calcul du produit");
      mp = produitCarre(m1,m2);
      Console.afficherln("Fin du calcul du produit"); }
    Console.sautDeLigne();
    { Console.afficherln("Génération M1");
      m1 = initRandMatrice(n,n,1.0);
      Console.afficherln("Génération M2");
      m2 = initRandMatrice(n,n,1.0);
      Console.afficherln("Début du calcul du produit");
      mp = produitCarre(m1,m2);
      Console.afficherln("Fin du calcul du produit"); }
  }
}