Télécharger le projet git de ce repo : https://github.com/alain13100/MinGL2_IUT_AIX.
Faites en sorte d’afficher :
* des 10 pixels de couleur pourpre dans la fenêtre;
* 2 triangles;
* 3 cercles;
* 1 carré;
* un rectangle;
* un pacman.
Télécharger le projet git de ce repo : https://github.com/alain13100/MinGL2_IUT_AIX.
Faites en sorte d’afficher :
* des 10 pixels de couleur pourpre dans la fenêtre;
* 2 triangles;
* 3 cercles;
* 1 carré;
* un rectangle;
* un pacman.
Le code suivant contient la procédure de génération d’un tableau et la recherche de la valeur maximale.
using namespace std; void initVect (vector& V, const size_t & _size, const unsigned & min, const unsigned & max) { V.resize(_size); for (unsigned & val : V) val = min + rand() % (max - min); } unsigned maxElemem (const vector & V) { return *max_element (V.begin(), V.end()); } int main() { srand (time(nullptr)); vector V; unsigned maxAGenerer (20); initVect (V, 10, 1, maxAGenerer); //TODO return 0; }
Compléter le contenu pour afficher l’histogramme du tableau.
Veillez à bien dimensionner votre fenêtre.
Dans le fichier node.hpp
, créer la classe générique CNode
:
templateclass CNode { private: T m_Data; CNode* m_Next; public: //constructor CNode (); //destructor ~CNode (); //getter / setter TODO };
getter
et des setter
;
Tester votre classe avec le code suivant :
void ListeSimple (void) { std::cout << "ListeSimple : \n\n"; CNode* Tete = nullptr; // Le dernier element cree est toujours le premier de la liste for (unsigned i (0); i < 5; ) { Tete = new CNode (i++, Tete); std::cout << Tete << endl; } for (CNode * Ptr (Tete); Ptr; Ptr = Ptr->GetNextNode ()) std::cout << Ptr->GetData() << "; "; std::cout << '\n'; // Dans cette version, le destructeur de C1Link detruit son // suivant donc la destruction de la liste est recursive delete Tete; }// ListeSimple ()
Dans le fichier list.hpp
, créer la classe générique CList
de signature suivante :
templateclass CList { private: CNode * m_Head; public: CList (); ~CList (); //ajout en tête de liste void push_front (const T & val); //affichage void Show () const; //recherche d'un élément dans la liste, renvoie le pointeur du maillon si l'élément est présent, nullptr sinon CNode * Find (const T & val) const; //ajout d'une valeur après un maillon de la liste void Add (const T & val, CNode *); //détache un maillon de la liste et le supprime void Delete (CNode *); };
Ecrivez le corps de toutes les fonctions de cette classe.
Tester votre classe avec le code suivant :
void ListeSimpleV2 () { cout << "ListeSimpleV2 : \n\n"; CListAList; // Le dernier element cree est toujours le premier de la liste for (unsigned i (0); i < 5; ) { AList.push_front (i++); } AList.Show (); int i; cin >>i; CNode * ptr = AList.Find (i); AList.Add (3*i, ptr); AList.Show (); cout << ((ptr != NULL)? " " : "non ") << "trouve" << endl; }
Ajouter à la classe CList
une donnée membre qui indique l’adresse de la queue (dernier élément) de la liste.
Modifier la fonction Add
en mettant à jour cette variable lorsque cela est nécessaire.
Ajouter à la classe la fonction push_back ()
de signature :
void push_back (const T & val);
Tester votre fonction.
La donnée membre m_Head
change de sémantique : elle ne pointe plus vers la tête réelle mais vers une tête fictive nommée m_fictionaHead
.
Modifier toutes les fonctions de la classe CList
pour appliquer cette modification.
Créer le projet ReseauSocial
.
Depuis C++11
, C++
offre une bibliothèque ctime
, qui permet de grossièrement gérer l’heure et la date. Cette bibliothèque reprend les structures du C
, dans l’espace de nom std
. Pour obtenir la date du jour, il faut procéder en 2 étapes. D’abord, récupérer le nombre de secondes écoulées depuis le 01/01/1970, à l’aide de la fonction time()
de profil (simplifié)
time (time_t * t);
qui s’utilise comme suit :
time_t t; time (&t);
Ensuite,on transforme le time_t
en une structure struct tm
(rappel: struct
classe où tout est publique par défaut) à l’aide de la fonction localtime()
de profil
tm * localtime (time_t * t);
qui transforme t
, le nombre de secondes écoulées depuis le 01/01/1970, en une tm
et s’utilise comme suit :
tm local = * localtime (& t);
nous allons encapsuler cette struct tm
dans la classe Date
, comme sur le schéma UML
suivant, de manière à interdire, à l’utilisateur qui utiliserait cette classe Date
, l’accès aux attributs de la struct tm
:
On ajoutera à cette classe Date
un constructeur par défaut qui construit une Date
avec la date du jour.
Ecrire complètement les fichiers Date.h
et Date.cpp
qui contiennent respectivement les déclarations et les définitions de la classe Date
correspondant au schéma et aux explications, dans l’espace de noms std
.
Tester en ajoutant la fonction suivante à l’espace de noms anonyme de votre main.cpp
:
void testDate (void) { Date date; cout << "Aujourd'hui nous sommes le : " << date.getDay () << ' ' << date.getMonth () << ' ' << date.getYear () << " et il est " << date.getHour () << "h " << date.getMinute () << "mn et " <Petit problème, le mois est le mois dernier et l'année est n'importe quoi. Voici ce que dit le
man
sur les attributs mis en cause dans lestruct tm
:struct tm { int tm_sec; /* Seconds (0-60) */ int tm_min; /* Minutes (0-59) */ int tm_hour; /* Hours (0-23) */ int tm_mday; /* Day of the month (1-31) */ int tm_mon; /* Month (0-11) */ int tm_year; /* Year - 1900 */ int tm_wday; /* Day of the week (0-6, Sunday = 0) */ int tm_yday; /* Day in the year (0-365, 1 Jan = 0) */ int tm_isdst; /* Daylight saving time * / };Corriger dans les 2 accesseurs concernés et tester à nouveau.
Date.h
/** * * \file Date.h * * \authors M. Laporte * * \date 24/05/2018 * * \version V1.0 * * \brief Declaration de la classe Date * **/ #ifndef __DATE_H__ #define __DATE_H__ #include <ctime> // struct tm namespace std { class Date : public tm { public : Date (void); unsigned getYear (void) const; unsigned getMonth (void) const; unsigned getDay (void) const; unsigned getHour (void) const; unsigned getMinute (void) const; unsigned getSecond (void) const; }; // Date } // std #endif /* __DATE_H__ */
Date.cpp
/** * * \file Date.cpp * * \authors M. Laporte * * \date 24/05/2018 * * \version V1.0 * * \brief Definitions de la classe Date * **/ #include "date.h" std::Date::Date (void) { time_t whatTime; time (& whatTime); tm local; local = * localtime (&whatTime); tm_year = local.tm_year; tm_mon = local.tm_mon; tm_mday = local.tm_mday; tm_hour = local.tm_hour; tm_min = local.tm_min; tm_sec = local.tm_sec; //*this = * ((Date *) localtime (&whatTime)); tm_year += 1900; tm_mon += 1; } unsigned std::Date::getYear (void) const { return tm_year; } unsigned std::Date::getMonth (void) const { return tm_mon; } unsigned std::Date::getDay (void) const { return tm_mday; } unsigned std::Date::getHour (void) const { return tm_hour; } unsigned std::Date::getMinute (void) const { return tm_min; } unsigned std::Date::getSecond (void) const { return tm_sec; }
Le but de ce qui suit est de traduire en C++ le schéma UML suivant :
Dans l’espace de noms anonyme du fichier main.cpp
déclarer la classe Message
, comme elle est décrite sur le schéma UML
. Y ajouter un constructeur qui se contente de remplir myContent
avec un paramètre correspondant, et myDate
, avec la date courante (constructeur par défaut de Date
). La fonction displayContent()
affiche à l’écran le contenu du message. Vous intégrerez directement les définitions des fonctions dans la classe.
Dans l’espace de noms anonyme, insérer les différentes classes (exercices suivants), de haut en bas, dans l’ordre des exercices. Normalement, seules des déclarations de classes vides seront à ajouter. Lorsque cela sera nécessaire un embryon de classe sera fourni.
Ajouter à la classe l’accesseur à l’attribut myDate
.
Dans l’espace de noms anomyme ajouter les fonctions displayDate()
suivante :
void displayDate (const Date & date) { cout << date.getDay () << ' ' << date.getMonth () << ' ' << date.getYear (); } // displayDate()
et displayHour()
suivante :
void displayHour (const Date & date) { cout << date.getHour () << "h " << date.getMinute () << "mn et " <Tester avec la fonction
testMessage()
suivante, également à incorporer à l'espace de noms anonyme du fichiermain.cpp
:void testMessage (void) { Message message ("salut"); message.displayContent (); cout << " posté le : "; displayDate (message.getDate ()); cout << " à "; displayHour (message.getDate ()); cout << endl; } // testMessage()}
class Message { string myContent; Date myDate; public : Message (const string & content) : myContent (content) {} void displayContent (void) const { cout << myContent; } Date getDate (void) const { return myDate; } }; // Message