Corrigé Complet & Méthodologique : Gestion INFOREPAR
Pour maîtriser ce genre d’exercice, il ne suffit pas de connaître le code, il faut comprendre la méthodologie de conception. Voici une décomposition pédagogique de la résolution, divisée par étapes logiques.
ÉTAPE 1 : La Phase de Réflexion (Analyse des structures)
III.1 Avantages et inconvénients : Vecteurs vs Listes Chaînées
| Structure | Avantages | Inconvénients |
|---|---|---|
| Vecteur (Tableau) | • Accès direct et rapide via l’indice. • Gestion mémoire simple et contiguë. |
• Taille fixe (statique) définie à l’avance. • Insertion/suppression coûteuse (décalage). |
| Liste Chaînée | • Taille dynamique (s’adapte aux besoins). • Insertion/suppression très facile. |
• Accès séquentiel uniquement (parcours lent). • Consomme plus de mémoire (données + pointeurs). |
💡 Rappel de cours :
- Vecteur (Tableau) : C’est comme un immeuble de 50 appartements numérotés. On connaît la taille exacte dès le début. Si on veut le 10ème, on y va directement.
- Liste Chaînée : C’est comme une chasse au trésor. Chaque indice (nœud) contient un objet ET un papier indiquant où se trouve l’indice suivant.
🛠️ Technique de résolution : Le comparatif “Accès vs Flexibilité”
- Pourquoi le tableau pour les clients ? L’énoncé dit “maximum 50”. C’est une limite fixe. Le tableau est parfait pour une taille connue.
- Pourquoi la liste pour les matériels ? On ne sait pas combien de matériels seront réparés. La liste est “élastique” (dynamique) : elle grandit selon les besoins.
ÉTAPE 2 : La Phase de Modélisation (Définition des types)
III.2 Déclarations des structures de données
// 1. Structure pour l'adresse (Enregistrement imbriqué)
Type Adresse = Enregistrement;
code_postal : Chaîne;
quartier : Chaîne;
ville : Chaîne;
FinEnregistrement;
// 2. Structure pour le Client
Type Client = Enregistrement;
code : Entier;
nom : Chaîne;
prenom : Chaîne;
adresse : Adresse; // Imbrication de l'enregistrement Adresse
telephone : Chaîne;
FinEnregistrement;
// 3. Structure pour le Matériel (pour la Liste Chaînée)
Type Materiel = Enregistrement;
code : Entier;
designation : Chaîne;
type : Chaîne;
marque : Chaîne;
num_serie : Chaîne;
code_client_proprio : Entier;
suivant : Pointeur vers Materiel; // INDISPENSABLE pour la liste
FinEnregistrement;
// Variables Globales
Variables
Tableau_Clients : Tableau[1..50] de Client;
Liste_Materiels : Pointeur vers Materiel; // Tête de la liste
nb_clients_actuels : Entier;
💡 Rappel de cours :
- Enregistrement (Record) : Un conteneur qui regroupe des données de types différents.
- Imbrication : C’est mettre un enregistrement à l’intérieur d’un autre.
- Pointeur : Une variable qui contient une adresse mémoire (le lien vers l’élément suivant).
🔍 Analyse pas à pas (Le “Pourquoi”) :
- L’adresse : L’énoncé dit que l’adresse est composée de 3 éléments. On crée donc un type
Adresse. - Le Client : Il possède une adresse. On utilise l’imbrication : son champ
adresseest de typeAdresse. - Le Matériel : Pour que ce soit une liste chaînée, chaque matériel DOIT avoir un champ
suivantqui est un Pointeur. Sans ce pointeur, les éléments ne sont pas reliés entre eux.
ÉTAPE 3 : L’Algorithmique (Écriture des programmes)
III.3 Procédure pour créer un vecteur de N Clients
Procédure Creer_Vecteur_Clients(N : Entier, VAR T : Tableau[1..50] de Client, VAR taille : Entier);
Variables
i : Entier;
Début
Si (N > 50) Alors
Ecrire("Erreur : Maximum 50 clients.");
taille <- 0;
Sinon
taille <- N;
Pour i de 1 à N Faire
Ecrire("Saisie du client n°", i);
Lire(T[i].code, T[i].nom, T[i].prenom);
// Accès imbriqué pour l'adresse
Lire(T[i].adresse.code_postal, T[i].adresse.quartier, T[i].adresse.ville);
Lire(T[i].telephone);
FinPour;
FinSi;
Fin;
🛠️ Technique : Utiliser une boucle POUR car on connaît le nombre d’itérations ($N$).
⚠️ Piège à éviter : L’utilisation du mot-clé VAR dans les paramètres.
- Pourquoi ? Si vous passez un tableau sans
VAR, la procédure travaille sur une copie. Quand elle s’arrête, le tableau original reste vide.VARpermet de modifier l’original.
III.4 Procédure pour ajouter un matériel dans la Liste Chaînée
Procédure Ajouter_Materiel(M_nouveau : Materiel, VAR tete : Pointeur vers Materiel);
Début
M_nouveau.suivant <- tete;
tete <- M_nouveau;
Ecrire("Matériel ajouté.");
Fin;
🔍 Analyse pas à pas : Imaginez une chaîne de personnes qui se tiennent la main.
- Le nouveau membre ($M$) doit d’abord attraper la main de la première personne actuelle (
M.suivant <- tete). - Ensuite, la “tête” de la file devient $M$ (
tete <- M). 🚀 Pourquoi cette méthode ? C’est l’insertion en tête. C’est la plus rapide car on ne perd pas de temps à chercher la fin de la liste.
III.5 Procédure pour afficher les matériels d’un client
Procédure Afficher_Materiels_Par_Client(C_code : Entier, T : Tableau[1..50] de Client, taille_T : Entier, tete_M : Pointeur vers Materiel);
Variables
i : Entier;
client_existe : Booleen;
courant : Pointeur vers Materiel;
Début
// 1. Vérifier si le client existe (Filtre sur le Tableau)
client_existe <- Faux;
Pour i de 1 à taille_T Faire
Si (T[i].code = C_code) Alors
client_existe <- Vrai;
Interrompre;
FinSi
FinPour;
Si (client_existe = Faux) Alors
Ecrire("Erreur : Client inconnu.");
Sinon
// 2. Filtrer les matériels (Filtre sur la Liste)
courant <- tete_M;
TantQue (courant != NULL) Faire
Si (courant.code_client_proprio = C_code) Alors
Ecrire("Matériel : ", courant.designation);
FinSi
courant <- courant.suivant;
FinTantQue;
FinSi;
Fin;
🛠️ Technique de résolution : “Le filtre successif”
- Étape 1 (Le filtre Client) : On parcourt le tableau. On utilise un “drapeau” (booléen
client_existe) pour mémoriser si on a trouvé le client. - Étape 2 (Le filtre Matériel) : Si le drapeau est “Vrai”, on parcourt la liste avec une boucle
TantQue. - Le pointeur de parcours : On utilise une variable
courant. Pourquoi ? Si on modifiait directementtete, on perdrait l’adresse du début de la liste et elle deviendrait inaccessible !courantest notre “doigt” qui se déplace.
III.6 Fonction pour retourner le nombre de matériels
Fonction Compter_Nombre_Materiels(tete : Pointeur vers Materiel) : Entier;
Variables
compteur : Entier;
courant : Pointeur vers Materiel;
Début
compteur <- 0;
courant <- tete;
TantQue (courant != NULL) Faire
compteur <- compteur + 1;
courant <- courant.suivant;
FinTantQue;
Retourner compteur;
Fin;
🛠️ Technique : C’est un algorithme de “compteur”.
- On part du début.
- On avance tant qu’on n’est pas dans le vide (
NULL). - À chaque pas, on fait
+1.
📝 Résumé de la méthodologie pour vos prochains examens
| Problème | Ce qu’il faut chercher dans l’énoncé | Technique à utiliser |
|---|---|---|
| Taille fixe/max | “Maximum de…”, “Taille de…” | Tableau / Vecteur |
| Taille inconnue | “Liste de…”, “Nombre indéfini” | Liste Chaînée |
| Plusieurs infos liées | “Caractérisé par…”, “Décrit par…” | Enregistrement |
| Éléments dans des éléments | “L’adresse est composée de…” | Imbrication |
| Parcours de liste | “Parcourir la liste…” | TantQue (courant != NULL) |
| Modification de l’original | “Créer un vecteur…”, “Ajouter…” | Paramètre VAR |
Prêt à passer à la suite ?
Vous avez terminé cette leçon sur Corrigé Complet & Méthodologique : Gestion INFOREPAR. Continuez votre apprentissage avec la prochaine leçon ou explorez d'autres formations.