IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Problèmes sur opérations simples sur des matrices


Sujet :

C++

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 15
    Points : 7
    Points
    7
    Par défaut Problèmes sur opérations simples sur des matrices
    Bonjour à tous,

    J'ai fait une classe matrice et j'ai surchargé l'opérateur * afin de multiplier 2 matrices, le voilà :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    matrice matrice::operator*(const matrice &m1)
    {
     matrice result(ligne,m1.colonne);
     
     if(colonne == m1.ligne) // si nb colonnes = nb lignes de l'autre matrice
     {
      for(int i=0;i<ligne;i++) //pour chaque ligne
      {
       for(int j=0;j<m1.colonne;j++) // pour chaque colonne
       {
        for(int k=0;k<colonne;k++) // produit scalaire
         result.mat[i][j] += mat[i][k]*m1.mat[k][j];
       }
      }
     }
     else
     {
      cout<<"Matrices incompatibles,operation impossible !"<<endl;
     }
     
       return result;
    }


    J'ai également surchargé l'opérateur << d'affichage qui marche très bien (je l'ai testé), mais quand je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    cout<<"m1 * m2 = "<<(m1*m2)<< endl;
    cout<<endl;*/
    Rien ne s'affiche. J'ai essayé plusieurs choses, mais je n'arrive pas à comprendre pourquoi cela ne veut pas marcher !

    J'ai fait une surcharge de l'opérateur = :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    matrice &matrice::operator=(matrice &m1)
    // Affectation d'une matrice à une autre
    {
     int i,j;
     
     if(&m1 != this)
     {
      for(i=0;i<ligne;i++)
      {
       for(j=0;j<colonne;j++)
       {
        mat[i][j] = m1.mat[i][j];
       }
      }  
     }
     else
     {
      cout << "(matrice) Erreur d\'affectation !" << endl;
     }
     return *this;
    }
    et mon constructeur initialise à 0 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    matrice::matrice(int lig, int col)
    // constructeur
    {
     for (int i=0;i<lig;i++)
     {
      for (int j=0;j<col;j++)
      {
       mat[i][j]=0;
      }
     }
     
     ligne   = lig;
     colonne = col;
    }
    mais ce qui est bizare c'est que quand je fais un affichage dans ma fonction * juste avant le return, ça me met bien la matrice attendue.

    Merci d'avance pour votre aide.

    Ajout des balises [code] par khayyam90

  2. #2
    Membre habitué
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Décembre 2005
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Décembre 2005
    Messages : 109
    Points : 161
    Points
    161
    Par défaut
    Tu devrais :
    1/
    2/ Vérifier ton constructeur de copie, et tant qu'à faire nous donner la déclaration de ta classe - ça peut aider.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 15
    Points : 7
    Points
    7
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    #define MAX_LIGNE 50
    #define MAX_COLONNE 50
     
    class matrice
    {
     
    private :
    	int ligne;
    	int colonne;
    	int mat[MAX_LIGNE][MAX_COLONNE];
     
    public:
    	// Constructeurs
    	matrice(int =3,int =3);
    	matrice(const matrice & );
     
    	// Accesseurs
    	int getLigne();
    	int getColonne();
     
    	// Opérations
    	void matrice_transposee(matrice );
    	int matrice_inverse();
    	void matrice_identite(int=1);
    	void permutation();
    	void remplirMatrice();
    	void inverserLignes(int,int);
     
    	// Surcharges d'opérateurs
    	matrice operator*(const matrice &);
    	matrice & operator=(matrice &);
    	friend ostream & operator<<(ostream &,const matrice &);
     
     
     
    };

  4. #4
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Dans le désordre:
    a- il manque quantité de const
    b- le test d'auto-affectation est un contre-idiome (nominalement, il fait perdre plus de temps qu'en gagner (i.e. c'est une pessimisation) ; on l'utilisait principalement quand il y avait des réallocations à faire ; il ne règle rien en cas d'exception ; la solution exception-safe règle le problème que le test d'auto-affectation réglait) FAQ!
    c- Tu ne te serais pas planté sur ton constructeur de recopie (l'opération utilisée en retour du résultat) ?
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  5. #5
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Citation Envoyé par catmary
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    #define MAX_LIGNE 50
    #define MAX_COLONNE 50
     
    class matrice
    {
     
    private :
    	int ligne;
    	int colonne;
    	int mat[MAX_LIGNE][MAX_COLONNE];
    C'est pas terrible du tout ça, ces macros.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    	matrice(const matrice & );
    A priori tu n'as pas besoin de surcharger ton constructeur.
    Celui par défaut ira très bien.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    	// Opérations
    	void matrice_transposee(matrice );
    	int matrice_inverse();
    	void matrice_identite(int=1);
    	void permutation();
    	void remplirMatrice();
    	void inverserLignes(int,int);
    Déjà, on constate des conventions différentes pour la sépération des mots dans les noms des fonctions.
    Ensuite, tu es déjà dans une classe matrice, pas besoin de rajouter matrice dans le nom des fonctions membres.

    L'auto-affectation doit toujours être possible.
    Dans ton cas, tu n'as pas besoin de différencier les cas, et surtout, pas besoin d'afficher "Erreur d'affectation" sur la sortie standard.

    Pense à surchager l'opérateur () pour donner l'accès aux lignes et aux colonnes plutôt de passer par une variable membre qui est un tableau de tableaux.

    Je ne vois pas ce qui pourrait causer le problème, par contre.
    Fournis un exemple réduit qui compile pas mais ne produit pas le résultat escompté.
    Boost ftw

Discussions similaires

  1. Réponses: 3
    Dernier message: 05/09/2014, 22h42
  2. [TPW] Opérations simples sur les fractions
    Par forum dans le forum Codes sources à télécharger
    Réponses: 0
    Dernier message: 16/11/2011, 20h43
  3. Réponses: 2
    Dernier message: 25/08/2011, 23h01
  4. Opérations simple pour des variables
    Par anayathefirst dans le forum Jasper
    Réponses: 8
    Dernier message: 31/03/2008, 11h57
  5. Réponses: 3
    Dernier message: 16/02/2007, 12h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo