Lotto mit Mengen

  • geschlossen
  • Delphi

  • Stephie
  • 1848 Aufrufe 7 Antworten

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Lotto mit Mengen

    Hallo^^

    Ich hab da ein relativ großes Problem gerade im Informatik Unterricht und hoffe, dass mir hier jemand helfen kann. Wir hatten gerade mal eine Stunde zum Thema Mengen, in der mein Lehrer leider mal wieder gar nichts erklärt hat, und sollen nun ein Programm entwickeln.

    Also, ich fange erst mal mit der Aufgabe an^^ Wir sollen ein Programm schreiben, dass einem wenn man auf den Button klickt 6 zufällige Zahlen aus 49 in einer Listbox ausgibt, wovon natürlich keine doppelt vorkommen darf. Man muss keine Zahlen tippen können.

    Mein Problem besteht nun hauptsächlich darin, dass ich das nicht einfach so programmieren kann, wie ich gerne würde, weil wir halt mit Mengen und nicht mit Arrays oder sontigem arbeiten sollen.

    Es soll eben eine Menge mit 49 Zahlen sein und eine, die dann die Zahlen enthält, die schon gezogen wurden, damit man da irgendwie die Differenz bilden kann, weil keine Zahlen doppelt vorkommen dürfen...

    Außerdem hat er noch so Sachen vorgegeben, die angeblich darin vorkommen sollen, mir aber ziemlich schleierhaft sind. Ich schreib das jetzt mal hierhin.

    var Lotto: set of 1..49; <-- das is mir noch klar

    randomize;
    x:=random(48)+1;

    for i:=1 to 49 do
    Lotto:=Lotto+;

    for i:=1 to 49 do
    if Lotto*[i]=[i] then listbox1.items.add(inttostr(i);)

    Diese letzten 4 Zeilen versteh ich überhaupt nicht und es ist ja auch nicht vollständig. Müsste es nicht sowieso erstmal nur for i:=1 to 6 lauten, weil er ja nur 6 Zahlen raussuchen soll?

    Wäre echt nett, wenn mir da jemand weiterhelfen könnte.
  • Pascal ist jetzt nicht meine starke Seite.
    Aber ich probiere mal ein bisschen weiter zu helfen.

    Mit "set of" definiert man Mengen.
    Die kennen die Operatoren *, + und - für Durchschnitt, Vereinigung und Mengendifferenz;
    Bei
    for i:=1 to 49 do
    Lotto:=Lotto+;
    baut er eine Menge mit den Elemente 1 bis 49 auf.

    Die Zeilen
    for i:=1 to 49 do
    if Lotto*[x]=[x] then listbox1.items.add(inttostr(x)
    bilden mit der Zufallszahl und der Menge "Lotto" eine Mengendifferenz (alle Elemente die sowohl in "Lotto" als auch in "x" sind). D.H. ist die Zahl "x" in "Lotto", dann pack die Zahl in die Listbox.

    Ich würd danch z.B. ein Lotto = Lotto - [x]; erwarten ...


    In der Summe irgendwie so:

    for i:=1 to 49 do
    Lotto:=Lotto+[i];

    randomize;
    Repeat
    x:=random(48)+1;
    if Lotto*[x]=[x] then
    listbox1.items.add(inttostr(x));
    Lotto = Lotto - [x];
    end
    until (sechs Zahlen in der Listbox)

    Ist jetzt nicht wirklich Pascal, aber ich kenn den Syntax halt nicht auswendig.

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von wasawasa ()

  • erstmal vielen, vielen Dank! Das hat mir sehr geholfen.

    Ich habe das auch heute gleich mal ausprobiert und eigentlich hat das auch ganz gut hingehauen. Das einzige Problem war jetzt, dass er zwar meistens 6, manchmal aber nur 5 Zahlen ausgegeben hat. Die Frage ist nur, ob das jetzt an dem Programmtext liegt oder daran, dass Delphi bei uns in der Schule zur Zeit total spinnt.

    Hier mal der ganze Text:

    Quellcode

    1. a:=0;
    2. for i:=1 to 49 do Lotto:=Lotto+[i];
    3. randomize;
    4. repeat
    5. begin
    6. x:=random(49)+1;
    7. if Lotto*[x]=[x] than listbox1.items.add(inttostr(x));
    8. Lotto:=Lotto-[x];
    9. inc(a);
    10. end;
    11. until a=6; <-- damit er es halt 6mal macht
    Alles anzeigen


    Ich kann mir wirklich nicht vorstellen, wo da der Fehler sein soll...
  • Hallo Stephie,

    zunächst mal, es ist in den seltesten fällen ein Fehler im System, meistens ist der Programmierer selbst schuld ;)

    Dein Fehler ist folgender:
    Du überprüfst ob ein element in der menge vorhanden ist, wenn ja wird das item in die listbox eingetragen. (Somit ist die if abfrage beendet) Sofern immer unterschiedliche zahlen gefunden werden funktioniert das so auch gut. Aber du erhöst "a" immer, auch wenn das element nicht in der Menge gefunden wurde.

    Was also (ungetestet) zu immer 6 ausgaben führen dürfte ist das:

    Quellcode

    1. a:=0;
    2. for i:=1 to 49 do Lotto:=Lotto+[i];
    3. randomize;
    4. repeat
    5. begin
    6. x:=random(49)+1;
    7. if Lotto*[x]=[x] then begin
    8. listbox1.items.add(inttostr(x));
    9. Lotto:=Lotto-[x];
    10. inc(a);
    11. end
    12. end;
    13. until a=6; <-- damit er es halt 6mal macht
    Alles anzeigen


    Gruß Zerd
    [SIZE="1"]i'm a signature virus. copy me into your signature to help me spread. - smart questions[/SIZE]
  • Kannst du mir nochmal erklären, warum du das mit dem inc(a) jetzt in die if-Abfrage mit einschließt? so richtig hab ich das nicht verstanden.

    aber danke auf jeden fall für deine hilfe^^

    und das mit dem programm hab ich nur gedacht, weil das ganze programm bei uns halt wirklich kaum funktioniert. wenn man sein programm/formular starten will, geht es häufig nicht und teilweise lässt sich nicht mal der play button drücken...
  • Na ganz einfach.

    Quellcode

    1. x:=random(49)+1;


    Jetzt ist x ja eine zuefallige Zahl von 1 bis 49.
    Nehmen wir mal an, es kommt sechs Mal hintereinander 5 raus, was sehr unwahrscheinlich, aber moeglich ist.

    Jetzt kommt

    Quellcode

    1. if Lotto*[x]=[x] then listbox1.items.add(inttostr(x));


    x ist aber nur beim ersten Mal ein Element von Lotto, weil ja danach Lotto:=Lotto-[x] kommt.

    Das heisst die 5 wird nur einmal in deine Listbox hinzugefuegt, aber dein Zaehler a wird jedes Mal erhoeht.

    a=0: x = 5, x wird hinzugefuegt, a wird erhoeht
    a=1: x = 5, x wird nicht hinzugefuegt, a wird erhoeht
    a=2: x = 5, x wird nicht hinzugefuegt, a wird erhoeht, usw.

    Das heisst du hast am Ende nur eine Zahl in der Listbox.
    Und um das zu verhindern, wird a nur erhoeht, falls x eine Zahl ist, die nicht schon vorher mal generiert wurde. Damit wird auf jeden Fall sichergestellt, dass am Ende 6 Zahlen drin sind.

    PS: So, wie ich den randomize Befehl per Google verstanden habe, muss der nur einmal ausgefuehrt werden.
    Da oben in der ersten Schleife macht es so oder so keinen Sinn.
    Wo ist der Discord Server

    Dieser Beitrag wurde bereits 10 mal editiert, zuletzt von Skyte ()

  • Skyte schrieb:

    PS: So, wie ich den randomize Befehl per Google verstanden habe, muss der nur einmal ausgefuehrt werden, also z.B.:
    ...
    Da oben in der ersten Schleife macht es so oder so keinen Sinn.


    Der Befehl wurde auch nur einmal ausgeführt... Die for schleife beschränkt sich auf eine Anweisung: for i:=1 to 49 do Lotto:=Lotto+; in der die Menge gefüllt wird.

    In der Schleife wird nur Lotto:=Lotto+[i]; ausgeführt. Das randomize kommt erst danach. (wird einmal aufgerufen) Erst dann kommt die 6er schleife. War also in der hinsicht schon korrekt so...
    [SIZE="1"]i'm a signature virus. copy me into your signature to help me spread. - smart questions[/SIZE]
  • Achso, stimmt, sorry. Das lag an meinen nicht vorhandenen Delphi Kenntissen.^^

    Ich dachte das "repeat" kennzeichnet das Ende der for Schleife und der Anfang der unteren Schleife wird durch "begin" gekennzeichnet.
    Hab jetzt nachgelesen, wie es wirklich is, wieder was gelernt.^^

    Sorry nochmal.
    Wo ist der Discord Server

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Skyte ()