Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Frage zu Lottozahlengenerator (https://www.delphipraxis.net/133411-frage-zu-lottozahlengenerator.html)

Siggy 1. Mai 2009 12:55


Frage zu Lottozahlengenerator
 
Hallo Community,

Wir sollen einen Lottozahlengenerator in der Schule programmieren.
Nun habe ich durch langes rumstöbern was gefunden...

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);

begin
  for i:= 1 to 49 do Zahlen[i]:=false;
  for i:=1 to 6 do begin
   repeat
    z:=random(49)+1
   until Zahlen[z] = false;
   Zahlen[z]:=true;
  end;
  Edit1.Text:='';
  for i:=1 to 49 do
   if Zahlen[i] then memo1.Lines.add (Inttostr(i));
end;
Nur leider versteh ich so ziemlich gar nichts bei dem Code.
Kann mir den jemand verständlich erklären?
So alles bisschen ausseinanderpflücken und dann vlt so immer 2 Zeilen zusammenfassen in verständliches "Normalodeutsch" ? :D

Weitere Fragen:
Gibt es eine Möglichkeit, dass ich die Zahlen nicht alle auf einmal in dem Memo ausgebe? Sondern vor Jede Zahl noch eine Zeile oder so einfügen kann, sowas wie:
Zahl1: 23
Zahl2: 12

usw.
Geht das? Und wenn ja, wie?


mfg Siggy

mkinzler 1. Mai 2009 13:00

Re: Frage zu Lottozahlengenerator
 
Scheinbar bedeutet heute Programmieren suchen nach einer Copy&Paste-Lösung! :wall:
Überleg dir doch einfach die Vorgehensweise, wenn du das mit Blatt und Stift lösen müsstest und versuche dann die Lösung in Delphi umzusetzen!

worker 1. Mai 2009 13:05

Re: Frage zu Lottozahlengenerator
 
Zahlen wird wohl ein Array[1..49] of Boolean sein. Die Indizes 1-49 stellen die Werte der deutschen Lottozahlen dar.
Als erstes werden alle Elemente des Arrays auf False gesetzt, was wohl einem 'nicht gezogen' entspricht.

Anschließend werden 6 Zahlen in einer for-Schleife 'gezogen', in dem mittels einer repeat..unitl-Schleife solange ein Zufallswert zwischen 1 und 49 ermittelt wird, bis ein Index gefunden wird, dessen Element im Array auf False steht, um Doppelziehungen zu vermeiden. Dieser wird dann auf True gesetzt, also als 'gezogen' gekennzeichnet.

Abschließend wird das komplette Array durchgerattert, und alle Indizes, deren Element True ist, in das Memo geschrieben.

Meiner Meinug nach nicht optimal, aber da solltest Du Dir selber Gedanken machen.

Zu Deiner Frage:

Delphi-Quellcode:
var
   iCounter: Integer;
[...]
iCounter := 1;
for i := 1 to 49 do begin
   memo1.Lines.add (Format('Zahl %d: %d', [iCounter, i]));
   Inc(iCounter);
end;
Edit: CopyPaste-Fehler korrigiert

Siggy 1. Mai 2009 13:09

Re: Frage zu Lottozahlengenerator
 
Ich hatte erst eine Lösung die auch funktioniert hat.
Die sah so aus:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
a,b,c,d,e,f :integer;
begin
randomize;
repeat
  a:= random (49);
  b:= random (49);
  c:= random (49);
  d:= random (49);
  e:= random (49);
  f:= random (49);

until (a<>b) and (a<>c) and (a<>d) and (a<>e) and (a<>f)
and  (b<>c) and (b<>d) and (b<>e) and (b<>f)
and  (c<>d) and (c<>d) and (c<>f)
and  (d<>e) and (d<>f)
and  (e<>f);


edit1.Text := inttostr (a);
edit2.Text := inttostr (b);
edit3.Text := inttostr (c);
edit4.Text := inttostr (d);
edit5.Text := inttostr (e);
edit6.Text := inttostr (f);

Die auch funktioniert hat...
Allerdings ist die ja sehr unschön und ein ewig langer Text...
Unser Lehrer hat gemeint, dass wir das mit Arrays lösen sollen, allerdings hab ich davon keine Ahnung und daher hab ich hier gefragt ob mir das jemand anhand meines Lottogenerators erklären könnte.


Siggy

DeddyH 1. Mai 2009 13:53

Re: Frage zu Lottozahlengenerator
 
OK, hier mal die Erklärung:
Zitat:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);

begin
  for i:= 1 to 49 do Zahlen[i]:=false;
  for i:=1 to 6 do begin
   repeat
    z:=random(49)+1
   until Zahlen[z] = false;
   Zahlen[z]:=true;
  end;
  Edit1.Text:='';
  for i:=1 to 49 do
   if Zahlen[i] then memo1.Lines.add (Inttostr(i));
end;

Zahlen ist ein Array mit 49 Boolean-Elementen (also true oder false). In der ersten Zeile werden diese Elemente alle auf false gesetzt. Nun wird 6 mal Folgendes gemacht: es wird eine zufällige Zahl zwischen 1 und 49 gezogen. Dies wiederholt sich solange, bis das Array-Element an der gezogenen Position false ist. Im Anschluss daran wird dieses auf true gestellt. Ist dies 6 mal erfolgt, wird das Array erneut durchlaufen und die Position aller Elemente ausgegeben, an denen das jeweilige Element auf true steht. Das sieht dann etwa so aus:
Code:
//alle Elemente haben zu Beginn wohl einen zufälligen Wert
0111001101011001110011000010010000011010000111101

//nach der 1. Codezeile
0000000000000000000000000000000000000000000000000

//nach der 2. Schleife sind 6 zufällige Elemente auf true gesetzt
0010001000000100001100000000010000000000000000000

//in der letzten Schleife ergibt das dann folgende Lottozahlen
3 7 14 19 20 30

Siggy 1. Mai 2009 14:16

Re: Frage zu Lottozahlengenerator
 
Erst einmal vielen Dank für die superschnelle Hilfe :)
Nun habe ich so ziemlich alles verstanden, denke ich.

Allerdings funktioniert eines nicht:

Delphi-Quellcode:
var
   iCounter: Integer;
[...]
iCounter := 1;
for i := 1 to 49 do begin
   memo1.Lines.add (Format('Zahl %d: %d', [IntToStr(iCounter),IntToStr(i)]));
   Inc(iCounter);
end;

Wenn ich das einfüge und das Programm starte und dann meinen Button anklicke kommt die Nachricht:

"Format '%d' ungültig oder nicht kompatibel mit Argument."


Liegt das vielleicht daran, dass ich Turbo Delphi habe?
Wenn ja, gibt es eine andere Möglichkeit?:)


mfg

Siggy

fwsp 1. Mai 2009 14:21

Re: Frage zu Lottozahlengenerator
 
Delphi-Quellcode:
memo1.Lines.add (Format('Zahl %d: %d', [iCounter, IntToStri]));
probier mal das.

//edit
%d bedeutet, dass er eine dezimalzahl (integer) erwartet, und du wolltest ihm nen string geben. mochte er net.

Cyf 1. Mai 2009 14:36

Re: Frage zu Lottozahlengenerator
 
Du könntest als Zähler natürlich auch einfach das i verwenden, das ohnehin schon da ist. :wink:

Siggy 1. Mai 2009 19:07

Re: Frage zu Lottozahlengenerator
 
Zitat:

Zitat von fwsp
Delphi-Quellcode:
memo1.Lines.add (Format('Zahl %d: %d', [iCounter, IntToStri]));
probier mal das.

//edit
%d bedeutet, dass er eine dezimalzahl (integer) erwartet, und du wolltest ihm nen string geben. mochte er net.


Funktioniert genau so wenig ;)
Naja zur Not muss ich halt auf die unschönere Variante zugreifen und jede Zahl in einem Extra Edit oder Label ausgeben.



Funktioniert sowas eig auch mit Buchstaben?
Ich denke da an sowas wie die DNA, sprich ein String einer bestimmten Länge (10000 oder mehr) nur mit den Buchstaben A,C,G und T (Adenin,Cytosin,Guanin und Thymin)
Und der soll eine zufällige Reihenfolge erstellen:

ACTGAAACTGGCTGCACTAAGTCA....


Wenn dies möglich wäre, würde ich mich sehr freuen wenn mir jemand dazu was sagen könnte :)

blablab 1. Mai 2009 21:40

Re: Frage zu Lottozahlengenerator
 
Also ich würds so machen wie die Lottofee. Du hast 49 Bälle mit Zahlen von 1 bis 49. Diese mischst du durch und ziehst die ersten 6. Also n array von 1..49 durchmischen und die ersten 6 elemente sind dann deine Lösung. Ich find das ist einfach zu verstehen und auch die Umsetzung ist nicht wirklich kompliziert...


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:20 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz