• Aucun résultat trouvé

L - Exercices L-1 - Exercice 1L-1 - Exercice 1

Dans le document Télécharger cours Java en pdf (Page 112-120)

III - Classes d'usage courant

III- L - Exercices L-1 - Exercice 1L-1 - Exercice 1

Sous Unix, les programmes sont souvent appelés de la façon suivante : $ pg -o1 v1 v2 ... -o2 v3 v4 #

où -oi représente une option et vi une valeur associée à cette option. On désire créer une classe options qui permettrait d'analyser la chaîne d'arguments -o1 v1 v2 ... -o2 v3 v4 # afin de construire les entités suivantes :

optionsValides dictionnaire (Hashtable) dont les clés sont les options oi valides. La valeur associée à la clé oi est un vecteur (Vector) dont les éléments sont les valeurs v1 v2 # associées à l'option -oi

optionsInvalides dictionnaire (Hashtable) dont les clés sont les options oi invalides. La valeur associée à la clé oi est un vecteur (Vector) dont les éléments sont les valeurs v1 v2 # associées à l'option -oi

optionsSans chaîne (String) donnant la liste des valeurs vi non associées à une option

erreur entier valant 0 s'il n'y a pas d'erreurs dans la ligne des arguments, autre chose sinon : 1 : il y a des paramètres d'appel invalides 2 : il y a des options invalides

4 : il y a des valeurs non associées à des options

S'il y a plusieurs types d'erreurs, ces valeurs se cumulent.

Un objet options pourra être construit de 4 façons différentes : public options (String arguments, String optionsAcceptables)

arguments la ligne d'arguments -o1 v1 v2 ... -o2 v3 v4 # à analyser

optionsAcceptables la liste des options oi acceptables Exemple d'appel : options opt=new options("-u u1 u2 u3 -g g1 g2 -x","-u -g");

Ici, les deux arguments sont des chaînes de caractères. On acceptera les cas où ces chaînes ont été découpées en mots mis dans un tableau de chaînes de caractères. Cela nécessite trois autres constructeurs :

public options (String[] arguments, String optionsAcceptables) public options (String arguments, String[] optionsAcceptables) public options (String[] arguments, String[] optionsAcceptables)

La classe options présentera l'interface suivante (accesseurs) :

public Hashtable getOptionsValides()

rend la référence du tableau optionsValides construit lors de la création de l'objet options

public Hashtable getOptionsInvalides()

rend la référence du tableau optionsInvalides construit lors de la création de l'objet options

public String getOptionsSans()

rend la référence de la chaîne optionsSans construite lors de la création de l'objet options

public int getErreur()

rend la valeur de l'attribut erreur construite lors de la création de l'objet options

public String toString()

s'il n'y a pas d'erreur, affiche les valeurs des attributs optionsValides, optionsInvalides, optionsSans ou sinon affiche le numéro de l'erreur.

Voici un programme d'exemple :

import java.io.*; //import options;

public class test1{

public static void main (String[] arg){ // ouverture du flux d'entrée

String ligne;

BufferedReader IN=null; try{

IN=new BufferedReader(new InputStreamReader(System.in)); } catch (Exception e){

affiche(e); System.exit(1); }

// lecture des arguments du constructeur options(String, string) String options=null;

String optionsAcceptables=null; while(true){

System.out.print("Options : "); try{

options=IN.readLine(); } catch (Exception e){ affiche(e); System.exit(2); }

if(options.length()==0) break;

System.out.print("Options acceptables: "); try{

} catch (Exception e){ affiche(e); System.exit(2); }

System.out.println(new options(options,optionsAcceptables)); }// fin while

}//fin main

public static void affiche(Exception e){ System.err.println("Erreur : "+e); } }//fin classe Quelques résultats : C:\Serge\java\options>java test1 Options : 1 2 3 -a a1 a2 -b b1 -c c1 c2 c3 -b b2 b3 Options acceptables: -a -b Erreur 6

Options valides :(-b,b1,b2,b3) (-a,a1,a2) Options invalides : (-c,c1,c2,c3)

Sans options : 1 2 3

III-L-2 - Exercice 2

On désire créer une classe stringtovector permettant de transférer le contenu d'un objet String dans un objet Vector. Cette classe serait dérivée de la classe Vector :

class stringtovector extends Vector et aurait le constructeur suivant :

private void stringtovector(String S, String separateur, int[] tChampsVoulus, boolean strict){

// crée un vecteur avec les champs de la chaîne S

// celle-ci est constituée de champs séparés par separateur // si séparateur=null, la chaîne ne forme qu'un seul champ

// seuls les champs dont les index sont dans le tableau tChampsVoulus // sont désirés. Les index commencent à 1

// si tChampsvoulus=null ou de taille nulle, on prend tous les champs // si strict=vrai, tous les champs désirés doivent être présents

La classe aurait l'attribut privé suivant : private int erreur;

Cet attribut est positionné par le constructeur précédent avec les valeurs suivantes :

• 0 : la construction s'est bien passée

• 4 : certains champs demandés sont absents alors que strict=true La classe aura également deux méthodes :

public int getErreur()

qui rend la valeur de l'attribut privé erreur. public String identite(){

qui affiche la valeur de l'objet sous la forme (erreur, élément 1, élément 2, #) où éléments i sont les éléments du vecteur construit à partir de la chaîne.

Un programme de test pourrait être le suivant :

import java.io.*;

//import stringtovector;

public class essai2{

public static void main(String arg[]){ int[] T1={1,3};

System.out.println(new stringtovector("a : b : c :d:e",":",T1,true).identite()); int[] T2={1,3,7};

System.out.println(new stringtovector("a : b : c :d:e",":",T2,true).identite()); int [] T3={1,4,7};

System.out.println(new stringtovector("a : b : c :d:e",":",T3,false).identite()); System.out.println(new stringtovector("a : b : c :d:e","",T1,false).identite()); System.out.println(new stringtovector("a : b : c :d:e",null,T1,false).identite()); int[] T4={1};

System.out.println(new stringtovector("a : b : c :d:e","!",T4,true).identite()); int[] T5=null;

System.out.println(new stringtovector("a : b : c :d:e",":",T5,true).identite()); System.out.println(new stringtovector("a : b : c :d:e",null,T5,true).identite()); int[] T6=new int[0];

System.out.println(new stringtovector("a : b : c :d:e","",T6,true).identite()); int[] T7={1,3,4};

System.out.println(new stringtovector("a b c d e"," ",T6,true).identite()); } } Les résultats : (0,a,c) (4,a,c) (0,a,d) (0,a : b : c :d:e) (0,a : b : c :d:e) (0,a : b : c :d:e) (0,a,b,c,d,e) (0,a : b : c :d:e) (0,a : b : c :d:e) (0,a,b,c,d,e) Quelques conseils :

1 Pour découper la chaîne S en champs, utiliser la méthode split de la classe String. 2 Mettre les champs de S dans un dictionnaire D indexé par le numéro du champ

3 Récupérer dans le dictionnaire D les seuls champs ayant leur clé (index) dans le tableau tChampsVoulus.

III-L-3 - Exercice 3

On désire ajouter à la classe stringtovector le constructeur suivant :

public stringtovector(String S, String separateur, String sChampsVoulus,boolean strict){ // crée un vecteur avec les champs de la chaîne S

// celle-ci est constituée de champs séparés par separateur // si séparateur=null, la chaîne ne forme qu'un seul champ

// seuls les champs dont les index sont dans sChampsVoulus sont désirés // les index commencent à 1

// si sChampsvoulus=null ou "", on prend tous les champs

// si strict=vrai, tous les champs désirés doivent être présents

La liste des champs désirés est donc dans une chaîne (String) au lieu d'un tableau d'entiers (int[]). L'attribut privé

• 2 : la chaînes des index des champs désirés est incorrecte Voici un programme exemple :

import java.io.*;

//import stringtovector;

public class essai1{

public static void main(String arg[]){ String champs=null;

System.out.println(new stringtovector("a: b :c :d:e ",":","1 3",true).identite()); System.out.println(new stringtovector("a: b :c :d:e ",":","1 3 7",true).identite()); System.out.println(new stringtovector("a: b :c :d:e ",":","1 4 7",false).identite()); System.out.println(new stringtovector("a: b :c :d:e ","","1 3",false).identite()); System.out.println(new stringtovector("a: b :c :d:e ",null,"1 3",false).identite()); System.out.println(new stringtovector("a: b :c :d:e ","!","1",true).identite()); System.out.println(new stringtovector("a: b :c :d:e ",":","",true).identite()); System.out.println(new stringtovector("a: b :c :d:e ",":",champs,true).identite()); System.out.println(new stringtovector("a: b :c :d:e ",null,champs,true).identite()); System.out.println(new stringtovector("a: b :c :d:e ","","",true).identite()); System.out.println(new stringtovector("a: b :c :d:e ",":","1 !",true).identite()); System.out.println(new stringtovector("a b c d e "," ","1 3",false).identite()); } } Quelques résultats : (0,a,c) (4,a,c) (0,a,d) (0,a: b :c :d:e) (0,a: b :c :d:e) (0,a: b :c :d:e) (0,a,b,c,d,e) (0,a,b,c,d,e) (0,a: b :c :d:e) (0,a: b :c :d:e) (2) (0,a,c) Quelques conseils :

Il faut se ramener au cas du constructeur précédent en transférant les champs de la chaîne sChampsVoulus dans un tableau d'entiers. Pour cela, découper sChampsVoulus en champs avec un objet StringTokenizer dont l'attribut countTokens donnera le nombre de champs obtenus. On peut alors créer un tableau d'entiers de la bonne dimension et le remplir avec les champs obtenus.

Pour savoir si un champ est entier, utiliser la méthode Integer.parseInt pour transformer le champ en entier et gérer l'exception qui sera générée lorsque cette conversion sera impossible.

III-L-4 - Exercice 4

On désire créer une classe filetovector permettant de transférer le contenu d'un fichier texte dans un objet Vector. Cette classe serait dérivée de la classe Vector :

class filetovector extends Vector

et aurait le constructeur suivant :

// --- constructeur

public filetovector(String nomFichier, String separateur, int [] tChampsVoulus,boolean strict, String tagCommentaire){

// crée un vecteur avec les lignes du fichier texte nomFichier // les lignes sont faites de champs séparés par separateur

// si séparateur=null, la ligne ne forme qu'un seul champ

// seuls les champs dont les index sont dans tChampsVoulus sont désirés // les index commencent à 1

// si tChampsvoulus=null ou vide, on prend tous les champs // si strict=vrai, tous les champs désirés doivent être présents // si ce n'est pas le cas, la ligne n'est pas mémorisée et son index // est placé dans le vecteur lignesErronees

// les lignes blanches sont ignorées

// ainsi que les lignes commençant par tagCommentaire si tagCommentaire != null

La classe aurait les attributs privés suivants : private int erreur=0;

private Vector lignesErronees=null;

L'attribut erreur est positionné par le constructeur précédent avec les valeurs suivantes :

• 0 : la construction s'est bien passée

• 1 : le fichier à exploiter n'a pas pu être ouvert

• 4 : certains champs demandés sont absents alors que strict=true

• 8 : il y a eu une erreur d'E/S lors de l'exploitation du fichier

L'attribut lignesErronees est un vecteur dont les éléments sont les numéros des lignes erronées sous forme de chaîne de caractères. Une ligne est erronée si elle ne peut fournir les champs demandés alors que strict=true.

La classe aura également deux méthodes :

public int getErreur()

qui rend la valeur de l'attribut privé erreur.

public String identite(){

qui affiche la valeur de l'objet sous la forme (erreur, élément 1 élément 2 #,(l1,l2,#)) où éléments i sont les éléments du vecteur construit à partir du fichier et li les numéros des lignes erronées.

Voici un exemple de test :

import java.io.*; //import filetovector;

public class test2{

public static void main(String arg[]){ int[] T1={1,3};

System.out.println(new filetovector("data.txt",":",T1,false,"#").identite()); System.out.println(new filetovector("data.txt",":",T1,true,"#").identite()); System.out.println(new filetovector("data.txt","",T1,false,"#").identite()); System.out.println(new filetovector("data.txt",null,T1,false,"#").identite()); int[] T2=null;

System.out.println(new filetovector("data.txt",":",T2,false,"#").identite()); System.out.println(new filetovector("data.txt",":",T2,false,"").identite()); int[] T3=new int[0];

System.out.println(new filetovector("data.txt",":",T3,false,null).identite()); }

}

Les résultats d'exécution :

[0,(0,a,c) (0,1,3) (0,azerty,cvf) (0,s)] [4,(0,a,c) (0,1,3) (0,azerty,cvf),[5]]

[0,(0,a:b:c:d:e) (0,1 :2 : 3: 4: 5) (0,azerty : 1 : cvf : fff: qqqq) (0,s)] [0,(0,a:b:c:d:e) (0,1 :2 : 3: 4: 5) (0,azerty : 1 : cvf : fff: qqqq) (0,s)] [0,(0,a,b,c,d,e) (0,1,2,3,4,5) (0,azerty,1,cvf,fff,qqqq) (0,s)]

[0,(0,a,b,c,d,e) (0,1,2,3,4,5) (0,# commentaire) (0,azerty,1,cvf,fff,qqqq) (0,s)] [0,(0,a,b,c,d,e) (0,1,2,3,4,5) (0,# commentaire) (0,azerty,1,cvf,fff,qqqq) (0,s)]

Quelques conseils

1 Le fichier texte est traité ligne par ligne. La ligne est découpée en champs grâce à la classe stringtovector étudiée précédemment.

2 Les éléments du vecteur consitué à partir du fichier texte sont donc des objets de type stringtovector. 3 La méthode identite de filetovector pourra s'appuyer sur la méthode stringtovector.identite() pour afficher

ses éléments ainsi que sur la méthode Vector.toString() pour afficher les numéros des éventuelles lignes erronées.

III-L-5 - Exercice 5

On désire ajouter à la classe filetovector le constructeur suivant :

public filetovector(String nomFichier, String separateur, String sChampsVoulus, boolean strict, String tagCommentaire){

// crée un vecteur avec les lignes du fichier texte nomFichier // les lignes sont faites de champs séparés par separateur // si séparateur=null, la ligne ne forme qu'un seul champ

// seuls les champs dont les index sont dans tChampsVoulus sont désirés // les index commencent 1

// si sChampsvoulus=null ou vide, on prend tous les champs // si strict=vrai, tous les champs désirés doivent être présents // si ce n'est pas le cas, la ligne n'est pas mémorisée et son index // est placé dans le vecteur lignesErronees

// les lignes blanches sont ignorées

// ainsi que les lignes commençant par tagCommentaire si tagCommentaire != null

La liste des index des champs désirés est maintenant dans une chaîne de caractères (String) au lieu d'être dans un tableau d'entiers.

L'attribut privé erreur peut avoir une valeur supplémentaire :

• 2 : la chaînes des index des champs désirés est incorrecte Voici un exemple de test :

import java.io.*; //import filetovector;

public class test1{

public static void main(String arg[]){

System.out.println(new filetovector("data.txt",":","1 3",false,"#").identite()); System.out.println(new filetovector("data.txt",":","1 3",true,"#").identite()); System.out.println(new filetovector("data.txt","","1 3",false,"#").identite()); System.out.println(new filetovector("data.txt",null," 1 3",false,"#").identite()); String S2=null;

System.out.println(new filetovector("data.txt",":",S2,false,"#").identite()); System.out.println(new filetovector("data.txt",":",S2,false,"").identite()); String S3="";

System.out.println(new filetovector("data.txt",":",S3,false,null).identite()); }

Les résultats :

[0,(0,a,c) (0,1,3) (0,azerty,cvf) (0,s)][4,(0,a,c) (0,1,3) (0,azerty,cvf),[5]] [0,(0,a:b:c:d:e) (0,1 :2 : 3: 4: 5) (0,azerty : 1 : cvf : fff: qqqq) (0,s)] [0,(0,a:b:c:d:e) (0,1 :2 : 3: 4: 5) (0,azerty : 1 : cvf : fff: qqqq) (0,s)] [0,(0,a,b,c,d,e) (0,1,2,3,4,5) (0,azerty,1,cvf,fff,qqqq) (0,s)]

[0,(0,a,b,c,d,e) (0,1,2,3,4,5) (0,# commentaire) (0,azerty,1,cvf,fff,qqqq) (0,s)] [0,(0,a,b,c,d,e) (0,1,2,3,4,5) (0,# commentaire) (0,azerty,1,cvf,fff,qqqq) (0,s)]

Quelques conseils

1 On transformera la chaîne sChampsVoulus en tableau d'entiers tChampVoulus pour se ramener au cas du constructeur précédent.

Dans le document Télécharger cours Java en pdf (Page 112-120)