AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Labelfeld mit Zahlen sortieren

Ein Thema von Lebersalz · begonnen am 14. Jan 2006 · letzter Beitrag vom 15. Jan 2006
Antwort Antwort
Lebersalz

Registriert seit: 14. Jan 2006
1 Beiträge
 
Delphi 6 Personal
 
#1

Labelfeld mit Zahlen sortieren

  Alt 14. Jan 2006, 17:28
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!!!
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

Re: Labelfeld mit Zahlen sortieren

  Alt 14. Jan 2006, 18:06
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
  Mit Zitat antworten Zitat
Benutzerbild von Schaedel
Schaedel

Registriert seit: 5. Jan 2006
Ort: Saarland
174 Beiträge
 
Delphi 2007 Professional
 
#3

Re: Labelfeld mit Zahlen sortieren

  Alt 14. Jan 2006, 19:05
Schau dir mal was zum Thema Bubblesort an

mfg Schaedel
Michael S.
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#4

Re: Labelfeld mit Zahlen sortieren

  Alt 14. Jan 2006, 19:11
Zitat von Schaedel:
Schau dir mal was zum Thema Bubblesort an
Hi,
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 )

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
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#5

Re: Labelfeld mit Zahlen sortieren

  Alt 14. Jan 2006, 20:56
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:
var
  aZiehung: array of integer;

begin
  SetLength(aZiehung, 6);
  aZiehung[0] := SpinEdit1.Value;
  aZiehung[1] := SpinEdit2.Value;
  // ... den Rest kannst du schon
end;
Wenn du damit fertig bist, verwendest du vielleicht den BubbleSort von Schaedel:

Delphi-Quellcode:
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;
Und zum Schluß machst du aus all diesen Zahlen dann wieder eine Zeichenkette:

Delphi-Quellcode:
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;
Freundliche Grüße vom marabu
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#6

Re: Labelfeld mit Zahlen sortieren

  Alt 15. Jan 2006, 13:31
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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:52 Uhr.
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