Delphi-PRAXiS
Seite 4 von 6   « Erste     234 56      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi aus einem Array die kleinste Zahl herausfinden (https://www.delphipraxis.net/139757-aus-einem-array-die-kleinste-zahl-herausfinden.html)

DeddyH 8. Jul 2013 12:43

AW: aus einem Array die kleinste Zahl herausfinden
 
Dazu hatte ich doch schon eine komplette Lösung gepostet.

Foxi1896 8. Jul 2013 12:58

AW: aus einem Array die kleinste Zahl herausfinden
 
Hatte es ja auch ... nur mein Betreuer möchte es mit den Edits haben.



Das hier ist schon fast so wie ich es haben möchte nur die Werte wo es wieder von vorne anfängt sind Falsch.

Habe es mit 5 , 8 , 14 , 3 , 8 , 10 , 16 , 20 getestet.
Raus kommt: 3 , 8 , 10 , 16 , 20 , 8,50548.. , 3,531622 , 1,370997...
Was macht er mit den Werten?


Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
  var zahl : array[1..8] of real;
  i,merker : Integer;
  min : Real;

begin
  zahl[1] := StrToFloat(Edit1.Text);
  zahl[2] := StrToFloat(Edit2.Text);
  zahl[3] := StrToFloat(Edit3.Text);
  zahl[4] := StrToFloat(Edit4.Text);
  zahl[5] := StrToFloat(Edit5.Text);
  zahl[6] := StrToFloat(Edit6.Text);
  zahl[7] := StrToFloat(Edit7.Text);
  zahl[8] := StrToFloat(Edit8.Text);

  min:=1000;
  for i:= 1 to 8 do
  begin
    if zahl[i] < min then
    begin
      min:=zahl[i];
      merker:=i;
    end;
  end;
  label1.caption:=FloatToStr(min);
  label2.caption:=IntToStr(merker);

  Edit1.Text := FloatToStr(zahl[merker+0]);
  Edit2.Text := FloatToStr(zahl[merker+1]);
  Edit3.Text := FloatToStr(zahl[merker+2]);
  Edit4.Text := FloatToStr(zahl[merker+3]);
  Edit5.Text := FloatToStr(zahl[merker+4]);
  Edit6.Text := FloatToStr(zahl[merker+5]);
  Edit7.Text := FloatToStr(zahl[merker+6]);
  Edit8.Text := FloatToStr(zahl[merker+7]);


end;


EDIT: Hab den Fehler nur keine Lösung: ich zähle ja immer weiter mit +5 +6 +7 ... aber wie mach ich es das es wieder von vorne anfängt?

DeddyH 8. Jul 2013 13:01

AW: aus einem Array die kleinste Zahl herausfinden
 
Schalt doch mal die Bereichsprüfung ein, dann siehst Du, dass Du locker hinter dem Array weiterliest. Und was das Ganze mit Edits zu tun haben soll, will mir nicht in den Kopf, dem Array ist es doch völlig wurscht, wo die Daten herkommen, ob aus Edits, einer ComboBox oder aus einer Datei ausgelesen.

Foxi1896 8. Jul 2013 13:05

AW: aus einem Array die kleinste Zahl herausfinden
 
Wie schalte ich die Bereichsprüfung ein?
Ok, das mit dem Edits und so ist auch egal ... hab ich eingesehen.. ich benutze hier ja auch gerade Array.
Aber mir fehlt das know how für gewisse Befehle wie Bereichsprüfung. Verstehen tu ich schon halbwegs was hier steht nur die Ausführung.

baumina 8. Jul 2013 13:07

AW: aus einem Array die kleinste Zahl herausfinden
 
Das ist jetzt zwar keine schöne Programmierung, aber so verstehst du es sicher am Besten:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
   var zahl : array[1..8] of real;
   i,merker : Integer;
   min : Real;

begin
   zahl[1] := StrToFloat(Edit1.Text);
   zahl[2] := StrToFloat(Edit2.Text);
   zahl[3] := StrToFloat(Edit3.Text);
   zahl[4] := StrToFloat(Edit4.Text);
   zahl[5] := StrToFloat(Edit5.Text);
   zahl[6] := StrToFloat(Edit6.Text);
   zahl[7] := StrToFloat(Edit7.Text);
   zahl[8] := StrToFloat(Edit8.Text);

   min:=1000;
   for i:= 1 to 8 do
   begin
     if zahl[i] < min then
     begin
       min:=zahl[i];
       merker:=i;
     end;
   end;
   label1.caption:=FloatToStr(min);
   label2.caption:=IntToStr(merker);

   i := merker;
   Edit1.Text := FloatToStr(zahl[i]);

   i := i + 1;
   If i > 8 then i := 1; // dann vorne im Array anfangen
   Edit2.Text := FloatToStr(zahl[i]);

   i := i + 1;
   If i > 8 then i := 1; // dann vorne im Array anfangen
   Edit3.Text := FloatToStr(zahl[i]);

   i := i + 1;
   If i > 8 then i := 1; // dann vorne im Array anfangen
   Edit4.Text := FloatToStr(zahl[i]);

   i := i + 1;
   If i > 8 then i := 1; // dann vorne im Array anfangen
   Edit5.Text := FloatToStr(zahl[i]);

   i := i + 1;
   If i > 8 then i := 1; // dann vorne im Array anfangen
   Edit6.Text := FloatToStr(zahl[i]);

   i := i + 1;
   If i > 8 then i := 1; // dann vorne im Array anfangen
   Edit7.Text := FloatToStr(zahl[i]);

   i := i + 1;
   If i > 8 then i := 1; // dann vorne im Array anfangen
   Edit8.Text := FloatToStr(zahl[i]);


end;

DeddyH 8. Jul 2013 13:09

AW: aus einem Array die kleinste Zahl herausfinden
 
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]

Foxi1896 8. Jul 2013 13:26

AW: aus einem Array die kleinste Zahl herausfinden
 
@baumina: Danke, stimmt so verstehte ich es =)
Was könnte man den machen um es profensioneller aussehen zu lassen (auch wenn es mir eigentlich egal ist wie es aussieht.

@DeddyH: Geht das auch bei Lazarus? Hab gerade mal in den Einstellungen geschaut und finde nichts was dem entspricht.

Wenn es eine leichte Methode gibt. Nicht Abhängig vom Fixen Wert zu sein wäre es super. Wenn nicht auch egal bau ich halt eine zweiten/dritten Button ein (Meine Werte könnten 8 , 12 , 16 werden.)

baumina 8. Jul 2013 13:29

AW: aus einem Array die kleinste Zahl herausfinden
 
Professioneller ist sicherlich DeddyH's Lösung. An der ist meines Erachtens nichts auszusetzen.

Foxi1896 8. Jul 2013 13:39

AW: aus einem Array die kleinste Zahl herausfinden
 
DANK EUCH!!!
Jetzt versteh ich glaube auch die andere Variante.

DeddyH 8. Jul 2013 13:39

AW: aus einem Array die kleinste Zahl herausfinden
 
Danke für die Blumen, ich habe den Code trotzdem noch leicht modifiziert. Leider konnte ich nicht herausfinden, wie man bei Lazarus die Breichsprüfung aktiviert bzw. deaktiviert, vermutlich geht es über Compilerschalter.


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:04 Uhr.
Seite 4 von 6   « Erste     234 56      

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