Einzelnen Beitrag anzeigen

Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#36

AW: aus einem Array die kleinste Zahl herausfinden

  Alt 8. Jul 2013, 13:09
In den Projektoptionen unter "Compilieren" lässt sich u.A. die Bereichsprüfung einschalten. Und hier dann noch meine angepasste Routine für Fließkommazahlen und dynamische Arrays:
Delphi-Quellcode:
type
  TDoubleArray = array of double;

procedure MinimumFirst(const Src: TDoubleArray; out Dest: TDoubleArray);
var
  (* Variable für die kleinste Zahl im Array *)
  Minimum: double;
  (* Variable für den Index der kleinsten Zahl innerhalb des Array *)
  IndexOfMinimum: integer;
  (* Laufvariable für die Schleife *)
  i: integer;
  (* aktueller Index im Zielarray *)
  DestIndex: integer;
begin
  Assert(Length(Src) > 0, 'Ein leeres Array hat keinen Minimalwert');
  (* Ausgabe auf gleiche Länge wie Eingabe setzen *)
  SetLength(Dest, Length(Src));
  (* Initial setzen wir Minimum sowie dessen Index auf das erste Element im Array *)
  Minimum := Src[Low(Src)];
  IndexOfMinimum := Low(Src);
  (* Nun den Rest des Array durchgehen, vergleichen und Variablen ggf. anpassen *)
  for i := Low(Src) + 1 to High(Src) do
    if Src[i] < Minimum then
      begin
        Minimum := Src[i];
        IndexOfMinimum := i;
      end;
  DestIndex := Low(Dest);
  (* Nun in das Ausgabe-Array schreiben *)
  (* Zuerst ab der kleinsten Zahl bis zum Ende *)
  for i := IndexOfMinimum to High(Src) do
    begin
      Dest[DestIndex] := Src[i];
      inc(DestIndex);
    end;
  (* Nun noch die ggf. verbliebenen *)
  for i := Low(Src) to IndexOfMinimum - 1 do
    begin
      Dest[DestIndex] := Src[i];
      inc(DestIndex);
    end;
end;

(* Testaufruf *)
procedure TFormTest.ButtonTestClick(Sender: TObject);
var
  zahl, Dest: TDoubleArray;
  d: double;
begin
  SetLength(zahl, 8);
  try
    zahl[0] := StrToFloat(Edit1.Text);
    zahl[1] := StrToFloat(Edit2.Text);
    zahl[2] := StrToFloat(Edit3.Text);
    zahl[3] := StrToFloat(Edit4.Text);
    zahl[4] := StrToFloat(Edit5.Text);
    zahl[5] := StrToFloat(Edit6.Text);
    zahl[6] := StrToFloat(Edit7.Text);
    zahl[7] := StrToFloat(Edit8.Text);
  
    MinimumFirst(zahl, Dest);
  
    Edit1.Text := FloatToStr(Dest[0]);
    Edit2.Text := FloatToStr(Dest[1]);
    Edit3.Text := FloatToStr(Dest[2]);
    Edit4.Text := FloatToStr(Dest[3]);
    Edit5.Text := FloatToStr(Dest[4]);
    Edit6.Text := FloatToStr(Dest[5]);
    Edit7.Text := FloatToStr(Dest[6]);
    Edit8.Text := FloatToStr(Dest[7]);
  finally
    zahl := nil;
    Dest := nil;
  end;
end;
[edit] Seid Ihr sicher, dass es sinnvoll ist, min mit einem fixen Wert vorzubelegen? Wenn alle Zahlen im Array > 1000 sind, gibt es keinen Minimalwert, das ist aber nicht schön. [/edit]
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen

Geändert von DeddyH ( 8. Jul 2013 um 13:38 Uhr) Grund: Assertion und Ressourcenschutzblock eingefügt
  Mit Zitat antworten Zitat