Delphi-PRAXiS

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.

freimatz 15. Okt 2020 09:51

AW: Delphi Schleifen-Probleme
 
Schon klar.
Noch ein Tipp: https://de.wikibooks.org/wiki/Progra...:_Der_Debugger

Benmik 15. Okt 2020 12:39

AW: Delphi Schleifen-Probleme
 
Zitat:

Zitat von TiGü (Beitrag 1475534)
Ja tut es, aber das ist halt eins zu eins die Umsetzung aus dem Ursprungsposting.
Ob das sinnvoll ist, obliegt nicht mir.

Das finde ich keine Art, die man hier pflegen sollte. So geht man nicht mit Leuten wie diesem TE um. Keine nachahmenswerte Version von "Ein herzliches Willkommen in der freundlichen Entwickler-Community".

TiGü 15. Okt 2020 13:14

AW: Delphi Schleifen-Probleme
 
Geht's noch? :shock:
Ich habe bei meinen Beispiel nicht drauf geachtet, was da als Bedingung steht, sondern nur eins zu eins in eine Unterroutine gepackt.
Wo ist denn jetzt das Problem?
Der Threadersteller hat doch schon selber erkannt, dass es so wie bisher nicht optimal ist und die richtige Lösung mit InRange hast du ihm doch auch schon gegeben.

Benmik 15. Okt 2020 13:29

AW: Delphi Schleifen-Probleme
 
Wenn es dir vor freimatz' Hinweis nicht aufgefallen ist -> alles OK.
Deine Antwort klang aber ziemlich anders.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:13 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz