:: Enseignements :: ESIPE :: E3INFO :: 2015-2016 :: Programmation Objet avec Java ::
[LOGO]

Premiers pas en Java, chaînes de caractères, tableaux, boucles


Pour ce premier TP, afin de pouvoir illustrer des choses basiques sur les fichiers, les classes et le bytecode, vous utiliserez un éditeur de texte "tout bête" (type gedit) plutôt qu'un environnement de développement intégré (type eclipse). C'est également assez frustrant, mais pour ce premier TD, on ne va écrire que des "fonctions" (méthodes statiques), et pas de code objet... bientôt!

Exercice 1 - Hello Groland

On rappelle qu'en Java chaque classe publique doit être définie dans un fichier qui lui est propre. Le nom du fichier doit être le nom de la classe qu'il contient, auquel on ajoute le suffixe .java. Les noms des classes doivent être constitués de mots accolés dont la première lettre est une majuscule.
Dans un premier temps nous allons écrire des petits programmes permettant de se familiariser avec le compilateur, la machine virtuelle et les méthodes.

  1. Dans un nouveau répertoire (par exemple le sous-répertoire TD1 du répertoire Java), écrire le programme suivant :
    public class HelloGroland {
        public static void main(String[] args) {
            System.out.println("Hello Groland");
        }
    }
    Vous pouvez le recopier dans votre éditeur de texte préféré, ou plus simplement le coller, et le sauvegarder sous le nom HelloGroland.java
  2. Compiler ce programme en utilisant le commande javac puis vérifier que le fichier .class correspondant existe bien.
    TD1$ javac HelloGroland.java
  3. Exécuter le programme avec la commande java
    TD1$ java HelloGroland
    On ne spécifie pas l'extension ".class": la machine virtuelle, démarrée par la commande java, cherche d'elle même un fichier dont le nom est celui qui est fourni en lui ajoutant le suffixe .class.

Exercice 2 - Afficher les arguments de la ligne de commande

On aimerait écrire une classe PrintArgs qui affiche les arguments de la ligne de commande, comme ceci:
TD1$ java PrintArgs Voici des arguments
Voici
des
arguments
Les arguments de la ligne de commande sont stockés dans le tableau de chaînes de caractères qui est passé en argument à la méthode principale public static main(String[] args).
  • Dans un premier temps, afficher le premier argument de la ligne de commande (dans notre exemple Voici).
    Que se passe-t-il si l'on ne passe pas d'argument lors de l'exécution du programme ?
  • Écrire une boucle affichant le contenu de chaque indice du tableau en sachant qu'en Java les tableaux possèdent un champ (un attribut) length qui renvoie la taille du tableau.
  • Changer votre programme pour utiliser la syntaxe dite foreach for(Type value:array)

Exercice 3 - Calculette simple

On souhaite maintenant écrire un programme qui prend un nombre entier sur l'entrée standard et qui l'affiche.
Pour cela, on utilisera un objet Scanner et particulièrement sa méthode nextInt(). Récupérez le code de la classe Calc ci-dessous:

Pour comprendre le programme, il pourra être utile de regarder la documentation disponible ici, et même de mettre les liens suivants en bookmark (signet, favoris, etc.)

  1. Quel est le nom du fichier dans lequel vous devez enregistrer ce code afin qu'il compile et s'exécute correctement?
  2. Compléter la méthode main() pour qu'il affiche le nombre saisi par l'utilisateur.
  3. Indiquer dans le programme où sont les variables et quel est leur type associé.
    Modifier le programme pour déclarer et initialiser les variables en une seule ligne.
  4. Pourquoi nextInt() n'est pas une fonction ?
    Qu'est nextInt() alors ?
  5. Expliquer la ligne :
          import java.util.Scanner;
         
  6. Modifier le programme pour qu'il demande deux entier et affiche leur somme.
  7. Afficher en plus de la somme, la différence, le produit, le quotien et le reste.
  8. Ajouter un peu de formatage de sortie pour rendre le programme plus convivial à l'utilisateur. Par exemple, une exécution pourrait ressembler à ça:
    TD1$ java Calc
    Premier entier? 47
    Deuxième entier? 3
    47+3=50
    47-3=44
    47*3=141
    47/3=15
    47%3=2
    

Exercice 4 - Conversion de String en entier

On souhaite écrire un programme affichant la somme de plusieurs entiers pris en argument sur la ligne de commande, comme dans l'exemple d'exécution suivant :
 	$ java Sum 15 5 231
 	entiers: 15 5 231
 	somme: 251
   

Ce programme va être décomposé en plusieurs fonctions dans une classe Sum:
  1. Écrire une méthode qui prend un tableau stringArray de chaînes de caractères en paramètre et renvoie un tableau d'entiers de même taille contenant les entiers issus des chaînes de caractères du tableau stringArray.
    Indication: la méthode statique parseInt(String s) de la classe java.lang.Integer permet de récuperer la valeur d'un entier représenté une chaîne de caractères: par exemple, int i = Integer.parseInt("123");
  2. Que veut dire statique pour une méthode ?
  3. Que se passe-t'il si un mot du tableau ne représente pas un entier ?
  4. Écrire une méthode qui prend un tableau d'entiers en paramètre et renvoie la somme de ceux-ci.
  5. Écrire la méthode main qui utilise les deux méthodes précédentes et qui afficher le tableau des entiers ainsi que sa somme.
    Indication: il y a un petit piège pour afficher les tableaux vous pouvez vous aider de la classe java.util.Arrays.

Exercice 5 - De C vers Java

Cet exemple a pour but de montrer les différences de performance entre un programme en C et le même en Java. Récupérez le code C ci-dessous:

  1. Compiler (gcc pascal.c) et exécuter le programme a.out en demandant au système le temps d'exécution du programme. (time a.out).
  2. Ecrire le programme (Pascal.java) "équivalent" en Java. Pour une fois, servez-vous du copier/coller. Compiler le programme. Exécuter ce programme en mesurant le temps (toujours avec time).
Comment peut-on expliquer la différence de vitesse ?

Exercice 6 - Bissextile [à la maison]

Une année est dite bissextile si elle comporte un 29 février. C'est le cas de toutes les années divisibles par 4, à l'exception de celles divisibles par 100, qui ne sont bissextiles que si elles sont également divisibles par 400.

  1. Écrivez une classe LeapYear avec une méthode isLeapYear() qui prend en paramètre un nombre entier qui est l'année à tester, et qui retourne un booléen indiquant si cette année est bissextile ou non.
  2. Ajoutez une méthode main() à la classe, qui accepte une année en argument sur la ligne de commande et qui affiche si elle est bissextile ou non.
  3. Écrivez une méthode showAllInTheRange() qui prend en paramètre deux années, et qui affiche à l'écran toutes les années bissextiles supérieures ou égales à la première et inférieure ou égale à la seconde.
  4. Modifez la méthode main pour que si elle ne prend qu'un seul argument, elle se comporte comme avant, mais si on lui passe deux années, alors elle affiche à l'écran toutes les années bissextiles comprises entre ces deux valeurs.
  5. Modifiez la méthode showAllInRange() pour qu'elle retourne un tableau d'entiers (contenant les années bissextile).

Exercice 7 - Delta [à la maison]

Écrivez un programme qui calcule et qui affiche les racines réelles d'un polynôme a x2 + b x + c. On distinguera les différents cas selon le nombre de racines. Les valeurs de a, b et c seront de type double. Pour les transmettre à votre programme, deux solutions: soit en argument sur la ligne de commande, et vous pouvez les récupérer par Double.parseDouble(args[0]), soit sur l'entrée standard à partir d'un Scanner grâce à la méthode nextDouble().

Écrivez toutes les fonctions qui vous semblent utiles. Voici quelques exemples pour tester :
a b c : 1 1 1
Discriminant = -3.0
Pas de racine

a b c : 1 -2 1
Discriminant = 0.0
Racine double : 1.0

a b c : 3 2 -1
Discriminant = 16.0
Racines : -1.0 et 0.3333333333333333

a b c : 0.3 0.2 -0.1
Discriminant = 0.16
Racines : -1.0000000000000002 et 0.33333333333333337

a b c : 0.03 0.02 -0.01
Discriminant = 0.0015999999999999999
Deux racines : -1.0 et 0.33333333333333337