Boucle (For..)

Résolu
cs_clinik Messages postés 34 Date d'inscription vendredi 12 novembre 2004 Statut Membre Dernière intervention 1 novembre 2012 - 30 août 2007 à 02:42
Kristof_Koder Messages postés 918 Date d'inscription vendredi 3 août 2007 Statut Membre Dernière intervention 27 octobre 2008 - 31 août 2007 à 21:28
Salut,

J'aimerais quelques explications, puisque je veux faire une boucle pour me donner tout les possibilitées possibles avec 4 nombres par exemple.....

Ex:
A= 1
B= 2
C= 3
D= 4

Possibilitées: 1234, 1243, 1324.....

Merci

11 réponses

jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
30 août 2007 à 08:19
Salut,
>[auteurdetail.aspx?ID=59035 FMatrix07] Tiens on a presque la même signature

>[auteurdetail.aspx?ID=379347 clinik]: essaie ceci
Dim i As Integer
Dim A As String
Dim B As String
Dim C As String
Dim D As String
   A = "1"
   B = "2"
   C = "3"
   D = "4"
   'l'idée c'est d'aller de i= 1234 à 4321
   'et d'ajouter à la liste que les nombres
   'ecrit avec 1 et 2 et 3 et 4
   'la seul chose a faire est s'assurer (pas fait ici)
   'que a < b < c < d
   For i = CInt(A & B & C & D) To CInt(D & C & B & A)
       'si le nombre contient 1 et ...
       If InStr(1, i, A) Then
           'si le nombre contient 2 et ...
           If InStr(1, i, B) Then
               'si le nombre contient 3 et ...
               If InStr(1, i, C) Then
                   'si le nombre contient 4 et ...
                   If InStr(1, i, D) Then
                       Call ShowList.AddItem(CStr(i))
                   End If
               End If
           End If
       End If
   Next , ----
[code.aspx?ID=41455 By Renfield]

@+: Ju£i?n
Pensez: Réponse acceptée
3
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
31 août 2007 à 17:08
Re,
NOTE: [auteurdetail.aspx?ID= 379347 clinik  ][auteurdetail.aspx?ID=379347 Voici l'intérêt de faire attention à la section ou tu pose ta question]
SI tu fais tu VB6 NE POSTE PAS LA: [infomsgf_VB-NET-VB-2005_40.aspx VB.NET et VB 2005]
Sauf erreur de ma part (et oui c'est vendredi tout de meme) la traduction en VB6 serait

  Private Sub btnSearch_Click()
       Dim L As Integer
       L = CInt(txtLen.Text)
       lstSolutions.Clear
       Call TrouveComb(L, "")
       Call MsgBox("Terminée", vbOK Or vbExclamation, "Combinaisons")
   End Sub<hr />
   Private Sub TrouveComb(ByVal L As Integer, ByVal Begining As String)
       Dim i As Integer
       If Len(Begining) = L Then
           Call lstSolutions.AddItem(Begining)
           lblNbSolutions.Caption = lstSolutions.ListCount
           DoEvents
       Else
           For i = 1 To L
               If InStr(1, Begining, CStr(i)) = 0 Then
               'If Begining.IndexOf(i.ToString()) = -1 Then
                   Call TrouveComb(L, Begining & CStr(i))
               End If
           Next
       End If
   End Sub , ----
[code.aspx?ID=41455 By Renfield]

J'ai pas testé ce que donne cette version.
@+: Ju£i?n
Pensez: Réponse acceptée
3
cs_clinik Messages postés 34 Date d'inscription vendredi 12 novembre 2004 Statut Membre Dernière intervention 1 novembre 2012
30 août 2007 à 03:46
A = 1
B = 2
C = 3
D = 4


Dim i As Integer


 For i = A To D
    ShowList.AddItem (A * 1 + B * 10 + C * 100 + D * 1000)
Next

J'suis coincé
0
FMatrix07 Messages postés 233 Date d'inscription mercredi 26 février 2003 Statut Membre Dernière intervention 21 février 2009 2
30 août 2007 à 04:26
Bonjour,

Il ne faudrait pas plus que tu fasse 4 boucle, 1 pour chaque position que peux avoir chaque nombre

For j = A To D
   If j = A Then
      For i  = A To D
         ShowList.AddItem (i * 1 + B * 10 + C * 100 + D * 1000)
      Next
   ElseIf j = B Then
      For i  = A To D
         ShowList.AddItem (A * 1 + i * 10 + C * 100 + D * 1000)
      Next
   ElseIf j = C Then
      For i  = A To D
         ShowList.AddItem (A * 1 + B * 10 + i * 100 + D * 1000)
      Next
   ElseIf j = D Then
      For i  = A To D
         ShowList.AddItem (A * 1 + B * 10 + C * 100 + i * 1000)
      Next
   End IF
Next

SCCréat
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_clinik Messages postés 34 Date d'inscription vendredi 12 novembre 2004 Statut Membre Dernière intervention 1 novembre 2012
30 août 2007 à 04:41
Merci boucoup,

Avec sa :

Dim i As Integer
Dim j As Integer
Dim A As String
Dim B As String
Dim C As String
Dim D As String

A = "1"
B = "2"
C = "3"
D = "4"

For j = A To D
   If j = A Then
      For i = A To D
         ShowList.AddItem (i * 1 + B * 10 + C * 100 + D * 1000)
      Next
   ElseIf j = B Then
      For i = A To D
         ShowList.AddItem (A * 1 + i * 10 + C * 100 + D * 1000)
      Next
   ElseIf j = C Then
      For i = A To D
         ShowList.AddItem (A * 1 + B * 10 + i * 100 + D * 1000)
      Next
   ElseIf j = D Then
      For i = A To D
         ShowList.AddItem (A * 1 + B * 10 + C * 100 + i * 1000)
      Next
   End If
Next

Il me donne pas mal tout les 4*** mais il y en a qui reviennent 2 fois
mais il me donne qu'un 1***, 2*** et 3****
0
FMatrix07 Messages postés 233 Date d'inscription mercredi 26 février 2003 Statut Membre Dernière intervention 21 février 2009 2
30 août 2007 à 05:19
Dim i As Integer
Dim j As Integer
Dim A As String
Dim B As String
Dim C As String
Dim D As String


A = "1"
B = "2"
C = "3"
D = "4"

For j = A To D
    If j = A Then
         ShowList.AddItem (A & B & C & D)
         ShowList.AddItem (A & B & D & C)
         ShowList.AddItem (A & D & B & C)
         ShowList.AddItem (A & D & C & B)
         ShowList.AddItem (A & C & B & D)
         ShowList.AddItem (A & C & D & B)
    ElseIf j = B Then
         ShowList.AddItem (B & A & C & D)
         ShowList.AddItem (B & A & D & C)
         ShowList.AddItem (B & D & A & C)
         ShowList.AddItem (B & D & C & A)
         ShowList.AddItem (B & C & A & D)
         ShowList.AddItem (B & C & D & A)
    ElseIf j = C Then
         ShowList.AddItem (C & B & A & D)
         ShowList.AddItem (C & B & D & A)
         ShowList.AddItem (C & D & B & A)
         ShowList.AddItem (C & D & A & B)
         ShowList.AddItem (C & A & B & D)
         ShowList.AddItem (C & A & D & B)
    ElseIf j = D Then
         ShowList.AddItem (D & B & C & A)
         ShowList.AddItem (D & B & A & C)
         ShowList.AddItem (D & A & B & C)
         ShowList.AddItem (D & A & C & B)
         ShowList.AddItem (D & C & B & A)
         ShowList.AddItem (D & C & A & B)
    End If
Next

Je sais pas cool comme code mais ça donne le bon résultat sinon il faut faire un code encore plus complexe pour determiner la position de chaque nombre et la deplacer de 1 a chaque fois

SCCréat
0
FMatrix07 Messages postés 233 Date d'inscription mercredi 26 février 2003 Statut Membre Dernière intervention 21 février 2009 2
30 août 2007 à 05:55
Tiens nous au courant si tu trouves quelque chose de mieux.

@+: SCCréat
Pensez:  Réponse acceptée
Stéphan.COCHET
0
FMatrix07 Messages postés 233 Date d'inscription mercredi 26 février 2003 Statut Membre Dernière intervention 21 février 2009 2
30 août 2007 à 09:18
Hello Jrivet,
On dirait que les grands esprits se recontre

Ta soluce est pas mal du tout

@+: SCCréat
Pensez:  Réponse acceptée
Stéphan.COCHET
0
Kristof_Koder Messages postés 918 Date d'inscription vendredi 3 août 2007 Statut Membre Dernière intervention 27 octobre 2008 10
31 août 2007 à 10:33
Le problème se résolvant bien avec un algo récursif, voici une proposition de code, plutot efficace je pense.
En plus, tu peux y faire varier la longueur de la combinaison à rechercher (de 1 à 9)
Pour le tester, mettre sur une form :
- une Textbox nommée 'txtLen' et servant à indiquer la longueur de la combinaison à rechercher
- Un Button nommé 'btnSearch' servant à lancer la recherche
- Une Listbox nommée 'lstSolutions' servant à afficher les solutions
- Une Label nommée 'lblNbsolutions' servant à afficher le nb de solutions
Colle ensuite le code ci-dessous dans le module de la forme :

Private Sub btnSearch_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSearch.Click
Dim L As Integer = Integer.Parse(txtLen.Text)

lstSolutions.Items.Clear()
TrouveComb(L, "")
MessageBox.Show("Terminée", "Combinaisons", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
End Sub

Private Sub TrouveComb(ByVal L As Integer, ByVal Begining As String)
If Begining.Length = L Then
lstSolutions.Items.Add(Begining)
lblNbSolutions.Text = lstSolutions.Items.Count
My.Application.DoEvents()
Else
For i As Integer = 1 To L
If Begining.IndexOf(i.ToString()) = -1 Then
TrouveComb(L, Begining & i.ToString())
End If
Next
End If
End Sub

Dis-moi ce que tu en pense.
Avantages par rapport à la solutions de JRivet :
- Je ne boucle pas sur tous les nombres de 1234 à 4321, donc à priori, plus rapide
- Utilisable pour une longueur de combinaison variant de 1 à 9, sans toucher une seule ligne de code.
0
cs_clinik Messages postés 34 Date d'inscription vendredi 12 novembre 2004 Statut Membre Dernière intervention 1 novembre 2012
31 août 2007 à 16:26
Serais-ce du .Net?

Il y a plein de ligne en rouge dans le code lorsque je le paste..

* Mais sa me semble plus utile que le celui de JRivet :)
0
Kristof_Koder Messages postés 918 Date d'inscription vendredi 3 août 2007 Statut Membre Dernière intervention 27 octobre 2008 10
31 août 2007 à 21:28
jrivet < Suis d'a&ccord avec ta traduction
clinik < Gare à toi si le maitre des Sit passe par là !! tuvas gouer e son sabre laser déménageur de post !
0
Rejoignez-nous