Partage
  • Partager sur Facebook
  • Partager sur Twitter

Une matrice qui ne réponds pas au cahier de charge

    22 mai 2006 à 12:53:37

    Bonjour, Je commence par explique mon objectif: Faire une matrice (aleatoirement) de taille M*N tel que cette matrice contienne exactement dv 1 par colonne et dc 1 par ligne
    Je vous envoie mon code, il me parait logique mais en le compilant, il m'envois soit que des 1 ou que des zeros te je n'arrive pas a voir pourquoi
    Je vous laisse mon code si quelqu'un peut m'aider
    Merci
    #include<stdio.h>
    #include<stdlib.h>

    void ConstructionMatrice(int** Mat , int N , int dc , int dv )
    {
           
            int M=N*dv/dc;;  //M nb de lignes; N nb de colones
           
            //int Mat[N][M];
            int i, j , s , r ;                 // i nb de ligne, j nb de colone
            int c=0, l=0;                      // c Compteur sur une colone, l compteur sur une ligne
                   
           
            //initialisation de la matrice
            for(i=0 ; i<M ; i++)           //remplant par columnes
            {
                    for(j=0 ; j<N ; j++)   
                    {
                            Mat[i][j]=0;
                            //printf("%d\t",Mat[i][j]);
                    }
                    //printf("\n");
            }
           
           
           
    do
     {
            for (i=0 ; i<M ; i++)
                    {
                 do
                 {
                            for(j=0; j<N ; j++)
                            {
                 
                                                r=rand()%M;
                                                s=rand()%N;
                                                                    if(Mat[r][s] == 0)
                                                {
                                                                                            Mat[r][s]=1;
                                                                            l++;
                                                                                c++;
                                                 }
                                      }
                                           }
                                            while(l<dc);
                            }
                    }  while(c<dv);
                   
           
           
            //Affiche Matrice
            for(i=0 ; i<N ; i++)
            {
                    for(j=0 ; j<M ; j++)
                    {
                            printf("%d\t",**Mat);
                    }
                    printf("\n");
            }
            printf("c=%d \t l=%d \t dv=%d \t dc=%d\n",c, l, dv, dc);
           
    }

    int main()
    {
           
            int N,j;
           
            int dc =6;
            int dv =3;
                   
            printf("La taille de N\n");
            scanf("%d",&N);
           
            int M=N*dv/dc;
            printf("M=%d\n",M);
           
            int **Mat;
            Mat=(int**)malloc(M*sizeof(int *));
           
            for(j=0 ; j<M ; j++)
            {
                    Mat[j]=(int*)malloc(N*sizeof(int));
            }
           
           
           
            ConstructionMatrice(Mat, N, dc, dv);   
            system("PAUSE");
    }
    • Partager sur Facebook
    • Partager sur Twitter
      22 mai 2006 à 14:10:07

      Citation : amine_en_france

      Bonjour, Je commence par explique mon objectif: Faire une matrice (aleatoirement) de taille M*N tel que cette matrice contienne exactement dv 1 par colonne et dc 1 par ligne
      Je vous envoie mon code, il me parait logique mais en le compilant, il m'envois soit que des 1 ou que des zeros te je n'arrive pas a voir pourquoi


      Ton code est inutilement complexe. A priori, je ne vois pas pourquoi il faudrait faire quelque chose de plus compliqué que ceci :

      #include<stdio.h>
      #include<stdlib.h>
      #include<time.h>

      static void purge(FILE *fp)
      {
         int c;
         while ((c = fgetc(fp)) != '\n' && c != EOF)
         {
         }
      }

      static void clean (char *s, FILE *fp)
      {
         /* search ... */
         char *p = strchr (s, '\n'); /* <string.h> */
         if (p != NULL)
         {
            /* ... and kill */
            *p = 0;
         }
         else
         {
            purge (fp);
         }
      }

      //initialisation de la matrice
      void InitMatrice(int** mat , int lin , int col)
      {
         int i;
         for (i = 0 ; i < lin ; i++)           //remplant par columnes
         {
            int j;
            for (j = 0 ; j < col ; j++)
            {
               mat[i][j] = 0;
            }
         }
      }


      void RemplissageMatrice(int** mat , int lin , int col)
      {

         int i;

         for (i = 0; i < lin * col; i++)
         {
            int l = rand() % lin;
            int c = rand() % col;

            if (mat[l][c] == 0)
            {
               mat[l][c] = 1;
            }
         }

      }

      //Affiche Matrice
      void AffichageMatrice(int const *const * mat , int lin , int col)
      {
         int i;
         for (i = 0 ; i < lin ; i++)
         {
            int j;
            for (j = 0 ; j < col ; j++)
            {
               printf("%3d", mat[i][j]);
            }
            printf("\n");
         }
      }

      void FreeMatrice(int **mat, int lin, int col)
      {
         int i;
         for (i = 0 ; i < lin ; i++)
         {
            free (mat[i]), mat[i] = NULL;
         }
         free (mat), mat = NULL;
      }

      int **AllocMatrice(int lin, int col)
      {
         int **mat = malloc(lin * sizeof * mat);
         {
            int err;
            int i;
            for (i = 0 ; i < lin ; i++)
            {
               mat[i] = malloc (col * sizeof * mat[i]);

               err = mat[i] == NULL;
            }

            if (err)
            {
               FreeMatrice(mat, lin, col), mat = NULL;
            }
         }

         return mat;
      }

      int main()
      {
         int lin;
         int col;

         srand((unsigned) time (NULL));

         {
            char s[8];
            printf("NB lignes : ");
            fflush (stdout);
            fgets(s, sizeof s, stdin);
            clean(s, stdin);
            lin = (int) strtol(s, NULL, 10);

            printf("NB colonnes : ");
            fflush (stdout);
            fgets(s, sizeof s, stdin);
            clean(s, stdin);
            col = (int) strtol(s, NULL, 10);
         }

         {
            int **mat = AllocMatrice(lin, col);
            {
               InitMatrice(mat, lin, col);
               RemplissageMatrice(mat, lin, col);
               AffichageMatrice(mat, lin, col);
               FreeMatrice(mat, lin, col), mat = NULL;
            }
         }
         return 0;
      }


      NB lignes : 10
      NB colonnes : 12
      0 1 1 1 1 1 1 1 1 1 1 0
      0 1 0 1 0 0 0 0 1 1 1 1
      1 1 0 1 1 0 1 1 0 1 1 1
      1 0 1 0 1 1 1 0 0 1 1 0
      1 1 1 1 1 1 1 1 1 0 1 1
      0 0 1 1 0 0 1 1 1 0 1 1
      1 0 1 0 0 1 1 0 1 0 1 1
      0 0 1 0 1 0 1 0 1 1 0 0
      1 1 0 0 1 1 0 1 1 1 0 0
      0 1 1 0 0 1 1 1 1 0 1 0

      Press ENTER to continue.

      Pose des questions si tu ne comprends pas.
      • Partager sur Facebook
      • Partager sur Twitter
      Music only !
        22 mai 2006 à 15:42:03

        Merci, sauf que je trouve que ton code est beaucoup plus compliqué que le mien, ou si tu veux, il depasse largement mes compétence de débutant :p en plus lors des compilation je tombe sur des erreurs que j'estime due a la discorcondance entre les éditeur, bref, je n'arrive pas a exploiter ton code alors si qq1 d'autre pouvais aider ca m'arrangerait (un consigne : éviter les structures, je n'y ai pas droit)
        • Partager sur Facebook
        • Partager sur Twitter
          22 mai 2006 à 16:46:27

          Citation : amine_en_france

          Merci, sauf que je trouve que ton code est beaucoup plus compliqué que le mien, ou si tu veux, il depasse largement mes compétence de débutant :p


          C'est le moment de t'améliorer... Faire un petit effort de compréhension, poser des questions précises, ça ne te tente pas ?

          Citation : amine_en_france

          lors des compilation je tombe sur des erreurs que j'estime due a la discorcondance entre les éditeur


          Ca fout la trouille ! Ca veut dire quoi exactement ? Quelles erreurs ?

          • Partager sur Facebook
          • Partager sur Twitter
          Music only !
            22 mai 2006 à 18:46:15

            entre autre, parmi les erreurs de complitation il ne reconnais pas ca "int **mat = malloc(lin * sizeof(int) * mat);" il dit que c'est une opération invalide sinon je suis tres tenté pour progresser et je voudrai savoir pourquoi mon programme ne fais pas ce que je veux et pourtant ca ma parait "logique"
            • Partager sur Facebook
            • Partager sur Twitter
              22 mai 2006 à 20:25:22

              Citation : amine_en_france

              entre autre, parmi les erreurs de complitation il ne reconnais pas ca "int **mat = malloc(lin * sizeof(int) * mat);"


              o_O J'ai écrit ça moi ? Je devais être fatigué... Ca aurait dû être :
              int **mat = malloc(lin * sizeof *mat);

              En fait, dans le code publié, je lis :
                 int **mat = malloc(lin * sizeof * mat);

              Alors il ne faut pas réaconter n'importe quoi. Si tu commences à bricoler mon code sans le comprendre, normal que ça ne compiles plus ensuite. Tu ferrais mieux de poser des questions, plutôt que de faire croire que mon code ne compile pas...

              Citation : amine_en_france


              sinon je suis tres tenté pour progresser et je voudrai savoir pourquoi mon programme ne fais pas ce que je veux et pourtant ca ma parait "logique"


              Alors montre l'algo, on va voir si c'est logique.

              • Partager sur Facebook
              • Partager sur Twitter
              Music only !
                22 mai 2006 à 22:28:44

                Vu que ca m'a donné une erreur de compilation j'avais essayé de la corriger c'est pourquoi il y a une modif sinon je t'assur que ton allocation de mémoire envoie une erreur du moins sur devC++
                Bon je te remontre l'algo

                #include<stdio.h>
                #include<stdlib.h>
                #include <time.h>

                void ConstructionMatrice(int** Mat , int N , int dc , int dv )
                {
                       
                        int M=N*dv/dc;;  //M nb de lignes; N nb de colones
                        srand(time(NULL));
                        //int Mat[N][M];
                        int i=0, j=0 , s=0 , r=0 ;                 // i nb de ligne, j nb de colone
                        int c=0, l=0, k=0;                      // c Compteur sur une colone, l compteur sur une ligne
                               
                       
                        //initialisation de la matrice
                        for(i=0 ; i<M ; i++)           //remplant par columnes
                        {
                                for(j=0 ; j<N ; j++)   
                                {
                                        Mat[i][j]=0;
                                        //printf("%d\t",Mat[i][j]);
                                }
                                //printf("\n");
                        }
                       
                       
                       
                       



                while(c<dc)
                {
                       for(i=0; i<M ; i++)
                       {
                             while(l<dv)
                             {
                                      for (j=0 ; j<M ; j++)
                                      {
                                                   r=rand()%M;
                                                   s=rand()%N;
                                                   printf("r=%d s=%d\n",s,r);
                                                   k++;
                                                   printf("nombre de couples = %d\n ",k);
                                                   Mat[r][s]=1;
                                      }
                                      l++ ;
                             }
                       }
                       c++;   
                } 




                       
                        //Affiche Matrice
                        for(i=0 ; i<N ; i++)
                        {
                                for(j=0 ; j<M ; j++)
                                {
                                        printf("%d\t",**Mat);
                                }
                                printf("\n");
                        }
                        printf("c=%d \t l=%d \t dv=%d \t dc=%d\n",c, l, dv, dc);
                       
                }

                int main()
                {
                       
                        int N,j;
                       
                        int dc =6;
                        int dv =3;
                               
                        printf("La taille de N\n");
                        scanf("%d",&N);

                        int M=N*dv/dc;
                        printf("M=%d\n",M);
                       
                        int **Mat;
                        Mat=(int**)malloc(M*sizeof(int *));
                       
                        for(j=0 ; j<M ; j++)
                        {
                                Mat[j]=(int*)malloc(N*sizeof(int));
                        }
                       
                       
                       
                        ConstructionMatrice(Mat, N, dc, dv);   
                        system("PAUSE");
                }



                Sinon je sens que je m'approche et la grand souci pour l'instant c'est que
                Mat[r][s]=1;
                ne marche pas enfin compile et tu verras mieu
                merci pour ton aide
                • Partager sur Facebook
                • Partager sur Twitter
                  22 mai 2006 à 22:32:11

                  Citation : amine_en_france

                  Vu que ca m'a donné une erreur de compilation j'avais essayé de la corriger c'est pourquoi il y a une modif sinon je t'assur que ton allocation de mémoire envoie une erreur du moins sur devC++


                  Tu es sûr que tu compiles en C et non en C++ ? L'extension est bien .c et non .cpp ni .C ?

                  Citation : amine_en_france


                  Bon je te remontre l'algo


                  Ca, c'est pas l'algo, c'est le code. Ce qui m'interesse c'est de savoir comment tu en es arrivé là (ou si tu codes au hasard...). Quels sont tes éléments d'analyse ?

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Music only !
                    22 mai 2006 à 22:53:59

                    Je t'assure je code en c et pas en cpp,
                    sinon l'algo:
                    je commence par parcourir les lignes de la matrice et vérifié si la condition est bien respéctée c'est a dire si la matrice n'a pas plus de dc=6 fois le "1" et tant que c'est verifié, je regarde les lignes et vérifié que je verifie la condition moins de "1" que dv=3, si cela est valide je place un "1"
                    voila l'algo en bref...
                    • Partager sur Facebook
                    • Partager sur Twitter
                      22 mai 2006 à 22:58:34

                      Citation : amine_en_france

                      Je t'assure je code en c et pas en cpp,
                      sinon l'algo:
                      je commence par parcourir les lignes de la matrice et vérifié si la condition est bien respéctée c'est a dire si la matrice n'a pas plus de dc=6 fois le "1" et tant que c'est verifié, je regarde les lignes et vérifié que je verifie la condition moins de "1" que dv=3, si cela est valide je place un "1"
                      voila l'algo en bref...


                      C'est pas trop clair. On ne vois pas bien ce que ça signifie. En tout cas, il faut différencier le code qui construit/detruit l'espace mémoire de celui qui traite les données. je te conseille un découpage comme j'ai fait...
                      • Partager sur Facebook
                      • Partager sur Twitter
                      Music only !

                      Une matrice qui ne réponds pas au cahier de charge

                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                      • Editeur
                      • Markdown