begin process at 2012 05 29 00:14:22
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Algorithme

 > 

Maths

 > 

Code de gestion de matrices, merci de le critiquer


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Code de gestion de matrices, merci de le critiquer

vendredi 12 août 2011 à 15:27:36 | Code de gestion de matrices, merci de le critiquer

imed07

#ifndef MATRIX_H
#define MATRIX_H

#include <iostream>
#include <vector>

template<class T>
class Matrix
{
private:
int _nbLignes, _nbColonnes;
std::vector<std::vector<T>> _v;
void setElement(int l, int c, T v);
Matrix():_nbLignes(0),_nbColonnes(0){};

public:
Matrix(int, int);
Matrix(const Matrix&);

void operator+=(const Matrix&);
void operator-=(const Matrix&);

Matrix operator+(const Matrix&) const;
Matrix operator-(const Matrix&) const;

T operator()(int, int) const;

int getNbLignes() const{return _nbLignes;}
int getNbColonnes() const{return _nbColonnes;}

//initialise
void fill(T value);

int set(int l, int c, T v);

bool operator==(const Matrix&) const;

};

template<class T>
std::ostream& operator << (std::ostream& out, const Matrix<T>& m)
{
for(int i=0; i<m.getNbLignes(); i++)
{
out << "|" ;

for(int j=0; j<m.getNbColonnes(); j++)
out << " " << m(i,j) << " " ;

out << "|" << std::endl;
}
return out;
}

template<class T>
Matrix<T>::Matrix(int nbLignes, int nbColonnes):_nbLignes(nbLignes), _nbColonnes(nbColonnes)
{
_v.resize(nbLignes);
for(int i=0; i<nbLignes; i++)
_v[i].resize(nbColonnes);
}

template<class T>
Matrix<T>::Matrix(const Matrix<T>& m)
{
_nbLignes = m._nbLignes;
_nbColonnes = m._nbColonnes;

_v.resize(_nbLignes);
for(int i=0; i<_nbLignes; i++)
_v[i].resize(_nbColonnes);

for(int i=0; i<_nbLignes; i++)
for(int j=0; j<_nbColonnes; j++)
setElement(i,j,m(i,j));
}

template<class T>
void Matrix<T>::operator+=(const Matrix<T>& m)
{
if ((_nbLignes != m._nbLignes)||(_nbColonnes != m._nbColonnes))
{
std::cout << "addition impossible !!" << std::endl;
return ;
}

for(int i=0; i<_nbLignes; i++)
for(int j=0; j<_nbColonnes; j++)
this->setElement(i,j,m(i,j)+_v[i][j]);
}

template<class T>
void Matrix<T>::operator-=(const Matrix<T>& m)
{
if ((_nbLignes != m._nbLignes)||(_nbColonnes != m._nbColonnes))
{
std::cout << "soustraction impossible !!" << std::endl;
return ;
}

for(int i=0; i<_nbLignes; i++)
for(int j=0; j<_nbColonnes; j++)
this->setElement(i,j,_v[i][j]-m(i,j));
}

template<class T>
Matrix<T> Matrix<T>::operator+(const Matrix<T>& m) const
{
if ((_nbLignes != m._nbLignes)||(_nbColonnes != m._nbColonnes))
{
std::cout << "addition impossible !!" << std::endl;
return Matrix<T>();
}

Matrix result(*this);
result+=m;
return result;
}

template<class T>
Matrix<T> Matrix<T>::operator-(const Matrix<T>& m) const
{
if ((_nbLignes != m._nbLignes)||(_nbColonnes != m._nbColonnes))
{
std::cout << "soustraction impossible !!" << std::endl;
return Matrix<T>();
}

Matrix result(*this);
result-=m;
return result;
}

template<class T>
T Matrix<T>::operator()(int row, int col) const
{
return (this->_v[row])[col];
}

//initialiser
template<class T>
void Matrix<T>::fill(T value)
{
for(int i=0; i<_nbLignes; i++)
for(int j=0; j<_nbColonnes; j++)
this->setElement(i,j,value);
}

template<class T>
void Matrix<T>::setElement(int row, int col, T value)
{
(_v[row])[col] = value;
}

template<class T>
int Matrix<T>::set(int row, int col, T value)
{
if(row>0 && col>0 && row<=_nbLignes && col<_nbColonnes)
(_v[row-1])[col-1] = value;
else
return -1;

return 0;
}

template<class T>
bool Matrix<T>::operator==(const Matrix<T>& m) const
{
if(_nbLignes!= m._nbLignes || _nbColonnes!=m._nbColonnes)
return false;

for(int i=0; i<_nbLignes; i++)
for(int j=0; j<_nbColonnes; j++)
if (_v[i][j]!= m(i,j)) return false;

return true;
}

#endif
vendredi 12 août 2011 à 16:15:59 | Re : ode de gestion de matrices, merci de le critiquer

LA_Tupac

Membre Club
Bonjour
Bien bien bien ....
jolie classe ...
Mais c'est quoi la question ?
C'est vraiment lourd à force ce genre de post...
vendredi 12 août 2011 à 17:17:27 | Re : Code de gestion de matrices, merci de le critiquer

CptPingu

Administrateur CodeS-SourceS
Bonjour.

La question est dans le titre, mais il aurait été bien de la rappeler dans le sujet. Pense aussi à utiliser la balise de code quand tu en postes, sinon c'est un peu illisible.
Sépare aussi chacun des fichiers dans une balise de code différente, en précisant le nom du fichier.
Une fois cette opération faite, on pourra jeter un coup d'oeil sur ton travail.

Voici un exemple de question bien posée: http://www.cppfrance.com/forum/sujet-DECLARER-OBJETS-DANS-ATTRIBUTS-CLASSE-DEFINISSANT-OBJET-DECLARE_1540447.aspx

________________________________________________________________________
Historique de mes créations, et quelques articles:
http://0217021.free.fr/portfolio
Merci d'utiliser Réponse acceptée si un post répond à votre question
vendredi 12 août 2011 à 21:06:12 | Re : Code de gestion de matrices, merci de le critiquer

CptPingu

Administrateur CodeS-SourceS
@imed07: Je viens de supprimer ton message. Merci de faire attention à l'indentation. La couleur c'est bien, mais ça ne suffit pas. L'indentation est importante aussi.
Reposte avec ce critère supplémentaire.

________________________________________________________________________
Historique de mes créations, et quelques articles:
http://0217021.free.fr/portfolio
Merci d'utiliser Réponse acceptée si un post répond à votre question
mardi 16 août 2011 à 11:01:58 | Re : Code de gestion de matrices, merci de le critiquer

imed07

Code C/C++ :
#ifndef MATRIX_H
#define MATRIX_H

#include <iostream>
#include <vector>

template<class T>
class Matrix
{
private:
   int _nbLignes, _nbColonnes;
   std::vector<std::vector<T>> _v;
   void setElement(int l, int c, T v);
   Matrix():_nbLignes(0),_nbColonnes(0){};

public:
   Matrix(int, int);
   Matrix(const Matrix&);

   void operator+=(const Matrix&);
   void operator-=(const Matrix&);

   Matrix operator+(const Matrix&) const;
   Matrix operator-(const Matrix&) const;

   T operator()(int, int) const;

   int getNbLignes() const{return _nbLignes;}
   int getNbColonnes() const{return _nbColonnes;}

   //initialise
   void fill(T value);

   int set(int l, int c, T v);

   bool operator==(const Matrix&) const;

};

template<class T>
std::ostream& operator << (std::ostream& out, const Matrix<T>& m)
{
  for(int i=0; i<m.getNbLignes(); i++)
  {
     out << "|" ;

     for(int j=0; j<m.getNbColonnes(); j++)
        out << " " << m(i,j) << " " ;

     out << "|" << std::endl;
  }
return out;
}

template<class T>
Matrix<T>::Matrix(int nbLignes, int nbColonnes):_nbLignes(nbLignes), _nbColonnes(nbColonnes)
{
   _v.resize(nbLignes);
   for(int i=0; i<nbLignes; i++)
      _v[i].resize(nbColonnes);
}

template<class T>
Matrix<T>::Matrix(const Matrix<T>& m)
{
   _nbLignes = m._nbLignes;
   _nbColonnes = m._nbColonnes;

   _v.resize(_nbLignes);
   for(int i=0; i<_nbLignes; i++)
      _v[i].resize(_nbColonnes);

   for(int i=0; i<_nbLignes; i++)
      for(int j=0; j<_nbColonnes; j++)
         setElement(i,j,m(i,j));
}

template<class T>
void Matrix<T>::operator+=(const Matrix<T>& m)
{
   if ((_nbLignes != m._nbLignes)||(_nbColonnes != m._nbColonnes))
   {
       std::cout << "addition impossible !!" << std::endl;
       return ;
   }

for(int i=0; i<_nbLignes; i++)
   for(int j=0; j<_nbColonnes; j++)
      this->setElement(i,j,m(i,j)+_v[i][j]);
}

template<class T>
void Matrix<T>::operator-=(const Matrix<T>& m)
{
   if ((_nbLignes != m._nbLignes)||(_nbColonnes != m._nbColonnes))
   {
       std::cout << "soustraction impossible !!" << std::endl;
       return ;
   }

for(int i=0; i<_nbLignes; i++)
   for(int j=0; j<_nbColonnes; j++)
      this->setElement(i,j,_v[i][j]-m(i,j));
}

template<class T>
Matrix<T> Matrix<T>::operator+(const Matrix<T>& m) const
{
   if ((_nbLignes != m._nbLignes)||(_nbColonnes != m._nbColonnes))
   {
      std::cout << "addition impossible !!" << std::endl;
      return Matrix<T>();
   }

   Matrix result(*this);
   result+=m;
   return result;
}

template<class T>
Matrix<T> Matrix<T>::operator-(const Matrix<T>& m) const
{
   if ((_nbLignes != m._nbLignes)||(_nbColonnes != m._nbColonnes))
   {
      std::cout << "soustraction impossible !!" << std::endl;
      return Matrix<T>();
   }

   Matrix result(*this);
   result-=m;
   return result;
}

template<class T>
T Matrix<T>::operator()(int row, int col) const
{
   return (this->_v[row])[col];
}

//initialiser
template<class T>
void Matrix<T>::fill(T value)
{
   for(int i=0; i<_nbLignes; i++)
      for(int j=0; j<_nbColonnes; j++)
         this->setElement(i,j,value);
}

template<class T>
void Matrix<T>::setElement(int row, int col, T value)
{
   (_v[row])[col] = value;
}

template<class T>
int Matrix<T>::set(int row, int col, T value)
{
   if(row>0 && col>0 && row<=_nbLignes && col<_nbColonnes)
      (_v[row-1])[col-1] = value;
   else
      return -1;

   return 0;
}

template<class T>
bool Matrix<T>::operator==(const Matrix<T>& m) const
{
   if(_nbLignes!= m._nbLignes || _nbColonnes!=m._nbColonnes)
      return false;

   for(int i=0; i<_nbLignes; i++)
      for(int j=0; j<_nbColonnes; j++)
         if (_v[i][j]!= m(i,j)) return false;

   return true;
}

#endif 
mardi 16 août 2011 à 11:23:06 | Re : Code de gestion de matrices, merci de le critiquer

CptPingu

Administrateur CodeS-SourceS
C'est déjà beaucoup plus lisible.

Voici quelques critiques:
- Matrix(int, int); => Mieux vaut laisser le nom des arguments dans la définition. C'est beaucoup plus clair. => Matrix(int nbLignes, int nbColonnes)
- On sépare le code de la définition. La définition va dans .hh et le code templaté dans un .hxx (le .hxx est inclus à la fin du .hh, juste avant le #endif).
- Utilise toujours la liste d'initialisation. Tu l'as bien fait pour le premier constructeur, tu peux aussi le faire pour le deuxième.
Code C/C++ :
template<class T>
Matrix<T>::Matrix(const Matrix<T>& m)
{
   _nbLignes = m._nbLignes;
   _nbColonnes = m._nbColonnes;

devient:
Code C/C++ :
template<class T>
Matrix<T>::Matrix(const Matrix<T>& m)
 : _nbLignes(m._nbLignes), _nbColonnes (m._nbColonnes)
{

- Tu peux directement assigné des valeurs à ton tableau, au lieu de refaire une boucle:
Code C/C++ :
   _v.resize(_nbLignes);
   for(int i=0; i<_nbLignes; i++)
      _v[i].resize(_nbColonnes);

   for(int i=0; i<_nbLignes; i++)
      for(int j=0; j<_nbColonnes; j++)
         setElement(i,j,m(i,j));

Devient:
Code C/C++ :
   _v.resize(_nbLignes);
   for(int i = 0; i < _nbLignes; ++i)
  {
      _v[i].resize(_nbColonnes);
      for(int j = 0; j < _nbColonnes; ++j)
         setElement(i,j,m(i,j));
  }

- Quand on est face à une erreur, on n'écrit pas un message mais on lève plutôt une exception:
Code C/C++ :
   if ((_nbLignes != m._nbLignes)||(_nbColonnes != m._nbColonnes))
   {
       std::cout << "addition impossible !!" << std::endl;
       return ;
   }

devient:
Code C/C++ :
   if ((_nbLignes != m._nbLignes)||(_nbColonnes != m._nbColonnes))
      throw MatrixException("addition impossible !!");

(Il faut que tu codes une classe MatrixException qui hérite de std::exception)

- Ici:
Code C/C++ :
template<class T>
T Matrix<T>::operator()(int row, int col) const
{
   return (this->_v[row])[col];
}

Tu peux directement écrire:
Code C/C++ :
template<class T>
T Matrix<T>::operator()(int row, int col) const
{
   return _v[row][col];
}

- Idem pour:
Code C/C++ :
(_v[row])[col] = value;

qui peut directement s'écrire:
Code C/C++ :
_v[row][col] = value;

- Ici:
Code C/C++ :
if(row>0 && col>0 && row<=_nbLignes && col<_nbColonnes)
      (_v[row-1])[col-1] = value;
   else
      return -1;

   return 0;

Tu peux lever un exception:
Code C/C++ :
if( row < 0 || col < 0 || row > _nbLignes || col > _nbColonnes)
  throw MatrixException("Index out of bound");

_v[row-1][col-1] = value;

- Dans operator==:
Code C/C++ :
if (_v[i][j]!= m(i,j)) return false;

devient:
Code C/C++ :
if (_v[i][j]!= m._v[i][j]) return false;


Au niveau du design:
- Tu force l'utilisateur à considérer que la matrice commence à 1-1 plutôt que 0-0. C'est pas très naturel et est sujet à erreur. A ta place je ferais démarrer à 0-0 comme tous les conteneurs du C et du C++.
- Au lieu de recoder l'operator<< directement, il est généralement préférable de créer une méthode publique qui fait l'affichage et de l'appeler dans l'operator<<. Ex:

Code C/C++ :
template<class T>
void Matrix<T>::print(std::ostream& out) const
{
  for(int i = 0; i<m._nbLignes; ++i)
  {
     out << "|";
     for(int j = 0; j < m._nbColonnes; ++j)
        out << " " << m._v[i][j] << " ";
     out << "|" << std::endl;
  }
}

Puis en dehors de la classe:
Code C/C++ :
template<class T>
std::ostream& operator<<(std::ostream& out, const Matrix<T>& m)
{
  m.print(out);
  return out;
}


________________________________________________________________________
Historique de mes créations, et quelques articles:
http://0217021.free.fr/portfolio
Merci d'utiliser Réponse acceptée si un post répond à votre question
jeudi 18 août 2011 à 10:21:26 | Re : Code de gestion de matrices, merci de le critiquer


Cette discussion est classée dans : int, const, matrix, nblignes, nbcolonnes


Répondre à ce message

Sujets en rapport avec ce message

Format de données [ par leskritiques ] Voici le programme que je veux modofier :#include "chaine.h"#include "entreeSortie.h"#include "chaine.cpp"#include "entreeSortie.cpp"int pgcd (const i ProB avec la fonction int remove (const char*) [ par Avalon10101 ] _-=AvAloN=-_Jai un petit prob avec cette fonction :Je cré mon prog il na aucune erreur é il est donc pré à etre exécuter pour suprimer un fichier test Tableau avec new [ par Dalamar ] bonjour, je suis incapable de créer un tableau multidimentionnel avec une fonction:TileEngine::TileEngine(const int w, const int h) { nTiles = w * h; Templates persos [ par nicolas66 ] Bonjour tlm,j'ai écrit une classe Matrix en template permettant de manipuler aussi bien des int, des double, ou autre ... Mais en maths, il existe aus Probleme de tableau entre C et C++ [ par fred23 ] Bonjour,J'ai récupéré des codes qui semblent en C et je souahiterais les mettre en C++.qui peut me dire si ces codes sont en C ou C++.Matrix = (int ** Manipulation de matrices en C. [ par T TeKa K ] Hello les gens! Je viens quemander de l'aide afin de me sortir de ce programme qui me prend la tete. But de l'exericice: creer un programme qui m argument d'une fonction [ par tomalille ] bonjour, j'ai une question qui va vous sembler très bête mais bon...J'ai besoin de faire une fonction ayant un tableau multidimentionnel en paramètre. class matrice [ par flaky ] Slt à tousJ'utilise une classe "matrice" (celle de nicolas aunai, téléchargée sur le site) qui fonctionne très bien. Mais j'ai du mal à manipuler l'ob Marche pas : Changer la résolution de l'écran [ par yserver ] Bojours.La réponse sera a prioris toute bête. Je pose qd même mon code qui à passer pour un idiot, mais faut bien avancer.Donc le pb c'est cette fonct


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,671 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales