Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - repeat-Schleife "stimmt" nicht


Paulchengb - Mo 12.03.07 21:28
Titel: repeat-Schleife "stimmt" nicht
Hallo,
ich habe hier mal folgende repeat-until Schleife gemacht


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure TForm1.LabeledEdit8Change(Sender: TObject);
var s1,s2:real;
begin
s1:=strtoint(LabeledEdit8.text);

repeat
s1:=s1+1;
s2:=s2+s1;
until
s1=20;

LabeledEdit9.text:=floattostr(s2);


Es geht zwar, aber als Ergebnis(s2) wird bei der Eingabe von zB. 4 200 angezeigt.

Eigentlich sollte die Anzahl der Wiederholungen der Schleife, bis 20 erreicht ist, angezeigt werden.

Wo liegt der Fehler?


HelgeLange - Mo 12.03.07 21:34

initialisiere mal s2 vor der schleife mit 0, dann sollte das klappen, sehe erstmal so keinen Fehler.


Christian S. - Mo 12.03.07 21:46

Du solltest außerdem sicherstellen, dass s1 vor der Schleife nicht größer als 19 ist, sondern wird die 20 nie erreicht.


HelgeLange - Mo 12.03.07 22:11

user profile iconChristian S. hat folgendes geschrieben:
Du solltest außerdem sicherstellen, dass s1 vor der Schleife nicht größer als 19 ist, sondern wird die 20 nie erreicht.


[KlugscheissMode=on]
Naja, das stimmt so nicht ganz, sie wird erreicht, es dauert nur viiiieellll länger. Und dadurch, dass beide den gleichen Datentyp haben, ist der Überschlag auch der gleiche und es sollte sogar das gleiche Ergebnis kommen, oder ?
[KlugscheissMode=off]

Aber insgesamt hast Du natürlich recht, Repeat-Until ist Fusslastig und es sollte vorher überprüft werden, da die Routine mind. 1x durchlaufen wird.


Paulchengb - Mo 12.03.07 22:54

Hi,
also jetzt schaut es so aus


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure TForm1.LabeledEdit8Change(Sender: TObject);
var s1,s2:real;
begin
s1:=strtoint(LabeledEdit8.text);
s2:=0;
repeat
s1:=s1+1;
s2:=s2+s1;
until
s1=20;

LabeledEdit9.text:=floattostr(s2);


Und s1 ist natürlich kleiner 20... Ich versuchs immer mit verschiedenen Zahlen. Bei 8 kommt jetzt zB. 174 raus. Scheint mir auch eher flasch zu sein :P


Christian S. - Mo 12.03.07 23:01

Ist doch richtig.

Du rechnest 9+10+11+...


Calculon - Mo 12.03.07 23:03

Paulchengb hat folgendes geschrieben:
Eigentlich sollte die Anzahl der Wiederholungen der Schleife, bis 20 erreicht ist, angezeigt werden.

Dann erhöhe s2 innerhalb der Schleife um eins und nicht um s1


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
var s1,s2: integer; 
begin 
s1 := strtoint(LabeledEdit8.text); 
s2 := 0;
repeat 
  s1 := s1 + 1
  s2 := s2 + 1
until 
  s1=20

LabeledEdit9.text := inttostr(s2);

Gruß

Calculon
--

[edit] Ich würde statt real integer nehmen, da ersteres bei deiner Problemstellung keinen Sinn macht.[/edit]


Paulchengb - Mo 12.03.07 23:03

Aso, hm. Dann liegt ein Denkfehler vor.

Aber wie bekomm ich dann raus, wie oft die Schleife wiederholt wurde?

Also wenn ich 8 eingebe, dann muss 8+1+1+1+1...12-mal wiederholt werden, bis 20 erreicht ist.


EDIT: Danke Calculon, jetzt gehts :P


GTA-Place - Mo 12.03.07 23:31

Mach vor der Schleife s2 := 20 - s1, dann haste es auch.