c Fabrice Rossi, 1997-2002
Conditions de distribution et de copie
Cet ouvrage peut être distribué et copié uniquement selon les conditions qui suivent :
1. toute distribution commerciale de l’ouvrage est interdite sans l’accord préalable explicite de
l’auteur. Par distribution commerciale, on entend une distribution de l’ouvrage sous quelque
forme que ce soit en échange d’une contribution financière directe ou indirecte. Il est par
exemple interdit de distribuer cet ouvrage dans le cadre d’une formation payante sans autorisation préalable de l’auteur ;
2. la redistribution gratuite de copies exactes de l’ouvrage sous quelque forme que ce soit est
autorisée selon les conditions qui suivent :
(a) toute copie de l’ouvrage doit impérativement indiquer clairement le nom de l’auteur de
l’ouvrage ;
(b) toute copie de l’ouvrage doit impérativement comporter les conditions de distribution et
de copie ;
(c) toute copie de l’ouvrage doit pouvoir être distribuée et copiée selon les conditions de
distribution et de copie ;
3. la redistribution de versions modifiées de l’ouvrage (sous quelque forme que ce soit) est interdite sans l’accord préalable explicite de l’auteur. La redistribution d’une partie de l’ouvrage
est possible du moment que les conditions du point 2 sont vérifiées ;
4. l’acceptation des conditions de distribution et de copie n’est pas obligatoire. En cas de non
acceptation de ces conditions, les règles du droit d’auteur s’appliquent pleinement à l’ouvrage.
Toute reproduction ou représentation intégrale ou partielle doit être faite avec l’autorisation
de l’auteur. Seules sont autorisées, d’une part, les reproductions strictement réservées à l’usage
privé et non destinées à une utilisation collective, et d’autre part, les courtes citations justifiées
par le caractère scientifique ou d’information de l’oeuvre dans laquelle elles sont incorporées
(loi du 11 mars 1957 et Code pénal art. 425).
Exercices (III) : Chaı̂nes de caractères
Fabrice Rossi
8 janvier 2002
1
1.1
Analyse de programmes
Mémoire
Exercice 1.1 :
On considère le programme suivant :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Truc
public class Truc {
public static void a(String s) {
s+="DSQKJ";
}
public static String b(String s) {
s+="GHIJK";
return s;
}
public static void c(StringBuffer sb) {
sb.append("KNTOP");
}
public static StringBuffer d(StringBuffer sb) {
new StringBuffer("ERTBG");
sb=new
return sb;
}
public static void main(String[] args) {
String s="JNHGV";
a(s);
System.out.println(s);
s="GHIJK";
b(s);
System.out.println(s);
new StringBuffer("ABCDE");
StringBuffer sb=new
c(sb);
System.out.println(sb);
new StringBuffer("ERTBG");
sb=new
d(sb);
System.out.println(sb);
}
}
1.1 Mémoire
1. Dessiner l’état complet de la mémoire (en supposant que l’éboueur a fait son travail) juste
après l’exécution de la ligne 10 (et avant le retour dans la méthode main).
2. Donner l’affichage produit par le programme.
Exercice 1.2 :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
Indiquer l’affichage produit par le programme suivant :
Analyse
public class Analyse {
int x) {
public static void modif1(int
x+=2;
}
int x) {
public static void modif2(int
x=5;
}
//
public static String ajoute1(String s) {
s+=" toto";
return s;
}
public static String ajoute2(String s) {
s="toto";
return "titi";
}
//
public static StringBuffer concat1(StringBuffer sb) {
sb.append(" +++");
return sb;
}
public static StringBuffer concat2(StringBuffer sb) {
sb= new StringBuffer("+++");
return sb;
}
public static void main(String[] args) {
int x=24;
modif1(x);
System.out.println(x);
x=24;
modif2(x);
System.out.println(x);
//
String s="titi";
System.out.println(ajoute1(s));
System.out.println(s);
s="titi";
System.out.println(ajoute2(s));
System.out.println(s);
//
new StringBuffer("---");
StringBuffer sb=new
F. Rossi– 8 janvier 2002 (Version 2.1)
p. 3
1.2 Manipulations
System.out.println(concat1(sb));
System.out.println(sb);
new StringBuffer("---");
sb=new
System.out.println(concat2(sb));
System.out.println(sb);
42
43
44
45
46
}
47
48
1.2
}
Manipulations
Exercice 1.3 :
On considère la méthode suivante :
1
2
3
4
5
6
public static String e(String a) {
String r="";
for(int i=0;i<a.length();i++)
r=a.charAt(a.length()-i)+r;
return r;
}
1. Cette méthode :
(a) renvoie le miroir de la chaı̂ne paramètre (c’est-à-dire la chaı̂ne constituée des mêmes
caractères que la chaı̂ne paramètre mais dans le sens inverse)
(b) renvoie une chaı̂ne identique à la chaı̂ne paramètre
(c) plante quand la chaı̂ne paramètre contient au moins un caractère
(d) plante toujours
2. On remplace la ligne 3 par la ligne for(int i=1 ;i<=a.length() ;i++). La nouvelle
méthode :
(a) renvoie le miroir de la chaı̂ne paramètre (c’est-à-dire la chaı̂ne constituée des mêmes
caractères que la chaı̂ne paramètre mais dans le sens inverse)
(b) renvoie une chaı̂ne identique à la chaı̂ne paramètre
(c) plante quand la chaı̂ne paramètre contient au moins un caractère
(d) plante toujours
3. On remplace la ligne 3 par la ligne for(int i=a.length() ;i>0 ;i--). La nouvelle méthode :
(a) renvoie le miroir de la chaı̂ne paramètre (c’est-à-dire la chaı̂ne constituée des mêmes
caractères que la chaı̂ne paramètre mais dans le sens inverse)
(b) renvoie une chaı̂ne identique à la chaı̂ne paramètre
(c) plante quand la chaı̂ne paramètre contient au moins un caractère
(d) plante toujours
4. Dans la méthode d’origine, on remplace la ligne 4 par :
r=a.charAt(a.length()-i-1)+r ;.
La nouvelle méthode :
F. Rossi– 8 janvier 2002 (Version 2.1)
p. 4
1.2 Manipulations
(a) renvoie le miroir de la chaı̂ne paramètre (c’est-à-dire la chaı̂ne constituée des mêmes
caractères que la chaı̂ne paramètre mais dans le sens inverse)
(b) renvoie une chaı̂ne identique à la chaı̂ne paramètre
(c) plante quand la chaı̂ne paramètre contient au moins un caractère
(d) plante toujours
Exercice 1.4 :
On considère la méthode suivante :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public static int d(String a,String b) {
int k=Math.min(a.length(),b.length());
for(int i=0;i<k;i++) {
if(a.charAt(i)<b.charAt(i)) {
return -1;
} else {
if (a.charAt(i)>b.charAt(i)) {
return 1;
}
}
}
if(a.length()<b.length()) {
return -1;
} else {
if(a.length()>b.length()) {
return 1;
} else {
return 0;
}
}
}
1. Cette méthode renvoie :
(a) -1 si la chaı̂ne a est avant la chaı̂ne b dans le dictionnaire, 1 si a est après b et 0 si
les chaı̂nes sont identiques
(b) -1 si la chaı̂ne a est après la chaı̂ne b dans le dictionnaire, 1 si a est avant b et 0 si
les chaı̂nes sont identiques
(c) -1 si le premier caractère de a est avant le premier caractère de b dans l’alphabet,
1 si le premier caractère de a est après le premier caractère de b et 0 si les deux
caractères sont égaux
(d) -1 si le premier caractère de a est après le premier caractère de b dans l’alphabet,
1 si le premier caractère de a est avant le premier caractère de b et 0 si les deux
caractères sont égaux
2. On remplace la ligne 2 de la méthode par int k=Math.max(a.length(),b.length()) ;.
Suite à cette modification, la méthode fonctionne en général exactement comme la méthode d’origine. Il arrive cependant que la méthode plante. Donner un exemple de chaı̂nes
paramètres qui provoquent un plantage. Donner une caractérisation précise de tous les
cas qui entraı̂nent un plantage.
F. Rossi– 8 janvier 2002 (Version 2.1)
p. 5
1.2 Manipulations
3. Dans la méthode d’origine, on remplace les lignes 12 à 20 par la ligne return
a.length()-b.length() ; :
(a) la méthode ne compile plus
(b) la méthode peut parfois planter (provoquer l’arrêt du programme)
(c) la méthode fonctionne comme la version d’origine
(d) le signe du résultat de la nouvelle méthode est identique au signe du résultat de la
méthode d’origine
(e) la méthode fonctionne mais donne des résultats complètement différents de ceux de
la méthode d’origine
Exercice 1.5 :
On considère la méthode :
1
2
3
4
5
6
7
8
9
10
public static String f(String s) {
StringBuffer sb=new StringBuffer(s);
int i;
for(i=0;i<sb.length();i++) {
char c=sb.charAt(i);
sb.setCharAt(i,sb.charAt(sb.length()-i-1));
sb.setCharAt(sb.length()-i-1,c);
}
return sb.toString();
}
1. La méthode devrait renvoyer le miroir de la chaı̂ne paramètre, c’est-à-dire une chaı̂ne de
caractères obtenue en retournant la chaı̂ne paramètre. En fait, la méthode ne fonctionne
pas :
(a) elle renvoie une chaı̂ne égale à la chaı̂ne d’origine
(b) elle ne compile pas
(c) elle fonctionne seulement avec les chaı̂nes de longueur strictement supérieure à 1 et
plante sinon
(d) elle plante toujours
2. L’erreur principale est située à la ligne :
(a) 4
(b) 6
(c) 5
(d) 7
3. Donner une version correcte de cette méthode, en modifiant le moins possible la version
proposée. Il est interdit d’utiliser la méthode reverse des StringBuffers.
F. Rossi– 8 janvier 2002 (Version 2.1)
p. 6
1.2 Manipulations
Exercice 1.6 :
On considère la méthode suivante :
1
2
3
4
5
6
7
8
9
public static String buildString(String s) {
String r="";
for(int i=0;i<s.length();i++) {
if(keepChar(s.charAt(i),i)) {
r=r+s.charAt(i);
}
}
return r;
}
On remarque que la méthode utilise la méthode keepChar.
1. On suppose que la méthode keepChar est la suivante :
1
2
3
public static boolean keepChar(char c,int position) {
return true;
}
Que fait alors la méthode buildString (justifiez votre réponse) ?
2. On suppose que la méthode keepChar est la suivante :
1
2
3
4
5
6
7
public static boolean keepChar(char c,int position) {
if(position%2==1) {
return true;
} else {
return false;
}
}
Quel est le résultat de la méthode buildString si on lui transmet la chaı̂ne "NBVCX" ?
Que fait la méthode buildString ?
3. Pour chaque résultat souhaité pour la méthode buildString proposez une méthode keepChar qui permette son obtention :
(a) La chaı̂ne renvoyée par buildString doit contenir un caractère sur trois de la chaı̂ne
paramètre, en conservant le caractère de position 1, puis celui de position 4, etc.
L’image de "ABCDEF" est donc "BE".
(b) La chaı̂ne renvoyée par buildString doit contenir les caractères qui ne sont pas
des chiffres contenus dans la chaı̂ne paramètre. L’image de "AB2C3D6EF" est donc
"ABCDEF".
Vous pourrez utiliser la classe Character qui propose une méthode isDigit qui à un
char associe true si et seulement si ce caractère correspond à un chiffre.
F. Rossi– 8 janvier 2002 (Version 2.1)
p. 7
2
Programmation
Exercice 2.1 :
Ecrire une méthode qui compare deux chaı̂nes de caractères au regard de l’ordre lexicographique
(l’ordre du dictionnaire pour les caractères non accentués). On n’utilisera pas la méthode
compareTo mais on cherchera à produire des résultats identiques à ceux de cette méthode.
Exercice 2.2 :
Ecrire une méthode qui à une chaı̂ne de caractères associe le nombre de caractères distincts
que celle-ci contient.
Exercice 2.3 :
Ecrire une méthode qui permet la saisie d’une chaı̂ne de caractères ne contenant que des chiffres.
Ecrire une méthode qui à une chaı̂ne de caractères ne contenant que des chiffres associe le
nombre correspondant (sous forme d’un int). Ecrire une méthode réalisant l’opération inverse.
Exercice 2.4 :
Écrire un programme qui demande à l’utilisateur un texte et un mot, puis affiche pour chaque
lettre du mot, le nombre d’occurrences de cette lettre dans le texte de départ.
Exercice 2.5 :
Ecrire une méthode qui à une chaı̂ne de caractères associe le nombre de mots que celle-ci
contient. Ecrire ensuite une méthode qui calcule la longueur moyenne des mots d’un texte.
Exercice 2.6 :
Ecrire une méthode qui à une chaı̂ne de caractères associe true si et seulement si la phrase
qu’elle contient vérifie les règles élémentaires de typographie : la phrase commence par une
majuscule et termine par un point. Les mots sont séparés par exactement un espace (sauf en
cas de symbole de ponctuation). La virgule et le point sont collés au mot qui les précède et
sont suivis par un espace. Le point-virgule et les deux points sont précédés et suivis par un
espace.
Exercice 2.7 :
Ecrire une méthode qui reçoit une chaı̂ne de caractères de longueur impaire et l’affiche sous la
forme d’un sablier et d’un noeud papillon. Par exemple :
bonjour
onjou
njo
j
njo
onjou
bonjour
b
r
bo
ur
bon our
bonjour
bon our
bo
ur
b
r
Exercice 2.8 :
Ecrire une méthode qui à deux chaı̂nes de caractères s1 et s2 associe la chaı̂ne constituée des
caractères de s1 qui n’apparaissent pas dans s2 (dans le même ordre).
F. Rossi– 8 janvier 2002 (Version 2.1)
p. 8
Exercice 2.9 :
Ecrire une méthode qui reçoit en paramètre une chaı̂ne de caractères et l’affiche sur deux lignes,
en affichant sur la première ligne les caractères de rang impair et sur la seconde les caractères
de rang pair. Par exemple, pour "ALGORITHME", on obtient :
A G R T M
L O I H E
Exercice 2.10 :
On donne l’algorithme de cryptage élémentaire (et très inefficace) suivant :
Données :
– une chaı̂ne de caractères t : le texte à coder ;
– une chaı̂ne de caractères c : la clé (de longueur strictement inférieure à celle de t).
Résultat : une chaı̂ne de caractères cryptée.
1. créer une chaı̂ne vide s.
2. pour chaque caractère x de t (dans l’ordre) :
(a) extraire de c le caractère de position i définie comme suit : soit j la position de x
dans t. i est le reste de la division de j par la longueur de c.
(b) ajouter au code unicode de x celui de c.
(c) ajouter à la chaı̂ne s le caractère correspondant au code unicode qui vient d’être
obtenu.
3. Résultat : la chaı̂ne s.
Programmez une méthode de codage et une méthode de décodage utilisant cet algorithme.
Exercice 2.11 :
Etant donnés une chaı̂ne de caractères s et un caractère c, on peut découper s selon c de la
manière suivante : si s ne contient pas c, l’unique sous-chaı̂ne u0 est la chaı̂ne s entière. Sinon, s
est formée d’une première partie u0 ne contenant pas c, suivie de c, suivie d’une seconde partie
s1 . Si s1 n’est pas la chaı̂ne vide, on peut recommencer l’opération sur celle-ci, en cherchant c
dans s1 , ce qui permet de construire u1 et s2 , etc.
Ecrire une méthode qui à une chaı̂ne de caractères s, un caractère c et un entier n associe la
sous-chaı̂ne un (éventuellement vide).
3
Problèmes
Problème 3.1 :
Pour répondre aux questions de ce problème, on pourra en général donner deux solutions :
une avec les Strings, l’autre avec les StringBuffers. Les deux solutions sont intéressantes à
comparer, tant au niveau de l’efficacité que de la simplicité de l’écriture.
1. Écrire une méthode build prenant comme paramètres un caractère c et un entier positif
n, et renvoyant la chaı̂ne constituée de n fois le caractère c. Si le paramètre entier est
négatif ou nul, la méthode devra renvoyer la chaı̂ne de caractères vide.
Exemple : le résultat de build(’a’,3) est donc la chaı̂ne de caractères "aaa".
F. Rossi– 8 janvier 2002 (Version 2.1)
p. 9
2. Écrire une méthode combine prenant comme paramètres deux caractères a et b, et deux
entiers n et p. En utilisant la méthode build, combine devra associer à ces paramètres la
chaı̂ne de caractères constituée de n fois a, suivi de p fois b, puis encore n fois a.
Exemple : le résultat de combine(’u’,’V’,3,2) est donc la chaı̂ne "uuuVVuuu". La
méthode doit fonctionner même si n ou p est nul.
3. Écrire une méthode pyramide prenant comme paramètre un entier strictement positif
n. Cette méthode devra afficher une pyramide de hauteur n à l’écran (en utilisant impérativement la méthode combine). Un tel affichage comprend n lignes. La première
ligne comprend n-1 espaces, un + et encore n-1 espaces. Chaque ligne est obtenue en
remplaçant par des + les espaces qui entourent la chaı̂ne des + dans la ligne précédente.
Par exemple, la seconde ligne comporte n-2 espaces, suivis de 3 +, suivis de n-2 espaces.
La dernière ligne contient donc 2n-1 fois le caractère +.
Exemple : ceci donne pour n égal à 4 l’affichage suivant :
___+___
__+++__
_+++++_
+++++++
Pour rendre l’affichage plus clair, les espaces ont été remplacés par le caractère _ (on
utilisera cette notation dans tout l’énoncé).
4. Calculer (en justifiant mathématiquement votre résultat) un , le nombre de caractères +
affiché par l’appel pyramide(n).
5. Le caractère ’\n’ s’affiche à l’écran sous forme d’un passage à la ligne (il s’agit dien d’un
seul caractère). Si on exécute par exemple :
System.out.println("a\nb") ;
On obtiendra l’affichage suivant :
a
b
En utilisant cette propriété, écrire une méthode pyramide2 qui effectue les mêmes opérations que pyramide, mais place le dessin de la pyramide dans une chaı̂ne de caractères
au lieu de l’afficher, et renvoie la chaı̂ne résultat.
Exemple : le résultat de pyramide2(2) sera donc la chaı̂ne _+_\n+++ (dans laquelle _
remplace le caractère espace).
6. Écrire une méthode compte qui à une chaı̂ne de caractères s et un caractère c associe le
nombre d’apparitions de c dans s.
Exemple : l’appel compte("bbbAABBb",’b’) renvoie donc 4.
7. Écrire une méthode remplace prenant comme paramètres une chaı̂ne de caractères s, un
entier positif ou nul n et deux caractères a et b. La méthode devra renvoyer une nouvelle
chaı̂ne obtenue en remplaçant dans s la n-ième apparition du caractère a par le caractère
b.
Exemple : l’appel remplace("AAABBBAA",2,’B’,’-’) donne ainsi comme résultat la
chaı̂ne "AAAB-BAA".
8. Écrire une méthode modifie prenant comme paramètres une chaı̂ne de caractères s et
deux caractères a et b. La méthode renvoie une chaı̂ne de caractères obtenue en remplaçant
une apparition de a par b dans s, choisie aléatoirement. On utilisera impérativement les
méthodes random (de la classe Math) et remplace.
F. Rossi– 8 janvier 2002 (Version 2.1)
p. 10
Exemple : le résultat de l’appel modifie("AAABBBAA",’B’,’-’) pourra être
"AAA-BBAA", "AAAB-BAA" ou "AAABB-AA", selon l’apparition choisie.
9. Écrire une méthode pyramide3 prenant comme paramètre un entier n. Cette méthode
commencera par utiliser pyramide2 pour fabriquer une pyramide dans une chaı̂ne de
caractères, puis elle appellera plusieurs fois modifie afin de remplacer 25% des caractères
+ par *. Elle aura pour résultat la chaı̂ne de caractères ainsi obtenue.
Exemple : comme modifie est aléatoire, nous n’indiquons ici qu’un seul résultat possible
pour l’appel pyramide3(3), à savoir la chaı̂ne
__+__\n_*++_\n+++*+
Cette chaı̂ne s’affiche de la façon suivante :
__+__
_*++_
+++*+
Notons bien que pyramide3 ne fait pas d’affichage.
10. Écrire une méthode développe prenant comme paramètre deux chaı̂nes de caractères s
et t, et un caractère c. Le résultat de la méthode est la chaı̂ne s dans laquelle chaque
apparition de c a été remplacée par la chaı̂ne t.
Exemple : le résultat de développe("bAbAAd","XoY",’A’) est donc la chaı̂ne
"bXoYbXoYXoYd".
11. On appelle pn la chaı̂ne de caractères produite par l’appel pyramide2(n), c’est-à-dire la
pyramide de hauteur n. On peut montrer que pn+1 s’obtient à partir de pn par l’algorithme
suivant :
(a) u s’obtient en ajoutant un espace au début et à la fin de pn ;
(b) v est le résultat du remplacement dans u de \n par la chaı̂ne "_\n_" (l’espace est ici
remplacé par "_") ;
(c) pn+1 s’obtient enfin en ajoutant à v le caractère \n puis la dernière ligne de la pyramide
(celle qui ne contient que des +).
Programmer une méthode développe2 qui applique à une chaı̂ne s et un entier n l’algorithme qui vient d’être présenté, et renvoie la chaı̂ne résultat. Pourquoi le paramètre n
est-il indispensable ? Notons qu’il correspond à pn et que l’appel développe2(pn ,n) doit
donc produire comme résultat la chaı̂ne pn+1 .
12. Programmer une méthode pyramide4 qui produit le même résultat que pyramide2 mais
en utilisant la méthode développe2.
13. Programmer une méthode randomChar, prenant comme paramètre un entier n et renvoyant soit le caractère +, soit le caractère *. Plus précisément, la méthode choisit aléatoirement un entier compris entre 1 et n et renvoie * si et seulement si cet entier est égal
à 1. En moyenne on obtient donc le caractère + n-1 fois sur n. Programmer une méthode
combineAléa prenant comme paramètres deux entiers n et p et fabrique une chaı̂ne de
p caractères obtenue en utilisant randomChar avec comme paramètre n. Programmer enfin une méthode pyramide5 qui obtient directement un résultat similaire à pyramide3.
Quelles sont les différences entre les résultats de deux méthodes ?
Problème 3.2 :
On souhaite étudier dans une chaı̂ne de caractères les séquences de caractères identiques,
c’est-à-dire les séquences de la forme "aaaa". Il faut bien sûr qu’une séquence de caractères
identiques comporte au moins deux caractères pour qu’elle soit prise en compte !
F. Rossi– 8 janvier 2002 (Version 2.1)
p. 11
Questions :
1. Écrire une méthode qui à une chaı̂ne de caractères associe une nouvelle chaı̂ne de caractères obtenue en remplaçant chaque séquence de lettres identiques par la première d’entre
elles (par exemple "aabb" devient "ab", "aaabbc" devient "abc", etc.).
2. Écrire une méthode qui à une chaı̂ne de caractères associe le nombre de séquences de
caractères identiques qu’elle contient (pour "aaabbc" on obtient 2).
3. Écrire une méthode qui à une chaı̂ne de caractères associe un booléen true si elle contient
au moins une séquence de caractères identiques et false sinon. On n’utilisera pas la
méthode solution de la question précédente.
4. Écrire une méthode qui à une chaı̂ne de caractères associe la longueur de la plus longue
séquence de caractères identiques qu’elle contient et 0 si elle n’en contient pas (pour
"aaabbc" on obtient 3).
5. Écrire une méthode qui à une chaı̂ne de caractères associe la moyenne des longueurs des
séquences de caractères identiques qu’elle contient et 0 si elle n’en contient pas. Pour
la chaı̂ne "aaabbcbbaad", on obtient 2.25. En effet, elle contient 4 séquences, trois de 2
lettres et une de 3 lettres, et la moyenne des longueurs est bien 2.25.
Problème 3.3 :
Dans ce problème, on programme un ensemble de méthodes qui permettent d’évaluer une
expression contenue dans une chaı̂ne de caractères :
1. écrire une méthode qui à une chaı̂ne de caractères associe true si et seulement si elle
ne contient que des chiffres, des lettres et des symboles mathématiques (+, /, *, - et les
parenthèses) ;
2. écrire une méthode qui à une chaı̂ne de caractères associe true si elle contient une expression correctement parenthèsée (à chaque parenthèse ouvrante correspond une parenthèse
fermante), et false sinon ;
3. écrire une méthode qui à une expression correctement parenthèsée associe la chaı̂ne de
caractères contenu dans la première paire de parenthèses ne contenant pas d’autre paire
de parenthèses. Si on a par exemple la chaı̂ne ((a+(b+c))+(a*b)), on obtient b+c ;
4. écrire une méthode qui calcule la valeur numérique d’une chaı̂ne de caractères contenant
un calcul élémentaire de la forme “opérande numérique 1 opérateur opérande numérique
2”, où les opérandes numériques sont des nombres entiers ;
5. écrire une méthode qui calcule la valeur numérique d’une chaı̂ne de caractères contenant
un calcul comportant éventuellement des parenthèses mais dans lequel chaque expression
sans parenthèse se réduit à un calcul de la forme élémentaire utilisé dans la question
précédente.
Problème 3.4 :
Dans ce problème, nous allons apprendre à transformer une String en un nombre entier ou
réel. S’il existe déjà une méthode Java qui réalise exactement (ou presque exactement) ce qui
est demandé dans l’énoncé, son utilisation est interdite dans le problème. Si on vous demandais
par exemple d’écrire une méthode qui calcule xn , vous n’auriez pas le droit d’utiliser la méthode
pow de la classe Math. Par contre, sauf si le contraire est précisé dans l’énoncé, vous pouvez
écrire une méthode en vous servant d’une méthode définie avant (même si vous n’avez pas su
répondre à la question). Vous pouvez aussi écrire d’autres méthodes si cela simplifie la solution.
F. Rossi– 8 janvier 2002 (Version 2.1)
p. 12
1. Ecrire une méthode int charToInt(char t) qui transforme un chiffre représenté par un
char en sa valeur sous forme de int. Le résultat de charToInt(’2’) sera par exemple 2.
Si le paramètre t n’est pas un chiffre, la méthode devra renvoyer la valeur -1.
2. Ecrire une méthode int toPositiveInt(String s) qui transforme une chaı̂ne de caractères contenant exclusivement des chiffres en l’entier correspondant. Pour cela, on utilisera
la méthode charToInt définie dans la question précédente. De plus, on rappelle que si
un entier s’écrit An−1 An−2 . . . A1 A0 , où les Ai désignent les chiffres de l’entier, alors la
Pn−1
valeur numérique de l’entier est donnée par k=0
Ak 10k . Il faudra être très attentif au
fait que les caractères d’une String sont numérotés de gauche à droite, soit le contraire
de la numérotation utilisée pour les chiffres d’un nombre. Enfin, si la chaı̂ne de caractères
ne représente pas un nombre entier positif, la méthode devra renvoyer -1.
3. On souhaite maintenant traduire une chaı̂ne de caractères en un nombre réel. Nous allons
procéder par étapes :
(a) écrire une méthode int position(String s,char c) qui donne la position de la
première apparition du caractère c dans la chaı̂ne s, et renvoie -1 si le caractère
n’apparaı̂t pas dans la chaı̂ne.
(b) écrire une méthode String substring(String s,int début,int fin) qui fabrique
la chaı̂ne de caractères constituée des caractères de s d’indices début, début+1, etc.
jusqu’à fin-1. Le résultat de substring("ABCDEFGH",3,6) est donc la chaı̂ne "DEF".
Si les paramètres numériques ne sont pas adaptés à la chaı̂ne de départ (trop grand,
trop petit, etc.), la méthode devra renvoyer une chaı̂ne vide.
(c) écrire une méthode double toPositiveReal(String s) qui convertit son paramètre
en un réel en procédant de la façon suivante :
i. la méthode repère la position dans s du point décimal, le caractère ’.’
ii. la méthode découpe s en deux chaı̂nes : la partie fractionnaire (après le ’.’) et
la partie entière (avant le ’.’)
iii. la méthode transforme les deux parties en int
iv. la méthode combine les deux entiers obtenus afin de fabriquer le réel attendu
On doit bien sûr utiliser les méthodes définies dans les questions précédentes.
(d) écrire une méthode double toPositiveReal2(String s) qui réalise la même opération que la méthode précédente mais en se basant sur le fait suivant : si un réel
s’écrit
An−1 An−2 . . . A1 A0 .A−1 A−2 . . . A−p
où les Ai désignent les chiffres du réel, alors la valeur numérique de ce réel est donPn−1
Ak 10k . Il faut donc déterminer p et n, puis travailler de façon assez
née par k=−p
similaire à celle utilisée pour la méthode toPositiveInt, en faisant de nouveau attention au sens de la numérotation des caractères dans les Strings. Il est bien entendu
interdit d’utiliser la méthode toPositiveReal pour construire la nouvelle méthode.
F. Rossi– 8 janvier 2002 (Version 2.1)
p. 13