www.wikidata.de-de.nina.az
Eine Schleife auch Wiederholung oder englisch loop ist eine Kontrollstruktur in Programmiersprachen Sie wiederholt einen Anweisungs Block den sogenannten Schleifenrumpf oder Schleifenkorper solange die Schleifenbedingung als Laufbedingung Anm 1 gultig bleibt bzw als Abbruchbedingung nicht eintritt Schleifen deren Schleifenbedingung immer zur Fortsetzung fuhrt oder die keine Schleifenbedingung haben sind Endlosschleifen Schleifen konnen beliebig verschachtelt werden Innerhalb des Schleifenkorpers der ausseren Schleife befindet sich wiederum eine Schleife sie liegt innen oder unter der ausseren Schleife Jede Schleife kann in eine rekursive oder sogar endrekursive Form umgewandelt werden Zur Beschleunigung des Programmablaufs werden Schleifen oft durch den Compiler entrollt Eine Schleife wird schrittweise wiederholt iterativ verarbeitet Ublicherweise wird ausser bei einer fussgesteuerten Schleife erst gepruft ob die Schleifenbedingung gultig ist falls nicht wird die Schleife beendet Der gesamte Schleifenrumpf wird ausgefuhrt Anschliessend wird mit 1 fortgesetzt Inhaltsverzeichnis 1 Arten 2 Schleifenabbruch im Sonderfall 3 Beispiele 3 1 Zahlschleife 3 2 Kopfgesteuerte Schleife 3 3 Fussgesteuerte Schleife 3 4 Mengenschleife 3 5 Iterationsabbruch 3 6 Schleifenabbruch 4 Implementierung mit Sprungbefehlen 4 1 For Schleife 4 2 While Do Schleife 4 3 Do While Schleife 4 4 Repeat Until Schleife 4 5 Befehle in Assemblersprache 5 Literatur 6 Weblinks 7 AnmerkungenArten BearbeitenPrinzipiell werden folgende Typen von Schleifen unterschieden Die vorprufende oder kopfgesteuerte Schleife Bei dieser Schleife wird vor der eventuellen Ausfuhrung des Schleifenrumpfs eine Bedingung gepruft ob der Schleifenrumpf Schleifeninhalt anschliessend erstmals erneut ausgefuhrt wird meist mit WHILE solange eingeleitet Die nachprufende oder fussgesteuerte Schleife Bei dieser Schleife wird nach dem Durchlauf des Schleifenrumpfes Schleifeninhalts eine Bedingung uberpruft ob der Schleifenrumpf erneut ausgefuhrt wird meist als Konstrukt DO WHILE ausfuhren solange oder REPEAT UNTIL wiederholen bis Die Zahlschleife eine Sonderform der vorprufenden Schleife meist als FOR fur Schleife implementiert Hauptartikel For Schleife Die Mengenschleife eine Sonderform der Zahlschleife meist als FOREACH fur jedes Element der Menge implementiert die Reihenfolge der Elemente ist beliebig Ferner konnen sich Schleifen bzgl ihrer Bedingungsprufung unterscheiden Schleife mit Laufbedingung Die Schleife wird solange durchlaufen wie die Schleifenbedingung zu wahr ausgewertet wird Schleife mit Abbruchbedingung Wertet die Bedingung zu wahr aus so wird die Schleife abgebrochen Eine Endlosschleife ohne Schleifenbedingung und ohne Schleifenabbruch darin kann nur von aussen unterbrochen werden etwa durch einen Programmabbruch durch den Benutzer Reset Interrupt Defekt Abschalten des Gerates oder ahnliches Schleifenabbruch im Sonderfall BearbeitenIn Fallen die schwierig als Schleifenbedingung zu fassen sind kann eine Schleife aus dem Schleifenkorper heraus meist abgebrochen werden IterationsabbruchEs wird lediglich die aktuelle Iteration abgebrochen Der Rest des aktuellen Schleifenrumpfs wird ubersprungen Die Schleife jedoch wird mit der nachsten Iteration fortgesetzt Mitunter kann in verschachtelten Schleifen auch auf eine weiter aussen liegende Schleife Bezug genommen werden der Abbruch der aktuellen Iteration gilt dann bezuglich jener angegebenen weiter ausseren Schleife die weiter innere in deren Schleifenrumpf die Abbruchanweisung steht wird dann komplett abgebrochen SchleifenabbruchMeist gibt es auch einen Befehl zum Gesamt Abbruch der Schleife das Programm wird dann mit der ersten Anweisung nach der Schleife fortgesetzt Oft ist in verschachtelten Schleifen auch eine Bezugnahme auf eine weiter aussen liegende Schleife moglich was die inneren dann ebenfalls abbricht Beispiele BearbeitenDie nachfolgenden Beispiele in Pseudocode finden sich in den jeweiligen Programmiersprachen meist sehr ahnlich Zahlschleife Bearbeiten FOR Iterator Anfangszahl TO Endezahl STEP Schrittweite DO Schleifenrumpf Bei einer For Schleife zahlt der Computer von einer Anfangszahl bis zu einer Endzahl und wiederholt dabei jedes Mal den Codeblock Schleifenrumpf Die aktuelle Zahl wird in eine Variable Iterator gesetzt damit sie bei Bedarf in dem Codeblock Verwendung finden kann Haufig ist die Zahlschleife auf Ganzzahlen beschrankt Das Andern der Iterator Variablen im Schleifenkorper ist bei vielen Programmiersprachen verboten und gilt als schlechter Programmierstil da es oft zu schwer verstandlichem Code fuhrt es lauft der Denkweise zuwider direkt am Schleifenkopf die Anzahl der Durchlaufe ablesen zu konnen Kopfgesteuerte Schleife Bearbeiten WHILE Logischer Ausdruck DO Schleifenrumpf Bei einer kopfgesteuerten Schleife erfolgt die Abfrage der Bedingung bevor der Schleifenrumpf ausgefuhrt wird also am Kopf des Konstruktes Eine logische Operation kann beispielsweise sein x gt 4 Solange diese Bedingung wahr ist werden die Anweisungen innerhalb der Schleife ausgefuhrt Wird der Inhalt der logischen Operation nicht im Schleifenrumpf verandert ist diese Kontrollstruktur meist nicht die richtige weil diese Schleife sonst kein einziges Mal durchlaufen wird oder unendlich lang lauft Fussgesteuerte Schleife Bearbeiten DO Schleifenrumpf WHILE Logischer Ausdruck bzw REPEAT Schleifenrumpf UNTIL Logischer Ausdruck Bei einer fussgesteuerten Schleife erfolgt die Abfrage der Bedingung nachdem der Schleifenrumpf ausgefuhrt wurde also am Fuss des Konstruktes Auf WHILE dt solange folgt eine Laufbedingung auf UNTIL dt bis eine Abbruchbedingung Wie fur die kopfgesteuerte Schleife gilt Wird der Inhalt der logischen Operation nicht im Schleifenrumpf verandert ist diese Kontrollstruktur meist nicht die richtige weil diese Schleife sonst genau einmal durchlaufen wird oder unendlich lang lauft Mengenschleife Bearbeiten FOREACH Element OF Menge DO Schleifenrumpf Eine Mengenschleife fuhrt den Schleifenrumpf fur jedes Element einer Menge z B Array oder Liste aus Sie kann ersetzt werden durch eine Zahlschleife mit dem Schleifenkorper FOR Iterator2 1 TO Machtigkeit Menge DO BEGIN Element Iterator2 tes Element von Menge Schleifenrumpf END Da die Reihenfolge der Abarbeitung bei der Mengenschleife beliebig ist bleibt dem Compiler uberlassen wie er vorgeht Aufgrund des sicher gegebenen Umstands dass eine Iteration nicht von der vorhergehenden abhangig sein kann kann ein Compiler Mengenschleifen am einfachsten automatisch parallelisieren Iterationsabbruch Bearbeiten CONTINUE bzw CONTINUE Schleifenbezeichner Die erste Variante bricht die aktuelle Iteration ab es geht weiter mit der Prufung der Laufbedingung fur die nachste Iteration Die zweite Variante beendet in verschachtelten Schleifen alle inneren und wirkt wie die erste Variante fur diejenige aussere Schleife welche durch Schleifenbezeichner angesprochen wird Oft kommt hier entweder ein Name ahnlich einer Sprungmarke zum Einsatz in Zahlschleifen erfolgt die Identifizierung mitunter uber den Namen des Iterators Schleifenabbruch Bearbeiten BREAK bzw BREAK Schleifenbezeichner Die erste Variante bricht die aktuelle Schleife ab es geht weiter mit der ersten Anweisung nach der Schleife Die zweite Variante beendet in verschachtelten Schleifen alle inneren komplett sowie diejenige aussere Schleife welche durch Schleifenbezeichner angesprochen wird Oft kommt hier entweder ein Name ahnlich einer Sprungmarke zum Einsatz in Zahlschleifen erfolgt die Identifizierung mitunter uber den Namen des Iterators Implementierung mit Sprungbefehlen BearbeitenFruher wurden auch in Hochsprachen Programmen haufig unbedingte Sprunge Goto Befehle verwendet Sprachen die Sprunganweisungen verwenden ermoglichen das Einfugen einer Marke englisch Label Eine solche Marke kann dann als Ziel einer Goto Anweisung dienen Nach heutigen Programmierparadigmen namentlich der strukturierten Programmierung wird von der Verwendung von Goto Sprungen abgeraten da durch diese der beruchtigte Spaghetticode entsteht Prinzipiell lasst sich jedoch jede Schleifenform mit Sprungbefehlen abbilden For Schleife Bearbeiten Es gibt mehrere Alternativen For Schleifen mit Hilfe einfacherer Befehle zu implementieren Im Normalfall verhalten sich diese Alternativen gleich aber in einigen speziellen Situationen gibt es Unterschiede Beispiele fur spezielle Situationen sind Die Schrittweite ist 0 nicht in allen Varianten der For Schleife moglich Der Startwert oder der Endwert sind die kleinst oder grosstmogliche darstellbare Zahl Eine ausfuhrlichere Darstellung der Varianten befindet sich im Artikel For Schleife While Do Schleife Bearbeiten WHILE Logischer Ausdruck DO Befehlssequenz entspricht Marke1 IF NOT Logischer Ausdruck GOTO Marke2 bedingter Vorwartssprung zum Verlassen der Schleife Befehlssequenz GOTO Marke1 Ruckwartssprung fur die nachste Iteration Marke2 Die Befehlssequenz wird keinmal durchlaufen wenn der logische Ausdruck schon zu Beginn falsch ist Do While Schleife Bearbeiten DO Befehlssequenz WHILE Logischer Ausdruck entspricht Marke1 Befehlssequenz IF Logischer Ausdruck GOTO Marke1 bedingter Ruckwartssprung fur die nachste Iteration wenn Bedingung erfullt ist Hier wird die Schleife mindestens einmal durchlaufen Die Do While Schleife ist damit nachprufend Repeat Until Schleife Bearbeiten REPEAT Befehlssequenz UNTIL Logischer Ausdruck entspricht Marke1 Befehlssequenz IF NOT Logischer Ausdruck GOTO Marke1 bedingter Ruckwartssprung fur die nachste Iteration wenn Bedingung nicht erfullt ist Sie ist also lediglich eine Do While Schleife mit Abbruchbedingung statt Laufbedingung Befehle in Assemblersprache Bearbeiten Assemblercode bietet normalerweise nicht die aus hoheren Programmiersprachen bekannten for while repeat Konstrukte Da aber auch hier Schleifen eingesetzt werden mussen Verzogerung durch aktives Warten s u serielles adressiertes Verarbeiten von Daten stehen einfache Sprungbefehle fur unbedingte und bedingte Sprunge zur Verfugung Letztere entscheiden anhand eines Statusflags der CPU z B Zero Flag ob gesprungen werden muss Trifft die Voraussetzung nicht zu so wird der Programmcounter PC einfach um eins erhoht Es wird dann also als Nachstes der Befehl nach dem bedingten Sprungbefehl ausgefuhrt Beispiel fur Code fur einen AVR Mikrocontroller der unter Verwendung einer Schleife um insgesamt 5000 Takte durch aktives Warten verzogert delaying 4998 clocks in 2 loops ldi R0 7 initialisiere ausseren Schleifenzahler mit 7 Marke1 innere Schleife ldi R1 237 initialisiere inneren Schleifenzahler mit 237 dezimal Marke2 dec R1 Vermindert Inhalt in R1 um 1 brne Marke2 Sprung nur wenn R1 nun nicht 0 ist BRanch if Not Equal to zero dec R0 ausseren Schleifenzahler um 1 verringern brne Marke1 delaying additional 2 clocks nop nop Haufig gibt es angepasste Assemblerbefehle die mehrere Aktionen kombinieren Prufe Iterator auf Ist Gleich wenn ungleich springe nach Zahle Iterator 1 herunter wenn er noch immer grosser 0 ist springe nach Oft setzen diese voraus dass ein Zahl Iterator sich z B in einem bestimmten Register befindet Literatur BearbeitenThomas Rauber Gudula Runger Parallele Programmierung 3 Auflage Springer Verlag Berlin 2012 ISBN 978 3 642 13603 0 Weblinks BearbeitenProgrammierung mit C Grundkurs PDF abgerufen am 1 Oktober 2015 Programmieren mit Python erste Schritte PDF abgerufen am 29 Juni 2018 Einfuhrung in die Programmierung Memento vom 2 Oktober 2015 im Internet Archive PDF abgerufen am 1 Oktober 2015 via archive orgAnmerkungen Bearbeiten Eine Laufbedingung muss erfullt wahr sein damit eine Schleife fortgesetzt wird Abgerufen von https de wikipedia org w index php title Schleife Programmierung amp oldid 239574814