Lotto-Programm

  • geschlossen
  • Delphi

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

  • Lotto-Programm

    nabend!
    wir benutzen zurzeit delphi 3 im infounterricht und sollen für nächste woche ein lottoprogramm programmieren.
    Ich hab es schon geschafft, dass es 7 zufällige Zahlen ausgibt und auch sortiert, aber wir sollen noch eine Tippfunkltion einbauen, die getippte und gezogene zahlen vergleicht.
    ich würde mich über eure hilfe freuen!

    mfg
  • wo ist dein Problem ?

    zwei eindimensionale Arrays, in das eine die Zufallszahlen, in das andere deine getippten Zahlen.
    beide aufsteigend sortieren und dann in 2 geschachtelten schleifen miteinander vergleichen (musst jede getippte Zahl mit jeder anderen vergleichen !!).
    Ein Zähler zeigt dir dann die Anzahl der richtigen Zahlen.


    Viele Grüße
  • Q-Dog schrieb:


    beim Sortieren nimm einfach ne Bubblesort Funktion o.ä.


    Ne, sortiert hab ich die Zahlen mit nem Bubblesort, ja, aber jetzt hab ich 7 Zahlen die auf einem Array liegen (ZAHL[1..7]) und die will ich jetzt vergleichen mit den Zahlen, die ich vorher als Tipp in 6 Edit-Felder eingegeben habe.
    Nochmals Danke für eure Bemühungen!

    mfg
  • dann musst du doch alle getippten zahlen mit allen gezogenen zahlen vergleichen.

    am besten schreibst du dir alle Edits auch in ein array, und sortierst das dann ebenfalls

    for i := 1 to 7 do begin

    for j := i to 7 do begin

    if zahl_tip = zahl_gezogen[j] then tip := tip + 1;

    end;

    end;

    sorry für die syntax fehler,
    mache im moment fast nur noch abap....


    @Metaphore: sicher ! :D
  • Wie gesagt.. wenn die Array sortiert sind braucht er ja nicht jedes mal alle Elemente durchlaufen. Bei diesen kl. Arrays ist das zwar egal... aber vom Grundprinzip her ist das teilw. uneffizient.

    So in etwa würde ich das machen...

    Quellcode

    1. while (ti < 8 and gi < 8) do begin
    2. if tipps[ti] = gezogene[gi] then begin
    3. inc(gi); inc(ti);
    4. continue //treffer
    5. end else if tipps[ti] > gezogene [gi] then begin
    6. inc[gi] // nächstes Element im Array der Gezogenen
    7. end else begin
    8. inc[ti] // nächstes Element im Array der Tipps
    9. end;
    10. end;
  • Jaaaaa.. dann brauchste aber noch eine Abbruchbedingung für die innere Schleife, damit Du nach einem Treffer nicht weitersuchst... :D
    Hach.. immer dieses Schleifenmassacker.. ist es nicht herrlich?

    Wie lange ich schon programmiere? Na ja.. ich weiß nicht so recht, ob ich den Schabernack den ich hier so treibe wirklich "Programmieren" nennen sollte ;)

    Übrigens - mir würde für dieses Lotto-Thematik ein ganz anderer Ansatz vorschweben!
    Wie wäre es mit einem so etwas in der Art mal so als Ansatz:

    Quellcode

    1. type
    2. TLottozahl = record
    3. tip: boolean;
    4. gezogen: boolean;
    5. sonderzahl: boolean;
    6. extrazahl: boolean;
    7. megasuperzahl: boolean;
    8. end;
    9. LottoBox = array [1..49] of TLottozahl;
    10. LottoSchein = array [1..10] of LottoBox;
    Alles anzeigen


    Dann kann man direkt qualifiziert auf jede mögl. Zahl zugreifen und einen Status setzen. Also Index hat man dann ja direkt den Tip oder die gezogene Zahl zur Verfügung.

    Oder:

    Quellcode

    1. type
    2. TLottozahl = (clzGetippt=1, clzGezogen=2, clzGetipptUndGezogen=3);
    3. LottoBox = array [1..49] of TLottozahl;
    4. function ...TippsSetzen...
    5. ...
    6. Tip1:=GetNextTip();
    7. LottoBox[Tip1] := clzGetippt;
    8. ...
    9. end;
    10. function ...ZiehungenSetzen...
    11. ...
    12. Gezogen:=GetNextGezogene();
    13. LottoBox[Gezogen] := LottoBox[Gezogen] + clzGezogen;
    14. ...
    15. end;
    16. function ...ErmittleTipps...
    17. ...
    18. for i:= 1 to 49 do begin
    19. if LottoBox[i] = clzGetipptUndGezogen then Freuen();
    20. end;
    Alles anzeigen


    Hier würde man den einzelnen Feldern dann einen einzigen Status zuweisen... hach na ja.. wie dem auch sei. Kommt immer auf die Anforderung an die gestellt wird.
  • Is ja alles gut und schön und ich bin euch auch sehr dankbar für eure Hilfe, aber man darf nicht vergessen, dass es sich um Schulinformatik handelt. Ich habs jetzt mit eurer Hilfe hinbekommen. Wenns euch interessiert:

    Quellcode

    1. var
    2. Form1: TForm1;
    3. ZAHL: ARRAY[1..7] of integer;
    4. b: ARRAY[1..7] of integer;
    5. c: ARRAY[1..8] of integer;
    6. implementation
    7. {$R *.DFM}
    8. procedure TForm1.langnese(Sender: TObject);
    9. begin
    10. close
    11. end;
    12. procedure TForm1.cricket(Sender: TObject);
    13. var i,j,o,z: integer;
    14. gefunden:boolean;
    15. begin
    16. begin
    17. progressbar1.position:=0;
    18. sleep(100);
    19. progressbar1.position:=10;
    20. sleep(100);
    21. progressbar1.position:=20;
    22. sleep(100);
    23. progressbar1.position:=30;
    24. sleep(100);
    25. progressbar1.position:=40;
    26. sleep(100);
    27. progressbar1.position:=50;
    28. sleep(100);
    29. progressbar1.position:=60;
    30. sleep(100);
    31. progressbar1.position:=70;
    32. sleep(100);
    33. progressbar1.position:=80;
    34. sleep(100);
    35. progressbar1.position:=90;
    36. sleep(100);
    37. progressbar1.position:=100;
    38. end;
    39. RANDOMIZE;
    40. for I:= 1 to 7 do ZAHL[i]:=0;
    41. i:=0;
    42. repeat
    43. gefunden:=false;
    44. z:=random(49)+1;
    45. i:=i+1;
    46. for j:=1 to i do
    47. if z=ZAHL[j] then
    48. begin
    49. gefunden:=true;
    50. i:=i-1;
    51. end;
    52. if not gefunden then ZAHL[i]:=z;
    53. until i=8;
    54. edit7.text:=IntToStr(Zahl[1]);
    55. edit8.text:=inttostr(Zahl[2]);
    56. edit9.text:=inttostr(Zahl[3]);
    57. edit10.text:=inttostr(Zahl[4]);
    58. edit11.text:=inttostr(Zahl[5]);
    59. edit12.text:=inttostr(Zahl[6]);
    60. edit13.text:=inttostr(Zahl[7]);
    61. progressbar1.position:=0;
    62. end;
    63. procedure TForm1.buttonuebernehmenklick(Sender: TObject);
    64. var i,j,hilf: integer;
    65. begin
    66. for I:= 1 to 6 do
    67. for j:=1 to 6 do
    68. if ZAHL[i]<ZAHL[j] then begin
    69. hilf:=ZAHL[i];
    70. ZAHL[i]:=ZAHL[j];
    71. ZAHL[j]:=hilf
    72. end;
    73. edit7.text:=inttostr(ZAHL[1]);
    74. edit8.text:=inttostr(ZAHL[2]);
    75. edit9.text:=inttostr(ZAHL[3]);
    76. edit10.text:=inttostr(ZAHL[4]);
    77. edit11.text:=inttostr(ZAHL[5]);
    78. edit12.text:=inttostr(ZAHL[6]);
    79. end;
    80. procedure TForm1.uebernehmen(Sender: TObject);
    81. var i,j:integer;
    82. ungueltig:boolean;
    83. begin
    84. ungueltig:=false;
    85. try
    86. b[1]:=strtoint(edit6.text);
    87. b[2]:=strtoint(edit5.text);
    88. b[3]:=strtoint(edit4.text);
    89. b[4]:=strtoint(edit3.text);
    90. b[5]:=strtoint(edit2.text);
    91. b[6]:=strtoint(edit1.text);
    92. except
    93. ungueltig:=true;
    94. end;
    95. for i:= 1 to 5 do
    96. for j:=i+1 to 6 do
    97. if b[i]=b[j] then ungueltig:=true;
    98. for i:= 1 to 6 do
    99. if not (b[i] in [1..49]) then ungueltig:=true;
    100. if ungueltig then begin
    101. edit1.clear;
    102. edit2.clear;
    103. edit3.clear;
    104. edit4.clear;
    105. edit5.clear;
    106. edit6.clear;
    107. label7.caption:='Ihr habt versagt, jetzt macht euch vom Acker!';
    108. end;
    109. end;
    110. procedure TForm1.Button5Click(Sender: TObject);
    111. var i,j,richtige,zzahl:integer;
    112. zusatz:string;
    113. begin
    114. richtige:=0;
    115. zzahl:=0;
    116. edit14.Clear;
    117. edit15.Clear;
    118. edit16.clear;
    119. edit17.clear;
    120. edit18.clear;
    121. edit19.clear;
    122. edit20.clear;
    123. for i:= 1 to 7 do c[i]:=0;
    124. for i:= 1 to 6 do
    125. for j:= 1 to 6 do
    126. if ZAHL[i]=b[j] then begin
    127. richtige:=richtige+1;
    128. c[richtige]:=ZAHL[i];
    129. end;
    130. for i:= 1 to 6 do
    131. if ZAHL[i]=b[7] then begin
    132. c[7]:=b[7];
    133. zzahl:=1;
    134. end;
    135. if c[1]<>0 then edit14.text:=inttostr(c[1]);
    136. if c[2]<>0 then edit15.text:=inttostr(c[2]);
    137. if c[3]<>0 then edit16.text:=inttostr(c[3]);
    138. if c[4]<>0 then edit17.text:=inttostr(c[4]);
    139. if c[5]<>0 then edit18.text:=inttostr(c[5]);
    140. if c[6]<>0 then edit19.text:=inttostr(c[6]);
    141. if c[7]<>0 then edit20.text:=inttostr(c[7]);
    142. if (richtige=5) and (zzahl=1) then begin
    143. zusatz:='+ Zusatzzahl!'
    144. end
    145. else begin
    146. richtige:=richtige+zzahl;
    147. zusatz:='!';
    148. end;
    149. label7.caption:=' Sie haben ' + IntToStr(richtige) + ' Richtige' + zusatz;
    150. end;
    151. procedure TForm1.initialisieren(Sender: TObject);
    152. const BAR_CONST = $0409;
    153. begin
    154. SendMessage(ProgressBar1.Handle, BAR_CONST, 0, clYellow);
    155. progressbar1.Brush.color:=clBlack;
    156. end;
    157. END.
    Alles anzeigen
  • ohne es in detail geprüft zu haben muss ich sagen,
    gratuliere !
    sieht aufn ersten blick gut und richtig aus.

    das ist ja das was ich immer sage, erstmal nen prototyp basteln und dann optimieren.

    siehst ja was Metaphore sich so alles überlegt hat.

    bytheway.
    Richtig, die Abbruchbedingung fehlt !!! Hut ab !
  • Also ich muss sagen.. da werd ich direkt neidisch! Ich fand das Schulfach "DV" (so hieß es bei uns damals) tierisch langweilig.. obwohl ich bspw. an DBs und am Programmieren interessiert war.. war der Cobol-Shit damals doch arg langweilig (Was soll ich sagen.. heute muss ich immer noch unter Cobol programmieren). So ein Lotto-Programm ist da doch mal eine richtig nette Aufgabenstellung.. nice!

    Mir gefällt Deine Lösung auch.

    @gisbert.. genau, wenn das Grundgerüst erstmal steht, dann fängt der Spaß erst an :)
  • Ich hätte noch eine letzte bitte :D Wie ihr vielleicht gesehen habt, habe ich eine Progressbar eingebaut, damit das ganze optisch aufwendiger aussieht. Leider habe ich eine eher uneffektive Lösung:

    Quellcode

    1. gressbar1.position:=0;
    2. sleep(100);
    3. progressbar1.position:=10;
    4. sleep(100);
    5. progressbar1.position:=20;
    6. sleep(100);
    7. progressbar1.position:=30;
    8. sleep(100);
    9. progressbar1.position:=40;
    10. sleep(100);
    11. progressbar1.position:=50;
    12. sleep(100);
    13. progressbar1.position:=60;
    14. sleep(100);
    15. progressbar1.position:=70;
    16. sleep(100);
    17. progressbar1.position:=80;
    18. sleep(100);
    19. progressbar1.position:=90;
    20. sleep(100);
    21. progressbar1.position:=100;
    22. end;
    Alles anzeigen


    Kennt ihr vielleicht ne Möglichkeit das zu optimieren. Wäre euch zu größtem Dank verpflichet!

    mfg
  • Ja, ja.. Hauptsache posen :D

    Quellcode

    1. for i:=1 to 10 do begin
    2. sleep(100);
    3. progressbar1.position:=i*10;
    4. end;


    Anekdote: Ein Kollege berichtete mir kürzlich, dass er vor einiger Zeit Anstoss daran nahm, dass sein Patch für eine Software so unglaublich schnell eingespielt war. Der Patch enthielt zwei Registry-Einträge. Für den Patch waren ihm aber ein PT (Projekttag) eingeräumt worden. Er dachte sich: "Hey, die Anwender, die Kack-Noobs... die denken dann das hat nicht geklappt mit dem Patch, wenn das so schnell geht"). Also baute er sich einen Fortschrittsbalken. Dazu eine Funktion die die Größe des Fortschritts (zwischen 1% und 5%) und die Dauer zwischen den einzelnen Fortschritten (zwischen 1-5 Sekunden) festlegte.. damit das authentisch aussieht. So dauerte die "Installation" des Patches also 2-3 Minuten :D ... ach, um noch einen oben drauf zu legen hat er sich ne String-Liste angelegt mit div. Meldungen, die für so eine Installation typisch sind... diese Meldungen gibt er dann passend zu den Fortschritts-Schritten per Zufallsroutine aus (Bspw: "Registry Einträge werden gelesen", "Dateien werden kopiert", "Deinstallation alter Komponenten" etc.)

    Ich fand das toll. Ich habe ihm vorgeschlagen die Software zu vermarkten.
  • Wenn ich den Code jetzt so eingebe wie du sagst, dann sieht man den Fortschrittsbalken gar nicht, weil das so schnell geht und der das dann wieder ruckzuck auf 0 setzt. Gibts keine Möglichkeit das so einzustellen, das das 2-3 sek. oder so dauert?
  • Tut mir leid - das ist für mich nicht nachvollziehbar. Er durchläuft die Schleife 10x und macht bei jedem Loop einen sleep(100)... Das dürfte dann genau eine Sekunde dauern.. müsste das gleiche sein wie bei Dir... Gib's zu, Du hast statt 100 10 eingegeben... :D
  • Hast recht, eben hast der das aber wirklich sofort abgespielt ohne das man was geshen hat. naja, egal. hab jetzt en perfektes lotto-programm womit ich meinen info-lehrer mit beeindrucken kann.

    Vielen Dank euch beiden!!!!

    mfg