String von 00000 bis ZZZZZ in Array

  • VB.NET

Es gibt 22 Antworten in diesem Thema. Der letzte Beitrag () ist von Leseratte.

    String von 00000 bis ZZZZZ in Array

    Hallo, ich brauche für eines meiner Programme ein Array, welches alle möglichen Kombinationen von 00000 bis ZZZZZ (Also alle 5stelligen Codes aus großbuchstaben und Zahlen) enthält. Ich weiß, dass ich zum hinzufügen eines eintrages die Funktion

    VB.NET-Quellcode

    1. Arrayname.Add("Eintrag")
    benutzen muss, aber ich habe 0 Ahnung wie ich die Strings vorher generieren soll. Hatt einer eine Idee oder sogar einen Code, wäre sehr nett!!

    Vielen Dank

    Leseratte

    EiPott schrieb:

    Ich hoffe, du weisst, dass die Berechnung für alle Möglichkeiten ein paar Tage dauern würde.

    Ich weiß, ich bräuchte es aber trotzdem...



    Pascal J. schrieb:

    also nur die Zahlen kannst du mit einer For-Schleife realisieren, zu den Buchstaben habe ich keine ahnung

    Wüsste denn einer Mehr dazu?

    VB.NET-Quellcode

    1. Dim ausgabe As New List(Of String)
    2. For c1 As Integer = 65 To 90
    3. For c2 As Integer = 65 To 90
    4. For c3 As Integer = 65 To 90
    5. For c4 As Integer = 65 To 90
    6. For c5 As Integer = 65 To 90
    7. ausgabe.Add(Chr(c1) & Chr(c2) & Chr(c3) & Chr(c4) & Chr(c5))
    8. Next
    9. Next
    10. Next
    11. Next
    12. Next


    Gilt aber nur für Buchstaben.
    Ich hoffe ich habe es richtig verstanden..
    Aber im Prinzip sollte es so in etwa gehen
    ACHTUNG: 1. Soll dies nicht C&P sein
    2. Ich hoffe du brauchst das nicht für irgendwelche Passwortcracksoftware

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Dim stelle1 As String
    2. Dim stelle2 As String
    3. Dim stelle3 As String
    4. Dim stelle4 As String
    5. Dim stelle5 As String
    6. ....
    7. Dim eintrag As New List(Of String)
    8. For i1 As Integer = 0 To 35
    9. For i2 As Integer = 0 To 35
    10. For i3 As Integer = 0 To 35
    11. For i4 As Integer = 0 To 35
    12. For i5 As Integer = 0 To 35
    13. If i1 > 10 Then
    14. stelle1 = i1.ToString
    15. Else
    16. stelle1 = ChrW(i1 - 10 + 65)
    17. End If
    18. If i2 > 10 Then
    19. stelle2 = i2.ToString
    20. Else
    21. stelle2 = ChrW(i2 - 10 + 65)
    22. End If
    23. If i3 > 10 Then
    24. stelle3 = i3.ToString
    25. Else
    26. stelle3 = ChrW(i3 - 10 + 65)
    27. End If
    28. If i4 > 10 Then
    29. stelle4 = i4.ToString
    30. Else
    31. stelle4 = ChrW(i4 - 10 + 65)
    32. End If
    33. If i5 > 10 Then
    34. stelle5 = i5.ToString
    35. Else
    36. stelle5 = ChrW(i5 - 10 + 65)
    37. End If
    38. eintrag.Add(stelle1 & stelle2 & stelle3 & stelle4 & stelle5)
    39. Next
    40. Next
    41. Next
    42. Next
    43. Next

    EDIT: Code funktioniert nicht 1:1 für dein Vorhaben, sondern hat einen Fehler drin ;)
    Es soll nur gezeigt werden, dass du sicher 5 verschachtelte Schleifen brauchst..


    Gruss
    Pascal

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „PascalN“ ()

    Leute , wir programmieren mittlerweile in .NET und nicht mehr in VB6: also ist es nicht nötig ständig mit Chr und ChrW zu arbeiten, ein simpler String tut es auch der dann brav in all den Schleifen durchlaufen wird:

    VB.NET-Quellcode

    1. Private AllowedChars As String = "01234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    2. ...
    3. For Each c0 As Char In AllowedChars
    4. ...
    5. Next

    Bestimmt geht es noch viel eleganter per LINQ oder Anonymen Methoden, aber die überlasse ich dann Hal und picoflop :whistling:

    EiPott schrieb:

    VB.NET-Quellcode

    1. Dim ausgabe As New List(Of String)
    2. For c1 As Integer = 65 To 90
    3. For c2 As Integer = 65 To 90
    4. For c3 As Integer = 65 To 90
    5. For c4 As Integer = 65 To 90
    6. For c5 As Integer = 65 To 90
    7. ausgabe.Add(Chr(c1) & Chr(c2) & Chr(c3) & Chr(c4) & Chr(c5))
    8. Next
    9. Next
    10. Next
    11. Next
    12. Next


    Gilt aber nur für Buchstaben
    Das hat mich schon sehr weitergebracht, ich werde damit noch etwas herumprobieren, und melde mich dann wieder.


    EDIT: Folgenden Code hab ich mal erweitert, aber jetzt bekomme ich jede Kombination genau 36 mal ins Array!!!

    VB.NET-Quellcode

    1. Dim d1, d2, d3, d4, d5, d6 As String
    2. For c1 As Integer = 65 To 100 'BIs 90 einschl sind Buchstaben
    3. Application.DoEvents()
    4. If c1 > 90 Then
    5. d1 = Asc(c1 - 90)
    6. If d1 = 10 Then d1 = Asc("0")
    7. Else
    8. d1 = c1
    9. End If
    10. For c2 As Integer = 65 To 100
    11. Application.DoEvents()
    12. If c2 > 90 Then
    13. d2 = Asc(c2 - 90)
    14. If d2 = 10 Then d2 = Asc("0")
    15. Else
    16. d2 = c2
    17. End If
    18. For c3 As Integer = 65 To 100
    19. Application.DoEvents()
    20. If c3 > 90 Then
    21. d3 = Asc(c3 - 90)
    22. If d3 = 10 Then d3 = Asc("0")
    23. Else
    24. d3 = c3
    25. End If
    26. For c4 As Integer = 65 To 100
    27. Application.DoEvents()
    28. If c4 > 90 Then
    29. d4 = Asc(c4 - 90)
    30. If d4 = 10 Then d4 = Asc("0")
    31. Else
    32. d4 = c4
    33. End If
    34. For c5 As Integer = 65 To 100
    35. Application.DoEvents()
    36. If c5 > 90 Then
    37. d5 = Asc(c5 - 90)
    38. If d5 = 10 Then d5 = Asc("0")
    39. Else
    40. d5 = c5
    41. End If
    42. For c6 As Integer = 65 To 100
    43. Application.DoEvents()
    44. If c6 > 90 Then
    45. d6 = Asc(c6 - 90)
    46. If d6 = 10 Then d6 = Asc("0")
    47. Else
    48. d6 = c6
    49. End If
    50. ausgabe.Add(Chr(d1) & Chr(d2) & Chr(d3) & Chr(d4) & Chr(d5))
    51. ListBox1.Items.Add(Chr(d1) & Chr(d2) & Chr(d3) & Chr(d4) & Chr(d5))
    52. If Stopp Then
    53. Exit For
    54. Exit For
    55. Exit For
    56. Exit For
    57. Exit For
    58. Exit For
    59. Exit For
    60. Exit For
    61. End If
    62. Next
    63. Next
    64. Next
    65. Next
    66. Next
    67. Next

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Leseratte“ ()

    VB.NET-Quellcode

    1. If Stopp Then
    2. Exit For
    3. Exit For
    4. Exit For
    5. Exit For
    6. Exit For
    7. Exit For
    8. Exit For
    9. Exit For
    10. End If


    das is ziemlicher quatsch, da das erste exit for die schleife sofort verlässt, werden die anderen 7 exit fors erst gar nicht aufgerufen
    Die Lösung:

    VB.NET-Quellcode

    1. Private Sub GenerateCombos(ByVal used As String, ByVal length As Integer)
    2. Dim j As Integer = used.Length
    3. Dim k As Long = CLng(Math.Pow(j, length))
    4. Dim l As Long() = New Long(length) {}
    5. For m As Integer = length To 0 Step -1
    6. l(m) = CLng(Math.Pow(j, m))
    7. Next
    8. For i As Integer = 0 To k - 1
    9. Dim n As Long = i
    10. Dim o As String = String.Empty
    11. For p As Integer = length To 0 Step -1
    12. Dim q As Integer = CInt(n \ l(p))
    13. If p = length AndAlso q = 0 Then Continue For
    14. o &= used(q)
    15. n -= q * l(p)
    16. Next
    17. Console.WriteLine(o)
    18. 'Falls du das als Funktion haben möchtest:
    19. 'Eine neue List(Of String) initialisieren und dann:
    20. 'myList.Add(o)
    21. Next
    22. End Sub


    Mit den Zeichen ABCD gibt es insgesamt (Kombinationen: ABCD, ACBD, ADCB, CABD, ...) 256 Kombinationen, nur zur Info.

    MfG

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „LaPi“ ()

    LaPi schrieb:

    Die Lösung:

    VB.NET-Quellcode

    1. Private Sub GenerateCombos(ByVal used As String, ByVal length As Integer)
    2. Dim j As Integer = used.Length
    3. Dim k As Long = CLng(Math.Pow(j, length))
    4. Dim l As Long() = New Long(length) {}
    5. For m As Integer = length To 0 Step -1
    6. l(m) = CLng(Math.Pow(j, m))
    7. Next
    8. For i As Integer = 0 To k - 1
    9. Dim n As Long = i
    10. Dim o As String = String.Empty
    11. For p As Integer = length To 0 Step -1
    12. Dim q As Integer = CInt(n \ l(p))
    13. If p = length AndAlso q = 0 Then Continue For
    14. o &= used(q)
    15. n -= q * l(p)
    16. Next
    17. Console.WriteLine(o)
    18. 'Falls du das als Funktion haben möchtest:
    19. 'Eine neue List(Of String) initialisieren und dann:
    20. 'myList.Add(o)
    21. Next
    22. End Sub


    Mit den Zeichen ABCD gibt es insgesamt (Kombinationen: ABCD, ACBD, ADCB, CABD, ...) 256 Kombinationen, nur zur Info.

    MfG
    Sehe ich das richtig, dass ich als Parameter used die Zeichen eingebe die vorkommen können (also "ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789" und in lenght dann 5?
    Also die komplette Funktion wäre dann (wenn ich mich nicht irre) folgende:

    VB.NET-Quellcode

    1. Private Function GenerateCombos(Optional ByVal used As String = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890", Optional ByVal length As Integer = 5) Dim Arr As New List(Of String)
    2. Dim j As Integer = used.Length
    3. Dim k As Long = CLng(Math.Pow(j, length))
    4. Dim l As Long() = New Long(length) {}
    5. For m As Integer = length To 0 Step -1
    6. l(m) = CLng(Math.Pow(j, m))
    7. Next
    8. For i As Integer = 0 To k - 1
    9. Dim n As Long = i
    10. Dim o As String = String.Empty
    11. For p As Integer = length To 0 Step -1
    12. Dim q As Integer = CInt(n \ l(p))
    13. If p = length AndAlso q = 0 Then Continue For
    14. o &= used(q)
    15. n -= q * l(p)
    16. Next
    17. Arr.Add(CStr(o))
    18. End Sub

    Stimmt das?