AGB  ·  Datenschutz  ·  Impressum  







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

Repeat-Until Schleife X^n

Ein Thema von 301200 · begonnen am 7. Apr 2011 · letzter Beitrag vom 9. Apr 2011
Antwort Antwort
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#1

AW: Repeat-Until Schleife X^n

  Alt 7. Apr 2011, 16:45
Lass dein Programm doch einfach mal rechnen.
x = 4 n = 3
Das wäre also 4^3 und das sind 4*4*4 = 64.
Wenn dein Programm dann aber 256 als Ergebnis auswirft, dann weisst du das deine Schleife einmal zu oft durchlaufen wurde.
Überleg' dir auch mal, ob du vielleicht nicht eine eigene Variable y für das Ergebnis brauchst.
Es ist immer blöd, wenn man sich die Inputvariablen überschreibt...
Andreas
  Mit Zitat antworten Zitat
301200

Registriert seit: 7. Apr 2011
8 Beiträge
 
#2

AW: Repeat-Until Schleife X^n

  Alt 7. Apr 2011, 16:46
Lass dein Programm doch einfach mal rechnen.
x = 4 n = 3
Das wäre also 4^3 und das sind 4*4*4 = 64.
Wenn dein Programm dann aber 256 als Ergebnis auswirft, dann weisst du das deine Schleife einmal zu oft durchlaufen wurde.
Überleg' dir auch mal, ob du vielleicht nicht eine eigene Variable y für das Ergebnis brauchst.
Es ist immer blöd, wenn man sich die Inputvariablen überschreibt...
Mein Programm läuft ja leider nicht.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: Repeat-Until Schleife X^n

  Alt 7. Apr 2011, 16:59
Damit wollte ich auch nicht sagen, dass du das können mußt, aber erkennen, dass der Ansatz schon falsch ist, das müsstest du.
Zitat:
Delphi-Quellcode:
x:=m
repeat
m:= m*x
x:=x+1
until x >= Ende
Ist dort ein fehler?
1. verwende die Variablen in der gleichen Bedeutung der Formel (sonst gibt es nur Verwirrung)
function Hoch( x, n : integer ) : integer; 2. Wenn wir wissen, das x^n bedeutet, dass x mit sich selber multipliziert wird (Annahme n=3), dann würde das ja wie folgt errechnet:
Code:
0   1   2   3
1 * x * x * x
da sehe ich kein n in der Berechnung, und auch immer das gleiche x
Somit ergibt sich (hier mit einer for Schleife) folgender Code (bei n >= 0)
Delphi-Quellcode:
var
  nidx : integer;
begin
  Result := 1;
  for nidx := 1 to n do
    Result := Result * x;
end;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo ( 7. Apr 2011 um 17:05 Uhr)
  Mit Zitat antworten Zitat
301200

Registriert seit: 7. Apr 2011
8 Beiträge
 
#4

AW: Repeat-Until Schleife X^n

  Alt 7. Apr 2011, 17:23
Damit wollte ich auch nicht sagen, dass du das können mußt, aber erkennen, dass der Ansatz schon falsch ist, das müsstest du.
Zitat:
Delphi-Quellcode:
x:=m
repeat
m:= m*x
x:=x+1
until x >= Ende
Ist dort ein fehler?
1. verwende die Variablen in der gleichen Bedeutung der Formel (sonst gibt es nur Verwirrung)
function Hoch( x, n : integer ) : integer; 2. Wenn wir wissen, das x^n bedeutet, dass x mit sich selber multipliziert wird (Annahme n=3), dann würde das ja wie folgt errechnet:
Code:
0   1   2   3
1 * x * x * x
da sehe ich kein n in der Berechnung, und auch immer das gleiche x
Somit ergibt sich (hier mit einer for Schleife) folgender Code (bei n >= 0)
Delphi-Quellcode:
var
  nidx : integer;
begin
  Result := 1;
  for nidx := 1 to n do
    Result := Result * x;
end;

Danke. Das hat mir jetzt erstmal verständlich das Prinzip erklärt.
Könntest du mir vielleicht noch bei der passenden repeat-until Schleife helfen? Ich kann das ja nicht, weil ich gefehlt habe als wir das gemacht haben und ein funktionierendes Beispiel hierbei würde mir wahrscheinlich helfen das Prinzip zu verstehen.
  Mit Zitat antworten Zitat
301200

Registriert seit: 7. Apr 2011
8 Beiträge
 
#5

AW: Repeat-Until Schleife X^n

  Alt 7. Apr 2011, 20:27
Delphi-Quellcode:
var x,m : real
   i,n : integer

begin
 x:=StrToFloat (Edit1.text);
 n:=StrToInt (Edit2.text);
 m:=x;
repeat
m:=m*x;
i:=i+1
until i=n

Kommt das so hin?

Geändert von 301200 ( 7. Apr 2011 um 20:34 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von patti
patti

Registriert seit: 20. Okt 2004
Ort: Mittelfranken
665 Beiträge
 
Turbo Delphi für Win32
 
#6

AW: Repeat-Until Schleife X^n

  Alt 7. Apr 2011, 20:52
Also es fehlt auf jeden Fall die Initialisierung deiner Lauf-Variable i, sprich du hast keinen "Start-Wert" für i angegeben. Vor der Schleife solltest du i beispielsweise auf 1 setzen.
Außerdem solltest du folgendes überlegen: Was passiert, wenn n = 1 ist? Die Repeat-Schleife wird - im Gegensatz zur While-Schleife - immer mindestens einmal durchlaufen (nennt sich glaube ich abweisende Schleife o.ä.). Wenn n = 1 ist, dann ist das Ergebnis bei deinem Code aber nicht x^1, sondern x^2...
Und: Schonmal darüber nachgedacht, was passiert, wenn jemand in das Feld für den Exponenten eine negative Zahl eingibt? Stichwort Endlosschleife - als Programmierer muss man auf solche "Fallen" aufpassen...
Patrick Kreutzer
[Informatik-Student im 4. Semester]
http://www.patti-k.de/
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: Repeat-Until Schleife X^n

  Alt 7. Apr 2011, 22:08
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;
Delphi-Referenz durchsuchenStrToFloatDef
Delphi-Referenz durchsuchenStrToIntDef

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
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo ( 8. Apr 2011 um 07:09 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


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 00:06 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