Thema: Schleifen

Einzelnen Beitrag anzeigen

Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#17

Re: Schleifen

  Alt 3. Dez 2005, 16:57
Zitat von netscanner:
danke erstmal für deinen beitrag aber wie soll ich das mit dem +1 bzw. -1 mit einer for-schleife machen?
dazu benötigt man doch eine repeat schleife oder?
sorry für die blöde frage aber schleifen sind echt nicht mein ding...
Hi,
ich wollte noch was zu deinem eigentlichen Problem loswerden, Schleifen. Die sind nämlich extrem wichtig, sie werden dir also sehr häufig begegnen (Dann ist vielleicht auch das mit +1 oder -1 klar)

Schleifen gehören zu den sogenannten Kontrollstrukturen. Die Idee von einem if ist dir sicherlich klar, du prüfst etwas (nennen wir es X) und wenn X wahr ist, machst du etwas sonst nicht. Jetzt gibt es aber viele Dinge die du gerne mehr als einmal machen möchtest. Da kommen dann Schleifen ins Spiel.

In Delphi gibt es verschiedene Möglichkeiten, du hast eine while ... do, eine repeat ... until und eine for .. to .. do.

Eine Schleife besteht immer aus zwei Teilen, einer Überprüfung und einem Schleifenkörper. Der Unterschied zwischen den drei Schleifen liegt hier in der Überprüfung (Zeitpunkt und Art).
Was welche Schleife macht muss du dir nicht kompliziert merken, dass geht recht gut aus den Namen hervor.

Die while-Schleife prüft direkt eine Bedingung. Ist diese erfüllt, wird der gesamte Schleifenkörper durchlaufen. Nach jedem duchlauf springt dein Programm wieder zu dieser Überprüfung und verfährt auf gleiche Art und Weise. Ist die Bedingung nicht erfüllt, so wird der gesamte Schleifenkörper übersprungen und in der nächsten Zeile fortgefahren.
Der Schleifenkörper sollte durch ein begin ... end umschlossen werden. Folgt dem do kein begin, besteht der Schleifenkörper nur aus der nächsten Zeile. Zu gutem Programmierstil gehört es jedoch auch für den einzeiligen Schleifenkörper ein begin und end zu verwenden (macht es leichter lesbar und weniger Fehleranfällig)
Ist also die Bedingung nie erfüllt, wird die Schleife nie durchlaufen.

Die repeat-Schleife gleicht der while Schleife fast komplett. Der wichtige Unterschied liegt darin, dass diese Schleife erst nach dem Durchlauf die Bedingung prüft. Zudem steht der Schleifenkörper zwischen dem repeat und dem until. Die Schleife wird also einmal durchlaufen, dann wird geguckt ob die Schleifenbedingung erfüllt ist und ggf. die Schleife erneut durchlaufen.
Ist die Bedingung nie erfüllt, so wird die Schleife trotzdem einmal durchlaufen.

Die for-Schleife ist eine besondere Schleife. Während while und repeat eine allgemeine boolsche Bedingung überprüft handelt es sich bei der for-Schleife um eine Zählschleife. Wie der Name schon sagt, zählt diese Schleife. Genau genommen kannst du hier die Anzahl der Durchläufe festlegen.
Sie besteht aus einer Variable, die mit einem bestimmten Wert initialisiert wird, einem Zielwert und der Richtung (rauf- oder runterzählen). Dabei wird die Variable automatisch in jedem Schritt um 1 erhöht (abgesenkt)
Diese Schleife lässt sich wohl einfacher an einem Beispiel erklären:

Delphi-Quellcode:
var i : Integer;
begin
  // initialisiert i mit dem Wert 0
  // tut irgendwas bis i den Wert 10 hat
  for i := 0 to 10 do
    begin
      // tue irgendwas
    end;

   // initialisier i mit dem Wert 10
   // tut irgendwas bis i den Wert 0 hat
   for i := 10 downto 0 do
     begin
       // tue irgendwas
     end;
end;
Eine solche Schleife kann auch mit einer while (oder repeat) realisiert werden

Delphi-Quellcode:
var i : Integer;
begin
  // i initialisieren
  i := 0;
  while i <= 10 do
    begin
      // tue irgendwas
      inc(i); // zähle i um eins hoch
    end;
end;
Was du in den Schleifenkörper schreibst, ist deine Sache und hängt nicht von der Schleife ab. Zählschleifen eignen sich natürlich immer dann, wenn du wirklich mit einer Variable zählst (z.B. alle Elemente in einem Array). Es ist einfach schöner nicht selbst die Variable zu verändern.
Bei der repeat-Schleife solltest du immer berücksichtigen, dass die Schleife immer mindestens einmal durchlaufen wird. Analog solltest du bei der while berücksichtigen, dass diese Schleife überhaupt nur durchlaufen wird, wenn die Bedingung irgendwann war wird.

Ist eine Bedingung immer wahr, so hast du dir eine Endlosschleife gebaut. In einigen Situationen wirst du so etwas sicherlich mal unabsichtlich machen (dann musst du das Programm über die IDE zurücksetzen). Du kannst es aber auch absichtlich verwenden und eine Schleife (zu jedem Zeitpunkt) mit einem break verlassen.

Delphi-Quellcode:
begin
  // immer wahr -> Endlosschleife
  while True do
    begin
      break; // verlässt die Schleife sofort
´ end;
end;
Mit Endlosschleifen, die mit break verlassen werden sollte man möglichst wenig arbeiten (besser gar nicht), es ist nicht so wirklich übersichtlich. Aber break kann auch wichtig sein, wenn du z.B. in einem Array einen bestimmten Wert suchst. Sobald du ihn gefunden hast, brauchst du ja den Rest des Feldes nicht mehr beachten.

Delphi-Quellcode:
var i : Integer;
    ints : Array of Integer;
    containsZero : Boolean;
begin
  // erstelle ints und schreib Werte rein
  setLength(ints, 10);
  ints[0] := ...;
  ...
  
  // schau nach ob ints den Wert 0 enthält
  containsZero := False;
  for i := 0 to length(ints) - 1 do
    begin
      if ints[i] = 0 then
        begin
          containsZero := True;
          break;
        end;
    end;
end;
Wenn du dises Schleife durchläufst und ints[4] die erste Null in ints ist, dann würde die for Schleife nie für i = 5..9 durchlaufen werden. Ist deine Schleife nur groß genug lohnt sich das. Allerdings hast du keine Garantie, dass es nicht gar keine 0 gibt oder die erste bei i = 9 steht.

Ja, hoffe es hilft dir ein wenig

Gruß Der Unwissende
  Mit Zitat antworten Zitat