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 :

Creation Classe Matrice


Sujet :

C++

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2007
    Messages : 22
    Points : 8
    Points
    8
    Par défaut [Résolu] Creation Classe Matrice
    Bonjour à tous!

    Donc voila comme le souligne le sujet, je souhaite creer une classe matrice (pour l instant c'est plutot un vecteur). J'obtiens quelques bugs non desirés.
    Je pense que je dois pas coder de la meilleur façon qui soit puisque ayant débuté il y a quelques jours dans la manipulation du C++, j'ai tendance à faire des choses qui ressemble plus à du C qu'autre chose ( et j'ai bien lu les tutoriaux donc pas de panique).

    Je souhaite inclure des operateurs banales tells que la soustraction et l'addition entre deux matrices mais cela ne semble pas marcher.

    Si je prend par exemple deux vecteurs A (1,1,1) et B (1,1,1) alors l'addition me donne (211152 2 0) et la soustraction (211152 0 0).

    MATRICE.h
    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
     
    #include <cstdlib>
    #include <iostream>
    #include <new>
     
    using namespace std;
     
    class Matrice {         
          int *Table;
          int Dimension;
     
    public:
        // Header of the constructor of the class "macierz"
        Matrice(int=3);
     
        // Header of the destructor of the class "macierz"
        ~Matrice();
        int D() const { return  Dimension; }
        int& D() { return  Dimension; }
     
        // Header of the constructor of copy of the class "macierz"    
        Matrice::Matrice(const Matrice&);
     
        // Header of the Overloading Constructors of the class "macierz"
     
        Matrice operator+(const Matrice&) const;
        Matrice operator-(const Matrice&) const;    
        int& operator[](int dim) 
              { return Table[dim]; }
     
        friend ostream& operator<<(ostream& o, Matrice&);
     
    };
    MATRICE.cpp
    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
     
    #include "Macierz.h"
     
    // Definition of the constructor of the class "macierz"
    Matrice::Matrice(int a) {
           Table= new int[this->Dimension=a];
       }
     
    // Definition of the destructor of the class "macierz"
      Matrice::~Matrice() {
           delete[] Table; 
        }
     
    // Definition of the constructor of copy of the class "macierz"
      Matrice::Matrice(const Matrice& MatriceCopy) {
           int i;
           Dimension =MatriceCopy.Dimension;
           Table= new int[Dimension];
     
           for(i=0; i<Dimension-1; i++) {
                 Table[i] = MatriceCopy.Table[i];
           }
       }
    // Definition of the Overloading Constructors "+" of the class "macierz"
        Matrice Matrice::operator+(const Matrice &M) const {
           int i;
           if  (M.Dimension == Dimension) {
               Matrice Y(Dimension);
     
               for(i=0; i<M.Dimension; i++){
                        Y.Table[i]=  M.Table[i] + Table[i] ;
               }
     
               return Y;
           }
     
           else cout << " Impossible" << endl ;
    }
     
        Matrice Matrice::operator-(const Matrice &M) const {
           int i;
           if  (M.Dimension == Dimension) {
               Matrice Y(this->Dimension);
     
               for(i=0; i<M.Dimension; i++){
                        Y.Table[i]=  M.Table[i] - Table[i] ;
               }
     
               return Y;
           }
     
           else cout << " Impossible" << endl ;
        }
     
     
      ostream& operator<<(ostream& o, Matrice &M) {
              int i;
     
              for(i=0; i<=M.Dimension-1; i++){
                       o<<"\t";
                       o<<M.Table[i]<<"\t";
                       o<<endl;
              }
     
              o<<endl;   
              return o;
    }
    MAIN.cpp
    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
     
    #include "Macierz.h"
     
    using namespace std;
     
    int main(int argc, char *argv[])
    {
        Matrice A(3);
        Matrice C(3);
        A[0]=A[1]=A[2]= 1;
        Matrice B(3);
        B[0]=B[1]=B[2]= 1;
        cout <<A << endl;
        cout <<B << endl;
        C = A+B;
        cout << C << endl;
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    Je vous remercie de votre aide.

    Nico

  2. #2
    Membre éclairé
    Avatar de Florian Goo
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    680
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 680
    Points : 858
    Points
    858
    Par défaut
    Bonjour,

    Pour commencer, utilise std::vector plutôt qu'un tableau de int. Tu verras la vie plus rose !
    Cours : Initiation à CMake
    Projet : Scalpel, bibliothèque d'analyse de code source C++ (développement en cours)
    Ce message a été tapé avec un clavier en disposition bépo.

  3. #3
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Et si la dimension est connue à la compilation, boost::array

  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
    Je te réponds dans l'optique où tu es en train d'exécuter un exercice.
    Si ce n'est pas le cas, arrêtes toi tout de suite et regarde une des nombreuses bibliothèques matricielles (boost.ublas, Blitz++, newmat, etc)

    a- Même en C, on ne boucle pas sur -1. La forme canonique d'une boucle, c'est de 0 à N, avec comparaison stricte. Rien de tel pour oublier des -1 ou des <=, comme cela t'es arrivé.

    b- ne retourne pas une valeur modifiable de ta dimension. Cela n'a pas de sens, et cela correspond d'ailleurs à une complète rupture de l'encapsulation.

    c- Ton constructeur d'initialisation n'a jamais initialisé la dimension. A partir de là ... c'est comme le C, il n'y a rien de magique, tout peut arriver, et c'est d'ailleurs ce qui t'arrives.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Matrice::Matrice(size_t d)
    : m_dimension(d)
    , m_tableau(new value_type[d]) // value_type == typedef que tu choisiras
    {}
    PS: j'évite de critiquer le style en général, mais capitaliser certaines variables et pas toutes, ou mieux aucune, est assez dérangeant.
    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
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2007
    Messages : 22
    Points : 8
    Points
    8
    Par défaut
    Déjà je vous remercie de vos réponses

    Ceci est bien un exercice, que je dois faire.

    Cependant je suis completement perdu. J'ai compris qu'il y avait quelque chose qui coincait au niveau du constructeur de la classe matrice mais j'ai vraiment vraiment pas compris tes explications Luc Hermitte, excepté que d'aprés ce que j'ai compris, ma variable dimension n'a pas de valeur et que je bouclerais de 0 à 1. Et si ca n'a pas de valeur alors forcement je definis un tableau dynamique n'importe comment.

    Ce que je comprend pas c'est pourquoi la definition de mon constructeur ne marche pas?

    Merci de vos eclairssissement, ce qui vous parait limpide me parait tres difficile et j'ai vraiment du mal a tout saisir.

    Merci de votre aide.

    Nico

  6. #6
    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
    Citation Envoyé par Mikolay Voir le message
    Ce que je comprend pas c'est pourquoi la definition de mon constructeur ne marche pas?
    Parce que tu n'as pas initialisé la dimension ?
    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...

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2007
    Messages : 22
    Points : 8
    Points
    8
    Par défaut
    OK, ca je l'avais bien compris mais je croyais l'avoir initialisée grâce à et d'avoir construit mon tableau grâce à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Table =  new int[Dimension]
    mais bon, vu que ca marche pas, c'est clair que j'ai du faire/oublier un truc.

    Je suis sur que ton code doit pourvoir m'aider mais j'avoue ne pas en comprendre la syntaxe.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Matrice::Matrice(size_t d)
    : m_dimension(d)
    , m_tableau(new value_type[d]) // value_type == typedef que tu choisiras
    {}
    Je suis désolé de poser les mêmes questions mais pourtant j'essaye de comprendre par moi-même alors merci de votre patience.

    Nico

  8. #8
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    En fait dans son code il utilise la liste d'initialisation.
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  9. #9
    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
    OK. Effectivement, ce devrait être initialisé. Mais c'est sale!
    Et effectivement, j'ai utilisé une liste d'initialisation. Mais, cela ne change rien à ton problème initial.

    Reste les erreurs de comptage des boucles.
    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...

  10. #10
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Pour les listes d'initialisation : http://cpp.developpez.com/faq/cpp/?p...EUR_liste_init

Discussions similaires

  1. Réponses: 9
    Dernier message: 16/02/2008, 07h01
  2. Creation d'une classe Matrice
    Par parisjohn dans le forum Général Python
    Réponses: 1
    Dernier message: 20/07/2007, 17h46
  3. Réponses: 3
    Dernier message: 06/05/2007, 19h46
  4. Réponses: 15
    Dernier message: 21/01/2007, 22h47
  5. aide classe matrice
    Par ba10 dans le forum C++
    Réponses: 8
    Dernier message: 17/05/2006, 08h10

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