// FICHIER : Vecteur.cc // CLASSE : Vecteur // This file is part of the Herezh++ application. // // The finite element software Herezh++ is dedicated to the field // of mechanics for large transformations of solid structures. // It is developed by Gérard Rio (APP: IDDN.FR.010.0106078.000.R.P.2006.035.20600) // INSTITUT DE RECHERCHE DUPUY DE LÔME (IRDL) . // // Herezh++ is distributed under GPL 3 license ou ultérieure. // // Copyright (C) 1997-2021 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, // or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty // of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. // See the GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // // For more information, please consult: . ////#include "Debug.h" # include using namespace std; //introduces namespace std #include #include #include "Sortie.h" #include #include "ParaGlob.h" #include "CharUtil.h" #include "Vecteur.h" #ifndef VECTEUR_H_deja_inclus #ifndef MISE_AU_POINT inline #endif // Constructeur permettant de definir un vecteur de taille n initialise a 0 Vecteur::Vecteur (int n) { #ifdef MISE_AU_POINT if ( n<0 ) { cout << "\nErreur : taille invalide !\n"; cout << "VECTEUR::VECTEUR (int ) \n"; Sortie(1); }; #endif if ( n==0 ) // cas ou la taille selectionnee est nulle : initialisation identique a l'appel // du constructeur par defaut { taille=0; v=NULL; } else {v=new double [n]; // allocation de la place memoire taille=n; for (int i=0;iAffiche(min_i,max_i,pas_i,nd); cout << "\n entrez une lettre pour continuer ? "; rep = lect_chaine(); } }; #ifndef MISE_AU_POINT inline #endif // Permet de modifier la taille du vecteur // N.B. : Si la nouvelle taille est superieure a l'ancienne alors le vecteur // est complete par des 0 void Vecteur::Change_taille (int n) { // si la taille est identique, on ne fait rien if (n == taille) return; // la suite concerne le cas où il faut vraiment faire quelque chose if ( n<0 ) // cas ou la taille selectionnee est negative { cout << "\nErreur : taille invalide !\n"; cout << "VECTEUR::CHANGE_TAILLE (int ) \n"; Sortie(1); }; if ( n==0 ) // cas ou la taille selectionnee est nulle : initialisation identique a // l'appel du constructeur par defaut { taille=0; v=NULL; return ; }; double* tempo; tempo=new double [n]; if ( n<=taille ) // cas ou la taille selectionnee est inferieure a la taille d'origine { for (int i=0;itaille ) // cas ou la taille selectionnee est superieure a la taille d'origine { for (int i=0;i0 ) {delete [] v;} // desallocation du vecteur pointe par v else { if ( v!=NULL ) { cout << "\nErreur de liberation de la place memoire\n"; cout << "VECTEUR::LIBERE () \n"; Sortie(1); }; }; v=NULL; taille=0; }; #ifndef MISE_AU_POINT inline #endif // Retourne le maximum en valeur absolue des composantes du vecteur double Vecteur::Max_val_abs () const { double max; max=fabs(v[0]); // affectation de max a la premiere composante du vecteur for (int i=1;iNorme(); return *this;}; #ifndef MISE_AU_POINT inline #endif // Realise le produit scalaire entre le vecteur courant et le vecteur // vec et retourne le resultat obtenu // N.B.: Les vecteurs doivent etre de meme taille double Vecteur::Prod_scal (const Vecteur& vec) const { #ifdef MISE_AU_POINT if ( taille!=vec.taille ) { cout << "\nErreur : tailles non egales !\n"; cout << "VECTEUR::PROD_SCAL (Vecteur ) \n"; Sortie(1); }; #endif double prod_scal=0.0; for (int i=0;i & A) { // cas où les deux tailles sont égales if ( taille==A.size() ) { for (int i=0;itaille) ) { cout << "\nErreur : composante inexistante !\n"; cout << "VECTEUR::OPERATOR() (int ) \n"; Sortie(1); }; #endif return v[i-1]; }; #ifndef MISE_AU_POINT inline #endif // Retourne la ieme composante du vecteur : acces en lecture et en ecriture double& Vecteur::operator() (int i) { #ifdef MISE_AU_POINT if ( (i<1) || (i>taille) ) { cout << "\nErreur : composante inexistante !\n"; cout << "VECTEUR::OPERATOR() (int ) \n"; Sortie(1); }; #endif return v[i-1]; }; #ifndef MISE_AU_POINT inline #endif // Surcharge de l'operateur ! : renvoie la norme d'un vecteur double Vecteur::operator! () const { return Norme(); }; // mise a zero d'un vecteur #ifndef MISE_AU_POINT inline #endif void Vecteur::Zero() {for (int i=0;i vec.taille) ) { cout << "\nErreur, affectation impossible: indice= " << indice << " vec.Taille()= " << vec.taille << " (*this).Taille()= " << taille << " !\n"; cout << "Vecteur::Egale_une_partie_de(const Vecteur& vec,int indice)\n"; Sortie(1); }; #endif int j=indice-1; for (int i=0;i taille) ) {cout << "\nErreur, affectation impossible: indice= " << indice << " vec.Taille()= " << vec.taille << " (*this).Taille()= " << taille << " !\n"; cout << "Vecteur::Une_partie_egale(int indice, const Vecteur& vec)\n"; Sortie(1); }; #endif int j=indice-1; for (int i=0;i> (istream & entree, Vecteur & vec) { // vérification du type string type; entree >> type; if (type != "Vecteur") {Sortie (1); return entree; }; // passage de la chaine donnant la taille puis lecture de la taille int taille; entree >> type >> taille; // vérification de la taille sinon changement if (vec.Taille() != taille) vec.Change_taille(taille); // lecture des données for (int i = 0; i< vec.taille; i++) entree >> vec.v[i]; return entree; }; // surcharge de l'operateur d'ecriture non formatée // les informations sont le type puis la taille puis les datas séparées par // un espace #ifndef MISE_AU_POINT inline #endif ostream & operator << ( ostream & sort,const Vecteur & vec) { // tout d'abord un indicateur donnant le type sort << "Vecteur taille= " << vec.taille << " "; for (int i = 0; i< vec.taille; i++) sort << setprecision(ParaGlob::NbdigdoCA()) << vec.v[i] << " "; // sort << "\n"; return sort; }; // spécifiquement à la classe MV_Vector #ifndef MISE_AU_POINT inline #endif MV_Vector * Vecteur::Nouveau_MV_Vector_double() { MV_Vector * pt = new MV_Vector (v,taille,MV_Vector_::ref_type(1)); return pt; }; #ifndef MISE_AU_POINT inline #endif const MV_Vector * Vecteur::Nouveau_MV_Vector_double_const() const { const MV_Vector * pt = new const MV_Vector (v,taille,MV_Vector_::ref_type(1)); return pt; }; // ramène un vecteur MV_Vector qui utilise la même place // mémoire que this ce qui pemet d'utiliser le type MV_Vector #ifndef MISE_AU_POINT inline #endif MV_Vector Vecteur::MV_vecteur_double() { return (MV_Vector (v,taille,MV_Vector_::ref_type(1))); }; // ramène un vecteur constant MV_Vector qui utilise la même place // mémoire que this ce qui pemet d'utiliser le type MV_Vector #ifndef MISE_AU_POINT inline #endif const MV_Vector Vecteur::MV_vecteur_double() const { return (MV_Vector (v,taille,MV_Vector_::ref_type(1))); }; #endif