Codes generieren mit QBASIC

Julatsch

Lt. Junior Grade
Registriert
Juli 2005
Beiträge
397
Hi,

Gestern Abend habe ich ein Programm mit Quick Basic geschrieben, welches mir Codes generiert.

Und zwar Codes wie: ABC12345 oder XYZ98761.
Ich frage vorher ab, wie viele Codes der Benutzer generiert haben möchte. Gibt er 9000 ein bekommt er auch 9000. Das Limit ist bei 10000 Codes.
Das Programm funktioniert soweit ganz gut.
Das einzige Problem ist, dass ich bei ca. 8000 Codes oder so mehrere Codes doppelt bis zehnfach habe. Einige kommen nur ein mal vor andere zehnmal. Ist halt zufall ^^.

Ich komm einfach nicht drauf, wie ich die Codeprüfung auf doppelte Codes machen soll.
Es soll inerhalb dieses Programms noch passieren und nicht in einem extra Prüfprogramm oder so.
Kann mir da einer weiterhelfen?

Ich schreib meinen Quellcode einfach mal hier rein. Kann net so gut erklären, bei Fragen zum Ablauf, oder wenn ihr nicht wisst was ich meine....bitte nachfragen.

Code:
CLS
OPEN "codefile.dat" FOR OUTPUT AS #1
1:
Input "Wie viele Codes sollen generiert werden? ", anzahl
IF anzahl > 10000 THEN
    PRINT "Die Codemenge ist bis 10000 limitiert."
GOTO 1:
END OF

kleinste = 10000
groesste = 99999

     FOR schleife = 1 to anzahl
         RANDOMIZE TIMER
         zahl = INT(RND * (groesste - kleinste + 1)) + kleinste

         RANDOMIZE TIMER
         buch1 = INT(RND * 26) + 65
         buch2 = INT(RND * 26) + 65
         buch3 = INT(RND * 26) + 65
         alle$ = CHR$(buch1) + CHR$(buch2) + CHR$(buch3) + LTRIM$(STR$(zahl))
         PRINT alle$
         PRINT #1, alle$     'Die Codes schreibe ich in eine Datei weg.

      NEXT schleife

         PRINT ""
         INPUT "Brauchen Sie weitere Codes? (Ja = 1, Nein = 0)" , eingabe
         IF eingabe = 1 THEN
         GOTO 1:
         PRINT ""
         ELSE
         END
         END IF

CLOSE #1


Also es funktioniert prima =) Ich bitte nicht um Programm "Umschreibungen" sondern lediglich um einen Hinweis bzw eine kleine Hilfe wie ich doppelte Codes ausschließen kann.

VIELEN DANK
 
Du musst dir ein Array erstellen in dennen du die Ergenisse speicherst. Dann musst du jeden Generierte Zahl überprüfen ob diese sich im Array befinden. Wenn ja neue Zahl generieren, wenn nein Code dem Array hinzufügen und ausgeben.

Grüße

tewes
 
Das mit den Arrays hab ich grad mal überlegt und dann mal probiert. Allerdings macht Basic nicht mit, da der Speicher ja bei glaub 64kb liegt , und bei 4000 Codes is dann ende. Brauch aber ja mind. die 10000.
 
Dann müsstest du eine Datei nehmen. Aber das Prinzip ist es halt immer das gleiche.
Werte Speichern,
Überprüfen ob Existiert
Einfügen & ausgeben oder neuen Code generieren
ggf. Zähler hochzählen lassen.
 
Zuletzt bearbeitet:
Ginge auch per Datenbank wenn du eine zur Verfügung hast. Da kannst du dann sogar auf Ewigkeiten prüfen ob es den Wert gibt ;)
Und noch Wahrscheinlichkeiten ausrechnen zu wie viel % Kombination xyz rauskommt ;)

Frage am Rande: Wie weit bist du mit dem anderem Programm gekommen bei dem ich dir versucht hab zu helfen?
 
Das andere läuft einwandfrei =) Danke nochmal hast mir sehr geholfen.

Wie mach ich denn das per Datenbank?
hab ich noch nicht so richtig von gehört bzw was drüber gelesen :(

ich häng da grad echt voll -.- ohne jeglichen Ansatz oder ne Umsetzungsidee...
 
Zuletzt bearbeitet:
Wenn du noch keine Ahnung von Datenbanken hast, dann rate ich dir zu einer Datei.
Von Prinzip her:
Code:
datei = "werte.txt";
string wert = code;
int anzahGefundener = 0;
Solange anzahlGefundener < 10000
       Solange Daten in Datei
                 Wenn wert != Datei.Zeile
                         Schreibe wert in Datei
                         anzahlgefundener = anzahlGefundener + 1
                 Ende If
       Ende While
Ende While
Ist zwar sehr rechenaufwendig, aber so sollte es gehen

Grüße

tewes
 
vielen dank für den vorschlag, an manchen stellen hab ich allerdings so kleine verständigungs probleme :P

unklarheiten bestehen bei:

int anzahGefundener = 0;
"wie istn das mit dem int gemeint?"

Solange Daten in Datei (würde ja dann "WHILE blabla" heißen (nur was schreib ich da als blabla hin) also nur in dem fall jetzt sonst wüsst ichs eig immer.


Wenn wert != Datei.Zeile ( != ? )



bin grade dabei basic zu lernen , habe mich mit dem rest und Pseudocode oder wie der heisst nich so massig beschäftigt...
 
Zuletzt bearbeitet:
Ein int zeit immer eine Ganze Zahl, und wird in diesem falle nur als zähler benutzt, um zu überprüfen ob ausreichend Ergebnisse da sind.
Beim zweiten soll eine Datei geöffnet werden und Zeile für Zeile gelesen werden, bis keine Daten in der Datei sind. Musst mal gucken wie man in QBasic Datein liest, schreibt etc.
Und das != steht für nicht(!) gleich(=).

Mir fällt grad auf das es nicht funktionieren kann. Werde es heute abend mal in C# Programmieren und dir den Quelltext posten.

Grüße

tewes

Habe das mal schnell zusammen Programmiert. Ist garantiert nicht der beste und sauberste Code aber es funktioniert
Code:
Random zzg = new Random(); // ZUfallsgenerator
            int Doppelt = 0; // Zähler für die Doppelten einträge
            for (int i = 0; i < 10000; i++) // So lange i < 10000 ist
            {
                string code = zzg.Next(100, 10000000).ToString(); // Zufalls Zahl generieren
                StreamReader reader = new StreamReader("Codes.txt"); // Instanz eines Stremreader estellen zum Daten aus der Datei lesen
                bool found = false; // Speichern ob gefunden
                while (!reader.EndOfStream) // So lange das ende der Datei nicht erreicht ist
                {
                    string Line = reader.ReadLine(); // Speichern der Zeile
                    if (code == Line) // ist die Zeile gleich dem Code?
                    {
                        found = true; // Zeile ist gleich dem Code
                    }
                }
                reader.Dispose(); // Datei "loslassen"
                reader.Close(); // Stream Schließen
                if (found) // Wenn was gefunden wurde
                {
                    i--; // Minus 1 rechnen um auf 10000 Werte zu kommen
                    Doppelt++; // Doppelte einträge hochzählen
                    Console.WriteLine("Doppelter Wert gefunden." + code); // Ausgabe auf der Console
                }
                else
                {
                    File.AppendAllText("Codes.txt", code + "\r\n"); // Neuen code in die Datei schreiben
                    Console.WriteLine(code); // Ausgabe auf der Console
                }
            }
            Console.WriteLine("Es wurden {0} doppelte Werte generiert.", Doppelt); // "Statistik ausgeben
            Console.ReadKey();
 
Zuletzt bearbeitet:
mh naja, sonderlich viel kann ich mit nem C - code net anfangen :P

aber danke für die Mühe
 
Das ist in C# geschrieben;) ist ein Himmelweiter unterschied.
Kannst ja aus den Kommentaren Probieren es in QBasic zu schreiben. Hab leider von QBasic keine Ahnung ;)
Aber wenn du PAP's lesen kannst kann ich dir heute abend einen erstellen.
 
mh die grundlegenden Sachen kann ich daraus erkennen. Nur leider krieg ichs net in Basic hin -.-

Ich bräuchte sonst einfach mal nen einachen Pseudo Code oder so dazu. Ich weiß zum Bespiel auch net was dieses "Streamreader" sein soll :P

PAP = Programmablaufplan? ^^

wenn ja , kannst ja ma machen =)

wär dir sehr dankbar, wenn ichs danach hinbekomme.
 
Also man erkennt doch nun wirklich, dass der StreamReader "irgendetwas" mit dem Filehandling und Einlesen der Werte zu tun hat.
Dann geht man auf google, sucht nach "qbasic read file" und freut sich...
 
Ja ich mein ein Programmablaufplan. Werde dir dann nach der Arbeit einerstellen.

Mit einem StreamReader kann man in C# und VB.Net eine Datei öffnen und lesen. Gegenteil dazu gibt es den StreamWriter, den ich hier nich benutzt haben.(Ich habe da das File.AppendAllText() benutzt. Ist zwar nicht schön aber war in diesem falle einfacher ;))

Grüße

tewes


//Edit: Hab jetzt auf die schnelle ein PAP erstellt. Kein Meisterwerk aber ich hoffe es hilft dir.
 

Anhänge

  • PAP.JPG
    PAP.JPG
    122,3 KB · Aufrufe: 183
  • Zeichnung1.rar
    Zeichnung1.rar
    26,5 KB · Aufrufe: 126
Zuletzt bearbeitet:
Zurück
Oben