Sequenzen
Ein Algorithmus setzt sich aus verschiedenen sogenannten Strukturelementen zusammen. Welche dieser Elemente hierbei zur Anwendung kommen, hängt in erster Linie davon ab, welches Problem mithilfe eines Algorithmus gelöst werden soll. Jede Programmiersprache verfügt daher über einen mehr oder weniger reichhaltigen Satz dieser Grundbefehle und -strukturen. Die Reihenfolge und Kombination mit welchen diese Befehle angewendet werden, entscheidet darüber, ob und wie effizient ein Problem oder eine Aufgabenstellung gelöst wird. Sie sind also die Bausteine, aus denen ein Algorithmus zusammengestellt wird.
Die wichtigsten dieser Strukturelemente werden in diesem Kapitel vorgestellt und an Beispielen illustriert. Der erste Baustein sind die Sequenzen.
Werden mehrere Befehle hintereinandergestellt und entsprechend ausgeführt, so bilden diese eine Anweisungsfolge oder Sequenz. Einzelne Anweisungen müssen in vielen Programmiersprachen durch einen Strichpunkt voneinander getrennt werden. Allerdings gibt es diesbezüglich viele unterschiedliche Konventionen.
Das Entscheidende hierbei ist, dass die Befehle vom Computer streng in der gegebenen Reihenfolge abgearbeitet werden. Gleichungen und Aussagen in der Mathematik zum Beispiel können immer in beliebiger Reihenfolge gelistet werden ohne, dass sich ihre Lösungen beziehungsweise ihr Wahrheitsgehalt ändert. Aber auch wenn viele Computerprogramme starke Ähnlichkeiten zu mathematischen Formeln aufweisen, muss hier an das Analogon mit dem Kochrezept gedacht werden: Selbst wenn es egal ist, ob der Koch erst Wasser oder Eier zum Teig hinzufügt, so muss im Rezept selbst immer eins vor dem anderen stehen.
In den meisten Programmiersprachen werden Anweisungsfolgen durch die Verwendung geschweifter Klammern zu einer neuen Anweisung zusammengefasst, die man (Code)-Block nennt. Soll so eine Sammlung an Anweisungen öfters in einem Programm verwendet werden, bietet es sich an, sie als Funktion zusammenzufassen. Das bedeutet, dass so einem Block ein eigener Name gegeben wird, über den dieser anschließend aufgerufen werden kann.
Hierzu ein Beispiel einer Funktion, die die Koeffizienten einer quadratischen Abbildung erhält und anschließend anhand der Diskriminante entscheidet, wie viele reelle Nullstellen diese besitzt:
1: anzahl_nullstellen(a, b, c) {
2: Berechne d = b^2 - 4 * a * c
3: Ist d < 0 ?
4: | Gib das Ergebnis 0 aus
5: Ist d == 0 ?
6: | Gib das Ergebnis 1 aus
7: sonst
8: | Gib das Ergebnis 2 aus
9: }
In Zeile 1 wird eine neue Funktion anzahl_nullstellen
deklariert. In den meisten Sprachen wird dann nur die erste Anweisung, die der Deklaration folgt, der Funktion zugeordnet. In diesem Fall die Berechnung der Diskriminante d. Um alle Befehle in den Zeilen 2 bis 8 ausführen zu lassen, müssen diese in geschweifte Klammern gefasst werden. Dadurch werden diese als ein einziger, großer Befehl aufgefasst.
Damit unterscheiden sich solche informatischen Funktion nur unwesentlich von Funktionen der Mathematik. Allerdings müssen Funktionen in Programmcodes weder Eingabe- noch Ausgabewerte haben. Im Allgemeinen berechnen sie also keine konkreten Werte, sondern tun “irgendwas”. Das kann zwar das Bestimmen eines (Zahlen-)Werts sein, aber auch z. B. das Ändern der Schriftfarbe auf einem Computerbildschirm oder das Steuern eines Druckers.
Mehr Informationen zu Algorithmen finden Sie unter (Dieker & Güting, 2018).