Combinaison de chifre

Résolu/Fermé
NBA321 Messages postés 33 Date d'inscription mardi 14 juillet 2009 Statut Membre Dernière intervention 22 août 2011 - Modifié par NBA321 le 22/08/2011 à 14:46
NBA321 Messages postés 33 Date d'inscription mardi 14 juillet 2009 Statut Membre Dernière intervention 22 août 2011 - 22 août 2011 à 21:28
Bonjour à tous,

Je me creuse la tête depuis un bon moment déjà pour résoudre ceci :
J'ai 8 éléments A,B,C,D,E,F,G,H. Je voudrai créer un programme permettant de trouver les différentes possibilité de combinaison à 4 élément parmi les 8 et les trier ensuite pour supprimer les doublons du genre (ABCD,DCBD).
J'ai essayé en vain plusieurs combinaisons de boucles FOR/NEXT, DO/LOOP...

A défaut de me donner l'algorythme, voire le prog en VB, si quelqu'un a une piste, une idée de départ, c'est pas de refus!

4 réponses

KX Messages postés 16746 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 29 juin 2024 3 016
22 août 2011 à 14:29
Normalement quand on parle de combinaison, l'ordre n'a pas d'importance contrairement aux arrangements, alors avant de commencer à t'expliquer, mettons nous bien d'accord sur le vocabulaire parce que les résultats ne seraient pas du tout les même !

Exemple : (1,2,3), (1,3,2), (2,1,3), (2,3,1), (3,1,2), (3,2,1) sont les 6 arrangements de la combinaison {1,2,3}
0
KX Messages postés 16746 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 29 juin 2024 3 016
Modifié par KX le 22/08/2011 à 14:47
Si on parle bien de combinaisons, voici un programme en Pascal qui te les donne (il peut être amélioré)

VAR a,b,c,d,e,f,g,h:byte; 
BEGIN 
for a:=0 to 1 do 
for b:=0 to 1 do 
for c:=0 to 1 do 
for d:=0 to 1 do 
for e:=0 to 1 do 
for f:=0 to 1 do 
for g:=0 to 1 do 
for h:=0 to 1 do 
    if a+b+c+d+e+f+g+h=4 
    then begin 
         if a=1 then write('A'); 
         if b=1 then write('B'); 
         if c=1 then write('C'); 
         if d=1 then write('D'); 
         if e=1 then write('E'); 
         if f=1 then write('F'); 
         if g=1 then write('G'); 
         if h=1 then write('H'); 
         writeln; 
         end; 
END.
0
NBA321 Messages postés 33 Date d'inscription mardi 14 juillet 2009 Statut Membre Dernière intervention 22 août 2011
Modifié par NBA321 le 22/08/2011 à 17:22
Merci beaucoup, c'est tout à fait ce que je voulait.
Mais je voudrais aussi faire en sorte que le programme demande les valeurs des éléments, j'ai essayée avec readln mais ça ne fonctionne pas. Auriez vous une idéé ???
0
NBA321 Messages postés 33 Date d'inscription mardi 14 juillet 2009 Statut Membre Dernière intervention 22 août 2011
Modifié par NBA321 le 22/08/2011 à 18:18
J'ai essayé comme ceci

var a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t:byte; 
BEGIN 
for a:=0 to 1 do 
for b:=0 to 1 do 
for c:=0 to 1 do 
for d:=0 to 1 do 
for e:=0 to 1 do 
for f:=0 to 1 do 
for g:=0 to 1 do 
for h:=0 to 1 do 
for i:=0 to 1 do 
for j:=0 to 1 do 
    if a+b+c+d+e+f+g+h+i+j=6 
    then begin 
     writeln('Entrez les numéros favoris'); 
    readln(k,l,m,n,o,p,q,r,s,t); 
         if a=1 then write( k); 
         if b=1 then write( l); 
         if c=1 then write( m); 
         if d=1 then write( n); 
         if e=1 then write( o); 
         if f=1 then write( p); 
         if g=1 then write( q); 
         if h=1 then write( r); 
         if i=1 then write( s); 
         if j=1 then write( t); 
         writeln; 
         end; 
END. 


Mais maintenant sa ne m'affiche qu'une seule combinaison et me ensuite me redemande les numéros. Il ne donne plus toutes les combinaisons. J'ai surement quelque chose à corriger mais je ne vois pas.
0
KX Messages postés 16746 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 29 juin 2024 3 016
Modifié par KX le 22/08/2011 à 18:35
Ton readln tu devrais le faire une seule fois au tout début, là tu le fais à chaque fois que tu as une nouvelle combinaison donc forcément ça coince !
Remarque : tu peux également utiliser des string plutôt que des bytes dans ce cas.

VAR 
a,b... :byte; 
sa,sb... :string; 

BEGIN  
writeln('Entrez les valeurs preferees : '); 
readln(sa); 
readln(sb); 
// ... 

for a:=0 to 1 do  
for b:=0 to 1 do  
//... 
    if a+b+c+d+e+f+g+h+i+j=6  
    then begin 
         if a=1 then write(sa);  
         if b=1 then write(sb); 
         // ... 
         writeln;
         end;
END.
0
KX Messages postés 16746 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 29 juin 2024 3 016
22 août 2011 à 18:33
Remarque : cet algorithme est assez naïf, il faudrait l'adapter pour ne plus avoir à faire des copier-coller des même lignes de code à chaque fois que tu veux rajouter de nouvelles valeurs...
0
NBA321 Messages postés 33 Date d'inscription mardi 14 juillet 2009 Statut Membre Dernière intervention 22 août 2011
22 août 2011 à 21:28
Merci beaucoup mon programme fonctionne impec maintenant.
0