Algorithmique

Discutez d'informatique ici !
olive1978
Membre Naturel
Messages: 36
Enregistré le: 06 Jan 2006, 09:18

Algorithmique

par olive1978 » 06 Jan 2006, 09:22

Bonjour a tous,

Voila ... J'ai un tableau 2D dont je connais le nombre de lignes et dont chaque ligne a un nombre de colonnes connu. Le nombre de lignes doit pouvoi etre variable entre 2 executions du code. Je voudrais enumerer toutes les possibilites. Un exemple sera plus parlant ...

2 6
5
4 8
1

(on a : t(0)(0) = 2, t(2)(1) = 8, ...)

Je voudrais obtenir en sortie les suites :
2 5 4 1
2 5 8 1
6 5 4 1
6 5 8 1

D'avance merci



virtualmeet
Membre Naturel
Messages: 70
Enregistré le: 12 Juil 2005, 14:06

par virtualmeet » 07 Jan 2006, 20:03

Bonjour,
J'avoue que j'ai essayé pendant une demi heure mais je n'y arrive pas non plus: ma tête commence a me faire mal. je pense qu'il faut utiliser une autre structure que les tableaux, par exemple les listes ou encore les arbres. Ça devrait être plus facile a traiter qu'avec les tableaux surtout que le nombre de colonne est variables, et cela tu ne peux pas le faire avec les tableaux sauf en remplissant tes cases avec des valeures "Nulles". Tout au moins, il te faudra créer un autre tableau pour stoquer le nombre de colonnes de chaque ligne...mais même avec ça je n'y arrive pas. J'essayerais ce soir et je te dirais ce qu'il en ait (si je trouve une solution bien sure ;-) ) .
Bonne continuation.

Fract83
Membre Relatif
Messages: 110
Enregistré le: 25 Nov 2005, 13:35

par Fract83 » 13 Jan 2006, 13:37

Hello,

Et ou est le probleme exactement ici ?

Bonne journee.

Chimerade
Membre Irrationnel
Messages: 1472
Enregistré le: 04 Juil 2005, 13:56

par Chimerade » 13 Jan 2006, 13:51

Il faut faire une boucle de boucles... Je m'explique (rapidement, je n'ai guère le temps tout de suite)

Si le nombre de lignes avait été fixe (ce qui n'est pas le cas, je sais !) on aurait pu faire :

Code: Tout sélectionner
de i1=1 à nbcol(1) faire :
{
   de i2=1 à nbcol(2) faire :
   {
       de i3=1 à nbcol(3) faire :
       {
             etc...
       }

   }
}


Bon ! D'une part c'est très lourd comme codage, d'autre part ça ne marche, comme je l'ai dit ci-dessus que si le nombre de lignes est connu et constant.

Mais cela équivaut à :

Code: Tout sélectionner
i1=1
tant que i1<=nbcol(1) faire
{
   i2=1
   tant que i2<=nbcol(2) faire
   {
      i2=i2+1
   }
   i1=i1+1
}


Et là tu t'aperçois que tu peux faire une boucle "sur les débuts de boucles :

Code: Tout sélectionner
i1=1
tant que i1<=nbcol(1) faire
{
   i2=1
   tant que i2<=nbcol(2) faire
   {


et une boucle sur les fins de boucles :

Code: Tout sélectionner
      i2=i2+1
   }
   i1=i1+1
}


Je sais, ce n'est pas très clair...je reviendrai un peu plus tard pour expliciter davantage, mais essaie d'y réfléchir ; ça marche très bien, je l'ai fait de nombreuses fois...Désolé, je n'ai pas le temps pour le moment.

Chimerade
Membre Irrationnel
Messages: 1472
Enregistré le: 04 Juil 2005, 13:56

par Chimerade » 13 Jan 2006, 16:33

Je vais essayer d'être plus clair.

Je reprends donc. Si l'on connaissait le nombre de lignes (nblig) et le nombre de colonnes de chaque ligne (stocké en nbcol[lig]) on pourrait écrire :

Code: Tout sélectionner
Pour ind[0]=0 à (nbcol[0]-1) faire
{
   Pour ind[1]=0 à (nbcol[1]-1) faire
   {
      Pour ind[2]=0 à (nbcol[2]-1) faire
      {
         Pour ind[3]=0 à (nbcol[3]-1) faire
         {
            etc...
            t[0][ind[0]],t[1][ind[1]],t[2][ind[2]],t[3][ind[3]],...
            est la suite des valeurs qui nous intéressent
         }
      }
   }
}


Maintenant, entrons un peu dans le détail, le code ci-dessus est équivalent (en utilisant provisoirement un "goto" suranné) à :

Code: Tout sélectionner
ind[0]=0
Label 0 :
   ind[1]=0
   Label 1 :
   ind[1]=0
      Label 2 :
      ind[2]=0
         Label 3 :
         ind[3]=0
         etc...
         t[0][ind[0]],t[1][ind[1]],t[2][ind[2]],t[3][ind[3]],...
         est la suite des valeurs qui nous intéressent
         ind[3]=ind[3]+1
         si ind[3]=0) ind[lig]++;
      }
         while ((lig>=0) && (ind[lig]>=nbcol[lig]));
      // lig est la dernière ligne dont on a incrémenter
      // l'indice ind. On ajoute 1 à lig pour mettre à zéro
      // les indices à partir de cette position en début de boucle
      lig++;
   }
      while (lig>0);


Ce code est extrèmement souple : il ne préjuge pas du nombre de lignes NBLIG qui est une variable pouvant être définie à l'exécution, ni du nombre de colonnes de chaque ligne, définissable lui aussi à l'éxécution par la définition du tableau NBCOL[i], i=0 à NBLIG-1.

Et voilà !

virtualmeet
Membre Naturel
Messages: 70
Enregistré le: 12 Juil 2005, 14:06

par virtualmeet » 19 Jan 2006, 04:25

Merci Chimerade pour cette excellente réponse :zen: . Je ne sais pas par contre si olive1978 a pu en profiter...

 

Retourner vers ϟ Informatique

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 4 invités

Tu pars déja ?



Fais toi aider gratuitement sur Maths-forum !

Créé un compte en 1 minute et pose ta question dans le forum ;-)
Inscription gratuite

Identification

Pas encore inscrit ?

Ou identifiez-vous :

Inscription gratuite