#include<iostream>
#include<stdlib.h>
using namespace std;

/* Produit de deux matrices */

double** matrice(int m, int n){
  double** M;
  int i;

  M = (double**)malloc(m * sizeof(double*));
  for (i = 0; i < m; i++)
    M[i] = (double*)malloc(n * sizeof(double));
  return M;
}

void free_matrice(double** M, int m){
  int i;

  for (i = 0; i < m; i++)
    free(M[i]);
  free(M);
}  

void affichage(double** M, int m, int n){
  int i, j;

  for (i = 0; i < m; i++){
    for (j = 0; j < n; j++)
      cout << M[i][j] << " ";
    cout << endl;
  }
  cout << endl;
}

void produit(double** A, double** B, double** C, int m, int n, int p){
  int i, j, k;

  for (i = 0; i < m; i++)
    for (k = 0; k < p; k++){
      C[i][k] = 0.;
      for (j = 0; j < n; j++)
	C[i][k] += A[i][j] * B[j][k];
    }
}

int main(){
  int m = 2, n = 2, p = 3;
  double **A, **B, **C;
  int i,j;
 
  A = matrice(m,n);
  B = matrice(n,p);
  C = matrice(m,p);
  for (i = 0; i < m; i++)
    for (j = 0; j < n; j++)
      A[i][j] = (i+1)*(j+2);
  affichage(A,m,n);
  for (i = 0; i < n; i++)
    for (j = 0; j < p; j++)
      B[i][j] = (i+1)*(j+2);
  affichage(B,n,p);
  produit(A,B,C,m,n,p);
  affichage(C,m,p);
  free_matrice(A,m);
  free_matrice(B,n);
  free_matrice(C,m);
  return 0;
}
