Kontrollstrukturen: Unterschied zwischen den Versionen
Zeile 1: | Zeile 1: | ||
− | Um die formalen Eigenschaften eines Algorithmus in die syntaktischen Eigenschaften eines | + | Um die formalen Eigenschaften eines [[Algorithmus]] in die syntaktischen Eigenschaften eines [[Programm|Programms]] zu überführen, ist es notwendig, die einzelnen Anweisungen eines Algorithmus miteinander zu verknüpfen. |
− | In vielen Programmiersprachen, so auch in Java, gibt es dafür eine kleine Grundmenge an sogenannten Kontrollstrukturen, die den Fluss eines | + | In vielen [[Programmiersprache|Programmiersprachen]], so auch in [[Java]], gibt es dafür eine kleine Grundmenge an sogenannten '''Kontrollstrukturen''', die den Fluss eines Programms steuern. Diese sind im speziellen |
*die sequenzielle Ausführung einzelner Programmanweisungen, | *die sequenzielle Ausführung einzelner Programmanweisungen, | ||
*das Zusammenfassen von Anweisungssequenzen in Blöcken, | *das Zusammenfassen von Anweisungssequenzen in Blöcken, | ||
Zeile 32: | Zeile 32: | ||
Für die Anwendung in Java, siehe: [[Fallunterscheidung]] | Für die Anwendung in Java, siehe: [[Fallunterscheidung]] | ||
− | Fallunterscheidungen sind im Grunde | + | Fallunterscheidungen sind im Grunde lediglich Alternativen mit verschiedenen Pfaden für jedes mögliche Ergebnis. Anstatt jedoch jedes mögliche Ergebnis mit einem speziellen Programmpfad abzudecken, werden meistens nur Spezialfälle behandelt und der Rest mit einem sogenannten '''default'''-Pfad abgedeckt. Der Sprung zum Ende der Fallunterscheidung nach Abarbeiten eines Pfades ist meistens '''nicht''' in der Syntax der Programmiersprache vorgesehen und muss deswegen mit einer besonderen Anweisung erzwungen werden. Dies hat seine Hintergründe in der Art und Weise, wie die meisten [[Compiler]] eine solche Kontrollstruktur in [[Maschinencode]] übersetzen. |
== Wiederholung mit Schleifen == | == Wiederholung mit Schleifen == | ||
Zeile 38: | Zeile 38: | ||
Für die Anwendung in Java, siehe: [[Schleifen]] | Für die Anwendung in Java, siehe: [[Schleifen]] | ||
− | Eine Schleife drückt die Intention aus, in Abhängigkeit einer Aussage einen Teil des | + | Eine Schleife drückt die Intention aus, in Abhängigkeit einer Aussage einen Teil des Programms wiederholt auszuführen. Um die Häufigkeit der Wiederholung zu symbolisieren, verwenden Programme in imperativen Programmiersprachen meistens sogenannte ''Zählvariablen''. Diese vermerken, wie häufig die Schleife schon durchlaufen wurde und werden dann mit einem Zielwert verglichen, um gegebenenfalls mit der Wiederholung abzubrechen. |
Unterschieden wird hierbei zwischen kopfgesteuerten, fußgesteuerten und elementgesteuerten Schleifen. | Unterschieden wird hierbei zwischen kopfgesteuerten, fußgesteuerten und elementgesteuerten Schleifen. | ||
Zeile 48: | Zeile 48: | ||
Elementgesteuerte Schleifen verwenden meistens komplexe Datenstrukturen als Argument und iterieren über jedes Element dieser Datenstruktur, um eine Operation auf diesem auszuführen. Manche Programmiersprachen unterstützen ausschließlich diese Form von Schleife und implementieren kopf- und fußgesteuerte Schleifen mit Zählern über die Iteration von Listen von 1 bis zum Zielwert. | Elementgesteuerte Schleifen verwenden meistens komplexe Datenstrukturen als Argument und iterieren über jedes Element dieser Datenstruktur, um eine Operation auf diesem auszuführen. Manche Programmiersprachen unterstützen ausschließlich diese Form von Schleife und implementieren kopf- und fußgesteuerte Schleifen mit Zählern über die Iteration von Listen von 1 bis zum Zielwert. | ||
− | In funktionalen Programmiersprachen muss | + | In funktionalen Programmiersprachen muss die wiederholte Ausführung eines Teilprogrammes meistens über eine sogenannte Listenfaltung geführt werden und beinhaltet meist eine genauere Semantik hinter der verwendeten Syntax. Sie kommen hierbei den elementgesteuerten Schleifen am nächsten. |
Version vom 11. März 2016, 16:31 Uhr
Um die formalen Eigenschaften eines Algorithmus in die syntaktischen Eigenschaften eines Programms zu überführen, ist es notwendig, die einzelnen Anweisungen eines Algorithmus miteinander zu verknüpfen.
In vielen Programmiersprachen, so auch in Java, gibt es dafür eine kleine Grundmenge an sogenannten Kontrollstrukturen, die den Fluss eines Programms steuern. Diese sind im speziellen
- die sequenzielle Ausführung einzelner Programmanweisungen,
- das Zusammenfassen von Anweisungssequenzen in Blöcken,
- das Formulieren von alternativen Programmpfaden,
- das Formulieren von Fallunterscheidungen und
- das wiederholte Durchführen von Programmsequenzen.
Inhaltsverzeichnis
Anweisungssequenzen
Für die Anwendung in Java, siehe: Anweisungssequenzen
Eine imperative Programmiersprache notiert ihre Anweisungen hintereinander, um die Intention auszudrücken, dass diese Anweisungen hintereinander durchgeführt werden sollen.
Dies ist z.B. in funktionalen Programmiersprachen anders. Hier wird meistens die Sequenz der Ausführung von Programmteilen durch die passende Verschachtelung in Funktionsaufrufen implementiert.
Block
Für die Anwendung in Java, siehe: Block
Anweisungssequenzen, die in einem Block stehen, sollen dadurch als eine zusammenhängende Einheit gekennzeichnet werden. Meistens wird dadurch die Syntax einer Programmiersprache vereinfacht: Durch die Definition "Alles, was in einem Block ist, gilt als eine Anweisung" muss somit nicht mehr zwischen mehreren Anweisungen oder einer einzelnen Anweisung unterscheiden werden. Dies findet man häufig in Syntaxdiagrammen anderer Kontrollstrukturen wieder.
Alternativen
Für die Anwendung in Java, siehe: Alternativen
Durch Alternativen wird eine Gabelung im Programmpfad signalisiert. An dieser Stelle kann, in Abhängigkeit von einer Aussage, das Programm in einen von zwei Pfaden abzweigen. Der alternative Pfad kann dabei auch nicht vorhanden sein, um ein Überspringen des anderen Pfades zu signalisieren. Relevant ist, dass das Programm nach Durchführung der Alternative immer an der gleichen Programmzeile weiterarbeitet.
Fallunterscheidungen mit switch-case
Für die Anwendung in Java, siehe: Fallunterscheidung
Fallunterscheidungen sind im Grunde lediglich Alternativen mit verschiedenen Pfaden für jedes mögliche Ergebnis. Anstatt jedoch jedes mögliche Ergebnis mit einem speziellen Programmpfad abzudecken, werden meistens nur Spezialfälle behandelt und der Rest mit einem sogenannten default-Pfad abgedeckt. Der Sprung zum Ende der Fallunterscheidung nach Abarbeiten eines Pfades ist meistens nicht in der Syntax der Programmiersprache vorgesehen und muss deswegen mit einer besonderen Anweisung erzwungen werden. Dies hat seine Hintergründe in der Art und Weise, wie die meisten Compiler eine solche Kontrollstruktur in Maschinencode übersetzen.
Wiederholung mit Schleifen
Für die Anwendung in Java, siehe: Schleifen
Eine Schleife drückt die Intention aus, in Abhängigkeit einer Aussage einen Teil des Programms wiederholt auszuführen. Um die Häufigkeit der Wiederholung zu symbolisieren, verwenden Programme in imperativen Programmiersprachen meistens sogenannte Zählvariablen. Diese vermerken, wie häufig die Schleife schon durchlaufen wurde und werden dann mit einem Zielwert verglichen, um gegebenenfalls mit der Wiederholung abzubrechen.
Unterschieden wird hierbei zwischen kopfgesteuerten, fußgesteuerten und elementgesteuerten Schleifen.
Kopfgesteuerte Schleifen werten ihre Schleifenbedingung beim Eintritt in die Schleife aus und entscheiden dann, und vor dem Beginn jedes weiteren Durchlaufes, ob der Rumpf der Schleife ausgeführt oder übersprungen werden soll.
Fußgesteuerte Schleifen werten ihre Schleifenbedingung beim Verlassen der Schleife aus und entscheiden dann, ob zurück zum Anfang der Schleife gesprungen werden soll. Dadurch wird eine fußgesteuerte Schleife immer mindestens einmal ausgeführt.
Elementgesteuerte Schleifen verwenden meistens komplexe Datenstrukturen als Argument und iterieren über jedes Element dieser Datenstruktur, um eine Operation auf diesem auszuführen. Manche Programmiersprachen unterstützen ausschließlich diese Form von Schleife und implementieren kopf- und fußgesteuerte Schleifen mit Zählern über die Iteration von Listen von 1 bis zum Zielwert.
In funktionalen Programmiersprachen muss die wiederholte Ausführung eines Teilprogrammes meistens über eine sogenannte Listenfaltung geführt werden und beinhaltet meist eine genauere Semantik hinter der verwendeten Syntax. Sie kommen hierbei den elementgesteuerten Schleifen am nächsten.