Ce document détaille la conception d'une application console dédiée au pilotage d'un répertoire d'apprenants. L'implémentation s'appuie sur les principes de programmation orientée objet (gestion stricte des champs via encapsulation) et intègre la structure de données java.util.ArrayList pour manipuler dynamiquement une liste d'enregistrements.
L'application doit exposer les fonctionnalités CRUD standards :
- Inscription d'un nouveau profil ;
- Consultation exhaustive du registre ;
- Suppression ciblée par référence administrative ;
- Mise à jour des données existantes (partielle ou totale) ;
- Términation du processus.
Une contrainte technique majeure réside dans la vérification de l'unicité de la clé primaire (numéro d'inscription) lors des phases d'ajout ou de modification. Une validtaion rigoureuse des saisies est également implémentée afin d'éviter les exceptions runtime liées à des formats erronés ou à des références ienxistantes.
Définition du Modèle de Données
package com.pedagogie.modele;
/**
* Représente une fiche individuelle d'apprenant.
*/
public class PersonneScolaire {
private String refAdministrative;
private String nomUsager;
private String trancheAge;
private String domicile;
public PersonneScolaire() {}
public PersonneScolaire(String id, String nom, String annee, String residence) {
this.refAdministrative = id;
this.nomUsager = nom;
this.trancheAge = annee;
this.domicile = residence;
}
public String getRef() { return refAdministrative; }
public void setRef(String id) { this.refAdministrative = id; }
public String getNom() { return nomUsager; }
public void setNom(String nom) { this.nomUsager = nom; }
public String getAge() { return trancheAge; }
public void setAge(String age) { this.trancheAge = age; }
public String getAdresse() { return domicile; }
public void setAdresse(String adresse) { this.domicile = adresse; }
public void imprimeCarte() {
System.out.printf("Réf : %s | Nom : %s | Âge : %s | Lieu : %s%n",
refAdministrative, nomUsager, trancheAge, domicile);
}
}
Contrôleur Principal et Flux Interactif
package com.pedagogie.controleur;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public interfaceConsoleAdmin {
public static void main(String[] args) {
initialiserMenu();
List<PersonneScolaire> depot = new ArrayList<>();
boolean executionActive = true;
Scanner editeurDonnees = new Scanner(System.in);
while (executionActive) {
try {
System.out.print("Selectionnez une option [1-5] : ");
int choix = Integer.parseInt(editeurDonnee.nextLine().trim());
switch (choix) {
case 1 -> inscrireNouveau(depot, editeurDonnees);
case 2 -> listerIntegre(depot);
case 3 -> effacerParReference(depot, editeurDonnees);
case 4 -> ajusterProfil(depot, editeurDonnees);
case 5 -> executionActive = false;
default -> System.out.println("Option invalide. Veuillez recommencer.");
}
} catch (Exception e) {
System.out.println("Format de saisie incorrect. Redemander la sélection.");
editeurDonnees.nextLine(); // Consomme la ligne erronée
}
}
editeurDonnees.close();
}
private static boolean verifieExistance(List<PersonneScolaire> liste, String reference) {
for (PersonneScolaire p : liste) {
if (p.getRef().equals(reference)) return true;
}
return false;
}
private static void inscrireNouveau(List<PersonneScolaire> cible, Scanner entree) {
System.out.print("Nouvelle Réf Administrative : ");
String id = entree.nextLine();
if (verifieExistance(cible, id)) {
System.out.println("Échec : cette référence existe déjà.\n");
return;
}
System.out.print("Nom complet : ");
String nom = entree.nextLine();
System.out.print("Âge : ");
String age = entree.nextLine();
System.out.print("Domicile : ");
String addr = entree.nextLine();
cible.add(new PersonneScolaire(id, nom, age, addr));
System.out.println("Fiche enregistrée avec succès.\n");
}
private static void listerIntegre(List<PersonneScolaire> depot) {
if (depot.isEmpty()) {
System.out.println("Registre vide.\n");
return;
}
System.out.println("--- LISTE DES PROFILS ---");
for (PersonneScolaire p : depot) {
p.imprimeCarte();
}
System.out.println("-------------------------\n");
}
private static void effacerParReference(List<PersonneScolaire> cible, Scanner editeur) {
System.out.print("Référence à supprimer : ");
String refACacher = editeur.nextLine();
int indiceSuppression = -1;
for (int i = 0; i < cible.size(); i++) {
if (cible.get(i).getRef().equals(refACacher)) {
indiceSuppression = i;
break;
}
}
if (indiceSuppression != -1) {
System.out.println("Élément retiré :");
cible.get(indiceSuppression).imprimeCarte();
cible.remove(indiceSuppression);
System.out.println("Opération valide.\n");
} else {
System.out.println("Aucun élément ne correspond à cette référence.\n");
}
}
private static void ajusterProfil(List<PersonneScolaire> cible, Scanner entree) {
System.out.print("Référence à modifier : ");
String refModif = entree.nextLine();
int indexCible = -1;
for (int i = 0; i < cible.size(); i++) {
if (cible.get(i).getRef().equals(refModif)) {
indexCible = i;
break;
}
}
if (indexCible == -1) {
System.out.println("Référence introuvable.\n");
return;
}
System.out.println("Mode de mise à jour ? [1] Unique / [2] Complète : ");
String modeChoisi = entree.nextLine().trim();
if ("1".equals(modeChoisi)) {
mettreAJourGranulaire(cible, indexCible, entree);
} else if ("2".equals(modeChoisi)) {
mettreAJourComplete(cible, indexCible, entree);
} else {
System.out.println("Sélection de méthode invalide.\n");
}
}
private static void mettreAJourGranulaire(List<PersonneScolaire> cible, int idx, Scanner entree) {
System.out.println("Champ actuel : " + cible.get(idx).getRef() + " " +
cible.get(idx).getNom() + " " + cible.get(idx).getAge() + " " + cible.get(idx).getAdresse());
System.out.print("Veuillez taper le champ exact à modifier : ");
String champRecherche = entree.nextLine();
PersonneScolaire item = cible.get(idx);
boolean modifie = false;
if (champRecherche.equals(item.getRef())) {
System.out.print("Nouvelle valeur : ");
String newVal = entree.nextLine();
if (!valideUnicite(cible, newVal, idx)) {
System.out.println("Conflit d'unicité détecté. Modification annulée.\n");
return;
}
item.setRef(newVal);
modifie = true;
} else if (champRecherche.equals(item.getNom())) {
System.out.print("Nouveau nom : ");
item.setNom(entree.nextLine());
modifie = true;
} else if (champRecherche.equals(item.getAge())) {
System.out.print("Nouvel âge : ");
item.setAge(entree.nextLine());
modifie = true;
} else if (champRecherche.equals(item.getAdresse())) {
System.out.print("Nouvelle adresse : ");
item.setAdresse(entree.nextLine());
modifie = true;
}
if (!modifie) {
System.out.println("Aucun champ correspondant trouvé.\n");
} else {
System.out.println("Ajustement local appliqué.\n");
}
}
private static void mettreAJourComplete(List<PersonneScolaire> cible, int idx, Scanner entree) {
System.out.print("Nouvelle Réf : ");
String newRef = entree.nextLine();
if (!valideUnicite(cible, newRef, idx)) {
System.out.println("Cette référence est déjà utilisée par un autre dossier.\n");
return;
}
System.out.print("Nom : ");
String nom = entree.nextLine();
System.out.print("Âge : ");
String age = entree.nextLine();
System.out.print("Adresse : ");
String addr = entree.nextLine();
cible.set(idx, new PersonneScolaire(newRef, nom, age, addr));
System.out.println("Profil entièrement reconstruit.\n");
}
private static boolean valideUnicite(List<PersonneScolaire> liste, String nouvelleRef, int indexActuel) {
for (int i = 0; i < liste.size(); i++) {
if (i != indexActuel && liste.get(i).getRef().equals(nouvelleRef)) {
System.out.println("Erreur : doublon de référence bloquant la sauvegarde.\n");
return false;
}
}
return true;
}
private static void initialiserMenu() {
System.out.println("=========================================");
System.out.println(" TABLEAU DE BORD PEDAGOGIQUE ");
System.out.println(" [1] Ajouter [2] Consulter ");
System.out.println(" [3] Supprimer [4] Modifier ");
System.out.println(" [5] Quitter ");
System.out.println("=========================================");
}
}