Vous êtes sur la page 1sur 4

Master 2 BBSG

POO, langage Java Laurent Tichit

1. Exercices simples pour commencer


1. Lincontournable Print "Hello"
2. Les arguments de la ligne de commande
3. Jeux avec les chanes
4. Random
5. Calcul de la factorielle
6. Quel jour sommes-nous ?

1.1. Lincontournable Print "Hello"

Saisissez, compilez et excutez un programme Java qui affiche Bonjour tous ! sur lcran de la console.
crivez une classe publique excutable nomme Bonjour place dans un fichier nomm
Bonjour.java.

Trois dtails ne pas oublier :

1. Une classe est excutable si et seulement si elle comporte une mthode ayant exactement la
signature public static void main(String[] args)
2. On provoque une compilation en donnant un nom de fichier (ex.: javac Bonjour.java)
3. On lance lexcution dun programme en donnant un nom de classe (ex.: java Bonjour).

Observez ce qui se passe lorsque vous dsobissez une des trois prescriptions prcdentes.

Au cours du semestre, rdigez un carnet des erreurs Java en deux parties : les erreurs la compilation et
les erreurs l'excution.

1.2. Les arguments de la ligne de commande

Dans sa forme gnrale, la commande qui dclenche l'excution d'une application Java s'crit

java UneClasse chane0 chane0 ... chanek1

o chane0 chane0 ... chanek1 sont des chanes de caractres ne contenant pas de blancs spares par
des blancs (espaces, tabulations).

Ces chanes sont accessibles depuis lintrieur de lapplication travers le tableau, gnralement appel
args, qui est dclar dans len-tte de la fonction main. Par exemple, si une application est lance par la
commande

java NomDeLaClasse Dupond "Jean Pierre" 2006 2+3=5

alors la fonction main reoit un argument qui est un tableau form des quatre chanes de caractres
"Dupond", "Jean Pierre", "2006" et "2+3=5". Notez que :

quand un argument contient des blancs (Jean Pierre) on doit lencadrer par des guillemets,
les nombres ne sont pas reconnus en tant que tels, mais en tant que chanes de caractres,
les seuls sparateurs reconnus ce niveau sont lespace et la tabulation ; par exemple, 2+3=5
forme un seul argument.

Exercice. crivez une classe Calcul quon excute avec trois arguments : deux nombres et un oprateur
entre les deux, et qui affiche le rsultat de lopration indique sur les nombres indiqus. Exemple
dexcution (ce qui est saisi par lutilisateur est bleu) :

java Calcul 1200 + 400


1200 + 400 = 1600

1.3. Jeux avec les chanes

But de cet exercice : vous faire explorer la classe java.lang.String en testant ses diverses
mthodes sur des chanes et dautres valeurs lues au clavier.

Un des buts de cet exercice est justement de vous initier la consultation de cette
documentation. Pour cela, ouvrez un navigateur sur la doc de lAPI (chez Sun,
http://docs.oracle.com/javase/7/docs/api/) ; dans le volet gauche suprieur slectionnez le
paquetage java.lang et, alors, dans le volet gauche infrieur slectionnez la classe
String.

Il sagit d'crire une classe excutable TestChaines dont la mthode principale effectue les oprations
suivantes :

A. Crez une variable de type int, affectez-lui une valeur, puis convertissez cette variable en chane (ex.:
le nombre 12345 devient la chane "12345").

B. Sur la ligne de commande, lire une chane entirement compose de chiffres et la convertir dans le
nombre entier quelle reprsente (ex.: la chane "12345" devient le nombre 12345). La solution se
trouve parmi les mthodes statiques de la classe java.lang.Integer.

C. Mme question que ci-dessus, mais avec un nombre flottant (ex.: la chane "0.12345e4" devient le
nombre 0.12345e4).

D. Lire une chane reprsentant un nom de ville, lui enlever les ventuels blancs au dbut et la fin et
lafficher entirement en majuscules.

E. Lire deux chanes s1 et s2 et afficher la rponse la question : ces deux chanes commencent-elles par
le mme caractre ? Utilisez la mthode dinstance charAt.

F. Lire deux chanes s1 et s2 et afficher les rsultats renvoys par les expressions s1 == s2 ,
s1.equals(s2) , s1.compareTo(s2) et , s1.compareToIgnoreCase(s2) . Entre autres,
essayer les couples "abcd" et "abcd", puis "abcd" et "AbcD".

G. Lire deux chanes s1 et s2 et afficher la rponse aux questions s1 commence-t-elle par s2 ? , s1


finit-elle par s2 ? et s1 contient-elle s2 ?

H. Lire deux chanes s1 et s2 et si s1 contient s2, renvoyer s1 prive de s2 (sintresser substring),


sinon renvoyer s1.

I. Si s est une chane de caractres, lexpression s.intern() renvoie une chane ayant les mmes
caractres que s mais appartenant une collection de chanes sans doublons que Java maintient et dont les
chanes figurant dans le programme source font partie doffice.

Lire deux chanes s1 et s2 et constater qu la suite des transformations s1 = s1.intern(); et


s2 = s2.intern(); les expressions s1.equals(s2) et s1 == s2 deviennent
quivalentes.
D'une faon gnrale, tout langage de programmation comporte des mthodes diverses et varies sur les
chanes de caractres. Sachez reprer dans la documentation, la mthode qui rpond vos besoins.

1.4. Random

Pour tester la mthode java.lang.Math.random(), crivez un programme qui obtient n nombres


au hasard (par exemple, n = 100 000) et qui calcule la moyenne et lcart-type de la suite obtenue.

Pour produire des nombres alatoires utilisez la mthode java.lang.Math.random() (cela se lit :
la mthode random de la classe Math du paquetage java.lang ), sur laquelle vous trouverez des
indications dans la documentation de l'API.

Un des buts de cet exercice est justement de vous initier la consultation de cette
documentation. Pour cela, ouvrez un navigateur sur la doc de lAPI (chez Sun,
http://docs.oracle.com/javase/7/docs/api/) ; dans le volet gauche suprieur slectionnez le
paquetage java.lang et, alors, dans le volet gauche infrieur slectionnez la classe Math.
Parmi les mthodes de cette classe, cherchez random et lisez-en la documentation.

Rappel de formules : si n est le nombre de termes dune suite, S = x1 + x2 + ... + xn la somme de ces termes
et Q = x12 + x22 + ... + xn2 la somme de leurs carrs, alors

la moyenne est m = S / n
lcart-type s est la racine carre de la variance V, donne par V = ( Q / n ) m2

N.B. Si la distribution des valeurs renvoyes par la fonction random est uniforme, quand n devient
de plus en plus grand m doit tendre vers 0,5 et s vers 0,288675134595 (la racine carre de 1/12).

1.5. Calcul de la factorielle

A. crivez une classe excutable avec une mthode :

static long factorielle1(int n)

qui calcule la factorielle de n, cest--dire le nombre n ! = n (n 1) (n 2) ... 3 2 1.

B. Trouvez la valeur de n partir de laquelle les dbordements des valeurs entires rendent cette mthode
inutilisable.

N.B. Une manire de vrifier que la valeur de n! est juste, sachant que celle de (n 1)! lest, consiste
afficher le rapport n! / (n 1)!

C. Pour pallier ce problme de dbordement, crivez une nouvelle fonction utilisant des objets
java.math.BigInteger :

static BigInteger factorielle2(int n)

et constatez que maintenant on peut aller pratiquement aussi loin quon veut. Pour rsoudre cet exercice
vous aurez besoin de lire posment la documentation de cette classe.

D. Aurions-nous pu donner le mme nom aux fonctions factorielle1 et factorielle2 ?


1.6. Quel jour sommes-nous ? Quelle heure est-il ?

But de cet exercice : essayer diverses manires dobtenir et afficher la date courante (encore un prtexte
pour vous faire chercher dans la documentation...).

A. Premire manire : la mthode java.lang.System.currentTimeMillis() donne la date


courante, exprime comme le nombre de millisecondes qui se sont coules depuis le 1 er janvier 1970 0
heures GMT. Cest prcis, mais pas trs pratique pour organiser sa semaine ! (Retenez quand mme
lexistence de cette mthode, car elle est bien utile pour mesurer et comparer les performances des
programmes).

crivez un programme qui affiche le nombre de secondes coules depuis le 1 er janvier 1970. Excutez
deux fois ce programme, une minute dintervalle, et voyez si les valeurs obtenues correspondent peu
prs lexplication.

B. Deuxime manire : ajoutez au programme prcdent des instructions qui crent un objet de type
java.util.Date (par une expression comme Date d = new Date(); ) et le donnent
afficher System.out. Comme vous le voyez, cest mieux, car on obtient bien une date, mais crite
la manire des anglo-saxophones.

Ne cherchez pas la correction de ce dfaut parmi les nombreuses mthodes de la classe Date, elles sont
presque toutes deprecated (obsoltes, dsapprouves) et ne mritent pas quon sy investisse.

C. Troisime manire : crer un objet de type java.util.Calendar (par une expression comme
Calendar c = Calendar.getInstance(); ) et obtenir sparment les lments de la date
(le jour de la semaine, le jour du mois, le mois, lanne) pour les afficher comme bon nous semble.

En tudiant la documentation de la classe Calendar vous dcouvrirez quon obtient les divers
composants par des expressions de la forme c.get(Calendar.MONTH); ,
c.get(Calendar.YEAR); , etc.

Des tableaux de chanes dclars comme ceci peuvent vous aider obtenir une prsentation adquate :

String[] mois = { "janvier", "fvrier", ... "dcembre" };


String[] jSem = { "lundi", "mardi", ... "dimanche" };

D. Quatrime manire (la plus pro ) : construire un objet d de type java.util.Date comme dans
la deuxime manire et un objet f de type java.text.SimpleDateFormat (qui est une varit de
java.text.DateFormat) et afficher le rsultat du formatage du premier par le second, par une
expression comme f.format(d).

Ne vous laissez pas effrayer par la documentation de SimpleDateFormat. Si vous ne voyez pas
comment cela marche, essayez ceci et vous comprendrez :

...
Date d = new Date();
SimpleDateFormat f = new SimpleDateFormat("dd MMMMM yyyy HH:mm");
System.out.println("maintenant: " + f.format(d));
...

Vous aimerez peut-être aussi