Université Paris Diderot MASS L2 JAVA Année 2007-2008 TP n◦1 - Correction UNIX, emacs, premier programme java Ce premier TP a pour but de reprendre en main les machines et d’être capable d’écrire et de compiler un premier programme en java. Dans la mesure du possible, mettez-vous seul à une machine. Tout d’abord, allumez votre machine, et choisissez l’environnement UNIX, sous lequel nous travaillerons durant tout le trimestre. Rentrez votre nom d’utilisateur, ainsi que votre mot de passe. 1 Rappel : répertoires et fichiers La mémoire d’une machine est organisée en fichiers et en répertoires. Un répertoire peut «contenir» d’autres fichiers ou répertoires. Ceci donne naissance à une structure arborescente. Voici un exemple d’une telle structure : notes1 cours notes2 ∼ TP README fichier1 Dans cet exemple, le répertoire ∼ contient 2 répertoires cours et TP, ainsi que 2 fichiers README et fichier1. Le répertoire cours contient 2 fichiers notes1 et notes2. Le répertoire TP est vide. Les fichiers ou répertoires contenus dans un répertoire sont appelés fils de ce répertoire ; le répertoire qui contient un fichier ou un répertoire est appelé parent de ce fichier ou de ce répertoire. Dans l’exemple, le répertoire cours est donc un fils du répertoire ∼, et ∼ est le parent de cours. 2 Environnement UNIX Nous allons travailler sous UNIX, en utilisant un terminal de commande - cela peut paraı̂tre pénible au début, mais à l’usage, l’utilisation d’un terminal est plus puissante et permet de gagner du temps. 1 Commencez par ouvrir un terminal. Une invite de commande apparait. Nous allons taper quelques commandes dedans (toute commande se termine par entrée). NB : attention, la souris ne fonctionne pas dans un terminal ! Au départ, vous êtes dans votre répertoire personnel, qui s’appelle ∼ . 2.1 Manipulation de fichiers et répertoires Voici les premières commandes de bases permettant de manipuler des répertoires et des fichiers (attention aux espaces ! ) : – pwd (print working directory) : affiche le nom du répertoire courant (celui depuis lequel vous travaillez). – ls (listing) : affiche le contenu du répertoire courant. – cd nom_du_repertoire (change directory) : change de répertoire courant pour aller dans l’un de ses fils, nom_du_repertoire . cd .. : change de répertoire courant pour aller dans son parent. – touch nom_du_fichier (toucher ) : crée un fichier vide appelé nom_du_fichier dans le répertoire courant. – mkdir nom_du_repertoire (make directory) : crée un répertoire vide appelé nom_du_repertoire dans le répertoire courant. NB 1 : lorsque vous tapez le nom d’un fichier ou d’un dossier, vous pouvez taper seulement les premières lettres et utiliser la touche tabulation pour compléter automatiquement le nom de ce fichier ou dossier. NB 2 : en appuyant sur ↑, vous pouvez rappeler les commandes précédentes, ce qui peut également faire gagner du temps. Exercice 1 À l’aide de ces commandes, créez l’arborescence donnée ci-dessus et déplacez-vous à l’intérieur. Correction : touch README touch fichier1 mkdir TP mkdir cours cd cours touch notes1 touch notes2 ls cd .. ls Des commandes permettent également de supprimer les fichiers et les répertoires. – rm (remove) : permet de supprimer un fichier fils. – rmdir (remove directory) : permet de supprimer un répertoire fils vide. Exercice 2 Supprimer tous les répertoires et fichiers créés lors de l’exercice précédent. Correction : cd cours rm notes1 rm notes2 2 cd .. rmdir cours rmdir TP rm README rm fichier1 2.2 Chemins relatifs Il n’est pas utile de se déplacer dans un répertoire pour effectuer une action. On peut désigner tout répertoire ou fichier par un nom appelé chemin relatif, dépendant de l’endroit où l’on se trouve. Par exemple, si l’on se trouve dans ∼, on peut directement désigner notes1 dans cours en utilisant le nom : cours/notes1 (le symbole / est appelé slash). On tapera par exemple rm cours/notes1 pour le supprimer. Si l’on se trouve dans TP, on tapera rm ../cours/notes1 (rappelez-vous que .. désigne le répertoire parent du répertoire courant). Exercice 3 Sans bouger du répertoire racine (celui qui est à la base de l’arborescence ; il s’agit ici de ∼), créez l’arborescence suivante fichier2 rep1 rep2 ∼ fichier3 fichier1 Correction : mkdir mkdir touch touch touch rep1 rep1/rep2 fichier1 rep1/fichier2 rep1/rep2/fichier3 2.3 Déplacer et renommer La commande mv (move) permet d’effectuer ces 2 opérations. – mv nom repertoire_cible : déplace le fichier ou répertoire nom dans le répertoire repertoire_cible. Par exemple, si l’on est dans rep2 et que l’on souhaite mettre fichier3 dans ∼, on utilisera mv fichier3 ../.. – mv nom nouveau_nom : renomme le fichier ou répertoire nom en nouveau_nom. 3 Par exemple, si l’on est dans rep1 et que l’on souhaite renommer fichier2 en README, on utilisera mv fichier2 README Exercice 4 Créez quelques nouveaux fichiers et testez ces nouvelles commandes. Terminez en effaçant toute l’arborescence que vous avez créée. 3 emacs Nous vous conseillons pour taper vos programmes java d’utiliser l’éditeur de texte emacs, à moins que vous ne soyez déjà habitués à un autre éditeur. emacs est un éditeur de texte extrêmement puissant, et nous n’utiliserons qu’une infime partie de ses très nombreuses fonctionnalités. Introduisons la commande – emacs nom_du_fichier & : ouvre avec emacs le fichier nom_du_fichier . nom_du_fichier est créé s’il n’existe pas déjà. emacs ouvre alors une nouvelle fenêtre. La plupart des commande dont nous allons avoir besoin sont disponibles à partir des menus (File, Edit et Tools principalement) situés en haut de la fenêtre. Suivant la version, quelques icones peuvent apparaitre pour les taches les plus courantes. Néanmoins à l’usage, il est plus rapide d’utiliser quelques raccourcis clavier : – Ctrl x Ctrl s : sauvegarder – Ctrl x Ctrl c : fermer emacs – Ctrl k : couper une ligne – Ctrl y : coller une ligne le cas échéant, les autres raccourcis sont indiqués dans les menus ! Il existe également un mécanisme général permettant de faire des copier-coller à la souris : pour copier, il suffit de sélectionner le texte à copier (click gauche), et pour coller, il suffit de faire un click central à l’endroit où vous souhaitez coller. Ceci fonctionne aussi dans un terminal. Exercice 5 Ouvrez un nouveau fichier avec emacs, tapez une ligne de texte, dupliquez-là, puis sauvegardez et quittez. 4 Premier programme java Nous sommes prêts à écrire un premier programme java. Exercice 6 Commencez par créer un répertoire TP1 dans votre répertoire racine. Nous allons désormais travailler à l’intérieur de ce répertoire. Ouvrez avec emacs un fichier Test.java et écrivez le code suivant : public class Test{ public static void main(String[] argd) { System.out.println("Bonjour tout le monde"); } } Quelques rappels : – Un fichier .java définit une classe et doit porter son nom (ici Test.java). Par convention, ce nom commencera toujours par une majuscule. 4 – public static void main(String[] argd), sous une apparence barbare, désigne en fait seulement la fonction qui va être appelée lors de l’exécution du programme. Nous verrons au fur et à mesure du cours la signification des différents mots-clef utilisés. – System.out.println() permet d’afficher à l’écran une chaı̂ne de caractères. Une fois le code sauvegardé, deux étapes nous séparent de son exécution : compiler - cette étape transforme le code en pseudo-code ou bytecode, compréhensible par la machine virtuelle java. javac Test.java exécuter - cette étape exécute le bytecode sur une machine virtuelle java. java Test Exercice 7 Exécutez puis compilez le code que vous venez d’écrire. Quel fichier est créé lors de la compilation ? Modifiez la phrase à afficher. Que se passe-t-il si vous ne recompilez pas le code avant de l’exécuter ? 5 Échauffement : boucle for On rappelle la syntaxe de la boucle for : for (int i=0; i<10; i++) { //code à éxécuter } Exercice 8 Écrire dans des fichiers séparés les programmes suivants : (on pourra faire usage de la copie de fichier et/ou de copier-coller pour gagner du temps). – un programme Ordre.java qui écrit les entiers de 1 à 100 dans l’ordre croissant à l’écran. – un programme Desordre.java qui écrit les entiers de 1 à 100 dans l’ordre décroissant à l’écran. – un programme Puissance.java qui écrit les 10 premières puissances de 2 à l’écran. Correction : class Ordre{ public static void main(String argd[]) { for (int i=1; i<=10; i++) { System.out.println(i); } } } class Desordre{ public static void main(String argd[]) { for (int i=0; i<10; i++) { System.out.println(10-i); } } } 5 class Puissance{ public static void main(String argd[]) { int a=2; for (int i=0; i<10; i++) { System.out.println(a); a=a*2; } } } 6 Échauffement : boucle while, conditions On rappelle la syntaxe de la boucle while : while (condition) { //code à éxécuter } ainsi que du branchement conditionnel : if (condition) { //code à éxécuter si la condition //est vérifiée } else { //code à éxécuter si la condition //n’est pas vérifiée } Exercice 9 On appelle suite de Syracuse la suite d’entiers suivante : on se donne un premier terme entier u0 et on définit – un+1 = un /2 si un est pair. – un+1 = 3 ∗ un + 1 si un est impair. La conjecture de Syracuse (non démontrée à l’heure actuelle) est que quelquesoit l’entier choisi au départ, on fini toujours par retomber sur 1 au bout d’un certain temps. La parité d’un entier a peux se vérifier de la manière suivante : if (a%2==0)... Écrire un programme permettant d’afficher la suite de Syracuse commençant par 97. Essayez avec quelques autres valeurs ! Correction : 6 class Syracuse{ public static void main(String argd[]) { int a=97; while (a!=1) { System.out.println(a); if (a%2==0) { a=a/2; } else { a=3*a+1; } } } } 7