SAE S1.01&2
Gestion d'Annuaire Client
Développement d'une application console complète en langage C pour gérer un annuaire client.
Projet réalisé en binôme dans le cadre de ma première année de BUT Informatique.

Présentation du projet
Objectifs
Dans le cadre de la SAE (Situation d'Apprentissage et d'Évaluation) S1.01&2, nous devions concevoir une application de gestion d'annuaire client entièrement en C. Ce projet avait pour but de nous faire découvrir la programmation bas niveau et de nous initier aux défis de la gestion mémoire.
L'objectif principal était de créer un système capable de gérer efficacement les informations clients stockées dans un fichier CSV, tout en proposant des fonctionnalités avancées de recherche, tri et manipulation des données.
Descriptif technique
L'application que nous avons développée permet de gérer un annuaire complet avec les informations suivantes pour chaque client : prénom, nom, ville, code postal, téléphone, email, profession et date de naissance. L'âge est calculé automatiquement en fonction de la date d'exécution du programme.
Nous avons choisi une approche modulaire avec une séparation claire entre les structures de données, les fonctions métier et l'interface utilisateur. Cette architecture nous a permis de travailler efficacement en binôme : j'ai pris en charge la partie recherche et affichage, tandis que ma coéquipière Leia s'est occupée des fonctions CRUD et des algorithmes de tri.
Répartition des tâches :
Jordan (moi) :
- Fonctions de recherche textuelle et avec filtres
- Récupération et parsing des données CSV
- Fonctions d'affichage et détection des données manquantes
- Interface utilisateur et menu principal
Leia (coéquipière) :
- Ajout, modification et suppression de clients
- Algorithmes de tri par différents critères
- Validation des données et gestion des erreurs
Fonctionnalités implémentées
Interface utilisateur
L'application propose un menu principal avec 9 options différentes, permettant une navigation intuitive entre les différentes fonctionnalités. Chaque action est accompagnée de messages clairs et de validations pour guider l'utilisateur.
Gestion des données
L'une des parties les plus intéressantes du projet a été le développement du parser CSV. Nous avons dû gérer des cas particuliers comme les villes composées (par exemple "ST Etienne") ou les champs optionnels vides. J'ai mis en place un système qui analyse caractère par caractère pour extraire correctement chaque information.
Recherche avancée
J'ai développé deux systèmes de recherche distincts :
- Recherche exacte : Trouve un client spécifique en combinant plusieurs critères (téléphone obligatoire, nom, prénom et email optionnels)
- Recherche avec filtres : Permet de filtrer les clients selon 5 critères différents avec correspondance partielle
Ces fonctions utilisent des comparaisons insensibles à la casse et gèrent la correspondance partielle, ce qui rend la recherche très flexible.
Exemple de recherche avec filtres : ici on recherche tous les clients ayant "cou" dans leur nom
Modification des données
Leia a développé un système de modification très intuitif qui permet de mettre à jour les informations d'un client de manière sélective. L'utilisateur peut choisir quels champs modifier en laissant les autres inchangés.
Interface de modification permettant de changer sélectivement les informations d'un client
Système de tri
Leia a implémenté un système de tri par sélection capable de classer les clients selon 4 critères différents : nom, code postal, profession et date de naissance. Le tri chronologique des dates a été particulièrement challengeant car il fallait convertir le format DD/MM/YYYY en données comparables.
Gestion mémoire dynamique
L'un des aspects les plus techniques du projet a été la gestion de la mémoire. Nous avons utilisé l'allocation dynamique pour tous les champs texte, permettant d'optimiser l'espace mémoire selon la longueur réelle des données.
L'ajout de clients utilise realloc() pour étendre le tableau, tandis que chaque champ est alloué individuellement avec calloc().
Analyse des performances
Mesure de la complexité
Pour approfondir notre compréhension des algorithmes, nous avons créé une version spécialisée du programme dédiée à l'analyse de performance. Cette version compte le nombre d'opérations élémentaires pour chaque fonction critique.
Nous avons testé nos algorithmes sur 6 jeux de données différents, allant de 10 à 5000 entrées, ce qui nous a permis d'observer concrètement l'évolution de la complexité en fonction de la taille des données.
Évolution du nombre d'opérations élémentaires de la recherche avec filtre en fonction du nombre d'entrées
Résultats obtenus
Complexité algorithmique mesurée :
- Recherche : O(n) - Parcours linéaire du tableau
- Tri par sélection : O(n²) - Comparaisons quadratiques
- Insertion : O(1) amortie grâce à la stratégie de reallocation
Optimisations réalisées
Nous avons optimisé plusieurs aspects du programme :
- Parser CSV : Lecture en une seule passe avec gestion intelligente des cas spéciaux
- Calcul d'âge : Algorithme tenant compte des anniversaires non encore passés
- Comparaisons : Fonctions optimisées pour les comparaisons insensibles à la casse
- Gestion mémoire : Allocation précise pour éviter le gaspillage
Robustesse du code
Nous avons accordé une attention particulière à la robustesse du programme. Chaque fonction inclut une gestion d'erreur complète (échec d'allocation mémoire, fichier introuvable, format invalide) et toutes les saisies utilisateur sont validées avec des boucles de contrôle.
La documentation du code suit les standards avec des préconditions et postconditions pour chaque fonction, facilitant la maintenance et la compréhension du code.
Ressources et documentation
Accès au projet
Le code source complet du projet est disponible sur GitHub, incluant les deux versions (fonctionnelle et analyse de performance) ainsi que tous les jeux de données de test.
Rapport d'analyse des performances
Un rapport détaillé de nos analyses de performance est disponible, incluant les graphiques, les tableaux de mesures et nos conclusions sur l'optimisation des algorithmes.
Bilan du projet
Ce projet m'a permis de maîtriser les concepts fondamentaux de la programmation en C, notamment la gestion mémoire dynamique et l'implémentation d'algorithmes efficaces. Le travail en binôme a également été très enrichissant, nous permettant de nous répartir les tâches selon nos forces et d'apprendre l'un de l'autre.
L'approche scientifique avec l'analyse de performance a ajouté une dimension supplémentaire au projet, nous initiant aux méthodes d'évaluation et d'optimisation des algorithmes.