Outils d'utilisateurs

Outils du Site


intervalle

Différences

Cette page vous donne les différences entre la révision choisie et la version actuelle de la page.

Lien vers cette vue

intervalle [2014/10/07 11:26]
gbdivers créée
intervalle [2015/10/18 22:11] (Version actuelle)
winjerome
Ligne 2: Ligne 2:
 ^ Chapitre précédent ^ [[programmez_avec_le_langage_c|Sommaire principal]] ^ Chapitre suivant ^ ^ Chapitre précédent ^ [[programmez_avec_le_langage_c|Sommaire principal]] ^ Chapitre suivant ^
  
-====== Gérer un intervalle de valeurs ======+====== Gérer des intervalles de valeurs ======
  
-PratiquerCréer une classe qui gère les intervalles.+En mathématiques, un [[https://fr.wikipedia.org/wiki/Intervalle_(math%C3%A9matiques)|intervalle]] est l'ensemble des variables comprises entre deux valeurs. Par exemple, l'intervalle des entiers [1, 5[ (fermé à gauche et ouvert à droite) correspond aux valeurs 1, 2, 3, 4. 
 + 
 +Le but de ces exercices va être d'écrire une représentation d'ensemble d'intervalles. Par exemple l'ensemble [0, 5[ U [10, 15[ correspond aux valeurs 0, 1, 2, 3, 4, 10, 11, 12, 13, 14. 
 + 
 +Note : par symétrie avec les conteneurs standards, nous allons travailler sur des intervalles fermés à gauche et ouverts à droite. 
 + 
 +En particulier, il faudra pouvoir gérer les unions et intersections d'intervalles : 
 + 
 +  * [0, 5[ U [2, 7[ = [0, 7[ 
 +  * [0, 5[ I [2, 7[ = [2, 5[ 
 + 
 + 
 +===== Intervalle simple ===== 
 + 
 +**Première version**  
 + 
 +Écrire une classe ''Interval_1'' permettant de gérer un intervalle simple d'entiers (''int''). 
 + 
 +Construction et affectation 
 + 
 +  * construction à partir de deux valeurs ; 
 +  * assertion que les deux valeurs sont ordonnées ; 
 +  * sémantique de valeur : copiable, déplaçable (move). 
 + 
 +Opérations de base 
 + 
 +  * intersection d'intervalle ; 
 +  * tester si une valeur appartient à un intervalle. 
 + 
 +<code cpp> 
 +class Interval_1 { 
 +    ... 
 +private: 
 +    int low_value{}; 
 +    int hight_value{}; 
 +}; 
 +</code> 
 + 
 +**Seconde version** 
 + 
 +Idem, avec template au lieu de ''int''. 
 + 
 +<code cpp> 
 +template<class T> 
 +class Interval_1_bis { 
 +    ... 
 +private: 
 +    T low_value{}; 
 +    T hight_value{}; 
 +}; 
 +</code> 
 + 
 +===== Intervalle composé ===== 
 + 
 +**Première version**  
 + 
 +Idem, écrire une classe ''Interval_2'', mais ajout de l'union d'intervalles. Il n'est plus possible de conserver uniquement deux valeurs correspondant aux bornes. 
 + 
 +Utiliser un vector pouvant recevoir plusieurs ''Interval_1'' défini précédemment. Il faut en particulier s'assurer de la cohérence et la simplification des données (l'union de deux intervalles peut produire deux intervalles ou un seul). 
 + 
 +<code cpp> 
 +class Interval_2 { 
 +    ... 
 +private: 
 +    std::vector<Interval_1> m_intervals{}; 
 +}; 
 +</code> 
 + 
 +**Seconde version**  
 + 
 +Utiliser un conteneur associatif (std::set) pour trier les intervalles. Note : deux intervalles disjoints sont ordonnables, deux intervalles non disjoints doivent être fusionnés pour former un seul intervalle. 
 + 
 +<code cpp> 
 +class Interval_2_bis { 
 +    ... 
 +private: 
 +    std::set<Interval_1> m_intervals{}; 
 +}; 
 +</code> 
 + 
 +===== Ensemble de valeurs ===== 
 + 
 +**Première version**  
 + 
 +Écrire une classe ''Interval_3'', en changeant de représentation interne. Au lieu de conserver des paires de valeurs pour représenter des intervalles, utiliser un tableau de valeurs avec l'état courant. 
 + 
 +  * l'intervalle [-inf, inf[ sera représenté en interne par un tableau vide ; 
 +  * l'intervalle [0, inf[ sera représenté en interne par la valeur {0, true} ; 
 +  * l'intervalle [0, 1[ sera représenté en interne par les valeurs {{0, true}, {1, false}} ; 
 +  * l'ensemble [0, 1[ U [2, 3[ sera représenté en interne par les valeurs  {{0, true}, {1, false}, {2, true}, {3, false}}. 
 + 
 +<code cpp> 
 +class Interval_3 { 
 +    ... 
 +private: 
 +    std::vector<pair<int, bool>> m_intervals{}; 
 +}; 
 +</code> 
 + 
 +**Deuxième version**  
 + 
 +Idem, mais utiliser d'autres types que ''bool''. Par exemple avec ''char'' :
  
 <code cpp> <code cpp>
Ligne 13: Ligne 114:
 </code> </code>
  
-^ Chapitre précédent ^ [[programmez_avec_le_langage_c|Sommaire principal]] ^ Chapitre suivant ^+Écrire la classe correspondante :
  
-{{tagCours C++}}+  * sémantique de valeur ; 
 +  * ajout de valeurs ; 
 +  * union et intersection ; 
 +  * tester une valeur. 
 + 
 +<code cpp> 
 +class Interval_3_bis { 
 +    ... 
 +private: 
 +    std::vector<pair<int, char>> m_intervals{}; 
 +}; 
 +</code> 
 + 
 + 
 +**Deuxième version**  
 + 
 +Idem, mais avec templates 
 + 
 +<code cpp> 
 +template<class T, class U> 
 +class Interval_3_bis { 
 +    ... 
 +private: 
 +    std::vector<pair<T, U>> m_intervals{}
 +}
 +</code> 
 + 
 +^ Chapitre précédent ^ [[programmez_avec_le_langage_c|Sommaire principal]] ^ Chapitre suivant ^
intervalle.1412673979.txt.gz · Dernière modification: 2014/10/07 11:26 par gbdivers