Vous allez mettre en œuvre une classe générique dénommée « Vecteur » qui représente un tableau de type quelconque avec un certain nombre de caractéristiques supplémentaires. La généricité doit prendre en compte la dimension du tableau. Sans précision particulière, le « Vecteur » devra pouvoir stocker cinq éléments. Une fois que la dimension du tableau est définie, il n'est alors plus possible de la modifier en cours de route.
Ce « Vecteur » est différent d'un tableau dans le sens où il est plutôt considéré comme un conteneur. Un conteneur permet de stocker des informations à la volée. Prenons l'exemple d'un logiciel graphique qui trace des cercles. Au fur et à mesure que nous traçons les cercles, nous devons les stocker dans un conteneur afin de les restituer au moment opportun. Il faut donc qu'un conteneur soit capable d'ajouter des éléments mais aussi de les enlever, de pouvoir exécuter des recherches, etc.
Le langage C++ propose des conteneurs prêts à l'emploi. « Vecteur » représente l'un d'entre eux (« vector » que nous étudierons ultérieurement) mais bien entendu avec des caractéristiques plus modestes. Il devra posséder les méthodes suivantes.
| Méthodes | Explications |
| Constructeurs | Déterminez si il est nécessaire d'avoir un ou plusieurs constructeurs. Dans cette quête, évaluer la nécessité d'un constructeur par défaut et d'un constructeur de copie. |
| Destructeur | Par rapport à la démarche précédente, un destructeur est-il nécessaire ? si oui, mettez le en œuvre. |
| push_back ( élément ) | Cette méthode permet d'ajouter dans le conteneur un élément spécifique. Le stockage devra être effectué successivement, c'est-à-dire comme une pile d'assiettes. Il sera peut-être nécessaire d'introduire un attribut qui gère le nombre d'éléments déjà introduit. |
| élément pop_back () | Cette méthode est l'inverse de la précédente. Elle restitue le dernier élément, mais plus que cela, elle l'enlève également de la pile. |
| élément back () | Cette méthode est similaire à la précédente mais sans enlever l'élément de la pile. |
| unsigned capacity () | Cette méthode permet d'indiquer la dimension du conteneur. |
| unsigned size () | Cette méthode restitue le nombre d'éléments déjà introduits. |
| bool empty () | Cette méthode indique si le conteneur est vide. |
| clear () | Cette méthode permet de vider le conteneur. |
| bool find ( élément ) | Cette méthode indique si un élément est présent dans le conteneur. |
| remove ( élément ) | Cette méthode permet d'enlever un élément présent dans le conteneur. |
Voici un scénario possible pour vous montrer l'utilisation possible de ce conteneur.


Corrections : (cliquez sur le fichier source à visualiser)-- récupération des sources
Vous allez reprendre le conteneur précédent. Toutefois, lorsque la capacité du conteneur est atteinte, le conteneur devra continuer à stoker de nouveaux éléments, il devra en conséquence doubler automatiquement sa capacité de stockage. Ainsi, lorsque nous avons au départ un conteneur de cinq éléments et que nous tentons d'introduire un sixième, le conteneur devra au préalable passer à une capacité de dix éléments, à la suite de quoi, il sera capable de stocker cette sixième valeur. Réévaluer votre classe conteneur pour atteindre ces objectifs.
Corrections : (cliquez sur le fichier source à visualiser)-- récupération des sources
Vous allez mettre en œuvre une fonction générique « echange » qui, comme nous l'avons déjà vu, effectue une permutation entre deux variables de même type. Cette fonction devra permettre la permutation de variables de n'importe quel type. Vous la testerez avec deux variables entières, ensuite avec des variables réelles, mais également avec des permutations d'objets comme deux conteneurs « Vecteur » ou des objets « Complexe ».
Actuellement, avec le langage C++ est fourni une bibliothèque qui comporte des classes et des fonctions prêtes à l'emploi. Je l'ai d'ailleurs déjà évoqué avec les conteneurs de type « vector ». Cette bibliothèque est appelée bibliothèque standard et plus précisément « Standard Template Library » ou plus concisément « STL ». D'après les termes utilisés, vous remarquez qu'il s'agit de classes et de fonctions génériques qui pourront donc s'appliquer à tous les types. Dans cette bibliothèque il existe notamment une classe « bitset » qui représente un nombre binaire dont on peut choisir exactement le nombre de bits. Par exemple, il sera possible, grâce à cette classe, de travailler avec des nombres binaires de 12 bits. Vous allez fabriquer l'équivalent d'une telle classe et que vous appelerez « Binaire ». Cette classe devra bien évidemment travailler avec les opérateurs qui permet d'effectuer les traitements binaires comme le « et logique », le « ou logique », les décalages, etc. plus quelques méthodes supplémentaires qui sont bien utiles dans le cadre des nombres binaires. Je vous invite à fabriquer ces différent comportements dans l'ordre qui vous est donné dans le tableau ci-dessous :
| Méthodes | Explications |
| Constructeur par défaut | L'objet équivalent représentera une suite de bits nuls |
| Constructeur avec un argument de type non signé | On obtient une suite correspondant au motif binaire contenu dans l'argument, comme : Binaire<8> octet(0xF8) ; |
| Constructeur avec une chaîne de caractères en argument | Le motif binaire correspond exactement à l'écriture proposée dans la chaîne de caractères : Binaire<12> mot(« 101110 ») ; Les chiffres binaires non exprimés ont pour valeur 0. |
| test (position) | Cette méthode teste si le bit désigné par position est à 1. Si c'est le cas, la méthode renvoie true , et false dans le cas contraire. |
| any () | Existe-t-il au moins un bit dans le nombre binaire qui est à 1 ? |
| none () | Inverse de la précédente, tous les bits sont-ils à 0 ? |
| count () | Détermine le nombre de bits mis à 1. |
| size () | Indique la capacité (nombre de bits) du nombre binaire. |
| set () | Tous les bits du nombre sont mis à 1. |
| set ( position ) | Le bit désigné par position est mis à 1. |
| reset () | Tous les bits sont mis à 0. |
| reset ( position ) | Le bit désigné par position est mis à 0. |
| flip () | Inverse tous les bits du nombre. |
| flip (position) | Inverse le bit désigné par position. |
| Opérateur [ position ] | Permet de retourner la valeur du bit désigné par position. Il s'agit d'une lecture uniquement. |
| Opérateurs | Voici tous les opérateurs que vous devez implémenter :
&=, &, |= , |, ~, <<=, >>=, ==, != |
| Opérateur = | Doit-on redéfinir cet opérateur ? |
Nota : Pour cet ensemble de méthode, il n'est pas demander d'effectuer des tests particuliers comme pour contrôler par exemple que l'utilisateur demande la valeur d'un bit en dehors des bornes prévues par le nombre binaire.
Corrections : (cliquez sur le fichier source à visualiser)-- récupération des sources