Generell muss man sagen, dass für diese Lösung
repeat until
ungeschickt ist (schönen Gruß an den Lehrer) und
while do
erheblich besser geeignet ist.
Weiterhin ist x^n auch für n<0 definiert.
Und generell gesehen sollte man dafür eine
function
definieren und diese dann benutzen.
EVA (die Frau des Programmierers)
Delphi-Quellcode:
var
x, e : Extended;
n : Integer;
begin
// Eingabe
x := StrToFloatDef( EditX.Text, 0 );
n := StrToIntDef( EditN.Text, 0 );
// Verarbeitung
e := Hoch( x, n ); // Aufruf der eigentlichen Funktion
// Ausgabe
EditE.Text := FloatToStr( e );
end;
StrToFloatDef
StrToIntDef
Hier mal die Realisierung mit einer While-Schleife:
Delphi-Quellcode:
function Hoch( x : Extended; n : integer ) : Extended;
var
nidx : integer;
begin
Result := 1; // x^0 ist 1
nidx := 0; // Zähler initialisieren
// Zähler mit dem Absolutwert von n vergleichen
while nidx < Abs( n ) do
begin
Inc( nidx ); // Zähler um 1 erhöhen
// Fallunterscheidung für positive/negative n
if n > 0 then
Result := Result * x
else
Result := Result / x;
end;
end;
Hier noch ein kleiner Exkurs um ein
for to
in ein
while do
und dann in ein
repeat until
zu überführen:
Delphi-Quellcode:
for i := 0 to 9 do
foo;
// geht mit "while do" so
i := 0;
while i <= 9 do
begin
foo;
Inc( i );
end;
// und mit "repeat until"
i := 0;
if ( i <= 9 ) then
repeat
foo;
Inc( i );
until not ( i <= 9 );
und hier eine generische Umwandlung von
while do
nach
repeat until
Delphi-Quellcode:
while EinLogischerAusdruck do
foo;
// mit "repeat unitl"
if EinLogischerAusdruck then
repeat
foo;
until not EinLogischerAusdruck;
Andersherum von
repeat until
nach
while do
ist es komplizierter
Delphi-Quellcode:
repeat
foo;
until EinLogischerAusdruck;
// mit "while do"
FirstGoFlag := True;
while FirstGoFlag or not EinLogischerAusdruck do
begin
FirstGoFlag := False;
foo;
end;
Das sollte eigentlich reichen, damit du das obige Konstrukt mit einem
repeat until
umschreiben kannst