Janvier 2025

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.

Interface console de l'application

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.

Démonstration de la recherche avec filtres multiples

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 d'un client

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.

Graphique du nombre d'opérations élémentaires pour la recherche avec filtre

É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.