/* Calcul du coefficient de correlation         */
/* lineaire existant entre deux series          */
/* de valeurs reelles                           */

public class CoefficientCorrelationLineaireEnConsole {

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

/* Type agrege de stockage de deux tableaux     */
/* de 15 double                                 */

  static class DeuxSeries {
    double [] x = new double[15];
    double [] y = new double[15]; };

/* Fonction de calcul et retour                 */
/* de la moyenne des valeurs                    */
/* contenues dans un tableau de double          */
/* t : Le tableau de double cible               */

  static double moyenne(double [] t) {
    double moyenne;
    int i;
    moyenne = 0.0;
    for ( i = 0 ; i < t.length ; i = i+1 ) {
      moyenne = moyenne+t[i]; }
    moyenne = moyenne/t.length;
    return moyenne;
  }

/* Fonction de calcul et retour                 */
/* de l'écart quadratique des valeurs contenues */
/* dans un tableau de double                    */
/* t : Le tableau de double cible               */
/* m : La valeur par rapport à laquelle         */
/*     l'écrat quadratique est calculé          */

  static double ecartQuadratique(double [] t,
                                 double m) {
    double v;
    int i;
    v = 0.0;
    for ( i = 0 ; i < t.length ; i = i+1 ) {
      v = v + (t[i]-m)*(t[i]-m); }
    v = Math.sqrt(v);
    return v;
  }

/* Fonction de calcul et retour du coefficient  */
/* de correlation lineaire existant             */
/* entre deux series de valeurs reelles         */
/* ds : Le parametre de type DeuwSeries         */
/*      dans lequel les deux series de valeurs  */
/*      sont stockées                           */

  static double coefficientCorrelation(DeuxSeries ds) {
    double cc;
    int i;
    double mx;
    double my;
    double eqmx;
    double eqmy;
    mx = moyenne(ds.x);
    my = moyenne(ds.y);
    cc = 0.0;
    for ( i = 0 ; i < ds.x.length ; i = i+1 ) {
      cc = cc + (ds.x[i]-mx)*(ds.y[i]-my); }
    eqmx = ecartQuadratique(ds.x,mx);
    eqmy = ecartQuadratique(ds.y,my);
    cc = cc / (eqmx*eqmy);
    return cc;
  }

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

/* Fonction d'initialisation d'un tableau       */
/* de double avec une serie aleatoire           */
/* croissante de reelles                        */
/* t : Les tableau de double à initialiser      */

  static void initAleatoire(double [] t) {
    int i;
    for ( i = 0 ; i < t.length ; i++ ) {
      t[i] = Math.random(); }
  }

/* Fonction d'initialisation d'un tableau       */
/* de double avec une serie aleatoire           */
/* croissante de reelles                        */
/* t : Les tableau de double à initialiser      */

  static void initDecroissant(double [] t) {
    int i;
    t[0] = Math.random();
    for ( i = 1 ; i < t.length ; i++ ) {
      t[i] = t[i-1]-Math.random(); }
  }

/* Fonction d'initialisation d'un tableau       */
/* de double avec une serie aleatoire           */
/* croissante de reelles                        */
/* t : Les tableau de double à initialiser      */

  static void initCroissant(double [] t) {
    int i;
    t[0] = Math.random();
    for ( i = 1 ; i < t.length ; i++ ) {
      t[i] = t[i-1]+Math.random(); }
  }

/* Fonction d'initialisation d'une variable     */
/* de type DeuxSerie avec deux series           */
/* aleatoires croissantes de reelles            */
/* ds : Le parametre de type DeuxSeries         */
/*      à initialiser                           */

  static void initCroissants(DeuxSeries ds) {
    initCroissant(ds.x);
    initCroissant(ds.y);
  }

/* Fonction d'initialisation d'une variable     */
/* de type DeuxSerie avec une serie             */
/* aleatoire croissante de reelles              */
/* et une serie aleatoire decroissante          */
/* ds : Le parametre de type DeuxSeries         */
/*      à initialiser                           */

  static void initCroissantEtDecroissant(DeuxSeries ds) {
    initCroissant(ds.x);
    initDecroissant(ds.y);
  }

/* Fonction d'initialisation d'une variable     */
/* de type DeuxSerie avec deux series           */
/* aleatoires de reelles                        */
/* ds : Le parametre de type DeuxSeries         */
/*      à initialiser                           */

  static void initAleatoires(DeuxSeries ds) {
    initAleatoire(ds.x);
    initAleatoire(ds.y);
  }

/* Programme principal                          */

  public static void main(String [] args) {
    Console.setTitle("CoefficientCorrelationLineaire");
    DeuxSeries ds = new DeuxSeries();
    double cc;
    initCroissants(ds);
    cc = coefficientCorrelation(ds);
    Console.afficherln("Series croissantes");
    Console.afficherln("Coefficient correlation = ",cc);
    initCroissantEtDecroissant(ds);
    cc = coefficientCorrelation(ds);
    Console.afficherln("Series croissante et decroissante");
    Console.afficherln("Coefficient correlation = ",cc);
    initAleatoires(ds);
    cc = coefficientCorrelation(ds);
    Console.afficherln("Series aleatoires");
    Console.afficherln("Coefficient correlation = ",cc);
  }
}