Teaching - 2i002 - (TME: sujets)


2i002 : Introduction à la programmation Objet

TME 1: introduction à JAVA

Exercice 1 : Préliminaires

Question 1 (configuration internet):

Si vous n'avez pas accès à internet:

  • chercher l'outil de configuration d'accès
  • passer en configuration manuelle en mettant proxy (port = 3128) sur tous les champs

Mettez le site web de l'UE dans les favoris de votre navigateur pour que vous puissiez accéder rapidement au site web de l'UE à chaque séance de TME.

Question 2 (organisation des fichiers):

Pour bien organiser vos fichiers, on souhaite créer un répertoire 2i002 , puis dans ce répertoire, créer un répertoire TME1 . Tous vos fichiers du TME1 devront se trouver dans ce répertoire. Pour cela, ouvrez un nouveau terminal, puis tapez les commandes qui permettent de réaliser les instructions suivantes :

  1. créer un répertoire 2i002 (commande mkdir nomDuRepertoire),
  2. se déplacer dans ce répertoire 2i002 (commande cd nomDuRepertoire),
  3. créer un répertoire TME1 ,
  4. lister les fichiers du répertoire 2i002 pour vérifier que le répertoire TME1 a été créé (commande ls), ,
  5. se déplacer dans le répertoire TME1 ,
  6. afficher le nom du répertoire courant (commande pwd).

Aide : l'annexe du poly rappelle la liste des instructions que vous pouvez utiliser pour organiser vos fichiers et répertoires sous linux.

Question 3 :

Pour ouvrir un éditeur de texte afin d'écrire du code Java ou du texte, vous pouvez utiliser la commande : gedit & ou bien gedit MaClasse.java & pour ouvrir le fichier MaClasse.java . Attention : n'oubliez pas de mettre le '&' à la fin de la commande pour séparer le terminal et l'éditeur de texte.

Editeurs possibles:

  • gedit
  • geany
  • emacs (pour les connaisseurs seulement -éditeur avancé avec beaucoup de raccourcis clavier-)
  • PAS d'IDE avant la semaine 5: PAS d'Eclipse, PAS de netbeans

Dans tous les cas, vous devez chercher les options pour colorer la syntaxe et indenter les lignes et les numéroter.

Question 4 :

En fonction des chargé de TD : vérifier avec votre encadrant avant de commencer.
Aller sur le site de l'UE dans la partie "TME et Soumission". Sauvegarder dans votre sous-répertoire TME1 le fichier qui vous servira de modèle pour les comptes rendus (le fichier s'appelle : CompteRendu.txt). Renommer ce fichier avec vos noms et le numéro de TME. Attention : à chaque séance de TME, vous devez écrire un compte rendu qui doit contenir : les instructions (copier-coller des classes que vous écrivez), les exécutions des programmes (copier-coller du résultat affiché par le terminal) et, éventuellement, les réponses aux questions demandées. Ce compte rendu sera à rendre en fin de chaque TME (soumission).

Question 4 : prise de recul

Lisez rapidement l'annexe sur les commandes linux puis répondez aux questions suivantes :

  • Pourquoi est-il important d'indenter vos programmes ?
  • Pourquoi est-il important de sauvegarder et de compiler régulièrement vos programmes au lieu d'attendre d'avoir écrit le programme dans son entier ?

Exercice 2 : Premier programme

Question 1 :

Ecrire la classe Bonjour (fichier Bonjour.java ) dont la méthode main affiche "Bonjour !".

Sous-question :

Quelle est la commande pour compiler cette classe ? Compiler la classe. Quel est le nom du fichier créé par la compilation ?

Sous-question :

Quelle est la commande pour exécuter cette classe ?

Sous-question :

Supprimer le fichier Bonjour.class . Sans recompiler, taper à nouveau la commande pour exécuter la classe. La classe est-elle exécutée ?

Question 2 :

Observer les erreurs de compilation (pour être capable des les corriger dans le futur):

Sous-question :

Introduire un espace au milieu du mot static. Compiler. D'après le message d'erreur, à quelle ligne est l'erreur ? à quel endroit est détectée l'erreur ? Remarque : pour cette erreur, l'explication de l'erreur par le compilateur ne correspond pas à la correction à effectuer. Les diagnostics du compilateur ne doivent donc pas être suivis à la lettre, mais indiquent seulement l'échec de l'analyse.

Sous-question :

Rétablir le mot static correctement et supprimer le " terminant le mot Bonjour. Compiler et observer.

Sous-question :

Après avoir supprimé du répertoire courant le fichier Bonjour.class , transformer la méthode main en Main . La compilation réussit-elle ? Peut-on exécuter le programme ? Expliquer.

Sous-question :

Supprimer l'accolade \{ de la méthode main. Compiler et lire les messages.

Sous-question :

Supprimer le mot-clé public . La compilation réussit-elle ? Peut-on exécuter le programme ?

Sous-question :

Supprimer le mot-clé static . La compilation réussit-elle ? Peut-on exécuter le programme ?

Exercice 3 : Segment

On veut écrire des classes Java afin de pouvoir comparer la longueur de plusieurs segments de droite (sur une dimension).

Question 1 :

Un segment est une portion de droite délimitée par 2 extrémités. Ecrire la classe Segment qui contient :

  • les variables d'instance x et y correspondant aux valeurs des deux extrémités,
  • un constructeur : public Segment(int extX,int extY) qui initialise la variable x avec la valeur de extX et la variable y avec la valeur de extY ,
  • une méthode public int longueur() qui retourne la longeur du segment. Si l'extrémité x a une valeur plus petite que la valeur de l'extrémité y alors la longueur est y-x , sinon la longueur est x-y .
  • la méthode toString() dont le but est de retourner une chaîne de caractères au format suivant : "Segment [<x>,<y>]"<x> et <y> doivent être remplacés par les valeurs des extrémités x et y du segment courant.

Question 2 :

Écrire une classe TestSegment dont la méthode main crée le segment [6,8] et le segment [12,5], puis compare la longeur des 2 segments. Si le premier segment est plus long, ce programme affiche que le premier segment est plus long, sinon il affiche que le deuxième segment est plus long.

Exercice 4 : Solidarité villageoise

Un énorme rocher est tombé dans la nuit sur un petit village de l'ouest de la France, empêchant les cultures. Il est décidé de former une équipe de villageois pour déplacer le rocher (qui pèse 100 kg).

Question 1 :

Dans la classe Villageois , écrire les variables suivantes :

  • nom (le nom du villageois, de type String ),
  • poids (le poids du villageois, type double ),
  • malade (type boolean , sa valeur sera true si le villageois est malade, false sinon).

Quel doit être le nom du fichier contenant cette classe ?

Question 2 :

Ajouter dans la classe Villageois le constructeur public Villageois(String nomVillageois)

  • qui initialise le nom du villageois avec la valeur de nomVillageois ,
  • la variable poids avec un poids aleatoire compris entre 50 et 150 kg (150 exclu),
  • la variable malade qui vaut true dans 20% des cas

Aide : utiliser la méthode Math.random() qui génère une valeur aléatoire de type double comprise entre 0.0 inclus et 1.0 exclu.

Exemples : pour initialiser aléatoirement la variable x avec un nombre entre 20 et 100 exclu, on écrit l'instruction : double x=Math.random()*80+20;

Pour modéliser un évènement qui doit se produire dans 40% des cas on regarde si Math.random() < 0.40 . Voir aussi la documentation de la classe Math.

Question 3 :

Dans une nouvelle classe TestVillageois , ajouter une méthode main , qui crée quatre instances de la classe Villageois et les affiche. Quel doit être le nom du fichier contenant la classe TestVillageois ? Compilez et exécutez ce programme.

Question 4 :

Ajouter dans la classe Villageois et utiliser dans la classe TestVillageois les méthodes suivantes :

  • public String getNom() qui retourne le nom de ce villageois,
  • public double getPoids() qui retourne le poids du villageois,
  • public boolean getMalade() accesseur de la variable malade,
  • public String toString() qui retourne une chaîne de caractères décrivant les caractéristiques de ce villageois. Exemple : "villageois : Eustache, poids : 95 kg, malade : non"

Question 5 :

Ajouter dans la classe Villageois la méthode double poidsSouleve() qui retourne le poids soulevé par ce villageois : le tiers de son poids s'il est en bonne santé, le quart s'il est malade.

Question 6 :

Ajouter dans la classe TestVillageois , les instructions pour calculer le poids total que peuvent soulever les 4 villageois, et pour afficher un message pour indiquer si les villageois ont réussi à soulever le rocher ou pas.

Exercice 5 : Affichage avec passage à la ligne

Soit la classe Lettre suivante dont le but est de gérer des caractères.

public class Lettre {  
        private char carac;  

        public Lettre(char c) {    
                carac=c;  
        }  
        public char getCarac() {    
                return carac;  
        }  
        public int getCodeAscii() {    
                return (int)carac;  
        }
}

Question 1 :

Dans la méthode main d'une classe TestLettre , écrire les instructions qui, pour chaque caractère de 'a' à 'z', affiche son code ascii (utiliser la méthode getCodeAscii() ).
Aide : utiliser une boucle for avec un compteur de type char .

Question 2 :

On veut maintenant afficher l'alphabet comme ceci :

abcde
fghij
klmno
pqrst
uvwxy
z   

Pour cela, il suffit de répéter l'affichage d'un caractère en passant à la ligne tous les cinq caractères. A la suite dans le main , en utilisant la méthode getCarac() de la classe Lettre, effectuer cet affichage.
Aide : utiliser l'opérateur qui affiche chaîne sans passer à la ligne (contrairement à System.out.println() ).

Exercice 6 : Formule de Newton

La suite de Newton définie ci-dessous converge vers la racine carrée de x :

U_{0} = x/2 et U_{i} = (U_{i-1} + x/U_{i-1})/2

Écrire une classe SuiteNewton qui calcule la racine de x avec une précision de \epsilon, en utilisant la suite de Newton.

Exercice 7 : Libellé d'un chèque (Super long + fastidieux...)

Écrire une classe Libelle qui traduit en toutes lettres un nombre entier inférieur à 1000 selon les règles usuelles de la langue française.

Ex : 123 s'écrit : cent vingt-trois Ex : 321 s'écrit : trois cent vingt et un

Le programme doit prendre en compte les règles d'orthographe essentielles:

a) les nombres composés inférieurs à cent prennent un trait d'union sauf vingt et un, trente et un, ..., soixante et onze.

b) les adjectifs numéraux sont invariables sauf cent et vingt qui se mettent au pluriel quand ils sont multipliés et non suivis d'un autre nombre:

quatre-vingts, quatre-vingt-un trois cents, trois cent cinquante