![]() |
Labelfeld mit Zahlen sortieren
Also ich habe folgendes Problem:
Muss dazu sagen das ich noch blutiger Anfänger bin... Ich hab auf einem Labelfeld 6 Zahlen stehen und will diese sortieren... und hab keine Ahnung wie ich das machen soll.. muss ich da ne eigene Prozedur schreiben oder geht das auch mit ner FOR-Schleife... Ich bin verzweifelt... bitte helft mir!!! |
Re: Labelfeld mit Zahlen sortieren
Herzlich Willkommen in der Delphi-PRAXiS.
Was verstehst du unter einem Labelfeld? Wie sind denn die 6 Zahlen dahin gekommen? Sind das die Gewinnzahlen von der nächsten Lottoziehung? Kann ich die auch haben? Kannst du ein paar Code-Zeilen zeigen? Freundliche Grüße vom marabu |
Re: Labelfeld mit Zahlen sortieren
Schau dir mal was zum Thema Bubblesort an
mfg Schaedel |
Re: Labelfeld mit Zahlen sortieren
Zitat:
zu Sortieralgorithmen wirst du eine Menge in der DP finden, denke dass marabu da auch ein guter Ansprechpartner ist (wie für so ziemlich alle Fragen). Aber du solltest wirklich erst erklären, was genau ein Labelfeld ist. Versuche immer möglichst genau dein Problem zu beschreiben, dass erleichtert es einfach dir zu helfen. Was for-Schleife vs. eigene Prozedur angeht, ich weiß ja nicht wie du das siehst, aber die for-Schleife sollte schon in eine Prozedur (dass dürfte auch eine eigene sein :wink:) Aber wie gesagt, zum Sortieren gibt es mehrere Möglichkeiten und bei 6 Zahlen hast du eigentlich freie Auswahl (da wird nicht sonderlich viel besser oder schlechter sein). Gruß Der Unwissende |
Re: Labelfeld mit Zahlen sortieren
Lebersalz hat in einer PM an mich geschrieben Genau ich bin grad dabei eine Lottoziehung zu programmieren...Die eigentliche Lottoziehung hab ich auch schon programmiert und dort werden sie auch sortiert ausgegeben... mein problem ist jetzt das ich den eigenen Tipp über 6 Spin Edit Felder gemacht hab und die mit einem TLabelfeld verknüpft hab! wenn man jetzt aber die Zahlen unsortiert angibt werden diese natürlich auch unsortiert ausgegeben... Hab das Labelfeld mit den Spineditfeldern folgendermaßen verbunden; Label4.caption:=Spinedit1 + Spinedit2+...bis Spinedit6 wenn jetzt Spinedit1 größer ist als Spinedit2 und Spinedit6 ebenfalls noch kleiner sind die ja unsortiert ... wie krieg ich dieses Labelfeld jetzt sortiert??? Du sortierst nicht den Schriftzug auf dem Label, sondern die sechs Zahlen deiner Ziehung - das ist der Trick. Damit du sie sortieren kannst packst du sie alle in einen Container, z.B. ein Array of Integer:
Delphi-Quellcode:
Wenn du damit fertig bist, verwendest du vielleicht den BubbleSort von Schaedel:
var
aZiehung: array of integer; begin SetLength(aZiehung, 6); aZiehung[0] := SpinEdit1.Value; aZiehung[1] := SpinEdit2.Value; // ... den Rest kannst du schon end;
Delphi-Quellcode:
Und zum Schluß machst du aus all diesen Zahlen dann wieder eine Zeichenkette:
procedure BubbleSort(var Zahlen: array of integer);
var i, j, zahl: integer; begin // vom ersten bis zum vorletzten Eintrag for i := Low(Zahlen) to Pred(High(Zahlen)) do // vom nächsten bis zum letzten Eintrag for j := Succ(i) to High(Zahlen) do // Ordnung prüfen if Zahlen[i] > Zahlen[j] then begin // vertauschen zahl := Zahlen[i]; Zahlen[i] := Zahlen[j]; Zahlen[j] := zahl; end; end;
Delphi-Quellcode:
Freundliche Grüße vom marabu
function ErgebnisStr(const ergebnis: array of integer): String;
var i: Integer; begin for i := Low(ergebnis) to High(ergebnis) do if Result = '' then Result := IntToStr(ergebnis[i]) else Result := Result + ' ' + IntToStr(ergebnis[i]); end; |
Re: Labelfeld mit Zahlen sortieren
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:
So und wo soll ich jetzt hier Bubblesort einbinden???
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; :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 ![]()
Delphi-Quellcode:
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:
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;
Delphi-Quellcode:
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):
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;
Delphi-Quellcode:
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:
// 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;
Delphi-Quellcode:
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?
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;
Delphi-Quellcode:
Freundliche Grüße vom marabu
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; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:17 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz