Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Schleifen-Probleme (https://www.delphipraxis.net/205768-delphi-schleifen-probleme.html)

Kegasetu 14. Okt 2020 11:15

Delphi Schleifen-Probleme
 
Hallo Zusammen.
Ich bin gerade an einem Programm, aber kann meinen Fehler nicht finden.

Zu mir, ich bin absoluter Amateur und habe seit einigen Jahren nicht mehr programmiert.
Nun bin ich leider dazu gezwungen ein kleines Programm zu schreiben.

Im Grund ist es gar nicht so kompliziert. Es geht um Schleifen. Ich habe 5 verschiedene Werte welche eingegeben werden müssen. Dann wird gerechnet, solange bis die ausgerechneten Werte mit vordefinierten Werten übereinstimmen.

Hier der Code:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);

var ay, by, cy, l1, l2, f1, lf1, f2, lf2, lges, suche, t: extended;

begin

ay:= 0;
by:= 0;
cy:= 0;
l1:= 0.1;
l2:= 0.1;

f1:= strtofloat(edit1.Text);
f2:= strtofloat(edit2.Text);
lf1:= strtofloat(edit3.Text);
lf2:= strtofloat(edit4.Text);
lges:= strtofloat(edit5.Text);

suche:= (f1+f2)/3;

while l1<>lges do
begin
  while l2<>lges do
  begin
    ay:= f1*(1-(lf1*2/l1));
    by:= -f1 +(f1*lf1*2/l1)+f2+(f1*lf1-f2*(lf2-l1))/l2+f1 ;
    cy:= -1*(f1*(l1+2*l2)*lf1-f2*l1*(l1-l2-lf2))/(l1*l2);
    label4.caption:= floattostr(t);
    t:= t+1;
    if (ay <= 1.05 * suche) or (ay >= 1.05 * suche) then
     if (by <= 1.05 * suche) or (by >= 1.05 * suche) then
      if (by <= 1.05 * suche) or (by >= 1.05 * suche) then
      begin
        label1.Caption:= floattostr(ay);
        label2.Caption:= floattostr(by);
        label3.Caption:= floattostr(cy);
        end;


    l2:= l2 + 0.1;
  end;
  l1:= l1 + 0.1;
  l2:= l1 + 0.1;
end;












end;



end.
Hier meine Testwerte:
f1 = 500
f2 = 200
lf1 = 2
lf2 = 5
lges = 10


Leider hängt sich das Programm sofort auf. Label 4 soll mir zeigen, wie oft die Schleife durchlaufen wurde, aber auch hier passiert nicht. Hat jemand eine Lösung?

Vielen Dank für Unterstützung!

sakura 14. Okt 2020 11:27

AW: Delphie Schleifen-Probleme
 
Du arbeitest mit Fließkommazahlen, welche i.A. nicht genau genug sind, um diese mit festen Ergebnissen zu vergleichen.
Delphi-Quellcode:
while l1<>lges do
begin
  while l2<>lges do
Versuche anstatt
Delphi-Quellcode:
while l1<lges do
begin
  while l2<lges do
...:cat:...

P.S.: Die Labels werden sich erst nach der Berechnung neu zeichnen.

TiGü 14. Okt 2020 11:34

AW: Delphie Schleifen-Probleme
 
Delphi-Quellcode:
uses
  Math;


procedure TForm1.Button1Click(Sender: TObject);
var
  ay, by, cy, l1, l2, f1, lf1, f2, lf2, lges, suche: Extended;
  t: Integer;

  function IsValueValid(const AValue, ARange: Extended): Boolean;
  begin
    Result := (AValue <= ARange) or (AValue >= ARange);
  end;

begin
  ay := 0;
  by := 0;
  cy := 0;
  l1 := 0.1;
  l2 := 0.1;

  f1 := strtofloat(Edit1.Text);
  f2 := strtofloat(Edit2.Text);
  lf1 := strtofloat(Edit3.Text);
  lf2 := strtofloat(Edit4.Text);
  lges := strtofloat(Edit5.Text);

  suche := (f1 + f2) / 3;
  t := 0;
  while (l1 < lges) do
  begin
    while (l2 < lges) do
    begin
      ay := f1 * (1 - (lf1 * 2 / l1));
      by := - f1 + (f1 * lf1 * 2 / l1) + f2 + (f1 * lf1 - f2 * (lf2 - l1)) / l2 + f1;
      cy := - 1 * (f1 * (l1 + 2 * l2) * lf1 - f2 * l1 * (l1 - l2 - lf2)) / (l1 * l2);
      Inc(t);
      l2 := l2 + 0.1;
    end;
    l1 := l1 + 0.1;
    l2 := l1 + 0.1;
  end;

  Label4.Caption := IntToStr(t);

  if IsValueValid(ay, 1.05 * suche) then
    Label1.Caption := FloatToStr(ay);
  if IsValueValid(by, 1.05 * suche) then
    Label2.Caption := FloatToStr(by);
  if IsValueValid(cy, 1.05 * suche) then
    Label3.Caption := FloatToStr(cy);
end;

Kegasetu 14. Okt 2020 11:39

AW: Delphie Schleifen-Probleme
 
Zitat:

Zitat von sakura (Beitrag 1475501)
Du arbeitest mit Fließkommazahlen, welche i.A. nicht genau genug sind, um diese mit festen Ergebnissen zu vergleichen.
Delphi-Quellcode:
while l1<>lges do
begin
  while l2<>lges do
Versuche anstatt
Delphi-Quellcode:
while l1<lges do
begin
  while l2<lges do
...:cat:...

P.S.: Die Labels werden sich erst nach der Berechnung neu zeichnen.


Vielen Dank, es hat funktioniert!

Jedoch habe ich einen kleinen Fehler mit der IF-Anweisung gemacht. Ich will, sobald der Wert zwischen 95%-105% liegt eine IF-Anweisung weiter.
Dafür ist mein Ansatz mehr als falsch...

Gibt es die Möglichkeit, einfach so einen Bereich zu definieren?

himitsu 14. Okt 2020 11:45

AW: Delphie Schleifen-Probleme
 
Fließkommazahlen nie genau auf Gleichheit/Ungleichheit prüfen,
denn Dank der binärbedingen Rundungsfehler kann es knapp vorbei gehn und deine Schleife läuft endlos.

z.B. Delphi-Referenz durchsuchenSameValue

stifflersmom 14. Okt 2020 12:33

AW: Delphie Schleifen-Probleme
 
Zitat:

Zitat von Kegasetu (Beitrag 1475505)

Vielen Dank, es hat funktioniert!

Jedoch habe ich einen kleinen Fehler mit der IF-Anweisung gemacht. Ich will, sobald der Wert zwischen 95%-105% liegt eine IF-Anweisung weiter.
Dafür ist mein Ansatz mehr als falsch...

Gibt es die Möglichkeit, einfach so einen Bereich zu definieren?

Der Vorschlag mit IsValidValue von TiGü geht in die Richtung

Benmik 14. Okt 2020 15:27

AW: Delphi Schleifen-Probleme
 
Da ja die 95% - 105% offenbar nicht supergenau sein müssen, wäre die Funktion InRange aus der Unit Math ein einfache Lösung (Math müsstest du dann der Uses-Klausel hinzufügen).
Die nimmt auch Fließkommazahlen, und es kommt ja nicht so genau darauf an, dass die Grenze absolut scharf gezogen wird.
Delphi-Quellcode:
If InRange(Wert,Wert * 0.95,Wert * 1.05)
  then ...

Incocnito 15. Okt 2020 07:04

AW: Delphi Schleifen-Probleme
 
Bin ich jetzt vollkommen bescheuert, oder gibt
Delphi-Quellcode:
function IsValueValid(const AValue, ARange: Extended): Boolean;
begin
  Result := (AValue <= ARange) or (AValue >= ARange);
end;
nicht sowieso IMMER True zurück!?

MfG Incocnito

freimatz 15. Okt 2020 07:14

AW: Delphi Schleifen-Probleme
 
IMHO in der Regel ja. (Wenn die Parameter den Wert NaN o.ä. haben bin ich mir nicht sicher.)

TiGü 15. Okt 2020 07:59

AW: Delphi Schleifen-Probleme
 
Ja tut es, aber das ist halt eins zu eins die Umsetzung aus dem Ursprungsposting.
Ob das sinnvoll ist, obliegt nicht mir.


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:02 Uhr.
Seite 1 von 2  1 2      

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