ENPC - Programmation - Séance 1

Pour bien commencer, il est souhaitable d'organiser votre répertoire de travail personnel (votre "home dir"). Les exercices que vous allez faire tout au long de ce cours seront placés dans le répertoire info que vous devez créer à la racine de votre compte:

[home]$ mkdir info
[home]$
Dans ce répertoire info, créez un répertoire src pour y placer les fichiers sources de vos programmes.
[home]$ cd info
[info]$ mkdir src
[info]$
Pour ranger les programmes séance par séance, on peut également créer un répertoire td1.
[info]$ cd src
[src]$ mkdir td1
[td1]$
La prochaine feuille d'exercices donnera lieu à un répertoire info/src/td2, etc. Ceci est une première manière d'organiser les fichiers des programmes Java dans des répertoires. Nous verrons plus tard que d'autres moyens sont disponibles, en particulier via la notion de package, spécifique à Java.

Un premier programme

Avec l'éditeur de texte emacs, ouvrir un nouveau fichier Bonjour.java dans le répertoire td1.

  1. Dans ce fichier Bonjour.java, tapez le code source suivant et enregistrez ce fichier:
    public class Bonjour {
        public static void main(String [] args) {
            System.out.println("Bonjour !");
        }
    }
    
  2. Dans le répertoire info/src/td1/, compilez le fichier source Java avec la commande:
    [td1]$ javac Bonjour.java
    Listez le répertoire et constatez l'effet de cette commande: un nouveau fichier a été généré, Bonjour.class, qui contient le bytecode de la classe Bonjour.
  3. Exécutez ce programme avec la commande suivante:
    [td1]$ java Bonjour
    Bonjour !
    [td1]$
L'exécution de la commande java suivie du nom d'une classe a pour effet de lancer une Machine Virtuelle Java (JVM) qui interprète le bytecode de cette classe. Pour cela, cette classe doit contenir une méthode main qui possède exactement la signature de celle utilisée dans notre programme.

Documentation

Le langage Java repose sur des librairies de classes offertes en standard aux utilisateurs. Ainsi, par exemple, l'instruction System.out.println("Bonjour !") dans notre programme est un appel à la méthode println() avec comme argument la chaîne de caractères (String) "Bonjour !", sur le champ out de la classe System. Ces librairies de classes sont organisées en packages, que l'on appelle API (Application Programming Interface). Les classes System ou String font partie du package 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.3.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 package java.lang, retrouvez la méthode println() précédemment utilisée.

Nomenclature

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:

Arguments sur la ligne de commande

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 :

[td1]$ java Bonjour toto tata titi
alors 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.

Modifier le programme Bonjour.java pour qu'il affiche Bonjour ! si aucun argument n'est passé sur la ligne de commande lors d'un appel, mais Bonjour Robert ! si la chaîne "Robert" a été passée sur la ligne de commande.

Lecture d'un entier dans une String

Comme nous venons de 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:

[td1]$ java Bonjour 12
la 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]);

Déduire un programme qui affiche autant de fois "Bonjour !" que spécifié par un nombre entier passé sur la ligne de commande. Exemple:

[td1]$ java Bonjour 3
Bonjour !
Bonjour !
Bonjour !
[td1]$

Quelques manipulations

  1. Dans un fichier info/src/td1/Premier.java, écrire une classe Premier dont la méthode main affiche un message disant si l'entier n, lu sur la ligne de commande, est un nombre premier ou non. S'il n'est pas premier, on affichera pourquoi. Exemples:
    [td1]$ java Premier 101
    101 est premier.
    [td1]$ java Premier 91
    91 n'est pas premier (7 * 13).
    [td1]$
    
  2. Dans un fichier info/src/td1/SommeCarres.java, écrire une classe SommeCarres dont la méthode main affiche les valeurs des carrés des n premiers entiers, puis la somme cumulée de ces valeurs, où n est un entier passé sur la ligne de commande. Exemple:
    [td1]$ java SommeCarres 3
    Carré de 1 = 1
    Carré de 2 = 4
    Carré de 3 = 9
    Somme des carrés des 3 premiers entiers = 14
    [td1]$
    
  3. À partir des deux programmes précédents, écrire dans un nouveau fichier info/src/td1/Exo.java un troisième programme, la classe Exo, qui n'affiche que la somme des carrés des nombres premiers inférieurs ou égaux à n. Exemples:
    [td1]$ java Exo 2
    Somme des carrés des nombres premiers entiers inférieurs ou égaux à 2 = 5
    [td1]$ java Exo 3
    Somme des carrés des nombres premiers entiers inférieurs ou égaux à 3 = 14
    [td1]$ java Exo 4
    Somme des carrés des nombres premiers entiers inférieurs ou égaux à 4 = 14
    
    Indication: pour la clarté de ce programme, il sera pratique de regrouper les portions de code éxécutées fréquement dans des méthodes (ou fonctions). Par exemple, la méthode de signature:
    public static boolean estPremier(int i) { ... }
    
    peut tester si un entier i est premier et retourner true s'il l'est et false sinon. Cette méthode peut ensuite être appelée dans la méthode main avec l'argument souhaité.

À faire

  1. Envoyer un mail à Etienne.Duris[at]univ-mlv.fr en indiquant, dans le corps du message, vos nom et prénom.
  2. Écrire et tester les programmes proposés dans cette feuille et les envoyer à la même adresse mail, en tant que fichier attaché: il suffit pour cela de faire dans le message de composition Fichier - Joindre - Fichier..., et de sélectionner le fichier source du programme. Cette façon de joindre un fichier est bien préférable à un copier - coller dans le corps du message.
  3. Lire les deux premiers chapitres du polycopié de cours.

Etienne.Duris[at]univ-mlv.fr - © École Nationale des Ponts et Chaussées - Novembre 2001 - http://www-igm.univ-mlv.fr/~duris/ENPC