Final exercice: Matrix class
To translate this course in your native langage:
In Chrome: right-click anywhere on the page and select “Translate to…”
Or use this language selector:
Les mots colorés en anglais représentent des mots-clés de la norme du langage C++. Ils sont conservés à l’identique lors de l’utilisation d’une traduction automatique avec Google Translate. Exemple : l’héritage (inheritance) est un principe fondamental de C++.
L’objectif de cet exercice final est de développer une classe template pour gérer les matrices carrées square matrix. Sa réalisation demande une bonne maîtrise des notions abordées dans les chapitres de cours précédents.
Avertissement
IA or not IA, that is the question. Cet exercice est au programme de l’examen.
Convention
Notations :
Une matrice \(M_{mn}\) contient m lignes et n colonnes.
L’élément \(m_{ij}\) se trouve sur la ligne i colonne j.
La notion \(m_{ij}\) peut être contre-intuitive car en géométrie 2D, elle correspond à \(m_{yx}\) et non \(m_{xy}\)
Partie I
Vous allez créer une classe générique SMatrix pour représenter les matrices carrées.
Créez un fichier nommé SMatrix_base.cpp
La classe SMatrix doit être une classe template admettant comme paramètres :
Le type des données int, float, double…
La largeur de la matrice
Pour stocker les valeurs, vous devez utiliser un ou plusieurs containers de la STL.
Les tableaux du C sont interdits
Plusieurs options sont possibles
Le containeur retenu doit être paramétré en utilisant les paramètres du template de la classe SMatrix
Ce container sera déclaré private
Fournissez l’accès à chaque élément par la syntaxe : M[i][j] avec M un objet SMatrix :
En C++, peut-on créer directement un opérateur [][] ?
Cette syntaxe impose de choisir une modélisation adaptée :
Il faut choisir une modélisation pour la classe SMatrix qui permette de la faire fonctionner.
Plusieurs options sont possibles et affectent directement le choix du container de données.
Pour cette classe, fournissez les fonctionnalités suivantes :
Constructeur par défaut : ne réalise aucune initialisation des éléments.
Constructeur prenant une valeur : initialise tous les éléments avec la valeur passée en paramètre.
Constructeur par recopie : reçoit un objet SMatrix et recopie l’ensemble de ses valeurs.
size() : retourne la largeur de la matrice.
get(i,j) : retourne la valeur située à la position (i,j) - on ne gère pas les indices hors plage
set(i,j, value) : modifie la valeur située à la position (i,j) - on ne gère pas les indices hors plage
print() : affiche le contenu de la matrice sous la forme d’un tableau 2D
bool equals(const SMatrix & other) : indique si l’objet courant contient les mêmes valeurs que l’objet passé en paramètre.
SMatrix& operator=(SMatrix other) : copie le contenu d’un objet SMatrix dans l’objet courant.
Fournissez un constructeur permettant d’initialiser les valeurs de la matrice à partir d’une liste de valeurs :
Exemple : SMatrix<int, 2> m({1, 2, 3, 4})
Syntaxe permettant d’accepter une telle liste entre accolades : SMatrix(std::initializer_list<T> values)
Les valeurs doivent être placées ligne par ligne dans la matrice.
On supposera que le nombre de valeurs fournies correspond exactement au nombre d’éléments de la matrice.
L’utilisation du mot-clef const doit être faite chaque fois que nécessaire.
Pour vérifier votre code, vous devez utiliser les tests suivants :
test1.txtDéposez votre fichier contenant la classe et les tests dans l’espace partagé
Partie II
Opérateurs
Créez un fichier nommé SMatrix_operators.cpp
Mettez en place les opérateurs externes suivants :
Addition et soustraction de deux matrices carrées
Multiplication entre deux matrices carrées
Multiplication d’une matrice par un nombre entier par la gauche et par la droite
Un opérateur externe est un opérateur déclaré comme une fonction et non comme une fonction membre
Créez une fonction t(…) qui retourne la transposée de la matrice passée en argument
friend keyword
Comme nous créons des opérateurs externes (non membre de la classe), ils ne peuvent pas accéder aux données privées et doivent donc utiliser les accesseurs publics. Cependant, il est possible d’accéder aux données privées d’une classe depuis une fonction externe. Pour cela, il faut écrire la déclaration de cette fonction à l’intéreur de la classe et lui ajouter le qualificatif friend comme ceci :
template ...
class SMatrix
{
...
template ... friend ... operator+(...,...);
};
Test final
Vous devez pouvoir effectuer le calcul suivant en utilisant vos opérateurs :
Test
Vous devez pouvoir compiler et exécuter la ligne suivante :
A = A * t(A) + 2 * A - A * A;
Utilisez la matrice A= [ [1,2,3], [2,3,4], [3,4,5]] pour tester votre résultat. Vous devez obtenir :
>> 2 4 6
>> 4 6 8
>> 6 8 10
Travail sur l’espace partagé
Le test demandé doit être présent dans le code
Uploadez le fichier SMatrix_operators.cpp sur votre espace partagé