Kontrollfluss: Unterschied zwischen den Versionen

Aus KGS-Wiki
Keine Bearbeitungszusammenfassung
 
(3 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
{{Thumbnailbox|INHALT=<mermaid>graph TD
start(("Start")) --> a0[/"Eingabe a"/] --> a1["a := a × a"] --> a2[/"Ausgabe a"/] --> ende(("Ende"))
</mermaid>
|CAPTION=Der Kontrollfluss eines einfachen [[Algorithmus]],<br/>dargestellt als [[Programmablaufplan]]}}
Als [[Kontrollfluss]] bezeichnet man die Reihenfolge, in der die [[Anweisung|Anweisungen]] in einem [[Computerprogramm]] abgearbeitet werden. Eine einfache [[Sequenz]] von Anweisungen wird Schritt für Schritt von oben nach unten durchgegangen. Durch [[#Kontrollstrukturen|Kontrollstrukturen]] wie bedingte Anweisungen oder Wiederholungen kann davon jedoch abgewichen werden. Mit Methoden der [[Nebenläufigkeit|nebenläufigen]] Programmierung ist es auch möglich, Programmteile gleichzeitig ablaufen zu lassen.
Als [[Kontrollfluss]] bezeichnet man die Reihenfolge, in der die [[Anweisung|Anweisungen]] in einem [[Computerprogramm]] abgearbeitet werden. Eine einfache [[Sequenz]] von Anweisungen wird Schritt für Schritt von oben nach unten durchgegangen. Durch [[#Kontrollstrukturen|Kontrollstrukturen]] wie bedingte Anweisungen oder Wiederholungen kann davon jedoch abgewichen werden. Mit Methoden der [[Nebenläufigkeit|nebenläufigen]] Programmierung ist es auch möglich, Programmteile gleichzeitig ablaufen zu lassen.


Der Kontrollfluss eines Programms kann z.B. mit einem [[Programmablaufplan]] oder einem [[Aktivitätsdiagramm]] visualisiert werden. Der Kontrollfluss wird dann durch Pfeile dargestellt.
Der Kontrollfluss eines Programms kann z.B. mit einem [[Programmablaufplan]] oder einem [[Aktivitätsdiagramm]] visualisiert werden. Der Kontrollfluss wird dann durch Pfeile dargestellt.
Im einfachsten Fall, so wie oben rechts abgebildet, verläuft der Kontrollfluss linear von oben nach unten, sodass die Anweisungen strikt sequenziell abgearbeitet werden. Dies erleichtert insbesondere das Testen, da so schon ein einziger ausreicht, um den gesamten Kontrollfluss abzudecken.


== Befehlszähler ==
== Befehlszähler ==
[[File:Debug-comand.png|thumb|Der <code>debug</code>-Befehl zeigt links die ]]Auf der Ebene der [[Maschinensprache]] ist ein Programm eine Abfolge von Maschinenbefehlen, die durchnummeriert sind. Ein ''Befehlszähler'' bestimmt während der Ausführung eines Programms, welcher Befehl als nächstes ausgeführt werden soll. Normalerweise wird diese Zähler nach dem Abarbeiten eines Befehls um 1 hochgezählt.
[[File:Debug-comand.png|thumb|Der <code>debug</code>-Befehl zeigt links die Nummerierung der abgearbeiteten Maschinenbefehle]]Auf der Ebene der [[Maschinensprache]] ist ein Programm eine Abfolge von Maschinenbefehlen, die durchnummeriert sind. Ein ''Befehlszähler'' bestimmt während der Ausführung eines Programms, welcher Befehl als nächstes ausgeführt werden soll. Normalerweise wird diese Zähler nach dem Abarbeiten eines Befehls um 1 hochgezählt.


== Kontrollstrukturen ==
== Kontrollstrukturen ==
{{Thumbnailbox|INHALT=<mermaid>graph TD
start(("Start")) --> ina[/"Eingabe a"/] --> setb["b := 2"] --> w1{"a ≥ b?"} -- nein --> ende(("Ende"))
w1 -- ja --> w2{"a % b = 0?"} -- ja --> diva["a := a / b"] --> outb[/"Ausgabe b"/] --> w2
w2 -- nein --> if{"b = 2?"} -- ja --> b3["b := 3"] --> w1
if -- nein --> b4["b := b + 2"] --> w1
style if fill:red;
style b3 fill:red;
style b4 fill:red;
linkStyle 9 stroke:red;
linkStyle 10 stroke:red;
linkStyle 11 stroke:red;
linkStyle 12 stroke:red;
style w2 fill:green;
style diva fill:green;
style outb fill:green;
linkStyle 5 stroke:green;
linkStyle 6 stroke:green;
linkStyle 7 stroke:green;
</mermaid>
|CAPTION=Ein etwas komplizierterer Algorithmus mit nicht-linearem Kontrollfluss.<br/>Rot markiert ist eine bedingte Verzweigung,<br/>grün markiert eine bedingte Wiederholung.}}
Als '''Kontrollstrukturen''' werden Konstrukte bezeichnet, die es beim Programmieren ermöglichen, vom linearen Kontrollfluss abzuweichen und Bedingungen, Verzweigungen oder Wiederholungen zulassen.


=== Sprung ===
=== Sprung ===
Siehe auch [[Sprunganweisung]]
Siehe auch [[Sprunganweisung]]


Mit einer Sprunganweisung, die in vielen [[Programmiersprache|Programmiersprachen]] <code>goto</code> heißt, wird
Mit einer Sprunganweisung, die in vielen [[Programmiersprache|Programmiersprachen]] <code>goto</code> heißt, wird von einer Stelle im Programmablauf direkt zu einer anderen Stelle gesprungen. Diese Stelle kann je nach verwendeter [[Programmiersprache]] entweder als Zeilennummer angegeben werden oder es muss eine Sprungmarke gesetzt werden. Sprunganweisungen können die Lesbarkeit von Programmen beeinflussen – im positiven wie im negativen Sinne. Sprunganweisungen können ein unkompliziertes Austreten aus vielfach verschachtelten Kontrollstrukturen ermöglichen, machen es aber auch schwieriger, den Kontrollfluss nachzuvollziehen.


{{Todo|Sn}}
Edsger Dijkstra schrieb 1968 einen Aufsatz namens <q lang="en">Goto Statements Considered Harmful"</q> (<q>Goto-Anweisungen als schädlich eingeschätzt</q>)<ref>{{DOI|10.1145/362929.362947|Edsger Dijkstra: Goto Statements Considered Harmful}}</ref>, der dafür sorgte, dass der Einsatz von Sprunganweisungen lange verpönt war. Tatsächlich ist es möglich, jede Sprunganweisung problemlos durch bedingte Anweisungen und bedingte Wiederholungen zu ersetzen.
 
{{Fun fact|Die (nicht allzu ernst gemeinte) Programmiersprache INTERCAL hat statt einer <code>GO TO</code>- eine <code>COME FROM</code>-Anweisung.}}


=== Bedingte Anweisung ===
=== Bedingte Anweisung ===
Siehe auch [[Bedingte Anweisung]]
Siehe auch [[Bedingte Anweisung]]


Mit einer bedingten Anweisung wird der Kontrollfluss verzweigt, sodass eine Sequenz von Anweisungen, wenn eine gegebene Bedingung nicht erfüllt ist, nicht ausgeführt wird. Alternativ können in diesem Fall auch andere Anweisungen ausgeführt werden.
Mit einer bedingten Anweisung wird der Kontrollfluss verzweigt, sodass eine Sequenz von Anweisungen nur dann ausgeführt wird, '''wenn''' eine gegebene Bedingung erfüllt ist. Alternativ können in diesem Fall auch andere Anweisungen ausgeführt werden.
{{Beispiel|1=<scratchblocks>
falls <(Geschlecht) = [weiblich]>, dann
sage (verbinde [Guten Tag, Frau ] und (Nachname))
sonst
sage (verbinde [Guten Tag, Herr ] und (Nachname))
ende
</scratchblocks>
}}
 
=== Bedingte Wiederholung ===
 
Mit der bedingten Wiederholung wird ein Rücksprung im Kontrollfluss eingebaut, sodass eine Sequenz von Anweisungen wiederholt wird, '''solange''' eine bestimmte Bedingung erfüllt ist. Zu beachten ist hier, dass die Bedingung während der Ausführung der Sequenz nicht überwacht wird. Die Sequenz wird also nicht mittendrin abgebrochen, sondern entweder vollständig ausgeführt oder gar nicht.
{{Beispiel|1=
<syntaxhighlight lang="python">
def countdown():
    x = 10
    while x > 0:
        print(x)
        x = x - 1
</syntaxhighlight>
}}
 
=== Andere Wiederholungen ===
 
Es gibt noch andere Arten der Wiederholung wie die [[Wiederholung mit Laufvariable]]n. Die gehören aber eher zu dem, was man „syntaktischer Zucker“ nennt: ein Sprachkonstrukt, das dem Programmiery die Arbeit erleichtert, aber keine Funktionalität hinzufügt. So kann z.B. jede Wiederholung mit Laufvariable auch als eine bedingte Wiederholung ausgedrückt werden
{{Beispiel|1=Die folgenden Programmschnipsel erfüllen genau dieselbe Funktionalität:
{{{!}}
{{!}}- style="vertical-align: top;"
{{!}}
<syntaxhighlight lang="javascript">
for (x = 0; x < 5; x = x + 1) {
    console.log(x)
}
</syntaxhighlight>
{{!}}
<syntaxhighlight lang="javascript">
x = 0
while (x < 5) {
    console.log(x)
    x = x + 1
}
</syntaxhighlight>
{{!}}}
}}
 
== Fußnoten ==
<references/>
 
== Fußnoten ==
<references/>


{{Navigationsleiste Bestandteile von Algorithmen}}
{{Navigationsleiste Bestandteile von Algorithmen}}
[[Kategorie:Algorithmen]]
[[Kategorie:Algorithmen]]
[[Kategorie:Programmierung]]
[[Kategorie:Programmierung]]

Aktuelle Version vom 19. Mai 2025, 13:55 Uhr

graph TD start(("Start")) --> a0[/"Eingabe a"/] --> a1["a := a × a"] --> a2[/"Ausgabe a"/] --> ende(("Ende"))

Der Kontrollfluss eines einfachen Algorithmus,
dargestellt als Programmablaufplan

Als Kontrollfluss bezeichnet man die Reihenfolge, in der die Anweisungen in einem Computerprogramm abgearbeitet werden. Eine einfache Sequenz von Anweisungen wird Schritt für Schritt von oben nach unten durchgegangen. Durch Kontrollstrukturen wie bedingte Anweisungen oder Wiederholungen kann davon jedoch abgewichen werden. Mit Methoden der nebenläufigen Programmierung ist es auch möglich, Programmteile gleichzeitig ablaufen zu lassen.

Der Kontrollfluss eines Programms kann z.B. mit einem Programmablaufplan oder einem Aktivitätsdiagramm visualisiert werden. Der Kontrollfluss wird dann durch Pfeile dargestellt.

Im einfachsten Fall, so wie oben rechts abgebildet, verläuft der Kontrollfluss linear von oben nach unten, sodass die Anweisungen strikt sequenziell abgearbeitet werden. Dies erleichtert insbesondere das Testen, da so schon ein einziger ausreicht, um den gesamten Kontrollfluss abzudecken.

Befehlszähler

Der debug-Befehl zeigt links die Nummerierung der abgearbeiteten Maschinenbefehle

Auf der Ebene der Maschinensprache ist ein Programm eine Abfolge von Maschinenbefehlen, die durchnummeriert sind. Ein Befehlszähler bestimmt während der Ausführung eines Programms, welcher Befehl als nächstes ausgeführt werden soll. Normalerweise wird diese Zähler nach dem Abarbeiten eines Befehls um 1 hochgezählt.

Kontrollstrukturen

graph TD start(("Start")) --> ina[/"Eingabe a"/] --> setb["b := 2"] --> w1{"a ≥ b?"} -- nein --> ende(("Ende")) w1 -- ja --> w2{"a % b = 0?"} -- ja --> diva["a := a / b"] --> outb[/"Ausgabe b"/] --> w2 w2 -- nein --> if{"b = 2?"} -- ja --> b3["b := 3"] --> w1 if -- nein --> b4["b := b + 2"] --> w1 style if fill:red; style b3 fill:red; style b4 fill:red; linkStyle 9 stroke:red; linkStyle 10 stroke:red; linkStyle 11 stroke:red; linkStyle 12 stroke:red; style w2 fill:green; style diva fill:green; style outb fill:green; linkStyle 5 stroke:green; linkStyle 6 stroke:green; linkStyle 7 stroke:green;

Ein etwas komplizierterer Algorithmus mit nicht-linearem Kontrollfluss.
Rot markiert ist eine bedingte Verzweigung,
grün markiert eine bedingte Wiederholung.

Als Kontrollstrukturen werden Konstrukte bezeichnet, die es beim Programmieren ermöglichen, vom linearen Kontrollfluss abzuweichen und Bedingungen, Verzweigungen oder Wiederholungen zulassen.

Sprung

Siehe auch Sprunganweisung

Mit einer Sprunganweisung, die in vielen Programmiersprachen goto heißt, wird von einer Stelle im Programmablauf direkt zu einer anderen Stelle gesprungen. Diese Stelle kann je nach verwendeter Programmiersprache entweder als Zeilennummer angegeben werden oder es muss eine Sprungmarke gesetzt werden. Sprunganweisungen können die Lesbarkeit von Programmen beeinflussen – im positiven wie im negativen Sinne. Sprunganweisungen können ein unkompliziertes Austreten aus vielfach verschachtelten Kontrollstrukturen ermöglichen, machen es aber auch schwieriger, den Kontrollfluss nachzuvollziehen.

Edsger Dijkstra schrieb 1968 einen Aufsatz namens Goto Statements Considered Harmful" (Goto-Anweisungen als schädlich eingeschätzt)[1], der dafür sorgte, dass der Einsatz von Sprunganweisungen lange verpönt war. Tatsächlich ist es möglich, jede Sprunganweisung problemlos durch bedingte Anweisungen und bedingte Wiederholungen zu ersetzen.

🤓
Fun fact

Die (nicht allzu ernst gemeinte) Programmiersprache INTERCAL hat statt einer GO TO- eine COME FROM-Anweisung.

Bedingte Anweisung

Siehe auch Bedingte Anweisung

Mit einer bedingten Anweisung wird der Kontrollfluss verzweigt, sodass eine Sequenz von Anweisungen nur dann ausgeführt wird, wenn eine gegebene Bedingung erfüllt ist. Alternativ können in diesem Fall auch andere Anweisungen ausgeführt werden.

💬
Beispiel
falls <(Geschlecht) = [weiblich]>, dann
sage (verbinde [Guten Tag, Frau ] und (Nachname))
sonst
sage (verbinde [Guten Tag, Herr ] und (Nachname))
ende

Bedingte Wiederholung

Mit der bedingten Wiederholung wird ein Rücksprung im Kontrollfluss eingebaut, sodass eine Sequenz von Anweisungen wiederholt wird, solange eine bestimmte Bedingung erfüllt ist. Zu beachten ist hier, dass die Bedingung während der Ausführung der Sequenz nicht überwacht wird. Die Sequenz wird also nicht mittendrin abgebrochen, sondern entweder vollständig ausgeführt oder gar nicht.

💬
Beispiel
def countdown():
    x = 10
    while x > 0:
        print(x)
        x = x - 1

Andere Wiederholungen

Es gibt noch andere Arten der Wiederholung wie die Wiederholung mit Laufvariablen. Die gehören aber eher zu dem, was man „syntaktischer Zucker“ nennt: ein Sprachkonstrukt, das dem Programmiery die Arbeit erleichtert, aber keine Funktionalität hinzufügt. So kann z.B. jede Wiederholung mit Laufvariable auch als eine bedingte Wiederholung ausgedrückt werden

💬
Beispiel

Die folgenden Programmschnipsel erfüllen genau dieselbe Funktionalität:

for (x = 0; x < 5; x = x + 1) {
    console.log(x)
}
x = 0
while (x < 5) {
    console.log(x)
    x = x + 1
}

Fußnoten

Fußnoten