AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Delphi Schleifen-Probleme

Ein Thema von Kegasetu · begonnen am 14. Okt 2020 · letzter Beitrag vom 15. Okt 2020
Antwort Antwort
Seite 1 von 2  1 2      
Kegasetu

Registriert seit: 26. Sep 2013
85 Beiträge
 
#1

Delphi Schleifen-Probleme

  Alt 14. Okt 2020, 11:15
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!
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: München
11.412 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Delphie Schleifen-Probleme

  Alt 14. Okt 2020, 11:27
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
......

P.S.: Die Labels werden sich erst nach der Berechnung neu zeichnen.
Daniel W.
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.060 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Delphie Schleifen-Probleme

  Alt 14. Okt 2020, 11:34
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;
  Mit Zitat antworten Zitat
Kegasetu

Registriert seit: 26. Sep 2013
85 Beiträge
 
#4

AW: Delphie Schleifen-Probleme

  Alt 14. Okt 2020, 11:39
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
......

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?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.149 Beiträge
 
Delphi 12 Athens
 
#5

AW: Delphie Schleifen-Probleme

  Alt 14. Okt 2020, 11:45
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
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
stifflersmom

Registriert seit: 8. Dez 2005
Ort: 24994 Holt
374 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#6

AW: Delphie Schleifen-Probleme

  Alt 14. Okt 2020, 12:33

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
  Mit Zitat antworten Zitat
Benmik
Online

Registriert seit: 11. Apr 2009
542 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Delphi Schleifen-Probleme

  Alt 14. Okt 2020, 15:27
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 ...
  Mit Zitat antworten Zitat
Incocnito

Registriert seit: 28. Nov 2016
210 Beiträge
 
#8

AW: Delphi Schleifen-Probleme

  Alt 15. Okt 2020, 07:04
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
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
1.380 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Delphi Schleifen-Probleme

  Alt 15. Okt 2020, 07:14
IMHO in der Regel ja. (Wenn die Parameter den Wert NaN o.ä. haben bin ich mir nicht sicher.)
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.060 Beiträge
 
Delphi 10.4 Sydney
 
#10

AW: Delphi Schleifen-Probleme

  Alt 15. Okt 2020, 07:59
Ja tut es, aber das ist halt eins zu eins die Umsetzung aus dem Ursprungsposting.
Ob das sinnvoll ist, obliegt nicht mir.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:33 Uhr.
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