Partage
  • Partager sur Facebook
  • Partager sur Twitter

Lecture de Matrice

Afficher une matrice avec 'cout' dans une boucle for

    22 novembre 2021 à 16:32:13

    Bonjour,

    J'ai un Projet à faire dans lequel je dois initialiser une matrice sans utiliser de vector et l'afficher sous cette forme :

     --- --- --- --- --- ---
    | 0 | 0 | 0 | 0 | 0 | 0 |
     --- --- --- --- --- ---
    | 0 | 0 | 0 | 0 | 0 | 0 |
     --- --- --- --- --- ---
    | 0 | 0 | 0 | 0 | 0 | 0 |
     --- --- --- --- --- ---
    | 0 | 0 | 0 | 0 | 0 | 0 |
     --- --- --- --- --- ---

    Elle prend en entrée le nombre de lignes puis le nombre de colonnes et mon programme devrait permettre de remplacer les 0 (ci-dessus) par les valeurs aux coordonnées de la matrice.

    seulement quand je lance mon programme, il ne m'afficher que ça :

     --- --- --- --- --- ---
    |

    Et il s'arrête au moment d'afficher le premier élément de la matrice.

    J'ai essayé plusieurs solutions pour l'afficher et celle-ci me parait la meilleure pour mon niveau mais mon programme s'arrête et aucun message d'erreur ne s'affiche.

    #include <iostream>
    #include <cassert>
    using namespace std;
    
    
    
    
    void initialiser(int **g, unsigned int lignes, unsigned int colonnes) {
    
        //int** g;
        g = new int*[colonnes];           
        for (int i = 0; i < colonnes; ++i) {     
            g[i] = new int[lignes];     
        }
    }
    
    void afficher_grille(int **g, unsigned int& lignes, unsigned int& colonnes) 
    {
        
        for (unsigned int i = 1; i <= colonnes; ++i) {
            cout << " ---";
        }
        cout << endl;
    
        for (unsigned int l = 0; l < lignes; l++) {
            for (unsigned int c = 0; c < colonnes; c++){
                cout << "| " << g[l][c] << " ";    // CETTE LIGNE POSE VISIBLEMENT PROBLÈME
            }
                for (unsigned int i = 1; i <= colonnes; ++i) {
        }
            cout <<"|" << endl;
        for (unsigned int i = 1; i <= colonnes; ++i) {
            cout << " ---";
        }
        cout << endl;
        
        }
    }
    
    
    
    int main() 
    {
        unsigned int lignes, colonnes;
    
        int** grille;
    
        cin >> lignes;
        cin >> colonnes;
    
        initialiser(grille, lignes, colonnes);
        afficher_grille(grille, lignes, colonnes);
    
        return 0;
    }


    Est ce que quelqu'un a une solutions svp

    merci d'avance

    • Partager sur Facebook
    • Partager sur Twitter
      22 novembre 2021 à 16:43:40

      Ta variable "grille" n'est pas correctement initialisée. Tu initialises une copie locale dans ta fonction "initialiser".

      Et l'indentation de ton code est complètement décalé, il faut corriger ca.

      Et ca ne sert a rien de passer des int par référence.

      -
      Edité par gbdivers 22 novembre 2021 à 16:46:49

      • Partager sur Facebook
      • Partager sur Twitter

      Rejoignez le discord NaN pour discuter programmation.

        22 novembre 2021 à 16:53:57


        gbdivers a écrit:

        Et l'indentation de ton code est complètement décalé, il faut corriger ca.

        #include <iostream>
        #include <cassert>
        using namespace std;
        
        
        
        
        void initialiser(int **g, unsigned int lignes, unsigned int colonnes) {
        
            //int** g;
            g = new int*[colonnes];           
            for (int i = 0; i < colonnes; ++i) {     
                g[i] = new int[lignes];     
            }
        }
        
        void afficher_grille(int **g, unsigned int& lignes, unsigned int& colonnes) 
        {
            
            for (unsigned int i = 1; i <= colonnes; ++i) {
                cout << " ---";
            }
            cout << endl;
        
            for (unsigned int l = 0; l < lignes; l++) {
                for (unsigned int c = 0; c < colonnes; c++){
                    cout << "| " << g[l][c] << " ";
                }
                cout <<"|" << endl;
                for (unsigned int i = 1; i <= colonnes; ++i) {
                    cout << " ---";
                }
                cout << endl;
            }
        }
        
        
        
        int main() 
        {
            unsigned int lignes, colonnes;
        
            int** grille;
        
            cin >> lignes;
            cin >> colonnes;
        
            initialiser(grille, lignes, colonnes);
            afficher_grille(grille, lignes, colonnes);
        
            return 0;
        }

        J'ai réglé les problèmes d'identation, merci de me l'avoir fait remarqué, (et supprimé une boucle for inutile que j'avais oublié)

        Et pour l'initialisation de la variable "grille" c'est la seule méthode utilisable que j'ai vu en cours pour pouvoir modifier la taille des lignes et des colonnes en entrée donc à part ça, pour pouvoir la créer dans la fonction initialiser, je ne sais pas trop comment faire



        -
        Edité par ickx 22 novembre 2021 à 18:43:46

        • Partager sur Facebook
        • Partager sur Twitter
          22 novembre 2021 à 17:02:34

          C'est de la torture.

          #include <iostream>
          #include <cassert>
          
          
          using namespace std;
          
          
          void initialiser(int ***g, unsigned int lignes, unsigned int colonnes)
          {
              *g = new int*[colonnes];
              for (unsigned int i = 0; i < colonnes; ++i)
              {
                  (*g)[i] = new int[lignes];
              }
              for (unsigned int l = 0; l < lignes; l++)
              {
                  for (unsigned int c = 0; c < colonnes; c++)
                  {
                      (*g)[l][c]=0;
                  }
              }
          }
          
          
          void afficher_grille(int **g, unsigned int& lignes, unsigned int& colonnes)
          {
          
              for (unsigned int i = 1; i <= colonnes; ++i) {
                  cout << " ---";
              }
              cout << endl;
          
              for (unsigned int l = 0; l < lignes; l++) {
                  for (unsigned int c = 0; c < colonnes; c++){
                      cout << "| " << g[l][c] << " ";
                  }
                  cout <<"|" << endl;
                  for (unsigned int i = 1; i <= colonnes; ++i) {
                      cout << " ---";
                  }
                  cout << endl;
              }
          }
          
          
          int main()
          {
              unsigned int lignes, colonnes;
          
              int** grille;
          
              cin >> lignes;
              cin >> colonnes;
          
              initialiser(&grille, lignes, colonnes);
              afficher_grille(grille, lignes, colonnes);
          
              return 0;
          }



          • Partager sur Facebook
          • Partager sur Twitter
            22 novembre 2021 à 17:10:28

            Le plus simple serait de retourner la grille, pour écrire :

            int** initialiser(unsigned int lignes, unsigned int colonnes);
            
            grille = initialiser(lignes, colonnes);
            



            • Partager sur Facebook
            • Partager sur Twitter

            Rejoignez le discord NaN pour discuter programmation.

              22 novembre 2021 à 17:25:41

              rouIoude a écrit:

              C'est de la torture.

              c’est pour ça que je demande votre aide ahah

              merci pour le coup de pouce !

              -
              Edité par ickx 22 novembre 2021 à 18:44:44

              • Partager sur Facebook
              • Partager sur Twitter
                22 novembre 2021 à 17:43:59

                Utiliser new ? On se sert encore de ça?
                Oui c'est bien de la torture ...
                • Partager sur Facebook
                • Partager sur Twitter

                Le Tout est souvent plus grand que la somme de ses parties.

                  22 novembre 2021 à 18:35:17

                  PierrotLeFou a écrit:

                  Utiliser new ? On se sert encore de ça?
                  Oui c'est bien de la torture ...


                  Effectivement il ne faut pas utiliser new, ni même malloc, qui sont des fonctions de trop haut niveau. new force l'initialisation de la mémoire et malloc ne fait pas la différence entre réserver et commit de la mémoire, ce qui le rend globalement inutilisable en pratique dans des projets sérieux
                  • Partager sur Facebook
                  • Partager sur Twitter
                    22 novembre 2021 à 20:02:38

                    Quitte a ne pas utiliser les merveilles de la librairie standard (vive les cours du pré-jurassique), fais au moins une classe conforme RAII !!!
                    Histoire d'automatiser la gestion de la mémoire un minimum.
                    class Grid
                    {
                    private:
                        unsigned mWidth;
                        unsigned mHeight;
                    public:
                        Grid(unsigned width, unsigned height):
                            mWidth{ width },
                            mHeight{ height }
                        {
                            new .... // blablabla, à toi de le mettre
                        }
                        ~Grid()
                        {
                            delete .... // blablabla, à toi de le mettre
                        }
                    }
                    • Partager sur Facebook
                    • Partager sur Twitter
                      23 novembre 2021 à 2:08:21

                      Alors, cet exercice remonte au Cambrien ?
                      J'utilise malloc constamment en C, mais il ne me serait jamais passer par la tête de le faire en C++
                      Est-ce une bonne pratique d'enseignement que de forcer les gens à utiliser des outils archaïques ?
                      Par exemple, en C, on demande aux gens de ne pas utiliser le for, seulement le while.

                      Je ne dis pas que while est archaïque, mais qu'il ne devrait pas simuler un for quand for est plus simple.

                      -
                      Edité par PierrotLeFou 23 novembre 2021 à 2:10:48

                      • Partager sur Facebook
                      • Partager sur Twitter

                      Le Tout est souvent plus grand que la somme de ses parties.

                      Lecture de Matrice

                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                      • Editeur
                      • Markdown