Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Endlose repeat schleife


Stread - Do 15.01.09 19:36
Titel: Endlose repeat schleife
Ich bin gerade an einem Projekt zur Kreditberechnng dran. Sprich: Man gibt eine Kreditsumme einen Prozentsatz und eine Monatliche Rate ein und das Projekt sagt einem dann nach wieviel Jahren man den Kredit abgezahlt hat.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
var
  Form12: TForm12;
  Kreditsumme, Prozentsatz, mRate, ProzentGeld, Jahr, ZuZGeld : Double;

implementation

{$R *.dfm}

procedure TForm12.Button1Click(Sender: TObject);
begin
 Kreditsumme:= StrToFloat(Edit1.Text);
 Prozentsatz:= StrToFloat(Edit2.Text);
 mRate:= StrToFloat(Edit3.Text);

 mRate:= mRate*12;
 ProzentGeld:= (Kreditsumme*Prozentsatz)/100;
  if mRate < Prozentgeld then
    begin
     showmessage('Die Monatliche Rate ist zu klein');
    end
else
 Jahr:=0;
 repeat
   Jahr:= Jahr+1;
   Label15.Caption:=FloatToStr(Jahr);
   ZuZgeld:= (Kreditsumme+Prozentgeld)-mRate;
   Prozentgeld:= (ZuzGeld*Prozentsatz)/100;
   Label17.Caption:= FloatToStr(ZuZGeld);
 until ZuZGeld=0;
  if ZuZgeld = 0 then
     showmessage('Abgezahlt');
end;

end.


Die erste Showmessage kommt noch wenn die Bedingung erfüllt ist, aber die zweite bekomme ich nie zu Gesicht.
Mir scheint es als ob die Schleife nie aufhört.

Ich weiß dass die Darstellung nicht gut ist aber ich will erst dass das programm auch so läuft.

Danke


MSCH - Do 15.01.09 19:50

versuchs mal mit

Delphi-Quelltext
1:
 until ZuGeld <= 0;                    

:-)msch


Stread - Do 15.01.09 20:04

Nein, das wars leider nicht.


GTA-Place - Do 15.01.09 20:29

begin und end nach else wäre vielleicht nicht schlecht ;-)


Stread - Do 15.01.09 20:35

so?

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
repeat
     begin
   Jahr:= Jahr+1;
   Label15.Caption:=FloatToStr(Jahr);
   ZuZgeld:= (Kreditsumme+Prozentgeld)-mRate;
   Prozentgeld:= (ZuzGeld*Prozentsatz)/100;
   Label17.Caption:= FloatToStr(ZuZGeld);
   end;
 until ZuZGeld<=0;


Aber ich dachte immer bei einer Repeat Schleife gibt es kein begin und end?

Die Rechnung stimmt, dass habe ich gerade mit if then überprüft.


Marc. - Do 15.01.09 20:35

Ich hab mal die Repeat-Schleife zusammengefasst:

Delphi-Quelltext
1:
2:
3:
4:
 repeat
   Jahr:= Jahr+1;
   ZuZgeld:= (Kreditsumme + ZuzGeld*Prozentsatz / 100) - mRate;
 until ZuZGeld <= 0;

Wie soll das denn gegen Null gehen? Der Wert von Zuzgeld geht maximal gegen Kreditsumme-mRate, wenn Kreditsumme > mRate.
Ansonsten ist bereits nach dem ersten Durchlauf Schluss, vorrausgesetzt der Prozentsatz ist niedrig. :?

€: Weshalb finden sich die Änderungen der Labelcaption in der Repeat-Schleife? So schnell kann wirklich keiner mitlesen. :lol:
Außerdem brauchst du bei der Repeat-Schleife kein begin und end.


Stread - Do 15.01.09 21:43

Hast du, oder jemamd anderes, denn eine Idee wie es funktioniert?

Was muss ich denn anderst machen dass es 0 wird?

Jetzt hat GTA-Place noch geschrieben dass es nur nach else so ist.
Ich nehme mal an so

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
else
 begin
 Jahr:=0;
 repeat
   Jahr:= Jahr+1;
   Label15.Caption:=FloatToStr(Jahr);
   ZuZgeld:= (Kreditsumme+Prozentgeld)-mRate;
   Prozentgeld:= (ZuzGeld*Prozentsatz)/100;
   Label17.Caption:= FloatToStr(ZuZGeld);
 until ZuZGeld<=0;
  if ZuZgeld <= 0 then
     showmessage('Abgezahlt');
end;
end;


Ich will dass die Ergebnisse untereinander im Label stehen. Werde ich noch #13 einfügen.


GTA-Place - Do 15.01.09 21:46

Ja, das löst zwar noch nicht die Endlosschleife. Ich gehe aber davon aus, dass die Schleife eben nur dann aufgerufen werden soll, wenn mRate > Prozentgeld ist. Sonst würde das Programm trotzdem weitermachen.


Stread - Do 15.01.09 22:03

Ja das stimmt. Das Problem hätten wir also schonmal gelöst. :D

Edit: Wenns interessiert: Der richige Code lautet

Delphi-Quelltext
1:
ZuZgeld:= (ZuZGeld + ZuzGeld*Prozentsatz / 100) - mRate;