Einzelnen Beitrag anzeigen

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