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 :
Lire une chaîne s1 et afficher sa longueur (méthode length).
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".
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.
Lire deux chaînes s1 et s2 et afficher la réponse aux questions :
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.
Lire une chaîne s1 et remplacer toutes les instances de caractère 'o' par 'O' (méthode replace).
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.
Lire une chaîne représentant un nom de ville et l'afficher entièrement en majuscules (méthode toUpperCase).
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 "
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 :
Utiliser les 3 constructeurs de la classe :
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.
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 :
int
représentant une valeur
sexagésimale (heures, minutes, secondes) qu'on supposera
normalisée (secondes et minutes entre 0 et 59).double
représentant une
durée en heures.getDec
fournissant la valeur en heures
décimales associée à l'objet.getH
, getM
et
getS
fournissant les trois composantes
du nombre sexagésimal associé à l'objet.On proposera deux solutions :
Avec un champ (privé) représentant la valeur décimale,
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 :
Pour passer d'une valeur sexagésimale à une valeur décimale :
dec = heures + minutes/60. + secondes/3600.
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