Programmation Orientée Objet

TP n° 2

String, StringBuffer, encapsulation



Exercice 1. Classes String et StringBuffer, profil des méthodes

    Le but de cet exercice est de faire explorer la classe java.lang.String en testant ses différentes méthodes sur des chaînes et d'autres valeurs lues au clavier. Il s'agit d'écrire la classe exécutable TestChaines dont la méthode principale effectue les opérations suivantes :

  1. Lire une chaîne s1 et afficher sa longueur (méthode length).

  2. Lire deux chaînes s1 et s2 et afficher les résultats renvoyés par les expressions :

Entre autres, essayer les couples "abcd" et "abcd", puis "abcd" et "AbcD".

  1. Lire deux chaînes s1 et s2 et afficher la réponse à la question : « ces deux chaînes commencent-elles par le même caractère ? ». Utiliser la méthode d'instance charAt.

  2. Lire deux chaînes s1 et s2 et afficher la réponse aux questions :

  1. Lire deux chaînes s1 et s2 et concaténer s2 à s1. Par exemple, si s1= "abc"  et s2= "de" , le résultat est "abcde". Opérateur + ou méthode concat.

  2. Lire une chaîne s1 et remplacer toutes les instances de caractère 'o' par 'O' (méthode replace).

  3. Lire deux chaînes s1 et s2 et si s1 contient s2, renvoyer s1 privée de s2 sinon renvoyer s1. Utiliser les méthodes indexOf, substring.

  4. Lire une chaîne représentant un nom de ville et l'afficher entièrement en majuscules (méthode toUpperCase).

  5. Lire une chaîne représentant un nom de ville, lui enlever les éventuels blancs en début et à la fin (méthode trim). Exemple d'appel : TestChaines "   Burnhaupt le haut "  

  6. Lire une chaîne s1 comportant plusieurs noms de villes séparés par un et un seul « blanc ». Décomposer la chaîne pour accéder directement à chacun des noms de ville

Méthode split dont la profil est : public String[] split (String regex)

Vous donnerez à regex la valeur "  " (un blanc).

Afficher un nom de ville par ligne.

Exemple d'appel : TestChaines "Paris Lyon Marseille Strasbourg" 


    Les objets de type
String ne sont pas modifiables. Leur manipulation conduit à la création de nouvelles chaînes et de petits changements dans le contenu de la chaîne peuvent être coûteux. Dans les programmes manipulant intensivement les chaînes, la perte de temps et la place mémoire sont importantes. Ainsi, en particulier, l'opérateur += est très inefficace. Par exemple, str+='A' est implémenté comme : str=str+'A'. Cela signifie qu'une nouvelle chaîne est crée dont la valeur est le résultat de str+'A' et str référence une nouvelle chaîne.

Faire le test suivant :

La classe StringBuffer permet de manipuler les chaînes en modifiant les objets.

Effectuer les opérations suivantes sur la classe StringBuffer :

  1. Utiliser les 3 constructeurs de la classe :

  1. Utiliser les méthodes pour modifier votre chaîne : append, insert, setCharAt, replace, reverse...

    Noter que le 3ème argument de la méthode replace est de type String ; StringBuffer n'étant pas une sous-classe de String, on ne peut transmettre un StringBuffer en 3ème argument.

  2. Faire le même test que pour une instance de String pour vérifier que l'instance de StringBuffer est modifiable.


Exercice 2. Gestion de l'heure

On souhaite disposer d'une classe permettant d'effectuer des conversions (dans les deux sens) entre nombres sexagésimaux (durée exprimée en heures, minutes, secondes) et des nombres décimaux (durée exprimée en heures décimales). Pour ce faire, on réalisera une classe SexDec permettant de représenter une durée. Elle comportera :

On proposera deux solutions :

  1. Avec un champ (privé) représentant la valeur décimale,

  2. Avec des champs (privés) représentant la valeur sexagésimale.

Entre les 2 versions, le programme test TSexDec ne subira aucune modification. Le résultat affiché doit être identique, aux erreurs d'arrondi près.

Remarque :

  1. Pour passer d'une valeur sexagésimale à une valeur décimale :

dec = heures + minutes/60. + secondes/3600. 

  1. Pour passer d'une valeur décimale à une valeur sexagésimale :

Le nombre d'heures n'est rien d'autre que la partie entière de la durée décimale. Utiliser un cast sur un int. En soustrayant le nombre d'heures de la durée décimale, on obtient un résidu d'au plus une heure qu'on convertit en minutes en le multipliant par 60. La valeur des secondes s'obtient de même. Soustraire des minutes décimales les minutes entières pour obtenir un résidu horaire correspondant à au plus une minute. A multiplier par 60 pour avoir la valeur finale.


Voici un exemple du programme test :


public class TSexDec {

    public static void main (String args[]) {

    SexDec h1 = new SexDec(4.51) ;

    System.out.println("h1 - decimal = " + h1.getDec()

        + " Sexa = " + h1.getH() + ":" + h1.getM() + ":" + h1.getS()) ;

    SexDec h2 = new SexDec(2, 32, 15) ;

    System.out.println("h2 - decimal = " + h2.getDec()

        + " Sexa = " + h2.getH() + ":" + h2.getM() + ":" + h2.getS());

    }

}

qui lors de l'exécution affiche :

h1 - decimal = 4.51 Sexa = 4:30:35

h2 - decimal = 2.5375 Sexa = 2:32:15