#include<stdio.h>
#include<stdlib.h>
#include<time.h>


double random_number(double *rmin, double *rmax){
  return (*rmin) + (float)rand()/(float)RAND_MAX*((*rmax)-(*rmin));
}


int main(){
  double **A;
  double *Af;
  int i,j,k;
  double r_min,r_max;
  double tmp;
  int n_ges;

  n_ges = 4;
  r_min = 0.0;
  r_max = 1.0;

  srand(time(0));

  A = (double**)malloc(n_ges*sizeof(double));

  Af = (double*)malloc(n_ges*n_ges*sizeof(double));

  for (i=0; i<n_ges; i++){
    A[i] = &Af[i*n_ges];
  }

  printf("\nA:\n"); 
  for(i=0; i<n_ges; i++){
    for(j=0; j<n_ges; j++){
      A[i][j] = random_number(&r_min,&r_max);
      printf("%6.3f",A[i][j]);
    }
    printf("\n");
  }

  for(k=0; k<n_ges-1; k++){
    for(i=k+1; i<n_ges; i++){
//      tmp = A[i][k]/A[k][k];
      A[i][k] = A[i][k]/A[k][k];
      for(j=k+1; j<n_ges; j++){
//        A[i][j] = A[i][j] - tmp*A[k][j];
        A[i][j] = A[i][j] - A[i][k]*A[k][j];
      }
//      A[i][k] = tmp;
    }
  }

  printf("\nA:\n"); 
  for(i=0; i<n_ges; i++){
    for(j=0; j<n_ges; j++){
      tmp = 0.;
      k = 0;
      while( k<=i && k<=j ){
        if ( k==i ) tmp += A[i][j];
        else tmp += A[i][k]*A[k][j];
        k++;
      }
      printf("%6.3f",tmp);
    }
    printf("\n");
  }

  return 0;
}

