SAÉ S1.01-02 Semestre 1 · janvier 2026

Horizons Bus, 5 000 trajets en C

Une application console en C pour une compagnie d'autocars interurbains : charger son historique de réservations, gérer les passagers, trier et filtrer les trajets, puis supprimer les bus déficitaires en relogeant leurs passagers ailleurs.

Compétences
Réaliser · Optimiser
Cadre
BUT Informatique - IUT Lyon 1
Binôme
avec Raphaël Ghisquière
Outils
C · gcc · CSV

Le besoin : exploiter un fichier de réservations

La compagnie fictive Horizons Bus prépare un réseau de lignes interurbaines. Elle dispose d'un historique de réservations dans un simple fichier CSV, et veut savoir quelles lignes sont rentables.

5 000
trajets chargés depuis le CSV
55
places au plus par bus
10
fonctionnalités dans le menu
5
algorithmes mesurés, de 10 à 5 000 trajets

Chaque ligne du fichier décrit un trajet : numéro de bus, villes de départ et d'arrivée, date, heures, puis une liste de longueur variable de passagers, chacun avec son nom et le prix de son billet.

Un bus coûte 100 € fixes plus 50 € par heure de trajet. Comparé à la somme des billets vendus, ce coût dit si le trajet gagne ou perd de l'argent : c'est la règle sur laquelle repose toute la partie rentabilité.

L'application

Un menu console qui répond, question par question, au cahier des charges.

Menu principal

Dix fonctionnalités

Afficher les trajets et le détail de leurs passagers, les trier, ajouter, supprimer ou modifier un passager, sauvegarder dans le CSV, rechercher des trajets, classer les bus par chiffre d'affaires et optimiser la rentabilité.

Un petit script Windows prépare la console et affiche le logo au démarrage.

Menu principal de l'application Horizons Bus dans la console

Les choix techniques

Les données, le découpage du fichier et l'algorithme le plus délicat : la relocalisation.

01

Trois structures imbriquées

Passager, Date et Trajet, qui contient un tableau de 55 passagers puisque c'est la capacité d'un bus. Les heures sont stockées en entiers au format HHMM, faciles à comparer.

02

Un tableau statique plutôt qu'une liste chaînée

Les trajets sont chargés dans un tableau static de 6 000 cases : accès direct par indice, aucun malloc à libérer, et pas de risque de déborder la pile malgré la taille de la structure.

03

Un découpage du CSV sans copie

Plutôt que strtok, une fonction separer_champ cherche la virgule suivante, la remplace par une fin de chaîne et renvoie le champ suivant. La ligne est découpée sur place, sans allouer de mémoire.

04

Supprimer un bus sans perdre ses passagers

Les passagers des bus déficitaires sont mis en attente, puis replacés dans un bus maintenu sur la même ligne, le même jour, avec une place libre et l'horaire le plus proche. Le tableau est ensuite tassé pour retirer les trajets supprimés.

Complexité : la théorie vérifiée par la mesure

Un compteur d'opérations élémentaires a été ajouté dans les fonctions clés, puis le programme lancé sur 10, 50, 100, 500, 1 000 et 5 000 trajets.

FonctionnalitéAlgorithmeComplexitéOpérations pour 5 000 trajets
Q7. Trajets depuis une ville avec une nuit à bordparcours séquentielO(N)environ 95 000
Q8. Recherche départ, arrivée et dateparcours séquentielO(N)environ 85 000
Q3. Tri par ville, date puis heuretri par sélectionO(N²)environ 76 millions
Q9. Classement par chiffre d'affairescalcul du CA puis tri par sélectionO(N²)environ 38 millions
Q10. Optimisation de la rentabilitésuppression, décalage et relocalisationO(N²)environ 33 millions
Mille fois plus d'opérations pour le même volume. Les recherches restent quasi instantanées, alors que les tris explosent dès quelques milliers de trajets. À cette échelle, le tri par sélection reste acceptable ; au-delà, il faudrait passer à un tri en O(N log N) comme le tri rapide.

Le compte rendu

Douze pages rédigées à deux, qui accompagnent le code : ce qu'il fait, et pourquoi.

  • L'analyse des structures de données : Passager, Date, Trajet, et le choix d'un stockage statique.
  • Les algorithmes clés : découpage du CSV, calcul des durées et des coûts, tri multicritère, relocalisation des passagers.
  • L'analyse de complexité de cinq fonctionnalités, théorique puis mesurée, avec une courbe par algorithme.

Ce que ce projet m'a appris

  • Partir des contraintes du sujet simplifie le code : une capacité connue de 55 places justifie un tableau fixe plutôt qu'une allocation dynamique.
  • Lire un fichier réel, c'est gérer ses cas particuliers : heures manquantes, nombre variable de passagers, trajets qui passent minuit.
  • Une complexité se vérifie : compter les opérations et tracer les courbes rend concret l'écart entre un algorithme linéaire et un algorithme quadratique.
  • Une règle métier simple, le coût d'un bus, suffit à transformer une liste de trajets en aide à la décision.