Le langage Java repose sur des bibliothèques de classes offertes en standard aux utilisateurs. Ainsi, par exemple, l'instruction System.out.println("Bonjour !") est un appel à la méthode println() avec comme argument la chaîne de caractères "Bonjour !" (de type String), sur le champ out de la classe System. Ces bibliothèques de classes sont organisées en paquets, que l'on appelle API (Application Programming Interface). Les classes System ou String font partie du paquet java.lang dont toutes les classes sont utilisables naturellement par défaut dans un programme. Toutes les API sont documentées dans un format standardisé et ces documentations sont accessibles à l'URL http://cermics.enpc.fr/doc/java/jdk1.4.1/docs/api/index.html
Ouvrez une fenêtre de navigateur (Netscape, par exemple) et parcourez ces documentations. Sauvegardez cet URL dans vos signets (bookmarks).
En partant de la classe System du paquet java.lang, retrouvez la méthode println().
Par habitude et convention, les identificateurs en Java respectent les règles implicites suivantes:
Le langage Java impose deux contraintes sur l'écriture des programmes:
Dans le profil de la méthode principale public static void main(String[] args), qui doit se trouver dans tout programme destiné à être exécuté, args est le nom du paramètre de cette méthode qui représente les arguments de la ligne de commande. Le type de ce paramètre est String[], qui représente le type des tableaux de String. En effet, lors de l'exécution du programme, la variable args est la référence à un tableau dont les éléments représentent les chaînes de caractères passées après le nom de la classe sur la ligne de commande. Par exemple, si l'appel est le suivant:
% java immersion.Bonjour toto tata titialors args[0] vaut "toto", args[1] vaut "tata" et args[2] vaut "titi". Par ailleurs, la taille de ce tableau (et donc le nombre d'arguments) peut être connu grâce à l'instruction args.length, qui vaudra dans ce cas l'entier 3.
Comme nous venons de le voir, il est facile de passer un argument à un programme de cette manière. Néanmoins, cet argument ne peut être qu'une chaîne de caractères (String). En effet, même si la ligne de commande est:
% java immersion.Bonjour 12la seule information dont le programme dispose est que args[0] vaut la chaîne "12" (son type est String).
Si l'on veut récupérer l'entier 12, de type int, à partir de la String "12", on peut utiliser la méthode parseInt() de la classe Integer de la manière suivante:
int i = Integer.parseInt(args[0]);
Pour bien commencer, il est souhaitable d'organiser votre répertoire de travail personnel. Sauf indication contraire, les exercices de chaque séance seront placés dans des paquets distincts.
% mkdir seance1
package seance1; public class BaseDeux { public static void main(String[] args) { ... } }
% java seance1.BaseDeux 11 1011 % java seance1.BaseDeux 6 110La fonction Integer.toBinaryString(int i), qui accepte un entier i en argument, retourne la représentation binaire de cet entier sous la forme d'une chaîne de caractères de type String. Écrire le code nécessaire pour la fonction main().
% javac seance1/BaseDeux.javaListez le répertoire seance1 et constatez l'effet de cette commande: un nouveau fichier a été généré, BaseDeux.class, qui contient le bytecode de la classe BaseDeux.
% java seance1.Exo1 5 5! vaut 120 % java seance1.Exo1 -2 Factorielle n'est pas définie sur -2
On suppose dans la suite de cet exercice que a et b sont des entiers et que b >= 0.
On souhaite écrire un programme qui prend un entier positif sur sa ligne de commande et qui affiche un triangle ayant autant de ligne que l'entier fourni. Voici deux exemples du résultat attendu:
% java seance1.Triangle 3 * ** *** % java seance1.Triangle 4 * ** *** ****
Écrire, dans une classe Triangle, une méthode afficheTriangle1() qui prend en argument un entier positif n et affiche un triangle de n lignes. En déduire le programme voulu.
Ajouter dans Triangle une fonction afficheTriangle2() permettant d'obtenir le résultat suivant:
% java seance1.Triangle 4 * ** *** **** *** ** *
Comment faire pour changer arbitrairement le symbole "*"?
On rappelle que les coefficients binomiaux sont données par:
% java seance1.Exo4 6 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1Ajoutez, dans la classe Exo4, une fonction affichePascal() qui déclare un paramètre entier x et réalise cet affichage. En déduire le programme souhaité.
La relation de Newton, qui recherche le zéro d'une fonction, utilise la relation suivante:
Pour ce qui concerne la racine carrée d'un nombre a, la fonction qu'on cherche à annuler est f(x) = x2 - a, sa dérivée est f'(x) = 2x et la relation de Newton est donc la suivante:
Écrire, dans une classe Exo5, une fonction calculRacine() qui accepte en argument un nombre flottant a de type double et un nombre entier n. Cette fonction calcule et retourne l'approximation par n termes de la valeur de la racine carrée de a.
Écrire une fonction main() qui permet de tester cette fonction de sorte qu'elle soit utilisable de la manière suivante:
% java seance1.Exo5 400 6 20.06621767747577 % java seance1.Exo5 400 9 20.0 % java seance1.Exo5 0.5 9 0.7071067811865475
Comparez les résultats de cette technique en testant l'utilisation de la fonction prédéfinie Math.sqrt() du paquet java.lang.
Dans cet exercice on souhaite écrire un programme qui calcule le logarithme d'un nombre réel (qu'on supposera positif) en utilisant les développements limités. Le programme prendra deux nombres sur sa ligne de commande:
Le développement limité de ln(1+x) quand x est au voisinage de 0 est:
Le développement limité à l'ordre n ne contient que n termes, plus un terme donnant une approximation du reste, qu'on négligera pour simplifier.
Dans une classe Exo6 écrire une fonction developpementLimiteLog() déclarant un paramètre xde type réel, qu'on supposera proche de 1, et un paramètre n de type entier qu'on supposera positif, qui calcule par itérations successives la valeur du développement limité de ln(x) à l'ordre n et retourne la valeur calculée.
Nous allons maintenant écrire une fonction ln() prenant un argument réel x qu'on supposera positif et retournant ln(x). La fonction ln() pourra utiliser developpementLimiteLog(), mais il faut pour cela se ramener au voisinage de 1.On rappelle les relations suivantes des logarithmes:
Algorithme pour obtenir calculer ln(x) avec x positif quelconque en se ramenant à des appels recursifs de la forme ln(y) avec y proche de 1
Écrire une fonction main() qui permet de tester cette fonction de sorte qu'elle soit utilisable de la manière suivante:
% java seance1.Exo6 400 5 5.991581978022303 % java seance1.Exo6 400 8 5.991464545960707 % java seance1.Exo6 0.5 8 -0.6931471802249534
Le dernier nombre donne la précision. Plus il est élevé, plus la précision est grande. On l'utilisera pour fixer le nombre de termes du développement limité, le nombre de termes dans le calcul de la racine, et on fixera la valeur de A dans ce qui précède à A=1/n.
Comparez les résultats de cette technique en testant l'utilisation de la fonction prédéfinie Math.log() du paquet java.lang, qui donne le logarithme naturel (base e) de son argument.