Matrice aleatroire

Fermé
naruto2333 Messages postés 51 Date d'inscription vendredi 21 mars 2014 Statut Membre Dernière intervention 20 janvier 2017 - Modifié par Chris 94 le 21/04/2014 à 01:56
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 23 avril 2014 à 17:14
je veut remplir une matrice de taille 3*4 (ce qui fait 12 case) avec des entiers entre 0 et 9 et chaque numero si il existe il doit etre present a 3 fois dans la matrice donc on a 12/3=4
4 numero different pour cela j ai ecrit le code si dessous mais le probleme c que la compilation est toujours avec succés mais au niveau d execution une fois sa donne de bonne resultat et par fois la fenetre n affiche rien et je reste en attente meme pour des minute et toujours pas de resultat
/*code*/

#include<stdio.h>
#include<time.h>
#include<stdlib.h>
void alea(int m[8][9],int *l,int *c)
{ 
                    do{            
                           *l=rand()%8 ;
                           *c=rand()%9;
                                 
                   }while (m[*l][*c]!=10) ;
     }
int numero(int m[8][9])
{ int r,i,j,t=1;
   
   do{          
    
    r = rand()%10;
    for(i=0;i<8;i++)
        {for(j=0;j<9;j++)
      
             { 
              if (m[i][j]==r)  t=0;
             }
        }
   
      }while (t==0);
      return(r);
}
void repetition(int m[8][9])
{ int a,cmp1=0,l,c;
   
                a=numero(m);
            do {   
                alea(m,&l,&c);  
               
                   m[l][c]=a; 
                    cmp1++;
              }while(cmp1!=3);   
}
void remp(int m[8][9],int nv)
{ int i;
          for(i=0;i<24;i++)
               repetition(m); 
     
     } 
  main()
{ srand(time(NULL));
        int m[8][9], nv,i,j;
        printf("donner nv");
      scanf("%d",&nv);
       for(i=0;i<8;i++)
                       {
                                      for(j=0;j<9;j++) m[i][j]=10;
                      }
               remp(m,nv);                
      for(i=0;i<8;i++)
      {for(j=0;j<9;j++)
           {
            printf("%d\t",m[i][j]);
           
           }
       printf("\n");
      }
      
    system("PAUSE");                 
}


/*fin de programme*/
</code>
merci ;

2 réponses

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
21 avril 2014 à 15:36
Bonjour,

Pourquoi enlever le "Bonjour" mis automatiquement ? S'il est là, ce n'est pas pour rien...

main()
Le bon prototype est : int main(void)
Et il ne faut pas oublier le return 0; final.

printf("donner nv");
A quoi sert nv ? Tu ne t'en sers pas...

Dans ta fonction numero(),
Il faut que tu mettes t=1; en début de la boucle do while. Sinon boucle infini si t change de valeur.
De plus, tu parles de tableau de taille 3*4, mais dans ton code c'est un tableau de taille 8 par 9. Donc si tu mets r = rand()%10; il ne pourra pas remplir le tableau puisque tu pourras remplir au maximum 30 cases du tableau. Il faut que tu mettes plutôt r=rand()%25; pour remplir les 72 cases.

Et enfin, l'indentation à revoir. Ce n'est pas régulier. Du coup, ça nuit à la lisibilité.

Cdlt,
0
naruto2333 Messages postés 51 Date d'inscription vendredi 21 mars 2014 Statut Membre Dernière intervention 20 janvier 2017 2
23 avril 2014 à 04:05
en fait c une partie de mon taf donc g fait des erreurs quand j ai copie le code . voila le code correcte
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
void alea(int m[3][4],int *l,int *c)
{
do{
*l=rand()%3 ;
*c=rand()%4;

}while (m[*l][*c]!=10) ;
}
int numero(int m[3][4])
{ int r,i,j,t=1;

do{

r = rand()%10;
for(i=0;i<3;i++)
{for(j=0;j<4;j++)

{
if (m[i][j]==r) t=0;
}
}

}while (t==0);
return(r);
}
void repetition(int m[3][4])
{ int a,cmp1=0,l,c;

a=numero(m);
do {
alea(m,&l,&c);

m[l][c]=a;
cmp1++;
}while(cmp1!=3);
}
void remp(int m[3][4])
{ int i;
for(i=0;i<4;i++)
repetition(m);

}
main()
{ srand(time(NULL));
int m[3][4],i,j;


for(i=0;i<3;i++)
{
for(j=0;j<4;j++) m[i][j]=10;
}
remp(m);
for(i=0;i<3;i++)
{for(j=0;j<4;j++)
{
printf("%d\t",m[i][j]);

}
printf("\n");
}

system("PAUSE");
}
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
23 avril 2014 à 07:32
Plusieurs de mes remarques restent valables.
Donc tiens en compte et si ça ne fonctionne toujours pas reposte ton code corrigé entre 2 balises "code" (bouton situé à droite de "souligné")
0
naruto2333 Messages postés 51 Date d'inscription vendredi 21 mars 2014 Statut Membre Dernière intervention 20 janvier 2017 2
23 avril 2014 à 17:05
le code est correcte et il s execute correctement mais par fois il repend pas moi je pense a changer le compilateur pouvez vous me conseillez moi je taf sur dev c++
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
23 avril 2014 à 17:14
le code est correcte
Ben cela dépend si tu as tenu compte de mes remarques et si tu les as bien intégrées. De plus, je n'ai pas relu ton code en détail puisque j'attends que tu le montres entre 2 balises "code" en tenant compte des corrections.
Pour le compilateur, je te conseille "Code::Block". Mais, si ça ne fonctionne pas, ce n'est sûrement pas le compilateur...
0