M2103-TP1-Exo-1

L’objectif de cet exercice est de construire une ébauche d’une classe permettant de gérer une durée de temps (un délai), exprimé soit en secondes, soit en jours, heures, minutes et secondes.

Les normes IUT de programmation C++ devront être respectées : identificateurs des données membres (myData), identificateurs des paramètres (Data, terminaisons des classes}; // CX, …).

Création du projet

Créez le projet DureeDeBase (avec QT Creator).

Etape 1

Dans l’espace de noms anonyme du fichier main.cpp, déclarer la classe Duree dont le diagramme de classe est

, qui possède les données membres suivantes :

  • la durée en secondes (toujours positive ou nulle, et la plus grande possible),

  • le nombre de jours, d’heures, de minutes et de secondes correspondants (choisir les types les mieux adaptés).

et les fonctions membres suivantes :

  • un constructeur dont l’unique paramètre est le nombre de secondes de la durée,

  • une fonction membre display() qui affiche à l’écran la durée sous la forme suivante (sans retour chariot, pour pouvoir compléter l’affichage) :

          0 jour(s)  0 heure(s)  1 minute(s) 40 seconde(s)
         12 jour(s) 23 heure(s) 59 minute(s)  9 seconde(s)
    

    Comme le montre l’exemple ci-dessus, prévoir pour les zones numériques un format tel qu’elles soient alignées verticalement (rappel en utilisant le manipulateur standard setw().

    On pourra simplifier l’affichage en utilisant les unités h., j. min., s. au lieu de jour, heure, minute, seconde.

  • une fonction membre normaliser() qui transforme en jours, heures, etc., toute durée exprimée en secondes.

    Cette fonction ne devrait être accessible qu’à des fins internes.

Les définitions (corps) de toutes les fonctions membres devront être faites en dehors de la déclaration de la classe.

Attention à utiliser à bon escient le qualificatif const.

Avant de continuer à développer cette classe, tester ces trois premières fonctions membres.

Pour cela, écrire la fonction testDureeDeBase() qui, dans une boucle, saisit au clavier une durée exprimée en secondes (jusqu’à une valeur nulle), construit un objet de la classe Duree initialisé à la valeur lue et l’affiche à l’écran.

Compiler et tester.

Lorsque les résultats vous sembleront justes, vous devez ouvrir un terminal et vous placer dans le répertoire où se trouve l’exécutable de votre projet.

Téléchargez-y le fichier FichDurees.

Testez à nouveau votre programme en redirigeant le fichier FichDurees sur le flux d’entrée standard et comparez vos résultats avec ceux qui sont indiqués ci-dessous.

Seconde étape

Vous pouvez maintenant enrichir la classe avec :

  • la fonction membre getDuree() qui renvoie la valeur de la donnée membre correspondante,

  • les fonctions membres incr() et decr() qui augmentent ou diminuent la durée de l’objet de la valeur delta passée en paramètre.

    On considère pour le moment que si delta est supérieur à la valeur courante de la durée, le résultat de decr(Delta) est une durée nulle.

En fin de fonction testDureeDeBase(), ajoutez le code ci-dessous.

Duree d1 (0);
d1.incr (1);
cout << "Nbre sec. " << setw (6) << d1.getDuree ()
     << ", soit : ";
d1.display ();
cout << '\n';

d1.decr (1);
cout << "Nbre sec. " << setw (6) << d1.getDuree ()
     << ", soit : ";
d1.display ();
cout << '\n';

d1.incr (3662);
cout << "Nbre sec. " << setw (6) << d1.getDuree ()
     << ", soit : ";
d1.display ();
cout << '\n';

d1.decr (10000);
cout << "Nbre sec. " << setw (6) << d1.getDuree ()
     << ", soit : ";
d1.display ();
cout << '\n';

N’oubliez pas de sauvegarder tous vos fichiers sources sur github.

M2103-TP1-Exo-2

Création du projet

Créez le projet ModuleProf (avec QT Creator).

Etape 1

Dans l’espace de noms anonyme du fichier TestModuleProf.cpp, déclarer les classes Module et Prof définie par le
diagramme UML
:

, qui possède les caractéristiques suivantes :

  • Les références aux modules enseignés par un professeur seront rangés dans un
    vector <Module *>.

  • Le constructeur de la classe Prof aura en paramètre uniquement son nom.

  • Les références aux professeurs dispensant un module seront rangés dans un
    vector <Prof *>.

  • Le constructeur de la classe Module aura en paramètre uniquement son nom.

  • La fonction addModule() de la classe Prof ajoute au vector <Module *> le module passé en paramètre.
    Ce paramètre est un pointeur sur un Module (non représentable en UML).

  • La fonction addProf() de la classe Module ajoute au vector <Prof *> le module passé en paramètre.
    Ce paramètre est un pointeur sur un Prof (non représentable en UML).

  • La fonction display() de la classe Prof affiche les noms de chacun des modules qu’il dispense, à raison d’un par ligne.

  • La fonction display() de la classe Module affiche les noms de chacun des professeurs qui le dispense,
    à raison d’un par ligne.

Dans l’espace de nom anonyme écrire la fonction TestModuleProf() qui :

  • crée, un vector <Module *> (4 ou 5 suffiront), en saisissant les noms des modules au clavier (ne pas oublier d’allouer de la place).

  • crée, un vector <Prof *> (4 ou 5 suffiront), en saisissant les noms des professeurs au clavier (ne pas oublier d’allouer de la place).

  • Ajoute à chaque professeur 1 ou 2 modules qu’il dispense.

  • Ajoute à chaque module 1 ou 2 professeurs qui l’enseigne.

  • Affiche le nom de chaque professeur suivi de la liste de tous les modules dans lesquels il intervient.

  • Affiche le nom de chaque module suivi de la liste de tous les professeurs qui le dispensent.

  • Restitue l’espace alloué dans chacun des 2 vectors.

N’oubliez pas de sauvegarder tous vos fichiers sources sur github.

M2103-TP1-Exo3

Remarque préliminaire : cet exercice ne peut être effectué qu’après l’exercice 1 de ce même TP

Si la classe Duree est susceptible d’être utilisée dans plus d’un seul fichier, ce qui est déjà le cas, elle doit en être extraite et mise à la disposition de tout utilisateur.

De ce fait elle ne peut plus appartenir à un espace de noms anonyme.

Comme la norme C++ préconise de ne pas utiliser d’identificateurs globaux, il faut donc placer la classe Duree (déclaration et définition) dans un espace de noms nommé.

La notion de “durée” étant assez générale et non spécifique à un domaine particulier, nous la ferons entrer dans la catégorie des outils et nous la placerons dans l’espace nsUtil.

De plus, la déclaration de la classe sera placée dans un fichier .h susceptible d’être inclus dans tout programme utilisant cette classe.

Les définitions des méthodes seront au contraire regroupées dans un fichier .cpp.

Lorsque le code sera stabilisé (plus d’ajouts ni de modifications) il sera compilé séparément (avec production d’un fichier objet .o) et ajouté à une bibliothèque (library, fichier archive .a).

Créer le projet DureeCompilSeparee.

Y recopier le fichier DureeDeBase.cpp dans les fichiers Duree.h, Duree.cpp et TestDuree.cpp.

Dans le fichier Duree.h, extraire tout ce qui ne concerne pas la déclaration de la classe Duree (voir l’amphi correspondant).
Mettre la classe dans l’espace de noms nsUtil.
Ajouter les directives d’inclusion conditionnelle.

Dans le fichier Duree.cpp, placer tous les corps des fonctions membres (elles appartiennent maintenant à l’espace de noms nsUtil).

Inclure le fichier Duree.h.

Extraire tout ce qui ne concerne pas la définition de la classe Duree.

Du fichier TestDuree.cpp, supprimer tout ce qui concerne la classe Duree et le remplacer par l’inclusion du fichier Duree.h.

Au début de la fonction testDuree(), ajouter la déclaration d’un vector de Duree.

Modifier la boucle de lecture des durées au clavier, pour stocker les objets Duree créés dans le vecteur.

En fin de lecture au clavier, afficher le contenu du vecteur.

Compiler et tester.

N’oubliez pas de sauvegarder tous vos fichiers sources sur github.

M2103-TP1-Exo4

Remarque préliminaire : cet exercice ne peut être effectué qu’après l’exercice 3 de ce même TP
CDuree – Compilation séparée.

Construire le projet DureeConstrDfltCopyDestr.

Recopier les sources du projet DureeCompilSeparee dans le répertoire Sources du projet DureeConstrDfltCopyDestr.

Fonction display

Afin de rendre l’affichage plus concis, remplacer l’affichage initial, de la forme :

    12 jour(s)  2 heure(s)  3 minute(s) 55 seconde(s)

par

[    12:02:03:55]

Pour cela, vous devez utiliser le manipulateur setfill() en lui passant en paramètre le caractère de remplissage à gauche du chiffre le plus significatif : ' ' pour les jours, et '0' pour les autres valeurs.

Remarques

  1. setfill() a un effet permanent, jusqu’à la prochaine modification explicite du caractère de remplissage.

    Ceci implique qu’après l’avoir modifié, pensez à le restaurer à la valeur par défaut (l’espace).

  2. Lire aussi la fonction fill()

Destructeur

A la classe Duree, ajouter le destructeur qui se contente d’afficher le contenu de l’objet détruit (fonction display())).

Ajouter au constructeur l’affichage du contenu de l’objet construit (fonction display())).

Dans la fonction testCDuree(), commencer par redimensionner (resize()) le vecteur (vector) à 10 éléments (cela doit suffire pour le fichier FichDurees) et remplacer la fonction push_back() par une écriture indicée.

Compiler et tester.

Vous constatez une erreur de compilation.

Les raisons sont expliquées par le fonctionnement du constructeur par défaut et par celui de la fonction resize()‘ des cours consacrés à la classe vector.

Constructeur par défaut

Ajouter des valeurs par défaut aux paramètres du constructeur et des fonctions incr() et decr().

Compiler et tester.

Identifier les affichages provoqués par les appels de tous les destructeurs.

Constructeur par recopie

A la classe Duree, ajouter la surcharge du constructeur par recopie.

Y ajouter provisoirement un affichage permettant de montrer qu’il est appelé.

Avant la fonction testDuree(), ajouter dans l’espace de noms anonyme la fonction suivante :

void fct (Duree durDur)
{
	cout << "Affichage de durDur : ";
	durDur.afficher ();
	cout << '\n'; 

} // Fct()

Tester avec le fichier FichDurees téléchargé précédemment.

Analyser et comprendre tous les affichages.

N’oubliez pas de sauvegarder tous vos fichiers sources sur github.