Hi.
Lebersalz hat in einer PM an mich geschrieben
Nun hast du mich ja total verwirrt!!!
Also nochmal zusammengefasst: Ich habe sechs Spineditfelder mit denen ich sechs zahlen festlege!
Die übernehme ich mit einem Button.click in ein TLabel ... hier ist der quelltext dazu:
Delphi-Quellcode:
procedure TForm1.Button3Click(Sender: TObject);
begin
Label4.Caption := SpinEdit1.Text+(' ') + SpinEdit2.Text
+ (' ') + SpinEdit3.Text + (' ') + SpinEdit4.Text
+ (' ')+ SpinEdit5.Text + (' ') + Spinedit6.Text;
Label1.caption:='';
If SpinEdit1.Text = SpinEdit2.Text
Then Showmessage('Keine gleichen Zahlen erlaubt!')
Else
IF SpinEdit1.Text = SpinEdit3.Text
Then Showmessage('Keine gleichen Zahlen erlaubt!')
Else
IF SpinEdit1.Text = SpinEdit4.Text
Then Showmessage('Keine gleichen Zahlen erlaubt!')
Else
IF SpinEdit1.Text = SpinEdit5.Text
Then Showmessage('Keine gleichen Zahlen erlaubt!')
Else
IF SpinEdit1.Text = SpinEdit6.Text
Then Showmessage('Keine gleichen Zahlen erlaubt!')
Else
IF SpinEdit2.Text = SpinEdit3.Text
Then Showmessage('Keine gleichen Zahlen erlaubt!')
Else
IF SpinEdit2.Text = SpinEdit4.Text
Then Showmessage('Keine gleichen Zahlen erlaubt!')
Else
IF SpinEdit2.Text = SpinEdit5.Text
Then Showmessage('Keine gleichen Zahlen erlaubt!')
Else
IF SpinEdit2.Text = SpinEdit6.Text
Then Showmessage('Keine gleichen Zahlen erlaubt!')
Else
IF SpinEdit3.Text = SpinEdit4.Text
Then Showmessage('Keine gleichen Zahlen erlaubt!')
Else
IF SpinEdit3.Text = SpinEdit5.Text
Then Showmessage('Keine gleichen Zahlen erlaubt!')
Else
IF SpinEdit3.Text = SpinEdit6.Text
Then Showmessage('Keine gleichen Zahlen erlaubt!')
Else
IF SpinEdit4.Text = SpinEdit6.Text
Then Showmessage('Keine gleichen Zahlen erlaubt!')
Else
IF SpinEdit4.Text = SpinEdit6.Text
Then Showmessage('Keine gleichen Zahlen erlaubt!')
Else
IF SpinEdit5.Text = SpinEdit6.Text
Then Showmessage('Keine gleichen Zahlen erlaubt!')
Else Button1.Visible:=true;
end;
So und wo soll ich jetzt hier Bubblesort einbinden???
:duck:
Ich hab gesagt ich bin blutiger anfänger!!!
Ob die Verwendung von SpinEdit-Controls so sinnvoll ist? Hat das dein Lehrer vorgegeben? Ist aber eigentlich egal.
Der Algorithmus für eine Lottoziehung 6 aus 49 ist auf der
Homepage von
waldteufel ganz gut beschrieben. Dort habe ich auch recht effizienten Pascal-Code zur Ermittlung der sechs zufälligen Zahlen gefunden:
Delphi-Quellcode:
function Ziehung(const Anzahl, Gesamt: Integer): TIntegerDynArray;
var
i, iRandom: integer; // Laufvariable
Vorrat: TIntegerDynArray; // Vorratsvektor
begin
// Vorratsvektor dimensionieren
SetLength(Vorrat, Gesamt);
// Vektor initialisieren
for i := Low(Vorrat) to High(Vorrat) do
Vorrat[i] := Succ(i);
// Ergebnisvektor dimensionieren
SetLength(Result, Anzahl);
// Soviele Zahlen übernehmen wie nötig
for i := Low(Result) to High(Result) do
begin
// eine zufällige Position in dem
// durch die Laufvariable verkürzten
// Vektor auswählen
iRandom := Random(Gesamt - i);
// Zahl an dieser Position übernehmen
Result[i] := Vorrat[iRandom];
// Letzte Zahl des Vorrats an diese
// Position verschieben
Vorrat[iRandom] := Vorrat[High(Vorrat) - i];
end;
// Aufsteigende Sortierung
BubbleSort(Result);
end;
Ich hatte nicht ohne Grund gefragt, wie deine Zahlen in die SpinEdits kommen. Deine Prüfungen zeigen mir, dass du die Zahlen in den SpinEdits nicht gut vorbereitet hast, da du noch Doppelte erwartest. Durch den hier gezeigten Code erhältst du schon eine gültige Ziehung, allerdings in unsortiertem Zustand. Wenn du willst, dann kannst du das Ergebnis auch noch in deine SpinEdit-Controls eintragen:
Delphi-Quellcode:
procedure TLotteryForm.DrawButtonClick(Sender: TObject);
var
ida: TIntegerDynArray;
begin
// Ziehungsergebnis 6 aus 49 feststellen
ida := Ziehung(6, 49);
// Eintragen in SpinEdit-Controls
SpinEdit1.Value := ida[0];
SpinEdit2.Value := ida[1];
SpinEdit3.Value := ida[2];
SpinEdit4.Value := ida[3];
SpinEdit5.Value := ida[4];
SpinEdit6.Value := ida[5];
// Vektor in Zeichenkette umbauen und anzeigen
DisplayPanel.Caption := NumbersToStr(ida);
end;
Jetzt kommt die Sortierung. Erst durch die Speicherung deiner Zufallszahlen in einem Vektor kannst du elegant einen Sortier-Algorithmus formulieren (
EDIT Abbruch der inneren Schleife):
Delphi-Quellcode:
// uses Types;
procedure BubbleSort(var ida: TIntegerDynArray);
var
i, iInner, iOuter: Integer;
begin
// vom zweiten bis zum letzten Eintrag
for iOuter := Succ(Low(ida)) to High(ida) do
// für alle Einträge unterhalb des aktuellen
for iInner := Pred(iOuter) downto Low(ida) do
if ida[iInner] > ida[Succ(iInner)] then
begin // Vertauschen um Teilvektor zu ordnen
i := ida[Succ(iInner)];
ida[Succ(iInner)] := ida[iInner];
ida[iInner] := i;
end else Break; // Teilvektor ist sortiert
end;
Und wenn du dann noch deine Zahlen in eine Zeichenkette umwandeln willst, damit du sie auf einem Label als Caption anzeigen kannst, dann geht das mit dem Eregbnisvektor viel einfacher:
Delphi-Quellcode:
function NumbersToStr(const ida: TIntegerDynArray): String;
var
i: Integer;
begin
// Ausgabe-Zeichenkette initialisieren
Result := '';
// Jede Zahl aus sortiertem Vektor ...
for i := Low(ida) to High(ida) do
// ... in Leerzeichen einfassen und
// an die Ausgabe-Zeichenkette anhängen
Result := Result + ' ' + IntToStr(ida[i]) + ' ';
end;
Beim direkten Zugriff auf deine SpinEdit-Controls sieht das momentan noch ganz überschaubar aus, aber bei 100 oder 1000 SpinEdits wäre ein Ansatz über eine Schleife sicher angenehmer - oder?
Delphi-Quellcode:
function NumbersToStr(const ida: TIntegerDynArray): String;
begin
Result
:= IntToStr(SpinEdit1.Value) + ' '
+ IntToStr(SpinEdit2.Value) + ' '
+ IntToStr(SpinEdit3.Value) + ' ';
+ IntToStr(SpinEdit4.Value) + ' ';
+ IntToStr(SpinEdit5.Value) + ' ';
+ IntToStr(SpinEdit6.Value);
end;
Freundliche Grüße vom marabu