Table des matières

TD 1 : Premiers pas

Dans cette première séance nous allons voir comment compiler et exécuter un fichier de code source Java, et effectuer des manipulations basiques sur les objets.

Prise en main

Commencez par recopier le code source suivant dans un fichier nommé Main.java. Vous pouvez utiliser l’éditeur de texte de votre choix comme Emacs ou Atom par exemple. Placez ce fichier dans un répertoire vide créé pour l’occasion (exemple: poo/td1)

// Définition de classe, obligatoire dans chaque fichier Java.
// Le nom de la classe doit être égal au nom du fichier.
class Main {

	// Point d'entrée des programmes Java. Le tableau de String args correspond
	// aux paramètres passés sur la ligne de commande.
	public static void main(String[] args) {
		// Affichage du message.
		System.out.println("Hello World!");
	}
}

Pour compiler ce fichier il faut faire appel au compilateur Java : javac. Vous pouvez compiler le fichier avec la commande suivante :

~/poo/td1$ javac Main.java

dans une console. Si tout se passe bien, vous devriez obtenir un fichier nommé Main.class. Il contient le code précédent sous forme de bytecode. Pour lancer l’exécution du programme, il faut cette fois lancer la machine virtuelle Java, avec la commande

~/poo/td1$ java Main

également dans une console. Normalement, l’exécution du programme devrait afficher la chaîne Hello World! sur votre console.

Arguments sur la ligne de commande

L’unique argument de la fonction main est un tableau de chaînes de caractères. Les tableaux s’utilisent comme en C avec la notation crochet. Le premier élément du tableau est à l’indice 0. Modifiez le programme précédent pour que la chaîne de caractères à afficher soit passée en argument.

Nombre mystère

Nous allons maintenant écrire un programme tirant un nombre au hasard (compris entre des bornes) et demandant à l’utilisateur de trouver le nombre mystère. Le nombre mystère sera compris entre 0 (inclus) et 100 (exclus) et l’utilisateur disposera au plus de 10 coups. À chaque essai, le programme affichera trop petit ou trop grand en fonction de la valeur du nombre saisi. À la fin du programme, celui ci affichera un message Perdu ou Gagné en x coups. Le programme ci-dessous illustre comment tirer aléatoirement un nombre en Java et comment demander à l’utilisateur de saisir un nombre sur la console. Nous n’utiliserons pour cet exercice que des nombres entiers.

// Pour utiliser les bibliothèques standards
import java.util.Random;
import java.util.Scanner;

class Mystere {

	// Permet de lire ce que l'utilisateur saisi au clavier
	public static Scanner clavier = new Scanner(System.in);

	public static void main(String[] args) {
		// Un générateur de nombre aléatoire
		Random aleatoire = new Random();
		// Génère un nombre compris entreo 0 et 100 (exclus)
		int mystere = aleatoire.nextInt(100);

		System.out.print("Nombre : ");
		// Lit un entier au clavier, génère une erreur si la valeur saisie n'est pas un entier
		int essai = clavier.nextInt();

		System.out.println("Votre nombre est " + essai + " et le nombre mystere est " + mystere);
	}
}

Figures

Dans cette deuxième partie, nous allons mettre en oeuvre des opérations élémentaires sur des figures géométriques dans un espace 2D.

Point

Le but de cet exercice est d’écrire un programme manipulant des points. Écrivez une classe  Point dans un fichier Point.java ayant comme attributs les deux coordonnées x en abscisse et y en ordonnée de type double. Écrivez une classe TestPoint dans un fichier TestPoint.java dans laquelle vous définirez un main afin de tester votre classe Point. Dans un premier temps, nous utiliserons le constructeur par défaut sans argument. Définissez dans la classe Point la méthode void afficher() qui affiche sur la console les coordonnées d’un point.

En java, il n’est pas nécessaire de compiler l’ensemble de vos fichiers sources .java. Si chaque fichier .java ne contient qu’une seule classe et que le fichier porte le même nom que la classe, il suffit simplement de compiler le fichier qui contient la méthode public static void main(String[] args). Le compilateur compilera les fichiers nécessaires automatiquement.

Définissez ensuite les méthodes suivantes dans la classe Point et testez votre programme dans la classe TestPoint.

// Deplace un point par rapport à sa position d'origine
void deplacement(double dx, double dy);
void deplacement(double delta); // meme deplacement en x et en y

// Calcul la distance entre deux points
double distance(Point p);

Remarque : Java met à disposition la méthode Math.sqrt() pour calculer la racine carrée. Cette méthode prend un nombre non-négatif en paramètre.

Ajoutez ensuite un constructeur supplémentaire prenant en paramètre les coordonnées du point à créer.

Cercle

Le but de cet exercice est d’écrire une classe représentant les cercles. Écrivez une classe Cercle dans un fichier Cercle.java ayant comme attributs le rayon du cercle (de type double) et la position de son centre de type Point. La classe Cercle offrira un seul constructeur prenant comme premier argument le centre du cercle de type Point et comme deuxième argument le rayon du cercle. Écrivez une classe TestCercle dans un fichier TestCercle.java dans laquelle vous définirez un main afin de tester votre classe Cercle.

Définissez ensuite les méthodes suivantes dans la classe Cercle et testez votre programme.

double surface(); // retourne la surface du cercle (pi fois le carré du rayon)
boolean estInterieur(Point p); // teste si le point p passé en paramètre fait ou non partie du cercle (frontière comprise : disque fermé). La méthode retournera `true` si le test est positif, et `false` dans le cas contraire.

Dans le programme principal, instanciez plusieurs objets de la classe Cercle, affectez des valeurs de votre choix à leurs attributs et testez vos méthodes surface et estInterieur.

Remarque : La constante pi est donnée par Math.PI

Géométrie

Écrivez un programme Geometrie qui permet à l’utilisateur d’entrer les coordonnées (x, y) des sommets d’un triangle. Le programme devra afficher ensuite le périmètre du triangle ainsi qu’un message indiquant s’il s’agit d’un triangle isocèle.

~/poo/td1$ java Geometrie
Construction d'un nouveau point
Veuillez entrer x : 0
Veuillez entrer y : 0
Construction d'un nouveau point
Veuillez entrer x : 2,5
Veuillez entrer y : 2,5
Construction d'un nouveau point
Veuillez entrer x : 0
Veuillez entrer y : 5
Périmètre : 12.071067811865476  
Isocele : oui
~poo/td1$ 

Indications : Un triangle est isocèle si au moins deux côtés ont la même longueur. La méthode nextDouble() de la classe Scanner permet de lire un double au clavier.

Export svg

Remarque : Le repère de coordonnées (0,0) se trouve dans le coin supérieur gauche de votre fenêtre. Il convient donc d’utiliser dans vos tests des coordonnées positives entières pour que les formes corresponantes soient visibles à l’écran.

Remarque Le code suivant permet d’écrire dans un fichier test.svg la représentation d’un cercle. Vous n’avez pas besoin de comprendre le fonctionnement de throws IOException pour le moment. Nous reviendrons sur cela plus tard avec les exceptions.

import java.io.FileWriter;
import java.io.IOException;

public class MonMain {
	public static void main(String[] args) throws IOException {
		FileWriter out = new FileWriter("test.svg");
		out.write("<?xml version='1.0' encoding='utf-8'?>\n");
		out.write("<svg xmlns='http://www.w3.org/2000/svg' version='1.1' width='100' height='100'>");
		out.write("<circle cx='50' cy='50' r='40' />"); 
		out.write("</svg>");
		out.close();
	}
}

Ajoutons de la couleur