Correction du TP n°4

Exercice 1

Inversion d'un tableau de caractères.

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

import java.io.*;

public class InversionTableauCaracteres {
  static BufferedReader flux = new BufferedReader(new InputStreamReader(System.in));
  
  /* Fonction de creation d'un tableau de caracteres      */
  /* initialise avec tous les caracteres                  */
  /* d'une chaine de caracteres                           */
  /* s : chaine de caracteres a traiter                   */
  /* Resultat fonction : tableau de caractere             */

  public static char [] initTableau(String s) {
    int n = s.length();
    char [] t = new char[n];
    for ( int i = 0 ; i < n ; i++ )
      t[i] = s.charAt(i);
    return(t);
  }
  
  /* Fonction de creation d'une chaine de caracteres      */
  /* initialisee avec tous les caracteres                 */
  /* d'une tableau de caracteres                          */
  /* t : tableau de caractere a traiter                   */
  /* Resultat fonction : chaine de caracteres             */

  public static String chaine(char [] t) {
    String s = "";
    for ( int i = 0 ; i < t.length ; i++ )
      s = s+t[i];
    return(s);
  }
  
  /* Fonction d'affichage d'un tableau de caracteres      */
  /* t : tableau de caractere a afficher                  */

  public static void afficheTableau(char [] t) {
    for ( int i = 0 ; i < t.length ; i++ )
      System.out.print(t[i]);
  }

  /* Fonction d'inversion des caracteres d'un tableau     */
  /* de caractere                                         */
  /* t : tableau de caractere a inverser                  */

  public static void inversion(char [] t) {
  /* Calcul de la taille du tableau de caractere          */
    int l = t.length;
  /* (l sur 2) inversions doivent etre realisee           */
    for ( int i = 0 ; i < l/2 ; i++ ) {
  /* On inverse les caracteres d'indice i et l-1-i        */
  /* Une variable auxiliaire du meme type que les deux    */
  /* variables a inverser doit etre utilisee              */
      char c = t[i];
      t[i] = t[l-1-i];
      t[l-1-i] = c; }
  }

  /* Fonction principale                                  */

  public static void main(String [] args) throws IOException {
  /* Creation d'un tableau de caractere a partir          */
  /* de la chaine de caracteres "ABCDEFGHI"               */
  /* Inversion de ce tableau et affichage du resultat     */
    { char [] mot = initTableau("ABCDEFGHI");
      System.out.println(chaine(mot));
      inversion(mot);
      System.out.println(chaine(mot)); }
  /* Au sein d'une boucle infinie                         */
  /* Lecture au clavier d'une chaine de caracteres        */
  /* Creation d'un tableau de caractere a partir          */
  /* de cette chaine de caracteres                        */
  /* Inversion de ce tableau et affichage du resultat     */
    while ( true ) {
      System.out.print("Quelle est la chaine a traiter? : ");
      String s = flux.readLine();
      char [] mot = initTableau(s);
      System.out.print(chaine(mot));
      inversion(mot);
      System.out.println(" -> "+chaine(mot)); }
  }
}

InversionTableauCaracteres.java

Exercice 2

Test si un tableau de caractères représentant un mot est un palindrome.

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

import java.io.*;

public class TestPalindrome {
  static BufferedReader flux = new BufferedReader(new InputStreamReader(System.in));
  
  /* Fonction de creation d'un tableau de caracteres      */
  /* initialise avec tous les caracteres                  */
  /* d'une chaine de caracteres                           */
  /* s : chaine de caracteres a traiter                   */
  /* Resultat fonction : tableau de caractere             */

  public static char [] initTableau(String s) {
    int n = s.length();
    char [] t = new char[n];
    for ( int i = 0 ; i < n ; i++ )
      t[i] = s.charAt(i);
    return(t);
  }
  
  /* Fonction de creation d'une chaine de caracteres      */
  /* initialisee avec tous les caracteres                 */
  /* d'une tableau de caracteres                          */
  /* t : tableau de caractere a traiter                   */
  /* Resultat fonction : chaine de caracteres             */

  public static String chaine(char [] t) {
    String s = "";
    for ( int i = 0 ; i < t.length ; i++ )
      s = s+t[i];
    return(s);
  }
  
  /* Fonction d'affichage d'un tableau de caracteres      */
  /* t : tableau de caractere a afficher                  */

  public static void afficheTableau(char [] t) {
    for ( int i = 0 ; i < t.length ; i++ )
      System.out.print(t[i]);
  }

  /* Fonction de test si la suite de caracteres           */
  /* d'un tableau de caractere est un palindrome          */
  /* t : tableau de caractere a inverser                  */
  /* Resultat fonction : booleen                          */

  public static boolean testPalindrome(char [] t) {
  /* Calcul de la taille du tableau t                     */
    int n = t.length;
  /* Definition et initialisation a 0 d'un entier         */
  /* utilise comme indice pour parcourir la suite         */
  /* de caractere du tableau                              */
    int i = 0;
  /* Boucle tant que avec deux conditions d'arret         */
  /* composees par et:                                    */
  /* - On a trouver deux caracteres differents            */
  /* aux indices i et n-1-i -> ce n'est pas un palindrome */
  /* - On a parcouru plus de (l sur 2) caracteres dans    */
  /* le tableau -> c'est un palindrome                    */
    while ( ( t[i] == t[n-1-i] ) && ( i < n/2 ) )
      i++;
  /* Calcul du resultat                                   */
    return(t[i] == t[n-1-i]);
  }

  /* Fonction principale                                  */

  public static void main(String [] args) throws IOException {
  /* Test de la chaine "ABCDEFGHI"                        */
    { char [] mot = initTableau("ABCDEFGHI");
      System.out.println(chaine(mot)+" : "+testPalindrome(mot)); }
  /* Test de la chaine "KAYAK"                            */
    { char [] mot = initTableau("KAYAK");
      System.out.println(chaine(mot)+" : "+testPalindrome(mot)); }
  /* Definition d'une boucle infinie de lecture           */
  /* au clavier d'une chaine de caracteres, calcul        */
  /* du tableau de caractere correspondant a cette chaine */
  /* et test de ce tableau                                */
    while ( true ) {
      System.out.print("Quelle est la chaine a tester? : ");
      String s = flux.readLine();
      char [] mot = initTableau(s);
      System.out.println(chaine(mot)+" : "+testPalindrome(mot)); }
  }
}

TestPalindrome.java

Exercice 3

Implantation du crible d'Ératosthène pour la détermination des premiers nombres premiers.

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

import java.io.*;

public class CribleEratosthene {
  static BufferedReader flux = new BufferedReader(new InputStreamReader(System.in));

  /* Fonction d'affichage d'un tableau de booleen         */
  /* La valeur de i est affichee si l'element d'indice i  */
  /* est a vrai                                           */
  /* t : tableau de booleen a afficher                    */

  public static void afficheTableau(boolean [] t) {
    for ( int i = 0 ; i < t.length ; i++ )
      if ( t[i] )
        System.out.println(i);
  }

  /* Fonction de realisation du crible d'eratosthene      */
  /* pour determiner tous les nombres premiers            */
  /* inferieurs ou egaux a une valeur entiere positive    */
  /* n : entier                                           */
  /* t : tableau de booleen a remplir                     */

  public static void cribleEratosthene(int n,boolean [] t) {
  /* Initialisation a faux de t[0] et t[1]                */
  /* 0 et 1 ne sont pas des nombres premiers              */
    t[0] = false;
    t[1] = false;
  /* Initialisation a vari du reste de t                  */
  /* Pour l'instant tous les autres nombres sont          */
  /* succeptibles d'etre premier                          */
    for ( int i = 2 ; i < t.length ; i++ ) {
      t[i] = true; }
  /* Pour toutes les valeurs entre 2 et 1 + la partie     */
  /* entiere de racine de n                               */
    for ( int i = 2 ; i <= (int) (Math.sqrt(n)+1) ; i++ )
  /* si t[i] est vrai -> i est definitivement premier     */
      if ( t[i] )
  /* Construction d'une boucle for pour mettre a faux     */
  /* tous les t[j] ou j est un multiple de i              */
  /* Le for s'initialise a j = 2*i, s'execute tant que    */
  /* j est inferieur ou egal a n, avec un pas egal a i    */
        for ( int j = 2*i ; j <= n ; j = j+i )
  /* t[j] n'est pas premier car multiple d'un nombre      */
  /* premier                                              */
          t[j] = false;
  }

  /* Fonction principale                                  */

  public static void main(String [] args) throws IOException {
  /* Lecture au clavier de la valeur pour laquelle        */
  /* on souhaite determiner tous les nombres premiers     */
  /* qui lui sont inferieurs ou egaux                     */
    System.out.print("Combien de nombres a tester : ");
    int n = Integer.valueOf(flux.readLine()).intValue();
  /* Creation d'un tableau de n+1 booleens                */
    boolean [] t = new boolean[n+1];
  /* Realisation du crible d'eratosthene                  */
    cribleEratosthene(n,t);
  /* Affichage du resultat du crible d'eratosthene        */
    afficheTableau(t);
  }
}

CribleEratosthene.java

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