/* Exemple de manipulation d'un types agrégé   */
/* incluant un champ de type tableau           */
/* appliqué au stockage d'un echantillon       */
/* de valeurs numériques réelles               */

public class EchantillonFraisesTagada {

/////////////////////////////////////////////////
  
/* Type agrege de stockage d'un echantillon    */
/* de poids pour 100 fraises Tagada            */
  
  static class EchantillonFraises {
    int numeroMachine = 0;
    String dateEchantillon = "01/01/1901";
    double [] poids = new double[1000]; };

/* Fonction de calcul et retour du pourcentage */
/* de fraises présentes dans un echantillon    */
/* qui ont un poids hors d'un intervalle       */
/* [minimum,maximum]                           */
/* ef : L'echantillonFraises analysé           */
/* minimum : La borne inférieure réelle        */
/*           de l'intervalle de recherche      */
/* maximum : La borne supérieure réelle        */
/*           de l'intervalle de recherche      */

  static double pourcentagePoidsHorsLimites(EchantillonFraises ef,
                                            double minimum,
                                            double maximum) {
    double prctg;
    int i;
    int cpt;
    cpt = 0;
    for ( i = 0 ; i < ef.poids.length ; i = i+1 ) {
      if ( ( ef.poids[i] < minimum ) || ( ef.poids[i] > maximum ) ) {
        cpt = cpt+1; } }
    prctg = cpt/10.0;
    return prctg;
  }

/* Fonction de calcul et retour de la valeur   */
/* médiane du poids des fraises présentes      */
/* dans un echantillon                         */
/* ef : L'echantillonFraises analysé           */

  static double medianePoids(EchantillonFraises ef) {
    double [] poidsTries = ensembleTrie(ef.poids);
    double mediane;
    int indice;
    indice = ef.poids.length/2-1;
    mediane = (ef.poids[indice]+ef.poids[indice+1])/2.0;
    return mediane;
  }

/* Fonction de génération et retour            */
/* du tableau de double contenant les mêmes    */
/* valeurs qu'un tableau de double "source",   */
/* mais ordonnées par ordre croissant          */
/* src : Le tableau de double source           */

  static double [] ensembleTrie(double [] src) {
    int i,j ;
    double aux;
    int n = src.length;
    double [] dst = new double[n];
    for ( i = 0 ; i < n ; i = i+1 ) {
      dst[i] = src[i]; }
    for ( i = 0 ; i < n-1 ; i++ ) {
      for ( j = 0 ; j < n-i-1 ; j++ ) {
        if ( dst[j] > dst[j+1] ) {
          aux = dst[j];
          dst[j] = dst[j+1];
          dst[j+1] = aux; } } }
    return dst;
  }

/////////////////////////////////////////////////
  
  static double nombreAleatoireNorme() {
    double v = 0;
    int i;
    for ( i = 0 ; i < 100 ; i = i+1 ) {
      v = v+Math.random(); }
    v = v/100;
    return v;
  }
  
/* Programme principal                         */

  public static void main(String [] args) {
    int i;
    EchantillonFraises echantillon = new EchantillonFraises();
    echantillon.numeroMachine = 1;
    echantillon.dateEchantillon = "01/03/2019";
    for ( i = 0 ; i < echantillon.poids.length ; i = i+1 ) {
      echantillon.poids[i] = 3.0*nombreAleatoireNorme(); }
    Ecran.afficherln(pourcentagePoidsHorsLimites(echantillon,0.1,2.9),"% hors de l'intervalle [0.1,2.9]");
    Ecran.afficherln(pourcentagePoidsHorsLimites(echantillon,0.5,2.5),"% hors de l'intervalle [0.5,2.5]");
    Ecran.afficherln(pourcentagePoidsHorsLimites(echantillon,1.0,2.0),"% hors de l'intervalle [1.0,2.0]");
    Ecran.afficherln(pourcentagePoidsHorsLimites(echantillon,1.3,1.7),"% hors de l'intervalle [1.3,1.7]");
    Ecran.afficherln(pourcentagePoidsHorsLimites(echantillon,1.4,1.6),"% hors de l'intervalle [1.4,1.6]");
    Ecran.afficherln("Le poids médian est : ",medianePoids(echantillon));
  }
}