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