Les seuls documents papier autorisés sont vos notes de cours, de travaux dirigés et de travaux pratiques. Les documents électroniques autorisés sont les documents présents sur les machines de l'IUT et dont vous êtes l'unique auteur (ainsi que les éventuels documents de cours). En dehors de la machine qui vous est attribuée et de votre matériel de composition (crayons, stylos, feuilles de brouillon…), aucun matériel n'est autorisé.
La documentation de l'API Java doit être consultée uniquement en version locale.
Toutes les réponses devront prendre la forme de fichiers source en langage Java. Suivez scrupuleusement les instructions de ce sujet. Vos réponses doivent correspondre aux exemples d'exécution : soyez rigoureux !
Sauf indication contraire, vous pouvez supposer que les données fournies sur la ligne de commande ou l'entrée standard respectent les restrictions de l'énoncé et ne nécessitent donc pas de contrôle.
Créez un répertoire nommé DEV32
. Faites-en votre répertoire courant et
placez-y tous les fichiers que vous écrirez durant l'épreuve. Votre nom complet devra
être mentionné au début de chaque fichier (en commentaire).
Effacez tous les fichiers temporaires et ne gardez que les fichiers d'extension
.java
(attention à ne pas effacer vos fichiers source !). Placez-vous
ensuite dans le répertoire immédiatement au dessus de DEV32
et archivez votre travail, par exemple par la commande :
bob@box:~$ tar czvvf bob_dev32.tar.gz DEV32Téléversez l'archive ainsi obtenue à cet endroit.
Division. (10 points) On souhaite écrire un programme qui prend des arguments sur sa ligne de commande et qui affiche seulement les arguments entiers (en préservant leur ordre), revient à la ligne, puis affiche les autres arguments (toujours en respectant l'ordre d'origine).
bob@box:~$ java Division -r -1 27 x2 8 -1 27 8 -r x2
Il va évidemment falloir tester chaque argument pour savoir s'il s'agit d'un entier, mais on ne veut pas faire ce test plusieurs fois. Choisissez une structure de données adaptée pour se souvenir des arguments qui apparaîtront sur la deuxième ligne. Vous justifierez votre choix sous la forme d'un commentaire dans votre code.
Dans un deuxième temps, on veut éviter que les arguments commençant par un tiret apparaissent sur la deuxième ligne. Utilisez (obligatoirement) la méthode removeIf de votre structure de données pour éliminer les indésirables.
Attention Lorsque vous réalisez une interface, il n'est pas nécessaire de redéfinir les méthodes qualifiées de static ou default.
Doublon. (10 points) On souhaite écrire une application qui prend en argument sur la ligne de commande une suite d'entiers compris entre 0 et 100, et qui affiche si une valeur est présente plusieurs fois.
bob@box:bob_apl31$ java Q2 51 17 66 12 42 35 17 79 92 0 doublon présent !
Pour arriver à ce but, chaque valeur doit être comparée aux autres. Il est donc judicieux de les stocker. La structure abstraite de données nécessaire dans ce cas est un ensemble : une collection de données qui ne peut pas contenir plusieurs fois le même élément.
Dans notre cas, on peut se contenter d'une définition simplifiée d'un ensemble supportant
une seule opération, telle que décrite dans l'interface Ensemble.java
:
/** * Une structure de données abstraite qui contient des entiers entre 0 et 100. Aucune * valeur ne peut apparaître plusieurs fois dans cette structure. * * @version 1.0 15 January 2025 * @author Luc Hernandez */ public interface Ensemble { /** * Ajoute une nouvelle valeur à la structure. * * @param element la nouvelle valeur * @return true si la nouvelle valeur a été ajoutée, false si elle était déjà présente * @throws IllegalArgumentException si l'argument n'est pas compris entre 0 et 100 */ public boolean ajouter(byte element); }
Une façon possible de réaliser un tel ensemble est d'utiliser un arbre préfixe bit-à-bit. Il s'agit d'un arbre binaire dont les nœuds n'ont pas d'étiquette.
Pour savoir si une valeur est présente dans cet arbre, on se base sur sa représentation binaire : partant de la racine, on va vers le fils gauche si le bit de poids fort vaut 0, et le fils gauche sinon. On fait ensuite de même pour le nœud suivant et le bit suivant. Si on arrive à suivre tous les bits (8 en tout dans notre cas), la valeur est présente. Si à n'importe quelle étape le nœud suivant est manquant, c'est que la valeur n'appartient pas à l'ensemble.
L'arbre ci-dessus représente l'ensemble { 0, 12 }.
Écrivez une classe qui réalise l'interface ci-dessus basée sur ce concept. Vous incluerez un constructeur sans argument qui crée un ensemble vide. Écrivez ensuite un programme qui utilise cette classe pour répondre à la question d'origine.