Ce document pédagogique de type travaux pratiques, intitulé TP4 : Fichier et complexité expérimentale, propose une exploration pratique de la manipulation de fichiers et de l'analyse empirique des performances d'algorithmes de tri en langage C++. Le travail s'appuie sur une structure de données dédiée aux nombres complexes et vise à mesurer les temps d'exécution sur différents types de jeux de données textuels.
La première partie du document pose les bases en demandant d'enrichir la classe NbComplexe créée lors d'un TP précédent. Pour simplifier l'écriture des entrées-sorties et des algorithmes, plusieurs opérateurs fondamentaux sont surchargés : l'opérateur d'affectation =, l'opérateur de comparaison < basé sur le calcul du module pour remplacer une ancienne fonction membre, ainsi que l'opérateur de multiplication *. De plus, les flux d'entrée et de sortie sont adaptés grâce aux opérateurs << et >>, remplaçant les méthodes traditionnelles d'affichage et de saisie. Les fonctions globales de tri par sélection et par insertion sont ensuite mises à jour pour intégrer ces nouveaux opérateurs.
L'exercice suivant aborde l'interaction avec le système de fichiers à l'aide de la librairie fstream. Une procédure nommée lireTabNbComplexeDepuisFichier est présentée afin d'allouer dynamiquement un tableau de nombres complexes à partir d'un fichier texte externe. Le programme s'adapte ainsi automatiquement au volume de données contenu dans le fichier, qu'il s'agisse de listes de nombres aléatoires, déjà triées ou triées en ordre inverse, stockées dans des fichiers tels que random.txt, sorted.txt ou reverse.txt.
Le travail se poursuit avec une procédure symétrique permettant d'enregistrer un tableau de nombres complexes dans un fichier texte. Enfin, le cœur du sujet aborde la mesure empirique des performances. À l'aide de la fonction clock(), les étudiants comparent les temps d'exécution du tri par sélection et du tri par insertion sur les différents fichiers fournis. Des tableaux de résultats chiffrés illustrent les nettes variations de performance selon l'état initial des données, mettant en évidence le comportement particulier du tri par insertion sur des listes déjà ordonnées.
Ce document permet de s'entraîner concrètement sur la programmation orientée objet en C++, la gestion de la mémoire dynamique, la manipulation des flux de fichiers et l'analyse algorithmique. Il est conseillé de reprendre l'implémentation de la classe, d'écrire les fonctions de lecture et d'écriture de fichiers, puis de reproduire les mesures de temps pour interpréter les différences de complexité entre les tris étudiés.
Le document compare le tri par sélection et le tri par insertion appliqués à des tableaux de nombres complexes.
Trois fichiers principaux sont mentionnés pour tester les algorithmes : random.txt, sorted.txt et reverse.txt.
Le temps d'exécution est mesuré en utilisant la fonction clock() du C++ et en divisant la différence par CLOCKS_PER_SEC pour obtenir un résultat en secondes.
Quel opérateur remplace la fonction membre estPlusPetit dans la classe NbComplexe ?
Réponse correcte : L'opérateur <
Explication : L'énoncé précise qu'il faut surcharger l'opérateur < pour tester le strict inférieur, ce qui remplace la fonction membre estPlusPetit.
Quelle est la précondition concernant le paramètre tab lors de l'appel à la procédure lireTabNbComplexeDepuisFichier ?
Réponse correcte : Le tableau tab ne doit pas être alloué, la procédure s'en charge
Explication : La précondition indique explicitement que le tableau n'est pas alloué et que la procédure prend en charge l'allocation dynamique de la mémoire.
Quelle fonction de la bibliothèque standard est utilisée pour mesurer le temps d'exécution ?
Réponse correcte : clock()
Explication : Le code fourni utilise clock_t tempsExec = clock(); pour capturer le temps processeur avant et après l'exécution du tri.