Classe Vecteur 3D
Objectifs:
- Utiliser l'auto-référence avec le pointeur this
- Manipuler pointeurs et références
- Surcharger les fonctions membres
Énoncé:
Réaliser une classe C++ "vecteur3d" permettant de manipuler des vecteurs à 3 composantes (de type float). On y prévoira :
- un constructeur, avec des valeurs par défaut (0),
- une fonction d’affichage des 3 composantes du vecteur, sous la forme : (x, y, z)
- une fonction permettant d’obtenir la somme de 2 vecteurs ;
- une fonction permettant d’obtenir le produit scalaire de 2 vecteurs.
- une fonction coincide permettant de savoir si 2 vecteurs ont mêmes composantes.
- une fonction qui renvoie la norme du vecteur
- une fonction nommée normax permettant d’obtenir, parmi deux vecteurs, celui qui a la plus grande norme. On prévoira trois situations :
- le résultat est renvoyé par valeur ;
- le résultat est renvoyé par adresse, l’argument étant également transmis par adresse.
- le résultat est renvoyé par référence, l’argument étant également transmis par référence.
Ecrire un programme utilisant la classe réalisée.
Vecteur V1(1,2,3)
Vecteur V2(5,6,7)
La somme des vecteurs v1 et v2 est : (6,8,10)
Le produit scalaire des vecteurs v1 et v2 est : 38
Copier le vecteur V1 dans V3:
Vecteur V3(1,2,3)
Les vecteurs v1 et v3 coincident
Le vecteur qui a la plus grande norme est (par valeur): (5,6,7)
Le vecteur qui a la plus grande norme est (par adresse): (5,6,7)
Le vecteur qui a la plus grande norme est (par reference) :(5,6,7)
//Programme : Classe Vecteur 3D
//Auteur : IDMANSOUR
//Copyright : Exelib.net
#include<iostream> #include<cmath> using namespace std; class vecteur3d { float x; float y; float z; public: //Constructeur d'initialisation vecteur3d(float a = 0, float b = 0, float c = 0) : x(a), y(b), z(c) { } //Constructeur de recopie vecteur3d(const vecteur3d & v) { x = v.x; y = v.y; z = v.z; } //L'affichage d'un vecteur void afficher() { cout << "("<<x<<","<<y<<","<<z<<")" << endl; } //La somme de deux vecteur vecteur3d somme(const vecteur3d & v) { vecteur3d s; s.x = x + v.x; s.y = y + v.y; s.z = z + v.z; return s; //Ou return vecteur3d(x+v.x, y+v.y, z+v.z); } //Le produit scalaire de deux vecteurs float produit(const vecteur3d & v) { return x*v.x + y*v.y + z*v.z; } //tester si deux vecteurs ont les memes composantes bool coincide(const vecteur3d & v) { return (x == v.x && y == v.y && z == v.z); } //Retourner la norme du vecteur float norme() { return sqrt(x*x + y*y + z*z); } //Retourner le vecteur qui la plus grande norme : par valeur vecteur3d normax(vecteur3d v) { if( this->norme() > v.norme()) return *this; return v; } //Retourner le vecteur qui la plus grande norme : par adresse vecteur3d * normax(vecteur3d * v) { if( this->norme() > v->norme()) return this; return v; } //Retourner le vecteur qui la plus grande norme : par reference vecteur3d & normaxR(vecteur3d &v) { if( this->norme() > v.norme()) return *this; return v; } }; int main() { vecteur3d v1(1,2,3); cout << "Vecteur V1"; v1.afficher(); vecteur3d v2(5,6,7); cout << "Vecteur V2"; v2.afficher(); cout<<endl; cout << "La somme des vecteurs v1 et v2 est : "; (v1.somme(v2)).afficher(); cout << "Le produit scalaire des vecteurs v1 et v2 est : " << v1.produit(v2) << endl; cout<<endl; cout << "Copier le vecteur V1 dans V3:" << endl; vecteur3d v3(v1); cout << "Vecteur V3"; v3.afficher(); if(v1.coincide(v3)) cout << "Les vecteurs v1 et v3 coincident " << endl; else cout << "Les vecteurs v1 et v3 ne coincident pas " << endl; cout<<endl; cout << "Le vecteur qui a la plus grande norme est (par valeur): "; (v1.normax(v2)).afficher(); cout << "Le vecteur qui a la plus grande norme est (par adresse): "; (v1.normax(&v2))->afficher(); cout << "Le vecteur qui a la plus grande norme est (par reference) :"; (v1.normaxR(v2)).afficher(); cout<<endl; }
La fonction normaxR ne peut pas être appelée normax parce que son appel aura la même syntaxe que celui de la fonction avec passage par valeur donc il y aura une ambiguïté lors de la compilation du programme.