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 :

Remplir Matrice deux dimensions


Sujet :

C++

  1. #1
    Membre régulier
    Homme Profil pro
    chercheur
    Inscrit en
    Février 2011
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : chercheur
    Secteur : Services à domicile

    Informations forums :
    Inscription : Février 2011
    Messages : 78
    Points : 109
    Points
    109
    Par défaut Remplir Matrice deux dimensions
    Bonjour à tous,

    Supposant que j'ai le fichier d'entré suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    nbressource 10
    nbperiode 10
    nbclasse 2
    classe 0 nbressource 5 : 0 1 2 3 4 		// 5 ressources dans la classe 0 : NbrInfClasse[i]
    classe 1 nbressource 5 : 5 6 7 8 9 		// 5 ressources dans la classe 1 
    classe 0 nbperiode 6 : 0 1 2 6 7 8 		// 6 periodes dans la classe 0 :  NombrPerdiodeClasse[i]
    classe 1 nbperiode 8 : 0 1 2 3 6 7 8 9      // 8 periodes dans la classe 0
    Je souhaiterai construire la matrice de présence du personnel de deux dimensions matrice[nbressource][nbperiode] en fonction des paramètres ci-dessus.
    Je vous explique. Supposant que dans la classe 0, j'ai 5 ressources [0 1 2 3 4] qui sont présentes dans les périodes [0 1 2 6 7 8]. Dans ce cas, je remplie les cases par 1 pour ces ressources correspondant à leurs périodes. Pareil pour la classe 1. Le reste des périodes sont à zéro.
    Voici le code que j'ai fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    for(i=0; i<NombreClasses; ++i){
    		for(j=0; j<NbrInfClasse[i]; j++){
    			for(t=0;t<NombrPerdiodeClasse[i];t++){
    				Matrice[newvector[i][j]][periodvector[i][t]] = 1; // newvector[i][j] : l'identifiant de la ressource
    				cerr<< " " << Matrice[newvector[i][j]][periodvector[i][t]] <<"\t" ; // periodvector[i][t] : l'identifiant de la période
    			}
    			cerr<<"\n";
    		}
    	}
    Le résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     1	 1	 1	 1	 1	 1	
     1	 1	 1	 1	 1	 1	
     1	 1	 1	 1	 1	 1	
     1	 1	 1	 1	 1	 1	
     1	 1	 1	 1	 1	 1	
     1	 1	 1	 1	 1	 1	 1	 1	
     1	 1	 1	 1	 1	 1	 1	 1	
     1	 1	 1	 1	 1	 1	 1	 1	
     1	 1	 1	 1	 1	 1	 1	 1	
     1	 1	 1	 1	 1	 1	 1	 1
    Comme vous le constatez, il me manque le reste de la matrice avec les valeurs de zéro ! dont je souhaite votre aide pour m'en sortir.
    Le résultat attendu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    1	1	1	0	0	0	1	1	1	0	
    1	1	1	0	0	0	1	1	1	0	
    1	1	1	0	0	0	1	1	1	0	
    1	1	1	0	0	0	1	1	1	0	
    1	1	1	0	0	0	1	1	1	0	
    1	1	1	1	0	0	1	1	1	1	
    1	1	1	1	0	0	1	1	1	1	
    1	1	1	1	0	0	1	1	1	1	
    1	1	1	1	0	0	1	1	1	1	
    1	1	1	1	0	0	1	1	1	1
    Merci d'avance.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 073
    Points : 12 119
    Points
    12 119
    Par défaut
    Le problème n'est pas dans le remplissage de votre matrice (bien que l'utilisation d'un tableau C est bien cra-cra), mais dans votre procédure d'affichage.
    Si vous avez bien pris la peine d'initialiser les valeurs de votre matrice avec des 0 préalablement au traitement des valeurs du fichier, le code suivant devrait le faire :

    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
     
    for(i=0; i<NombreClasses; ++i)
    {
    	for(j=0; j<NbrInfClasse[i]; j++)
    	{
    		for(t=0;t<NombrPerdiodeClasse[i];t++)
    		{
    			Matrice[newvector[i][j]][periodvector[i][t]] = 1; // newvector[i][j] : l'identifiant de la ressource
    		}
    	}
    }
     
    for(i=0; i<NbRessource; i++)
    {
    	for(j=0;j<NombrPerdiode;j++)
    	{
    		cerr<< " " << Matrice[i][j] <<"\t" ;
    	}
    	cerr<<"\n";
    }

  3. #3
    Invité
    Invité(e)
    Par défaut
    je suis également d'accord sur le fait que la construction de la matrice devrait etre dissociée de son affichage..

    Maintenant pour comprendre pourquoi un peu de refactoring

    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
     
    for(i=0; i<nbClasses; ++i){
      /*
        on itère pour tous les j, mais en dessous on utilise newvector[i][j] donc
        ca sert à rien d'utiliser NbInfClass[i], on peut utiliser newvector[i].size()
      */
        for(j=0; j<newvector[i].size(); j++){
     
          /*
            de meme pour periodes
          */
          for(t=0;t<periodvector[i].size();t++){
            /*
              le commentaire expliquant ce qu'est newvector est malvenu, newvector n'est pas correctement nommé
            */
            int idRessource = newvector[i][j];
            int idPeriode = periodvector[i][t];
     
            /*
              on utilise généralement les majuscules pour des classes par pour des variables
            */
            matrice[idRessource, idPeriode] = 1; // --> commentaire à supprimer newvector[i][j] : l'identifiant de la ressource
     
            //on utilise cout pour la sortie standard, cerr c'est erreur
            //et on utilise également std:: parce que c'est plus propre.
            std::cout<< " " << matrice[idRessource, idPeriode] <<"\t" ; // periodvector[i][t] : l'identifiant de la période
          }
          std::cout<<"\n";
        }
      }
    ...
    deuxième passe

    newvector est mal nommé, il contient les index des ressources, alors l'appeler ainsi
    tu utilises newvector pour tout i, donc nbClasses ne sert à rien tu peux utiliser newvector.size()

    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
     
    /*
      on initialize ses variables dans les boucles, c'est des entiers positifs... donc size_t i
    */
    for(size_t i=0; i<ressourceForClass.size(); ++i){
      for(size_t j=0; j<ressourceForClass[i].size(); j++){
        //dans ton code commenté on ne va afficher que pour les périodes où la ressource est présente
        //mais on veut également afficher pour le cas où elle n'est pas présente...
     
        /*for(size_t t=0;t<periodvector[i].size();t++){
          int idRessource = newvector[i][j];
          int idPeriode = periodvector[i][t];
          matrice[idRessource, idPeriode] = 1;
          std::cout<< " " << matrice[idRessource, idPeriode] <<"\t" ;
        }*/
     
        for(size_t idPeriode=0; idPeriode<matrice[0].size(); ++idPeriode){
          matrice[idRessource][idPeriode] = 0;
          if(containsPeriodVector(periodvector[i], idPeriod) ){//si periodvector contient idPeriode, alors 1 sinon 0
            matrice[idRessource][idPeriode] = 1;
          }
          std::cout<< " " << matrice[idRessource, idPeriode] <<"\t" ;
        }
        std::cout<<"\n";
      }
    }
    la fonction containsPeriodVector est pas forcément à écrire, tu peux utiliser
    std::find de <algorithm> sur vector, mais bon, comme t'as pas trop l'air à l'aise
    tu peux juste écrire le code suivant qui est normalement clair
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    bool containsPeriodVector(const std::vector<int>& v, int id){
      for(size_t i = 0; i<v.size(); ++i){
        if(v[i] == id){
          return true;
        }
      }
      return false;
    }

  4. #4
    Membre régulier
    Homme Profil pro
    chercheur
    Inscrit en
    Février 2011
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : chercheur
    Secteur : Services à domicile

    Informations forums :
    Inscription : Février 2011
    Messages : 78
    Points : 109
    Points
    109
    Par défaut
    Merci beaucoup pour vos réponses et vos explications.
    Juste une remarque à l'explication de Galerien69 à propos le cout et cerr :
    //on utilise cout pour la sortie standard, cerr c'est erreur
    //et on utilise également std:: parce que c'est plus propre.
    Je suis tout à fait d'accord, mais j'utilise le cerr pour écrire le résultat dans un fichier log pas plus que ça.
    Le problème est résolu maintenant.

  5. #5
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Pour les logs, tu devrais ouvrir un ofstream dédié.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Matrice deux dimensions
    Par Student_Master dans le forum C++
    Réponses: 7
    Dernier message: 24/10/2014, 13h01
  2. Lecture d'une matrice à deux dimensions
    Par nizar_triki dans le forum C
    Réponses: 1
    Dernier message: 05/04/2012, 09h50
  3. Tri matrice à deux dimensions
    Par ensi2007 dans le forum Débuter avec Java
    Réponses: 4
    Dernier message: 22/10/2009, 11h36
  4. [C#] - Remplir tableau à deux dimensions avec split
    Par dada4444 dans le forum Windows Forms
    Réponses: 7
    Dernier message: 26/05/2009, 09h26
  5. [TP] Matrice à deux dimensions
    Par bongo parfait dans le forum Turbo Pascal
    Réponses: 2
    Dernier message: 18/03/2007, 22h20

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