Ein kleines Problem für Könner, ein Großes für mich

Helmsen

Grünschnabel
Hi,

jetzt sitze ich schon knappe 12 Std an meinem Problem und finde keine Lösung. Zumindest keine die in der Prazis funktioniert. Eigentlich habe ich genug Ehrgeiz Probleme und zwar gerade solch schwere selbst zu lösen, denn genau solche Schwierigkeiten bringen ja erst dne Spaß, aber da ich zeitlich unter Druck stehe (muss mein Programm bald in der Schule abgeben) muss ich euch um Rat bitten.

Es geht darum, dass ich mir Zufallspassworte in einer Listbox ausgegeben lassen habe. Länge und Anzahl dieser sind variabel definierbar. Das Problem stellt sich bei der Programmierung, des Commandbuttons, welcher jegliches Passwort, welches mehrfach vorhanden ist aussortieren soll. So, dass jedes Passwort dann nurnoch einmal in meiner Listbox vorkommt.

Angefangen habe ich damit, einen Array mit den ausgegebenen Passwörtern zu füllen ( "Inhalt()"). Dann habe ich damit verschiedenste Ideen durchgearbeitet (leider hat noch keine in der Praxis funktioniert).
Eine Grundidee war, den Array Inhalt() mittels 2 For Next Schleifen zu durchsuchen und bei gefundener Doppelung von Passwörter einfach den Array ab dem identischen Passwort aufrücken zu lassen.
Eine andere Methode die mich sehr viel Zeit gekostet hat, war die Passwörter aus dem Array Inhalt() in den Array InhaltA() zu übergeben, so lange sie nicht doppelt vorkamen.

Programmcodes kann ich im Moment leider keine Posten, da ich sie immer mit meinen Neueren Ideen überschrieben habe und jetzt nurnoch ein halb fertiges Konstrukt der Verzweiflung in einem Programm besteht. Morgen ist mein letzter Tag, den ich Zeit bekommen habe, deshalb bin ich um jegliche konstruktive Hilfe dankbar. Am besten wäre ein fertiger Programmcode. Denn wie erwähnt, mangelt es mir nicht an Ideen, nur an den Umsetzungen.

In großer Zuversicht, Helmsen
 
Du solltest gleich bei der Generierung des Passwortes darauf achten, dass es nicht doppelt vorkommt.

Also machst du das so:

Code:
 $pass = generiere_passwort();
 while ($pass ist in Array $alle_passwoerter)
  $pass = generiere_passwort();

€dit:

Und damit du nicht ganz ohne Link dastehst:
http://www.vbarchiv.net/tipps/tipp_222-lottozahlen-6-aus-49.html

Hier geht es um Lottozahlen, beinhaltet aber genau dein Problem, ich hoffe du findest damit die Lösung.
 
Ich habe mir vor langem mal diverse Array-Funktion zu VB6/VBA erstellt, damit dort die Array überhaubt brauchbar werden.
http://wiki.yaslaw.info/wikka/VbaArrayFunctions

Dort fuindest du auch die Funktion ArrayIndex(). Damit kannst du prüfen ob ein Wert im Array ist (also das was Chumper schreibt)

Ergibt dann etwa folgenden Code (Alle notwendigen Array_funktionen dazu findest du auf der ober erwähnten Seite. Am besten einfach den ganzen Code aus meinem Wiki in ein Module mit dem Namen ArrayFunctions kopieren)

Visual Basic:
Public Sub deleteDublicateStringEntriesInArray(ByRef ioArray() As String)
    Dim retArray() As String
        
    For i = LBound(ioArray) To UBound(ioArray)
        ' Wenn der Eintrag im Return-Array noch nicht vorhanden ist, diesen kopieren
        If ArrayIndex(ioArray(i), retArray) < 0 Then
            Call pushArray(retArray, ioArray(i))
        End If
    Next i

    ioArray = retArray
End Sub

Hab natürlich auch ein Testscript dazu geschrieben
Visual Basic:
Public Sub testDeleteDublicateEntriesInArray()
    Dim myArray() As String
    
    ' Testdaten erstellen
    Call pushArray(myArray, "abcde")
    Call pushArray(myArray, "klmno")
    Call pushArray(myArray, "fghij")
    Call pushArray(myArray, "abcde")
    
    ' Funktionsaufruf
    Call deleteDublicateStringEntriesInArray(myArray)
    
    ' Ausgabe
    For i = LBound(myArray) To UBound(myArray)
        Debug.Print myArray(i)
    Next i

End Sub
Ausgabe
Code:
abcde
fghij
klmno
 
Erstmal vielen dank für eure Hilfe!
Aber meine Kenntnisse reichen nicht aus um eure Codes zu verstehen. Zur Veranschaulichung des Niveaus hier mal mein derzeitiger Versuch:

OptionExplicit
Dim Inhalt() As String
Dim AnzahlPos As Integer
Dim NummerNeu As Integer
Dim A As Boolean
Dim abschneiden As Integer
Dim I As Integer
Dim N As Integer
Dim M As Integer

Private Sub cmdDoppelt_Click()
AnzahlPos = lstAusgabe.ListCount - 1
ReDim Inhalt(AnzahlPos + 2)
N = 0
M = 1
A = False
abschneiden = 0

'Array mit Passwörtern füllen
For I = 0 To AnzahlPos
Inhalt(I) = Mid(lstAusgabe.List(I), 7, Len(lstAusgabe.List(I))) 'Passwörter müssen von ihrer Nummerierung getrennt werden
Next I

'Listbox leeren
lstAusgabe.Clear

'Arrays neu ordnen
Do While N <= AnzahlPos
M = 1
Do While M <= AnzahlPos
If Inhalt(0) <> Inhalt(M) Then
M = M + 1
A = True
Else
A = False
M = AnzahlPos + 1
End If
Loop

If A = True Then
Inhalt(AnzahlPos + 1) = Inhalt(0)
For I = 0 To AnzahlPos
Inhalt(I) = Inhalt(I + 1)
Next I

ElseIf A = False Then
'!!Dieser Abschnitt muss noch programmiert werden. Der Array muss "aufrücken", sodass Inhalt(0) überschrieben wird
End If

N = N + 1
Loop


'Ausgabe
For I = 0 To AnzahlPos - abschneiden
Ausgabe = Format(NummerNeu & ".", "!@@@@@@") & Inhalt(I) 'Passwörter wieder mit Nummern versehen
lstAusgabe.AddItem Ausgabe
NummerNeu = NummerNeu + 1
Next I

NummerNeu = 1

End Sub


Allgemein ist die Idee, dass Inhalt(0) mit allen anderen Passwörtern verglichen wird. Ist keines gleich wird Inhalt(0) "ganz hinten im Arrays angestellt". Gibt es ein gleiches wird Inhalt(0) überschrieben. Dies wird solange gemacht bis jedes Passwort einmal bei Inhalt(0) stand, dann ist die alte Reihenfolge wiederhergestellt nur ohne die Doppelten und das ganze kann ausgegeben werden.
 
item: Habs jetzt mal nicht gelsen weil so unformatiert ists echt nicht einfach. Schreib es bitte in [code=vb]dein Code[/code]. Gerade die Schleifen sind so nur schwer mit abzählen zu ermitteln

item: Frag was du nicht verstehst. Schau dir Befehle an die du nicht kennst. Weil
a) du dabei etwas lernst
b) es für uns (auf alle Fälle für mich) fast nicht möglich ist mit einem anderen Wissensstand zu programmieren
c) ich mir Mühe gab dir einen getesteten Code zu leifern den du mittels debug einfach mal durchgehen kannst.
 
Entschuldigt meine Unwissenheit. Nächstes mal werd ichs beachten. Dieses Problem hat sich aber erstmal erledigt, hab nämlich eine Möglichkeit gefunden.
Also bis zum nächsten mal, Helmsen.
 
Visual Basic:
    Option Explicit
    Dim I As Integer
    Dim N As Integer
    Dim M As Integer
    Dim AnzahlPos As Integer
    Dim Ausgabe as string
    Dim Abschneiden as integer  
    Dim Inhalt() as string

    Private Sub cmdDoppelteLoeschen_Click()
    AnzahlPos = lstAusgabe.ListCount - 1
    ReDim Inhalt(AnzahlPos + 1)
    M = 0
    N = 1
    Abschneiden = 0
    
    'Array mit Passwörtern füllen
    For I = 0 To AnzahlPos
        Inhalt(I) = Mid(lstAusgabe.List(I), 7, Len(lstAusgabe.List(I)))
    Next I
    
    lstAusgabe.Clear
    
    'Arrays überprüfen
    Do While M <= AnzahlPos 'Jedes Passwort der Reihe nach als Vergleichsmaßstab verwenden
        N = 1 + M
        
        Do While N <= AnzahlPos 'Jedes folgende Passwort zum Vergleich heran ziehen
            If Inhalt(M) = Inhalt(N) And Inhalt(N) <> "" Then 'Letzte vernachlässigen
                If Inhalt(N) = Inhalt(N + 1) Then
                    M = M - 1 'Derzeitiges M muss noch einmal durchlaufen werden
                End If
                For I = N To AnzahlPos
                    Inhalt(I) = Inhalt(I + 1)
                Next I
                Abschneiden = Abschneiden + 1
            End If
            N = N + 1
        Loop
        
            M = M + 1
    Loop
    
    'Ausgabe
    Nummer = 1
    For I = 0 To AnzahlPos - Abschneiden
        Ausgabe = Format(Nummer & ".", "!@@@@@@") & Inhalt(I)
        lstAusgabe.AddItem Ausgabe
        Nummer = Nummer + 1
    Next I
    
End Sub

Und so wird die Listbox LstAusgabe nach doppelten Ausgaben überprüft und ggf werden diese entfernt.
 
Zurück