Correction du TD n°17

Exercice 1 

Tri récursif.

001  action tri(t,indi,indf)
002    Données t : tableau [N] de entier   { Tableau dont une portion est a trier }
003            indi : entier               { Indice du premier entier             }
004                                        { de la portion de tableau a trier     }
005            indf : entier               { Indice du dernier entier             }
006                                        { de la portion de tableau a trier     }
007    Locales aux : entier      { Variable auxilaire pour permutation }
008            ind : entier      { Indice de la valeur a mi distance   }
009                              { entre indi et indf                  }
010    si indf != indi alors
011      si indf == indi+1 alors
012        si t[indi] > t[indf] alors
013          aux := t[indi] 
014          t[indi] := t[indf]
015          t[indf] := aux
016        fsi
017        sinon
018        ind := indi+(indf-indi)/2
019        tri(t,indi,ind)
020        tri(t,ind+1,indf)
021        fusion(t,indi,ind,indf)
022      fsi
023    fsi
024  fin action

001  action triRecursif(t)
002    Données t : tableau [N] de entier        { Tableau a trier }
003    tri(t,0,N-1)        { Lancement du tri recursif des indices 0 à N-1 }
004  fin action

TriRecursifAction.java

TriRecursifFonction.java

Exercice 2 

Une classe vecteur de 4 valeurs réelles.

/* Auteur: Nicolas JANEY          */
/* nicolas.janey@univ-fcomte.fr   */
/* Avril 2005                     */

public class Vecteur {
  /* Tableau de 4 valeurs double pour le stockage         */
  /* des 4 reels d'un objet Vecteur                       */
  double [] t;

  /* Constructeur sans parametre avec initialisation      */
  /* complete a 0 d'un Vecteur                            */
  
  public Vecteur() {
  /* Allocation de memoire pour le tableau t              */
  /* (initialisation a 0 realisee automatiquement)        */
    t = new double[4];
  }
  
  /* Constructeur avec 4 parametres double                */
  /* pour l'initialisation des 4 reels d'un Vecteur       */
  
  public Vecteur(double x,double y,double z,double s) {
  /* Allocation de memoire pour le tableau t              */
    t = new double[4];
  /* Affectations separees des reels de t                 */
    t[0] = x;
    t[1] = y;
    t[2] = z;
    t[3] = s;
  }
  
  /* Methode de multiplication par une Matrice            */
  /* avec par modification du Vecteur                     */
  /* m : Matrice utilisee pour multiplier le Vecteur      */
  
  public void multiplie(Matrice m) {
  /* Appel a la methode multiplie de la classe Matrice    */
    m.multiplie(this);
  }
  
  /* Surcharge de la methode toString                     */
  
  public String toString() {
    return("["+t[0]+","+t[1]+","+t[2]+","+t[3]+"]");
  }
}

Vecteur.java

Une classe matrice de 4x4 valeurs réelles.

/* Auteur: Nicolas JANEY          */
/* nicolas.janey@univ-fcomte.fr   */
/* Avril 2005                     */

public class Matrice {
  /* Tableau de 4x4 valeurs double pour le stockage       */
  /* des 4x4 reels d'un objet Matrice                     */
  double [][] t;

  /* Constructeur sans parametre avec initialisation      */
  /* d'une Matrice a la matrice identite                  */

  public Matrice() {
  /* Allocation de memoire pour le tableau t              */
  /* (initialisation a 0.0 realisee automatiquement)      */
    t = new double[4][4];
  /* Affectation a 1.0 des reels de la diagonale          */
    t[0][0] = t[1][1] = t[2][2] = t[3][3] = 1.0;
  }
  
  /* Methode de reaffectation complete d'une Matrice      */
  /* vers une transformation geometrique de type          */
  /* translation de tx en x, ty en y et tz en z           */
  /* tx, ty, tz : Reels decrivant les valeurs             */
  /*              de translation                          */

  public void toTranslation(double tx,double ty,double tz) {
  /* Affectation a 0.0 des trois premieres colonnes        */
  /* sauf sur la diagonale ou la valeur 1.0 est affectee   */
    for ( int i = 0 ; i < 4 ; i++ )
      for ( int j = 0 ; j < 3 ; j++ )
        t[i][j] = ( i == j ) ? 1.0 : 0.0;
  /* Affectation de la troisieme colonne                   */
    t[0][3] = tx;
    t[1][3] = ty;
    t[2][3] = tz;
    t[3][3] = 1.0;
  }
  
  /* Methode de multiplication d'un vecteur par la matrice */
  /* Le resultat de la multiplication est stocke           */
  /* dans le vecteur                                       */
  /* v : Vecteur a multiplier et a utiliser                */
  /*     pour le stockage du resultat                      */

  public void multiplie(Vecteur v) {
  /* Utilisation d'un vecteur auxiliaire pour le produit   */
  /* matriciel (necessaire pour ne pas ecraser des valeurs */
  /* de v qui devraient etre reutilisees par la suite      */
    Vecteur nv = new Vecteur();
  /* Produit matriciel                                     */
    for ( int i = 0 ; i < 4 ; i++ )
      for ( int k = 0 ; k < 4 ; k++ )
        nv.t[i] += t[i][k]*v.t[k];
  /* Reaffectation de v avec les valeurs de nv             */
    for ( int i = 0 ; i < 4 ; i++ )
      v.t[i] = nv.t[i];
  }
  
  /* Methode de multiplication d'une matrice               */
  /* par la matrice                                        */
  /* Le resultat de la multiplication est stocke           */
  /* dans la matrice                                       */
  /* m : Matrice a multiplier et a utiliser                */
  /*     pour le stockage du resultat                      */

  public void multiplie(Matrice m) {
  /* Utilisation d'une matrice auxiliaire pour le produit  */
  /* matriciel (necessaire pour ne pas ecraser des valeurs */
  /* de v qui devraient etre reutilisees par la suite      */
    Matrice nm = new Matrice();
  /* Produit matriciel                                     */
    for ( int i = 0 ; i < 4 ; i++ )
      for ( int j = 0 ; j < 4 ; j++ ) {
        nm.t[i][j] = 0.0;
        for ( int k = 0 ; k < 4 ; k++ )
          nm.t[i][j] += m.t[i][k]*t[k][j]; }
  /* Reaffectation de la Matrice avec les valeurs de nm    */
    for ( int i = 0 ; i < 4 ; i++ )
      for ( int j = 0 ; j < 4 ; j++ )
        t[i][j] = nm.t[i][j];
  }
  
  /* Surcharge de la methode toString                     */
  
  public String toString() {
    String s = new String();
    for ( int i = 0 ; i < 4 ; i++ )
      s = s+("["+t[i][0]+","+t[i][1]+","+t[i][2]+","+t[i][3]+"]");
    return(s);
  }
}

Matrice.java

Une application manipulant des Vecteur et des Matrice.

/* Auteur: Nicolas JANEY          */
/* nicolas.janey@univ-fcomte.fr   */
/* Avril 2005                     */

public class ApplicationMatricesVecteurs {
  
  public static void main(String [] args) {
  /* Definition, instanciation et affichage d'un vecteur  */
    Vecteur v = new Vecteur(2.2,3.1,-1.2,1.0);
    System.out.println("Vecteur v :");
    System.out.println(v);
  /* Definition et instanciation d'une matrice            */
    Matrice m = new Matrice();
  /* Transformation de m en une translation               */
    m.toTranslation(2.2,-5.0,3.4);
    System.out.println("Matrice m :");
    System.out.println(m);
  /* Multiplication de v par m                            */
    m.multiplie(v);
  /* Affichage de la nouvelle valeur de v                 */
    System.out.println("Produit de m par v :");
    System.out.println(v);
  /* Recreation du vecteur v a sa valeur initiale         */
    v = new Vecteur(2.2,3.1,-1.2,1.0);
  /* Multiplication de v par m                            */
    v.multiplie(m);
  /* Affichage de la nouvelle valeur de v                 */
    System.out.println("Produit de m par v :");
    System.out.println(v);
  /* Definition et instanciation d'une premiere matrice   */
    Matrice m1 = new Matrice();
  /* Transformation en une translation                    */
    m1.toTranslation(4.2,-2.0,1.4);
  /* Affichage                                            */
    System.out.println("Matrice m1 :");
    System.out.println(m1);
  /* Definition et instanciation d'une premiere matrice   */
    Matrice m2 = new Matrice();
  /* Transformation en une translation                    */
    m2.toTranslation(-1.7,4.2,3.4);
  /* Affichage                                            */
    System.out.println("Matrice m2 :");
    System.out.println(m2);
  /* Composition de m1 par m2 dans m1                     */
    m1.multiplie(m2);
  /* Reaffichage de m1                                    */
    System.out.println("Produit de m1 par m2 :");
    System.out.println(m1);
  }
}

ApplicationMatricesVecteurs.java

Auteur: Nicolas JANEY
UFR Sciences et Techniques
Université de Besançon
16 Route de Gray, 25030 Besançon
nicolas.janey@univ-fcomte.fr