Initialiser un tableau avec des données aléatoires, tout en ayant des conditions [Résolu]

Signaler
Messages postés
15
Date d'inscription
vendredi 14 novembre 2008
Statut
Membre
Dernière intervention
24 octobre 2009
-
Messages postés
589
Date d'inscription
lundi 25 août 2003
Statut
Membre
Dernière intervention
18 juillet 2010
-
bonjour tout le monde,
j'ai un petit problème avec mon programme. Je voudrais initialiser un tableau a deux dimension mais avec des données précises, c'est à dire dans un tableau[6][6], mettre des données précises, je dois réspecter des conditions,
- ce tableau doit comporter toute les nombres compris entre 0 et 17, mais mis dans le tableau de facon aléatoire!!!!
-d'autre part dans ce tableau chaque chiffre compris entre 0 et 17 doit avoir son doublon, c'est a dire que dans le tableau on doit avoir 2fois  17, 2 fois 16 ect jusqu'a 0...., j'ai pasmal chercher et j'ai fai un pti programme mais qui ne fait pas tout ce que je veux, merci d'avance de votre aide!!!!
bonnes fetes a tous

le code.c

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

#define TAILLE_TAB 18

int main ()
{   int tabaffichage[6][6];
    int tab[TAILLE_TAB] = { 0 };
    int i, k,l,x,c,nb ,tmp;
    c=0;
    nb=0;
     /* Initialise le tableau */
         for ( i=0 ; i<TAILLE_TAB ; i++ )
         {
          tab[i] = i;
        }
   
    /* Generation aleatoire */
    srand(time(NULL));
       for ( k=0 ; k<6 ; k++ ){
          for ( l=0 ; l<6 ; l++ ){
         for ( i=0 ; i<TAILLE_TAB ;i++ )
         {
        x =rand()%(TAILLE_TAB);
        /* On permute les valeurs du tableau */
        tmp = tab[i];
        tab[i] = tab[x];
        tab[x] = tmp;
       }
    tabaffichage[k][l]=tab[x];
   
    c++;
    printf("%d ",tabaffichage[k][l]);
    if (c==6)
    {printf("\n");
    c=0;
            }
   
       }
 }
   
    return 0;
}
A voir également:

9 réponses

Messages postés
589
Date d'inscription
lundi 25 août 2003
Statut
Membre
Dernière intervention
18 juillet 2010
1
J'ai pas le temps de te faire un code mais moi j'aurais procédé comme ca :

1.   int tabaffichage[6][6];
2.  creation d'une liste simplement chainé avec tout les chiffres a mettre dans tabaffichage (0,1,2...17,0,1,2,....,17) soit 36 cellule
3.   
pour i =0 à i<6, i++
   pour j = 0 à j<6, j++
      a = rand() % longueurdelaliste    
      tabaffichage[i][j] = liste(a);
      suppression de l'element numero a de la liste
   fin pour
fin pour

A la fin de cette boucle ton tableau tabaffichage dois etre remplis avec les nombres qu'il faut ainsi que les doublons.

<hr />www.e-fitz.com
Encore plus de sources et de tutoriels.
Messages postés
28
Date d'inscription
samedi 11 juin 2005
Statut
Membre
Dernière intervention
20 janvier 2009

Bonjour, l’idée et d’initialisé ton tableau a zéro, puis après on
choisi une position aléatoire dans le tableau pour les 36 valeur en vérifiant
si la case du tableau n’est pas déjà utilisé.

voila le code que je te propose:

<hr size="2" width="100%" />#include <stdio.h>

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

int main(void)
{
    int tabaffichage[6][6];
    int i, j, k;
   
    for(i=0; i<6; i++)
    {
        for(j=0; j<6; j++)
            tabaffichage[i][j] = 0;
    }
   
    srand(time(NULL));
    for(k=2; k<36; k++)
    {
        while(tabaffichage[i=rand()%6][j=rand()%6]);
        tabaffichage[i][j] = k/2;
    }
   
    for(i=0; i<6; i++)
    {
        for(j=0; j<6; j++)
        {
            printf("%d ", tabaffichage[i][j]);
            if(tabaffichage[i][j] < 10)    printf(" ");
        }
        printf("\n");
    }
    return 0;
}
<hr size="2" width="100%" />
Messages postés
15
Date d'inscription
vendredi 14 novembre 2008
Statut
Membre
Dernière intervention
24 octobre 2009

merci beaucoup de votre aide, je ne voyez pas comment faire mais tous s'éclaire maintenant!!!!
à la prochaine merci encore bonnes fêtes
Messages postés
15
Date d'inscription
vendredi 14 novembre 2008
Statut
Membre
Dernière intervention
24 octobre 2009

rebonjour,  maintenant que j'ai mon pti tableau trier aléatoirement, seriez-vous comme on fait pour faire le lien avec un tableau de surface en SDL, c'est a dire que plateau [i][j] correspond a une surface en sdl,afin qu'il puisse y afficher une image, en bref: si j'appuis sur entrée, et plateau[i][j]= 7 alors il me charge l'image 7  je sais c'est pas trés bien expliquer!!!!
j'espere que quelque me comprendra.... merci d'avance
Messages postés
589
Date d'inscription
lundi 25 août 2003
Statut
Membre
Dernière intervention
18 juillet 2010
1
Nan desolé je vois pas trop ce que tu veux dire.

<hr />www.e-fitz.com
Encore plus de sources et de tutoriels.
Messages postés
15
Date d'inscription
vendredi 14 novembre 2008
Statut
Membre
Dernière intervention
24 octobre 2009

bonjour, c'est encore moi, j'aurai besoin d'aide, car en faite, les explications sur le tableau que tu m'as fournit, m'ont permis de créer, un jeu de mémoire, maintenant je possede quelque base en sdl j'aurai aimer faire son affichage en sdl, si quelq'un pourrait m'aider?
j'ai fait l'affichage du fond avec la gestion des évenement, mais je ne vois pas comment creer un lien avec le jeu creer en langage c.... MERCI d'avance de vos réponses!!!!
Messages postés
589
Date d'inscription
lundi 25 août 2003
Statut
Membre
Dernière intervention
18 juillet 2010
1
Je te propose d'ouvrir un nouveau post pour ce nouveau probleme car il ne correspond plus au sujet initial.
Toutefois je comprends toujours pas ce que tu demandes essaye de preciser dans le nouveau post et peut etre que quelqu'un te repondra.

<hr />www.e-fitz.com
Encore plus de sources et de tutoriels.
Messages postés
15
Date d'inscription
vendredi 14 novembre 2008
Statut
Membre
Dernière intervention
24 octobre 2009

bonjour,  voila j'ai fait un petit truc à moi, mais cela ne tri pas bien, tout  marche sauf , il y a toujours  2 valeurs qui ne sont pas en double dans mon tableau!!,lors de l'éxécution je veux un tableau de 36,ou chaque case doit etre comprises entre 0 et 17  ainsi que ces doublons, ma ça marche pas j'ai un probleme avec le 0 (je crois ) donc si quelqu'un sait d'ou viens l'erreur,  merci d'avance de vos réponses!!!! 
bonnes fêtes

voici le code.c

                                   //FONCTION INITTABS

void inittabs(int pos[6][6])
{
 //Declaration des variables
 int i,j; //itérateurs
 //Initialisation de pos[][] et de retourne[][] a "0"
   //Les tableaux position[][] et estretourne[][] auront les valeurs de toutes leurs cases à 0
    for(i=0;i<6;i++)
    {
        for(j=0; j<6; j++)
        {
           pos[i][j] = 0;
          
        }
    }
}

//FONCTION INITVALEUR

void initvaleur (int val[36])
{
 
  int i,j;
  //Cette fonction rempli un tableau annexé de 0 à 35 (36 cases) avec des
  //valeurs de 0 à 17, chaque numéro de 0 à 17 sera en double
  for (i=0; i<17; i++)
  {
      //les annexes 0 à 17 prennent les valeurs de 0 à 17
      val[i]=i;
     
  }
  for (i=17; i<36; i++)
  {
      //les annexes 18 à 35 prennent les valeurs de 0 à 17
      val[i]=i-17;
     
  }
 
}

void initposition (int val[36], int pos[6][6])
//Cette fonction affecte a chaque case du tableau(36) une valeur aleatoire entre 0 et 17
//Chaque valeur sera en double.
{
 //Déclaration des variables
 int i, j, k, l;
 int repet, nombre;

 //Les 2 boucles "pour" parcours
 //le tableau pour lui affecter, dans chacune de ses cases, une valeur aléatoire
 for(i=0;i<6;i++)
 {
     for(j=0; j<6; j++)
     {
       repet = 0;
      //affectation d'un nombre aléatoire entre 1 et 36 a 'nombre'
      nombre =rand() % 36;

       //Les 2 boucles "pour" parcourent
       //le tableau pour vérifier si moins de 2 cases sont déja égales a la valeur de "nombre"
        for(k=0;k<6;k++)
        {
           for(l=0; l<6; l++)
           {
              //Dès que l'on trouve une case déjà égale à la valeur de "nombre",
              //on incrémente la variable "repet"
              if (pos[k][l]== val[nombre])
              {
                repet++;
              }

           }
        }

         //affectation de la valeur de la carte
              //Si le nombre choisi est présent moins de 2 fois dans le tableau
              //On met ce nombre dans la case
              if (repet < 2)
              {
                   pos[i][j]=val[nombre];
              }
              //Sinon on décrémente la valeur de "j" pour pas que la case ne soit oubliée
              //et reste à la valeur 0
             else
              {
                  j--;
              }

        }
   }
}

void main()
 


//Déclaration des variables
  int i,j;
  int valeur[36];
  int position[6][6];  
  int estretourne[6][6];
  srand(time(NULL));  //instruction nécessaire a l'appel de la fonction rand()

   initvaleur(valeur);
 inittabs(position);
initposition(valeur,position);

}
Messages postés
589
Date d'inscription
lundi 25 août 2003
Statut
Membre
Dernière intervention
18 juillet 2010
1
Bonsoir, deja ton rand() % 36 ca fait des valeurs de 0 et 35 car 36 % 36 = 0 donc mettre 37 ensuite si tu dois garder des affectations allant de 0 à 17 il est inutile de passer par un tableau d'affectation je te propose ci-dessous une version corrigé de ton code, j'ai changé la place de l'initialisation du generateur de nombre pseudo-aleatoire car je pense qu'il n'avait rien a faire dans le main.

#include <time.h>               /* time */
#include <stdlib.h>


void inittabs(int pos[6][6])
{
 //Declaration des variables
 int i,j; //itérateurs
 //Initialisation de pos[][] et de retourne[][] a "0"
   //Les tableaux position[][] et estretourne[][] auront les valeurs de toutes leurs cases à 0
    for(i=0;i<6;i++)
    {
        for(j=0; j<6; j++)
        {
           pos[i][j] = -1;


        }
    }
}




void initposition ( int pos[6][6])
//Cette fonction affecte a chaque case du tableau(36) une valeur aleatoire entre 0 et 17
//Chaque valeur sera en double.
{
 //Déclaration des variables
 int i, j, k, l;
 int repet, nombre;
 srand(time(NULL));  //instruction nécessaire a l'appel de la fonction rand()


 //Les 2 boucles "pour" parcours
 //le tableau pour lui affecter, dans chacune de ses cases, une valeur aléatoire
 for(i=0;i<6;i++)
 {
     for(j=0; j<6; j++)
     {
       repet = 0;
      //affectation d'un nombre aléatoire entre 1 et 36 a 'nombre'
      nombre =rand() % 18;


       //Les 2 boucles "pour" parcourent
       //le tableau pour vérifier si moins de 2 cases sont déja égales a la valeur de "nombre"
        for(k=0;k<6;k++)
        {
           for(l=0; l<6; l++)
           {
              //Dès que l'on trouve une case déjà égale à la valeur de "nombre",
              //on incrémente la variable "repet"
              if (pos[k][l]== nombre)
              {
                repet++;
              }


           }
        }


         //affectation de la valeur de la carte
              //Si le nombre choisi est présent moins de 2 fois dans le tableau
              //On met ce nombre dans la case
              if (repet < 2)
              {
                   pos[i][j]=nombre;
              }
              //Sinon on décrémente la valeur de "j" pour pas que la case ne soit oubliée
              //et reste à la valeur 0
             else
              {
                  j--;
              }


        }
   }
}




int main()


{


//Déclaration des variables
  int i,j;
  int valeur[36];
  int position[6][6];
  int estretourne[6][6];


    inittabs(position);
    initposition(position);




    return 0;


}

J'ai testé le code que je te propose il fonctionne, mais je tiens a préciser que cette méthode est plus couteuse en processeur que la méthode que je t'avais conseillé au début même si ma méthode semble plus complexe à mettre en oeuvre.

J'ajouterai que si tu souhaite garder un tableau pour initialiser tes valeurs tu pourrais utiliser la fonction d'initialisation suivantes, elle est un peu plus lourde en processeur mais plus courte a l'ecris mais pour 36 valeurs je pense pas que ce soit un reel probleme :

void initvaleur (int val[36])
{
 for (int i=0; i<36; i++)
      val[i]=i % 37;
}




Voila j'espere que cela t'eclairera un peu.


<hr />

www.e-fitz.com

Encore plus de sources et de tutoriels.