Bonjour !
Dans la leçon précédente, nous avons dessiné le plan de notre "Gestionnaire de Contacts Simplifié" en définissant son architecture modulaire. Nous savons maintenant quelles fonctions sont nécessaires et comment elles interagissent. C'est une étape de conception cruciale.
Aujourd'hui, nous passons de l'architecture à la construction. L'objectif est de prendre ce plan et de bâtir l'application brique par brique. Concrètement, vous allez écrire en pseudo-code l'algorithme complet, en implémentant chacune des fonctions que nous avons définies. C'est le moment où la logique prend vie et où notre projet devient un programme tangible, prêt à être testé.
À la fin de cette leçon, vous aurez un algorithme complet et fonctionnel en pseudo-code, un véritable plan directeur pour un futur codage en Java.
1. Les Règles du Jeu : Écrire un Bon Pseudo-Code
Avant de nous lancer dans l'écriture, rafraîchissons-nous la mémoire sur les conventions d'un pseudo-code clair et structuré. Un bon pseudo-code est à mi-chemin entre le langage naturel et un vrai langage de programmation. Sa clarté est essentielle pour votre objectif de "code clean".

Pour vous guider, je vous propose de consulter un document qui résume les bonnes pratiques.
Ce document, 'Règles du bon pseudocode', est un excellent mémento. Il formalise la syntaxe que nous allons utiliser, ce qui garantit que notre algorithme sera compréhensible et sans ambiguïté.
Survolez rapidement les sections 'Règles générales' (indentation, une instruction par ligne), 'Opérations primitives' (Lire, Écrire, ←), 'Autres opérations' (opérateurs arithmétiques, logiques), et 'Fonctions et répétitives'. Concentrez-vous sur les exemples de la colonne 'Correct'. L'objectif n'est pas de tout mémoriser, mais de vous familiariser avec la syntaxe que nous allons utiliser.
Les points clés à retenir pour notre projet :
- Déclaration :
ALGORITHME,TYPES,VARIABLES - Structure :
DEBUT...FIN,PROCEDURE Nom(...),FONCTION Nom(...) - Affectation :
variable ← valeur - Interaction :
Lire variable,Ecrire "message", variable - Contrôle :
SI...ALORS...SINON...FINSI,TANT QUE...FAIRE...FINTANTQUE,POUR...DE...A...FAIRE...FINPOUR - Fonctions :
Retourner valeurpour renvoyer un résultat.
2. Implémentation des Fonctions : Brique par Brique
Nous allons maintenant écrire le corps de chaque module défini dans la leçon précédente. Nous procéderons logiquement, en commençant par les fonctions utilitaires les plus simples pour finir par les plus complexes qui les utilisent.
Déclarations initiales
Commençons par définir les types et variables dont notre algorithme aura besoin. Ces déclarations sont globales à tout l'algorithme.
ALGORITHME GestionnaireDeContacts
TYPES
Contact = ENREGISTREMENT
nom: CHAINE
prenom: CHAINE
telephone: CHAINE
FIN ENREGISTREMENT
VARIABLES
annuaire: TABLEAU[1..100] DE Contact
nb_contacts_actuels: ENTIER
choix_utilisateur: CARACTERE
Module 1 : AfficherMenu
Une procédure simple qui affiche les options. Pas de logique, juste de l'affichage.
PROCEDURE AfficherMenu()
DEBUT
Ecrire("------------------------------------")
Ecrire("Gestionnaire de Contacts")
Ecrire("Veuillez choisir une option :")
Ecrire("A - Ajouter un contact")
Ecrire("L - Lister tous les contacts")
Ecrire("R - Rechercher un contact")
Ecrire("S - Supprimer un contact")
Ecrire("Q - Quitter")
Ecrire("------------------------------------")
FIN
Module 2 : AfficherUnContact
Une autre procédure utilitaire, qui prend un contact en paramètre et affiche ses informations.
PROCEDURE AfficherUnContact(contact_a_afficher: Contact)
DEBUT
Ecrire("Nom: ", contact_a_afficher.nom, ", Prénom: ", contact_a_afficher.prenom, ", Tel: ", contact_a_afficher.telephone)
FIN
Module 3 : RechercherContact
C'est notre première fonction avec une vraie logique. Elle parcourt le tableau et retourne l'indice du contact trouvé, ou -1 s'il n'existe pas.
FONCTION RechercherContact(ann: TABLEAU DE Contact, nb: ENTIER, nom_recherche: CHAINE, prenom_recherche: CHAINE) : ENTIER
VAR
i: ENTIER
DEBUT
POUR i DE 1 A nb FAIRE
SI ann[i].nom = nom_recherche ET ann[i].prenom = prenom_recherche ALORS
Retourner i // Contact trouvé, on retourne son indice
FINSI
FINPOUR
Retourner -1 // Le contact n'a pas été trouvé après avoir tout parcouru
FIN
Module 4 : ListerContacts
Cette procédure utilise une boucle pour parcourir l'annuaire et appelle AfficherUnContact pour chaque entrée. C'est un bel exemple d'interaction entre modules.
PROCEDURE ListerContacts(ann: TABLEAU DE Contact, nb: ENTIER)
VAR
i: ENTIER
DEBUT
Ecrire("--- Liste des contacts ---")
SI nb = 0 ALORS
Ecrire("L'annuaire est vide.")
SINON
POUR i DE 1 A nb FAIRE
AfficherUnContact(ann[i])
FINPOUR
FINSI
Ecrire("--------------------------")
FIN
Module 5 : AjouterContact
La logique se complexifie. Cette procédure doit gérer l'ajout, vérifier les doublons et l'espace disponible. Notez l'utilisation du mot-clé VAR devant les paramètres ann et nb pour indiquer qu'ils sont passés par référence et que la procédure peut les modifier.
PROCEDURE AjouterContact(VAR ann: TABLEAU DE Contact, VAR nb: ENTIER)
VAR
nouveau_nom, nouveau_prenom, nouveau_tel: CHAINE
indice_trouve: ENTIER
DEBUT
SI nb >= 100 ALORS
Ecrire("Erreur : L'annuaire est plein.")
Retourner // On quitte la procédure
FINSI
Ecrire("Saisir le nom :")
Lire nouveau_nom
Ecrire("Saisir le prénom :")
Lire nouveau_prenom
// On vérifie si le contact existe déjà
indice_trouve ← RechercherContact(ann, nb, nouveau_nom, nouveau_prenom)
SI indice_trouve <> -1 ALORS
Ecrire("Erreur : Ce contact existe déjà.")
SINON
Ecrire("Saisir le numéro de téléphone :")
Lire nouveau_tel
nb ← nb + 1 // On incrémente le nombre de contacts
ann[nb].nom ← nouveau_nom
ann[nb].prenom ← nouveau_prenom
ann[nb].telephone ← nouveau_tel
Ecrire("Contact ajouté avec succès.")
FINSI
FIN
Module 6 : SupprimerContact
Cette procédure recherche un contact et, s'il est trouvé, le supprime en décalant les éléments suivants pour combler le vide. C'est une manipulation classique de tableau.
PROCEDURE SupprimerContact(VAR ann: TABLEAU DE Contact, VAR nb: ENTIER)
VAR
nom_a_supprimer, prenom_a_supprimer: CHAINE
indice_a_supprimer: ENTIER
i: ENTIER
DEBUT
Ecrire("Saisir le nom du contact à supprimer :")
Lire nom_a_supprimer
Ecrire("Saisir le prénom du contact à supprimer :")
Lire prenom_a_supprimer
indice_a_supprimer ← RechercherContact(ann, nb, nom_a_supprimer, prenom_a_supprimer)
SI indice_a_supprimer = -1 ALORS
Ecrire("Erreur : Ce contact n'existe pas.")
SINON
// On décale tous les éléments situés après l'indice à supprimer
POUR i DE indice_a_supprimer A nb - 1 FAIRE
ann[i] ← ann[i + 1]
FINPOUR
nb ← nb - 1 // On décrémente le nombre total de contacts
Ecrire("Contact supprimé avec succès.")
FINSI
FIN
Remarque : nous pourrions aussi créer une procédure RechercherEtAfficherContact pour l'option 'R' du menu, mais pour rester simple, nous réutiliserons les briques existantes dans le programme principal.
3. L'Orchestration : Le Programme Principal
Maintenant que toutes nos briques sont prêtes, il nous faut un "maître d'œuvre" : le programme principal. Son rôle est d'initialiser les variables, puis de lancer une boucle qui affiche le menu, lit le choix de l'utilisateur et appelle la bonne procédure.
// Début du corps principal de l'algorithme
DEBUT
// Initialisation
nb_contacts_actuels ← 0
choix_utilisateur ← ''
// Boucle principale du programme
TANT QUE choix_utilisateur <> 'Q' FAIRE
AfficherMenu()
Ecrire("Votre choix ?")
Lire choix_utilisateur
// SELON (ou SI/SINONSI) pour gérer les options
SI choix_utilisateur = 'A' ALORS
AjouterContact(annuaire, nb_contacts_actuels)
SINONSI choix_utilisateur = 'L' ALORS
ListerContacts(annuaire, nb_contacts_actuels)
SINONSI choix_utilisateur = 'S' ALORS
SupprimerContact(annuaire, nb_contacts_actuels)
SINONSI choix_utilisateur = 'R' ALORS
// Pour rechercher, on combine les briques existantes
VAR nom_rech, prenom_rech: CHAINE
VAR indice: ENTIER
Ecrire("Saisir le nom à rechercher :")
Lire nom_rech
Ecrire("Saisir le prénom à rechercher :")
Lire prenom_rech
indice ← RechercherContact(annuaire, nb_contacts_actuels, nom_rech, prenom_rech)
SI indice = -1 ALORS
Ecrire("Contact non trouvé.")
SINON
Ecrire("Contact trouvé :")
AfficherUnContact(annuaire[indice])
FINSI
SINONSI choix_utilisateur = 'Q' ALORS
Ecrire("Au revoir !")
SINON
Ecrire("Choix invalide. Veuillez réessayer.")
FINSI
FINTANTQUE
FIN
4. L'Algorithme Complet
Pour une vue d'ensemble, voici l'intégralité de notre pseudo-code. Vous pouvez voir comment les déclarations, les procédures/fonctions et le programme principal s'agencent pour former un tout cohérent. C'est l'aboutissement de notre travail de conception et d'implémentation.
Pour vous inspirer de la structure finale, vous pouvez regarder l'Exercice VIII du document suivant, qui organise un programme de gestion de menu de manière très similaire.
[PDF] CORRIGE : Les procédures et les fonctions - CNRS
Le document 'CORRIGE : Les procédures et les fonctions' propose dans son Exercice VIII un exemple complet de programme modulaire avec un menu. C'est un excellent modèle pour voir comment assembler les différentes parties.
Regardez la structure de l'Exercice VIII. Notez comment le programme principal est une simple boucle Répéter...Jusqu'à qui appelle des procédures comme Voir, Supprimer, Ajouter. Observez aussi comment ces procédures en appellent d'autres (ex: Ajouter appelle Existe et Insérer).
Voici donc notre projet finalisé en pseudo-code :
Cliquez ici pour voir le pseudo-code complet du Gestionnaire de Contacts
ALGORITHME GestionnaireDeContacts
TYPES
Contact = ENREGISTREMENT
nom: CHAINE
prenom: CHAINE
telephone: CHAINE
FIN ENREGISTREMENT
VARIABLES
annuaire: TABLEAU[1..100] DE Contact
nb_contacts_actuels: ENTIER
choix_utilisateur: CARACTERE
---------------------------------------------------------------------
PROCEDURE AfficherMenu()
DEBUT
Ecrire("------------------------------------")
Ecrire("Gestionnaire de Contacts")
Ecrire("Veuillez choisir une option :")
Ecrire("A - Ajouter un contact")
Ecrire("L - Lister tous les contacts")
Ecrire("R - Rechercher un contact")
Ecrire("S - Supprimer un contact")
Ecrire("Q - Quitter")
Ecrire("------------------------------------")
FIN
---------------------------------------------------------------------
PROCEDURE AfficherUnContact(contact_a_afficher: Contact)
DEBUT
Ecrire("Nom: ", contact_a_afficher.nom, ", Prénom: ", contact_a_afficher.prenom, ", Tel: ", contact_a_afficher.telephone)
FIN
---------------------------------------------------------------------
FONCTION RechercherContact(ann: TABLEAU DE Contact, nb: ENTIER, nom_recherche: CHAINE, prenom_recherche: CHAINE) : ENTIER
VAR
i: ENTIER
DEBUT
POUR i DE 1 A nb FAIRE
SI ann[i].nom = nom_recherche ET ann[i].prenom = prenom_recherche ALORS
Retourner i
FINSI
FINPOUR
Retourner -1
FIN
---------------------------------------------------------------------
PROCEDURE ListerContacts(ann: TABLEAU DE Contact, nb: ENTIER)
VAR
i: ENTIER
DEBUT
Ecrire("--- Liste des contacts ---")
SI nb = 0 ALORS
Ecrire("L'annuaire est vide.")
SINON
POUR i DE 1 A nb FAIRE
AfficherUnContact(ann[i])
FINPOUR
FINSI
Ecrire("--------------------------")
FIN
---------------------------------------------------------------------
PROCEDURE AjouterContact(VAR ann: TABLEAU DE Contact, VAR nb: ENTIER)
VAR
nouveau_nom, nouveau_prenom, nouveau_tel: CHAINE
indice_trouve: ENTIER
DEBUT
SI nb >= 100 ALORS
Ecrire("Erreur : L'annuaire est plein.")
Retourner
FINSI
Ecrire("Saisir le nom :")
Lire nouveau_nom
Ecrire("Saisir le prénom :")
Lire nouveau_prenom
indice_trouve ← RechercherContact(ann, nb, nouveau_nom, nouveau_prenom)
SI indice_trouve <> -1 ALORS
Ecrire("Erreur : Ce contact existe déjà.")
SINON
Ecrire("Saisir le numéro de téléphone :")
Lire nouveau_tel
nb ← nb + 1
ann[nb].nom ← nouveau_nom
ann[nb].prenom ← nouveau_prenom
ann[nb].telephone ← nouveau_tel
Ecrire("Contact ajouté avec succès.")
FINSI
FIN
---------------------------------------------------------------------
PROCEDURE SupprimerContact(VAR ann: TABLEAU DE Contact, VAR nb: ENTIER)
VAR
nom_a_supprimer, prenom_a_supprimer: CHAINE
indice_a_supprimer: ENTIER
i: ENTIER
DEBUT
Ecrire("Saisir le nom du contact à supprimer :")
Lire nom_a_supprimer
Ecrire("Saisir le prénom du contact à supprimer :")
Lire prenom_a_supprimer
indice_a_supprimer ← RechercherContact(ann, nb, nom_a_supprimer, prenom_a_supprimer)
SI indice_a_supprimer = -1 ALORS
Ecrire("Erreur : Ce contact n'existe pas.")
SINON
POUR i DE indice_a_supprimer A nb - 1 FAIRE
ann[i] ← ann[i + 1]
FINPOUR
nb ← nb - 1
Ecrire("Contact supprimé avec succès.")
FINSI
FIN
---------------------------------------------------------------------
// Programme Principal
---------------------------------------------------------------------
DEBUT
nb_contacts_actuels ← 0
choix_utilisateur ← ''
TANT QUE choix_utilisateur <> 'Q' FAIRE
AfficherMenu()
Ecrire("Votre choix ?")
Lire choix_utilisateur
SI choix_utilisateur = 'A' ALORS
AjouterContact(annuaire, nb_contacts_actuels)
SINONSI choix_utilisateur = 'L' ALORS
ListerContacts(annuaire, nb_contacts_actuels)
SINONSI choix_utilisateur = 'S' ALORS
SupprimerContact(annuaire, nb_contacts_actuels)
SINONSI choix_utilisateur = 'R' ALORS
VAR nom_rech, prenom_rech: CHAINE
VAR indice: ENTIER
Ecrire("Saisir le nom à rechercher :")
Lire nom_rech
Ecrire("Saisir le prénom à rechercher :")
Lire prenom_rech
indice ← RechercherContact(annuaire, nb_contacts_actuels, nom_rech, prenom_rech)
SI indice = -1 ALORS
Ecrire("Contact non trouvé.")
SINON
Ecrire("Contact trouvé :")
AfficherUnContact(annuaire[indice])
FINSI
SINONSI choix_utilisateur = 'Q' ALORS
Ecrire("Au revoir !")
SINON
Ecrire("Choix invalide. Veuillez réessayer.")
FINSI
FINTANTQUE
FIN
Conclusion
Félicitations ! Vous avez transformé une conception modulaire en un algorithme complet et fonctionnel. C'est une étape majeure qui concrétise tout ce que nous avons appris jusqu'ici.
Points clés à retenir :
- L'implémentation suit la conception : nous avons écrit le code de chaque fonction en respectant la signature définie.
- Les fonctions s'appuient les unes sur les autres :
AjouterContactappelleRechercherContact,ListerContactsappelleAfficherUnContact, etc. C'est la force de la modularité. - Le programme principal agit comme un chef d'orchestre, initialisant le système et coordonnant les appels aux fonctions en fonction des entrées de l'utilisateur.
- Ce pseudo-code est maintenant une recette précise, prête à être traduite dans n'importe quel langage de programmation.
Notre algorithme est écrit, mais est-il correct ? Fonctionne-t-il comme prévu dans tous les cas ? Dans la prochaine leçon, nous allons jouer le rôle de l'ordinateur et valider la logique de notre algorithme en le traçant manuellement avec des jeux de données de test. C'est l'étape de vérification, indispensable pour garantir la qualité de notre travail.