Atelier 19 - Système de recherche de médicaments
Créez un programme Java qui simule un système de recherche de médicaments dans une pharmacie, en utilisant la fouille dichotomique.
Spécifications
1. Enum Categorie
Créez un enum Categorie avec les valeurs : ANTIBIOTIQUE, ANALGESIQUE, ANTIHISTAMINIQUE, ANTIVIRAL, VITAMINES.
2. Classe Medicament
Créez une classe Medicament avec les attributs suivants :
id(int)nom(String)categorie(Categorie)prix(double)stock(int) — nombre d'unités disponibles
Implémentez Comparable<Medicament> pour comparer par nom (ordre alphabétique).
Redéfinissez toString() pour afficher :
#id [CATEGORIE] nom — $prix (stock unités)
3. Données initiales
Créez une liste de 15 médicaments minimum couvrant toutes les catégories, avec des prix et stocks variés.
Exemple de quelques médicaments :
new Medicament(1, "Amoxicilline", Categorie.ANTIBIOTIQUE, 12.50, 80),
new Medicament(2, "Aspirine", Categorie.ANALGESIQUE, 3.99, 200),
new Medicament(3, "Cetirizine", Categorie.ANTIHISTAMINIQUE, 8.75, 120),
new Medicament(4, "Ibuprofène", Categorie.ANALGESIQUE, 5.25, 150),
new Medicament(5, "Loratadine", Categorie.ANTIHISTAMINIQUE, 7.30, 90),
new Medicament(6, "Oseltamivir", Categorie.ANTIVIRAL, 45.00, 30),
new Medicament(7, "Paracétamol", Categorie.ANALGESIQUE, 2.99, 300),
new Medicament(8, "Pénicilline", Categorie.ANTIBIOTIQUE, 18.00, 60),
new Medicament(9, "Ribavirin", Categorie.ANTIVIRAL, 55.00, 20),
new Medicament(10, "Vitamine C", Categorie.VITAMINES, 4.50, 250),
// ... au moins 5 autres
Section 4 — Fouille dichotomique sur tableau de noms
4a. Trier et préparer le tableau
Triez la liste de médicaments par nom (utilisez Collections.sort).
Construisez ensuite un tableau String[] noms contenant uniquement les noms des médicaments dans cet ordre trié.
Affichez le tableau noms avant de commencer les recherches.
4b. Implémenter rechercheBinaire
Implémentez la méthode suivante :
public static int rechercheBinaire(String[] tab, String valeur) { ... }
Elle retourne l'index de la valeur trouvée, ou -1 si elle est absente.
Cherchez "Paracétamol" et "Doliprane" dans le tableau, puis affichez :
Recherche de "Paracétamol" → trouvé à l'index 8
Recherche de "Doliprane" → non trouvé (-1)
4c. Tracer l'exécution
Modifiez votre méthode pour qu'elle affiche l'état de la recherche à chaque étape :
Recherche de "Paracétamol" dans [Amoxicilline, Aspirine, ..., Vitamine C]
Étape 1 : debut=0, fin=14, milieu=7 → tab[7]="Loratadine" → cherche à droite
Étape 2 : debut=8, fin=14, milieu=11 → tab[11]="Pénicilline" → cherche à gauche
Étape 3 : debut=8, fin=10, milieu=9 → tab[9]="Paracétamol" → trouvé !
4d. Compter les étapes
Modifiez la méthode pour qu'elle retourne aussi le nombre d'étapes effectuées.
Effectuez les recherches suivantes et affichez le nombre d'étapes pour chacune :
- Un médicament au début du tableau (meilleur cas potentiel)
- Un médicament au milieu exact
- Un médicament à la fin du tableau
- Un médicament inexistant (pire cas — jusqu'à ce que l'intervalle soit vide)
Section 5 — Fouille dichotomique sur objets
5a. Recherche par objet
Implémentez une méthode qui effectue la fouille dichotomique directement sur un tableau de Medicament[] (trié par nom) :
public static int rechercheMedicament(Medicament[] tab, String nom) { ... }
Utilisez compareTo sur les noms pour comparer. Retournez l'index trouvé ou -1.
Testez avec "Vitamine C" et "Morphine".
5b. Recherche par prix
Triez une copie du tableau de médicaments par prix croissant.
Implémentez une méthode de fouille dichotomique sur ce tableau trié par prix :
public static int recherchePrix(Medicament[] tab, double prix) { ... }
Recherchez un médicament à 5.25$ et un à 99.99$. Affichez le résultat.
5c. Recherche du premier dans une plage de prix
Implémentez une méthode qui retourne l'index du premier médicament dont le prix est supérieur ou égal à un seuil donné, dans le tableau trié par prix :
public static int premiereOccurrence(Medicament[] tab, double seuilPrix) { ... }
Utilisez la fouille dichotomique pour trouver efficacement ce seuil.
Testez avec un seuil de 10.00$ et affichez tous les médicaments à partir de cet index.
Section 6 — Comparaison avec la fouille séquentielle
6a. Implémenter la fouille séquentielle
Implémentez une fouille séquentielle (linéaire) sur le tableau de noms :
public static int rechercheSequentielle(String[] tab, String valeur) { ... }
6b. Compter et comparer
Pour chacune des recherches suivantes, comparez le nombre de comparaisons effectuées par la fouille séquentielle et par la fouille dichotomique :
| Médicament cherché | Séquentielle (comparaisons) | Dichotomique (comparaisons) |
|---|---|---|
| Premier du tableau | ? | ? |
| Milieu du tableau | ? | ? |
| Dernier du tableau | ? | ? |
| Inexistant | ? | ? |
Remplissez ce tableau dans votre sortie console.
6c. Réflexion
Répondez aux questions suivantes dans des commentaires dans votre code :
- Pourquoi la fouille dichotomique nécessite-t-elle un tableau trié ?
- Quel est l'avantage de
debut + (fin - debut) / 2par rapport à(debut + fin) / 2? - Dans quel cas la fouille séquentielle peut-elle être préférable à la dichotomique ?