Université Paris 7 Programmation Objet Licence Bio Informatique Année 2004-2005 TD n 1 - Correction Premiers pas Exercice 1 Hello World parce qu il faut bien commencer par quelque chose... 1. Enregistrez le programme suivant dans le fichier Bonjour.java. // fichier Bonjour.java public class Bonjour{ // affiche Bonjour! sur la console et passe a la ligne System.out.println("Bonjour!") ; 2. La commande javac permet de compiler un programme écrit en java vers du bytecode interprétable par la machine virtuelle java. Utilisez-la avec votre programme source. javac Bonjour.java Regardez quel est le fichier créé par cette opération. 3. La commande java permet de lancer une machine virtuelle java pour l interprétation d un fichier de bytecode java disposant d un point d entrée (la méthode main). Lancez votre premier programme en tapant java Bonjour. 4. On peut passer des arguments lors de l exécution d un programme. Lors de l écriture d un programme, les arguments de la ligne de commande sont représentés par le tableau de chaînes de caractères en paramètre de la méthode main. Le nombre de ces arguments est la longueur du tableau. A l indice 0 du tableau, il y a le premier argument. Modifiez le programme précédent pour qu il dise bonjour à chaque personne dont le nom sera passé en paramètre lors de l exécution du programme. aide : l opérateur + permet de concatener deux chaînes de caractères. // fichier Bonjour.java public class Bonjour{ for ( int i = 0 ; i < (argv.length) ; i++) System.out.println("Bonjour " + argv[i] + "!") ; Exercice 2 Première classe On vous propose d enrichir le programme suivant : 1
// fichier TestPaire.java class Paire{ // premier element de la paire private int premier ; // deuxieme element de la paire private int second ; public class TestPaire{ Paire p = new Paire() ; System.out.println(p) ; La classe Paire contient deux attributs privés (mot clé private) : cela signifie que ces attributs ne peuvent pas être utilisés directement de l extérieur de la classe. Pour vous en convaincre, ajoutez la ligne p.premier = 0 ; dans la méthode main et essayez de compiler le programme. La classe TestPaire contient la méthode main qui est le point d entrée du programme. Cette méthode vous permet de tester le fonctionnement de la classe Paire. Pour l instant, on y crée une référence vers un nouvel objet Paire et on demande son affichage sur la console. Vous pouvez compiler et interpréter ce programme tel quel. 1. Ajoutez à cette classe une méthode de signature public String tostring() qui retourne la valeur des attributs de la paire dans une chaîne de caractère. Compilez et executez à nouveau le programme. Qu est-ce qui a changé? 2. Ajoutez à cette classe un deuxième constructeur qui prend en paramètre des entiers pour initialiser les champs premier et second, ainsi que les lignes de code permettant de tester ce constructeur dans la méthode main. Pourquoi faut-il ajouter aussi un constructeur sans paramètres? 3. Ajoutez à cette classe des méthodes getpremier et getsecond qui retournent la valeur des attributs de la paire. Ces méthodes permettent d utiliser la valeur des attributs de la paire même si on ne peut pas y accéder directement. Testez ces méthodes dans la méthode main. 4. Ajoutez à cette classe des méthodes setpremier et setsecond qui modifient la valeur des attributs de la paire. Testez ces méthodes dans la méthode main. // fichier TestPaire.java class Paire{ // premier element de la paire private int premier ; // deuxieme element de la paire private int second ; // constructeur par défaut public Paire(){ // constructeur qui initialise les deux attributs de la paires public Paire(int premier, int second){ this.premier = premier ; 2
this.second = second ; public void setpremier(int premier){ this.premier = premier ; public void setsecond(int second){ this.second = second ; public int getpremier(){ return premier ; public int getsecond(){ return second ; public String tostring(){ return ("premier " + premier + " second " + second) ; public class TestPaire{ Paire p1 = new Paire() ; Paire p2 = new Paire(2,3) ; System.out.println(p1) ; System.out.println(p2) ; System.out.println(p2.getPremier()) ; System.out.println(p2.getSecond()) ; p1.setpremier(1) ; p1.setsecond(1) ; System.out.println(p1) ; Exercice 3 Le but de cet exercice est d écrire une classe représentant une pile d entiers, en utilisant un tableau. Vous définirez cette classe ainsi qu une classe contenant le main, pour tester votre code au fur et à mesure où vous l écrivez. 1. La classe Pile a un attribut contenupile qui est un tableau d entiers. Elle a également un attribut position qui est un entier contenant l indice du tableau considéré comme étant le sommet de la pile. 2. Le constructeur de la pile prend en paramètre un entier qui représentera la capacité de la pile, c est à dire le nombre de cases du tableau. 3. Définir une méthode empty qui renvoie le booléen true si la pile est vide, false sinon. 4. Définir une méthode full qui renvoie le booléen true si la pile est pleine, false sinon. 5. Définir les méthodes push (ajoute un élément au sommet de la pile) et pop (retourne et enlève l élément au sommet de la pile). 6. Définir la méthode tostring qui retourne le contenu de la pile sous forme de chaine de caractère. 3
// fichier Pile.java public class Pile{ private int[] contentpile ; private int position ; Pile(int size){ contentpile = new int[size] ; position = 0 ; public boolean empty(){ return (position == 0) ; public boolean full(){ return (position == contentpile.length) ; public void push(int element){ contentpile[position] = element ; position++ ; public int pop(){ position-- ; return ( contentpile[position] ) ; public String tostring(){ String buffer = "" ; for(int i = 0 ; i< position ; i++) buffer = buffer + " " + contentpile[i] ; return buffer ; //fichier TestPile.java public class TestPile{ // exemples de tests Pile mapile = new Pile(4) ; System.out.println("vide " + mapile.empty()) ; System.out.println("pleine " + mapile.full()) ; mapile.push(0) ; mapile.push(1) ; mapile.push(2) ; mapile.push(3) ; System.out.println("vide " + mapile.empty()) ; System.out.println("pleine " + mapile.full()) ; System.out.println(maPile.pop()) ; 4
Exercice 4 Pour occuper ceux qui ont déjà fini... Les tours de Hanoi Etant donné trois piles, et n entiers tous différents empilés sur la première, les plus petits au dessus des plus grands : un déplacement consiste à choisir une pile A non vide, et à enlever l entier au sommet pour le mettre au sommet d une autre pile B, si le sommet de cette pile n est pas un entier plus petit (sinon, le déplacement est impossible). On veut déplacer tous les entiers de la première pile sur la seconde, en se servant de la dernière. L algorithme proposé est le suivant : Pour déplacer n entiers de la pile A sur la pile C en utilisant la pile B, on déplace(récursivement) n 1 sommets de A vers B, puis on déplace l entier restant sur le sommet de la pile A sur la pile C, et on déplace(récursivement) n 1 sommets de B vers C. 1. Définir une classe Hanoi qui représente le jeu : ses attributs seront trois piles et le nombre d entiers. Définissez d ores et déjà une classe principale et une méthode main pour tester petit à petit votre travail. 2. Définir le constructeur qui initialise le jeu à partir d un nombre d entiers à empiler et initialise les piles dans la situation de départ. 3. Définir la méthode affiche qui affiche le contenu des trois piles sur la console. 4. Définir la méthode privée deplace et la méthode joue qui lance les déplacements. 5. Enfin, finaliser la classe principale et la méthode static main qui à partir d un entier saisi en ligne de commande initialise et lance le jeu. //fichier Hanoi.java public class Hanoi{ Pile depart ; Pile arrivee ; Pile intermediaire ; int nbentiers ; public Hanoi(int nbentiers){ this.nbentiers=nbentiers ; // construction des trois piles depart = new Pile(nbEntiers) ; arrivee = new Pile(nbEntiers) ; intermediaire = new Pile(nbEntiers) ; // remplissage de la pile de départ avec les premiers entiers for(int i = 0; i<nbentiers;i++){ depart.push(i) ; public void affiche(){ System.out.println("Pile de depart :" + depart) ; System.out.println("Pile intermediaire :" + intermediaire) ; System.out.println("Pile d arrivee :" + arrivee) ; private void deplace(pile A,Pile C,Pile B,int n){ if (n!= 0) { deplace(a,b,c,n-1) ; 5
C.push(A.pop()) ; deplace(b,c,a,n-1) ; public void joue(){ deplace(depart,arrivee,intermediaire,nbentiers) ; //fichier JeuHanoi.java public class JeuHanoi{ Hanoi jeu = new Hanoi(4) ; jeu.affiche() ; jeu.joue() ; jeu.affiche() ; 6