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 [2015/10/18 18:46]
gbdivers
intervalle [2015/10/18 22:11] (Version actuelle)
winjerome
Ligne 4: Ligne 4:
 ====== Gérer des intervalles de valeurs ====== ====== Gérer des intervalles de valeurs ======
  
-En mathématique, un [[https://fr.wikipedia.org/wiki/Intervalle_(math%C3%A9matiques)|intervalle]] est l'ensemble des variables compris entre deux valeurs. Par exemple, l'intervalle des entiers [1, 5[ (fermé à gauche et ouvert à droite) correspond aux valeurs 1, 2, 3, 4.+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. 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 ouvert à droite.+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 : En particulier, il faudra pouvoir gérer les unions et intersections d'intervalles :
  
-  * [0, 5[ U [2, 7[ = [0, 7[ ; +  * [0, 5[ U [2, 7[ = [0, 7[ 
-  * [0, 5[ I [2, 7[ = [2, 5[ ;+  * [0, 5[ I [2, 7[ = [2, 5[
  
  
 ===== Intervalle simple ===== ===== Intervalle simple =====
  
-Ecrire une classe Interval1 permettant de gérer un intervalle simple.+**Première version**  
 + 
 +Écrire une classe ''Interval_1'' permettant de gérer un intervalle simple d'entiers (''int'').
  
 Construction et affectation Construction et affectation
  
-  * construction à partir de deux valeurs +  * construction à partir de deux valeurs ; 
-  * assertion que les deux valeurs sont ordonnées +  * assertion que les deux valeurs sont ordonnées ; 
-  * sémantique de valeur : copiable, déplaçable (move)+  * sémantique de valeur : copiable, déplaçable (move).
  
 Opérations de base Opérations de base
  
-  * intersection d'intervalle +  * intersection d'intervalle ; 
-  * tester si une valeur appartient à un 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é ===== ===== Intervalle composé =====
  
-Idem, écrire une classe Interval2, mais ajout de l'union d'intervalles. Il n'est plus possible de conserver uniquement deux valeurs correspondant aux bornes.+**Première version** 
  
-Première version : utiliser un conteneur pouvant recevoir plusieurs Intervalle définie 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).+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 pour contenir les intervalles.+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).
  
-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é pour former un seul intervalle.+<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 ===== ===== Ensemble de valeurs =====
  
-Ecrire une classe Interval3, 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+**Première version** 
  
-  * l'intervalle [-inf, inf[ sera représenté en interne par un tableau vide +Écrire une classe ''Interval_3'', en changeant de représentation interne. Au lieu de conserver des paires de valeurs pour représenter des intervallesutiliser un tableau de valeurs avec l'état courant.
-  * l'intervalle [0, inf[ sera représenté en interne par la valeur {0, true} +
-  * l'intervalle [01[ sera représenté en interne par les valeurs {{0true}, {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}}+
  
-Seconde partie. Idem, mais utiliser d'autres types que bool. Par exemple avec char :+  * 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 59: Ligne 114:
 </code> </code>
  
-Ecrire la classe correspondante :+Écrire la classe correspondante :
  
-  * sémantique de valeur +  * sémantique de valeur ; 
-  * ajouter des valeurs +  * ajout de valeurs ; 
-  * union et intersection +  * union et intersection ; 
-  * tester une valeurs+  * tester une valeur.
  
-^ Chapitre précédent ^ [[programmez_avec_le_langage_c|Sommaire principal]] ^ Chapitre suivant ^+<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.1445186778.txt.gz · Dernière modification: 2015/10/18 18:46 par gbdivers