Vom Ablauf zum Algorithmus

Aus SELFHTML-Wiki
Wechseln zu: Navigation, Suche

Bevor du ein Computerprogramm schreibst – oder eine KI damit beauftragst –, musst du wissen, was es tun soll und wie die Aufgabe gelöst werden kann. Dazu gehört, einen Ablauf zu planen und in einzelne Schritte zu zerlegen.

Ein Kochrezept ist dafür ein gutes Beispiel. Es beschreibt, welche Zutaten benötigt werden und was mit ihnen geschehen soll. Die Reihenfolge ist wichtig: Kartoffeln müssen erst gewaschen und geschält werden, bevor sie geschnitten werden. Manche Schritte hängen von einer Bedingung ab, andere müssen mehrfach wiederholt werden.

In der Informatik nennt man eine genaue Beschreibung solcher Handlungsschritte einen Algorithmus. Er beschreibt einen Lösungsweg unabhängig davon, in welcher Programmiersprache er später umgesetzt wird.

Auch wenn eine KI den Programmcode schreibt, ist es hilfreich, die dahinterliegenden Strukturen zu verstehen. Nur dann kannst du nachvollziehen, was das Programm macht, mögliche Fehler erkennen und überprüfen, ob die Lösung tatsächlich zur Aufgabe passt.

In diesem Artikel entwickelst du aus einem einfachen Kochrezept einen Algorithmus. Dabei lernst du, Abläufe zu strukturieren, Entscheidungen und Wiederholungen zu beschreiben und einzelne Schritte zu wiederverwendbaren Teilabläufen zusammenzufassen. Anschließend erfährst du, wie sich solche Abläufe in Diagrammen darstellen lassen.

Vom Rezept zum Algorithmus

Ein Kochrezept beschreibt, wie aus Zutaten ein fertiges Gericht wird. Dafür werden die Arbeitsschritte in einer bestimmten Reihenfolge ausgeführt. Manche Schritte hängen davon ab, was gerade vorliegt; andere müssen mehrfach wiederholt werden.

Diese Aneinanderreihung von Einzelschritten hin zu einer Problemlösung wird in der Informatik Algorithmus genannt.[1] Dieser Algorithmus kann in Pseudocode oder in einem Diagramm oder Struktogramm dargestellt werden.


Anweisungen: Schritte in der richtigen Reihenfolge

Beispiel eines Struktogramms nach Nassi-Shneiderman mit mehreren Anweisungen
Anweisungen

Um Gemüse für einen Eintopf vorzubereiten, müssen mehrere Arbeitsschritte ausgeführt werden:

# Kartoffeln waschen
# Kartoffeln schälen
# Kartoffeln in Stücke schneiden
# Die Stücke beiseitelegen

Solche einzelnen Arbeitsschritte heißen in der Programmierung Anweisungen (englisch: statement). Sie werden in der festgelegten Reihenfolge ausgeführt.

Die Reihenfolge ist wichtig: Wenn du die Kartoffeln zuerst schneidest und erst danach schälst, ist das Ergebnis zwar vielleicht noch brauchbar, aber der Ablauf ist ein anderer. Bei anderen Aufgaben kann eine falsche Reihenfolge dazu führen, dass die Lösung nicht funktioniert.

Bedingungen: Wenn … dann … sonst

Beispiel eines Struktogramms nach Nassi-Shneiderman für eine bedingte Anweisung
bedingte Anweisung (Verzweigung)

Nicht alle Kartoffelstücke sind gleich groß. Damit sie beim Kochen ungefähr gleichzeitig gar werden, sollten zu große Stücke noch einmal geteilt werden.

Dazu wird eine Bedingung geprüft:

WENN Kartoffelstück größer als 3 cm
  DANN Stück noch einmal schneiden
  SONST Stück beiseitelegen

Eine bedingte Anweisung prüft, ob eine Bedingung erfüllt ist. Trifft sie zu, wird eine bestimmte Anweisung ausgeführt. Andernfalls kann eine andere Anweisung folgen – oder es geschieht nichts.

Der Ablauf verzweigt sich also je nach Ergebnis der Prüfung. Deshalb spricht man auch von einer Verzweigung**.


Schleifen: Schritte wiederholen

Die Kartoffelstücke sollen höchstens 3 cm groß sein. Ist ein Stück noch zu groß, wird es gedreht und erneut geschnitten. Anschließend wird geprüft, ob es jetzt klein genug ist. Dieser Ablauf wird bei Bedarf wiederholt.

Eine Schleife führt bestimmte Anweisungen mehrfach aus. Wie oft sie durchlaufen wird, hängt davon ab, welche Art von Schleife verwendet wird.

Beispiel eines Struktogramms nach Nassi-Shneiderman für eine kopfgesteuerte Schleife
kopfgesteuerte Schleife
SOLANGE Kartoffelstück > 3 cm
    Stück drehen
    Stück erneut schneiden


Bei einer kopfgesteuerten Schleife wird die Bedingung vor jedem Durchlauf geprüft. Ist sie erfüllt, werden die Anweisungen im Schleifenrumpf ausgeführt. Anschließend wird die Bedingung erneut geprüft.

Ist das Kartoffelstück bereits klein genug, wird der Schleifenrumpf gar nicht ausgeführt. So lassen sich unnötige Arbeitsschritte vermeiden.

Manchmal soll ein Arbeitsschritt mindestens einmal ausgeführt werden, bevor das Ergebnis überprüft wird. Dafür eignet sich eine fußgesteuerte Schleife:

Beispiel eines Struktogramms nach Nassi-Shneiderman für eine fußgesteuerte Schleife
fußgesteuerte Schleife
WIEDERHOLE
    Stück drehen
    Stück erneut schneiden
SOLANGE Kartoffelstück > 3 cm

Hier werden die Anweisungen zuerst ausgeführt. Erst danach wird die Bedingung geprüft. Ist das Stück noch zu groß, folgt ein weiterer Durchlauf. Deshalb wird der Schleifenrumpf bei einer fußgesteuerten Schleife immer mindestens einmal ausgeführt.

Wie oft wird eine Schleife ausgeführt?

Die Anzahl der Durchläufe kann auf unterschiedliche Weise festgelegt werden.

Wenn beispielsweise fünf Kartoffeln vorbereitet werden sollen, kann eine Anweisung fünfmal ausgeführt werden. Das nennt man eine zählergesteuerte Schleife.

Bei anderen Aufgaben steht die Anzahl der Durchläufe vorher nicht fest. Dann wird die Wiederholung an eine Bedingung geknüpft: etwa so lange, bis alle Kartoffelstücke klein genug sind.

Welche Art von Schleife sinnvoll ist, hängt von der Aufgabe ab. Wichtig ist, dass die Wiederholung ein klares Ende hat. Wird die Abbruchbedingung niemals erfüllt, kann eine Endlosschleife entstehen.

Teilabläufe zusammenfassen und wiederverwenden

In einem Kochrezept steht häufig nur: „Kartoffeln schälen und schneiden.“ Wie man eine Kartoffel schält, muss nicht jedes Mal neu erklärt werden. Der einzelne Arbeitsschritt ist bekannt und kann bei Bedarf wiederholt werden.

Auch ein größerer Ablauf lässt sich in einzelne Teilabläufe zerlegen. Für einen Eintopf müssen beispielsweise Kartoffeln und Karotten vorbereitet werden. Statt alle Arbeitsschritte für jedes Gemüse erneut zu beschreiben, kann man sie unter einer gemeinsamen Bezeichnung zusammenfassen.

In einem Algorithmus könnte das so aussehen:

FUNKTION zuschneiden(Gemüse)
    Gemüse waschen
    WENN Gemüse geschält werden muss
        Gemüse schälen
    ENDE WENN
    Gemüse in Stücke schneiden
    GIB vorbereitete Stücke zurück
ENDE FUNKTION
Beispiel eines Struktogramms nach Nassi-Shneiderman für eine Funktion
Funktion (Unterprogramm)

Die Funktion zuschneiden fasst mehrere Anweisungen und eine bedingte Anweisung zu einem benannten Teilablauf zusammen. Beim Aufruf muss nicht mehr beschrieben werden, wie jeder einzelne Schritt ausgeführt wird.

Kartoffeln = zuschneiden(Kartoffeln)
Karotten = zuschneiden(Karotten)

Obwohl beide Aufrufe dieselbe Funktion verwenden, werden unterschiedliche Zutaten verarbeitet. Die übergebenen Informationen heißen Parameter. Sie machen einen Teilablauf flexibel, weil er mit unterschiedlichen Werten verwendet werden kann.

Ein solcher Teilablauf wird in der Programmierung häufig als Funktion bezeichnet. Im engeren Sinn liefert eine Funktion einen Rückgabewert, den andere Teile des Programms weiterverwenden können. Eine Prozedur fasst dagegen vor allem Anweisungen zusammen, die ausgeführt werden sollen. Die genaue Verwendung dieser Begriffe unterscheidet sich je nach Programmiersprache.

Funktionen helfen dabei, komplexe Abläufe übersichtlicher zu gestalten. Wer eine Funktion verwendet, muss nicht jedes Mal ihre einzelnen Schritte nachvollziehen, sondern kann sich zunächst darauf konzentrieren, was sie erledigt. Erst wenn man verstehen oder überprüfen möchte, wie sie arbeitet, muss man sich ihre interne Beschreibung ansehen.

Gerade wenn eine KI Programmcode erzeugt, ist dieses Prinzip hilfreich: Aussagekräftige Funktionsnamen machen sichtbar, welche Aufgaben das Programm in einzelne Bausteine zerlegt. Ob diese Bausteine tatsächlich das Richtige tun, muss man allerdings weiterhin überprüfen.

Werte und Variablen

Die Funktion zum Zuschneiden lässt sich für verschiedene Zutaten und unterschiedliche Größen verwenden. Dazu müssen wir nicht jedes Mal einen neuen Ablauf beschreiben. Stattdessen übergeben wir der Funktion die Informationen, die sich ändern sollen:

FUNKTION zuschneiden (Zutat, Zielgröße)
    Zutat in Stücke schneiden
    SOLANGE ein Stück größer als Zielgröße
        Stück erneut schneiden
    ENDE SOLANGE
    GIB Stücke zurück
ENDE FUNKTION
Beispiel eines Struktogramms nach Nassi-Shneiderman für eine Funktion mit Übergabewerten
Funktion mit Übergabewerten

Die Funktion kann nun für unterschiedliche Zutaten und Größen aufgerufen werden:

zuschneiden (Kartoffeln, 3 cm)
zuschneiden (Karotten, 3 cm)
zuschneiden (Fleisch, 1 cm)

Die Namen Zutat und Zielgröße stehen innerhalb der Funktion für Werte, die erst beim Aufruf festgelegt werden. Sie heißen Parameter. Die konkreten Angaben wie Kartoffeln oder 3 cm, die beim Aufruf übergeben werden, nennt man Argumente.

Solche benannten Platzhalter für Werte spielen in der Programmierung eine wichtige Rolle. Sie heißen Variablen. Ihr Wert kann sich während eines Ablaufs ändern oder je nach Situation unterschiedlich sein. So muss ein Algorithmus nicht für jeden möglichen Wert neu beschrieben werden.

Variablen können unterschiedliche Arten von Werten aufnehmen, zum Beispiel:

  • Zahlen, etwa die Anzahl der Kartoffeln oder eine gewünschte Größe;
  • Texte, etwa den Namen einer Zutat;
  • Wahrheitswerte (wahr oder falsch), etwa die Antwort auf die Frage, ob ein Herd eingeschaltet ist.

Welche Werte eine Variable annehmen kann und wie sie verwendet wird, hängt von der jeweiligen Programmiersprache ab.

Diagramme

Ein Algorithmus lässt sich auf unterschiedliche Weise beschreiben: in Alltagssprache, mit Pseudocode oder als grafische Darstellung. Ein Diagramm macht sichtbar, welche Schritte nacheinander ausgeführt werden, wo Entscheidungen getroffen werden und welche Anweisungen wiederholt werden.

Du hast bereits einige Beispiele für solche Darstellungen kennengelernt. Besonders geeignet sind Struktogramme und Programmablaufpläne. Beide stellen denselben Algorithmus dar, verwenden dafür aber unterschiedliche grafische Mittel.

Struktogramm

Kartoffelkochen als Struktogramm nach Nassi-Shneiderman

Ein Struktogramm (auch Nassi-Shneiderman-Diagramm) stellt einen Algorithmus mithilfe rechteckiger, ineinander geschachtelter Blöcke dar. Jeder Block steht für eine Anweisung oder eine Kontrollstruktur.

Die Anweisungen werden von oben nach unten ausgeführt. Eine Verzweigung zeigt, welche Anweisungen abhängig von einer Bedingung ausgeführt werden. Schleifen fassen Anweisungen zusammen, die mehrfach durchlaufen werden.

Da die Struktur die Reihenfolge vorgibt, benötigt ein Struktogramm keine Pfeile zwischen den einzelnen Blöcken. Es eignet sich besonders gut, um die grundlegenden Strukturen eines Algorithmus übersichtlich darzustellen.

Struktogramme wurden für die strukturierte Programmierung entwickelt. In der heutigen Softwareentwicklung werden sie nur noch selten eingesetzt. Zum Lernen und Verstehen von Algorithmen sind sie aber weiterhin nützlich.

Programmablaufplan

Programmablaufplan des RoboPro von Fischertechnik
Programmablaufplan des RoboPro von Fischertechnik

Ein Programmablaufplan (PAP), auch Flussdiagramm (englisch: flowchart) genannt, stellt den Ablauf mithilfe festgelegter grafischer Symbole und Verbindungspfeile dar.[2]


  • Ein abgerundetes Rechteck kennzeichnet Anfang und Ende.
  • Ein Rechteck steht für eine Anweisung oder Verarbeitung.
  • Eine Raute kennzeichnet eine Entscheidung, bei der sich der Ablauf verzweigt.
  • Pfeile zeigen, in welcher Richtung der Ablauf weitergeht.

Im Gegensatz zum Struktogramm folgt ein PAP also dem Verlauf der Verbindungspfeile. Dadurch lassen sich auch komplexere Abläufe mit mehreren Verzweigungen darstellen. Bei umfangreichen Algorithmen können allerdings lange Pfeile und unübersichtliche Verbindungen entstehen.

Auch Programmablaufpläne werden heute seltener zur Beschreibung von Software eingesetzt als früher. Sie können jedoch hilfreich sein, um Abläufe zu planen oder verständlich zu erklären.

Welche Darstellung ist sinnvoll?

Für kleine Algorithmen reicht häufig Pseudocode aus. Er lässt sich schnell schreiben und ändern. Ein Struktogramm hilft, die grundlegenden Kontrollstrukturen und ihre Verschachtelung zu erkennen. Ein Programmablaufplan eignet sich, wenn der Weg durch verschiedene Schritte und Entscheidungen im Mittelpunkt steht.

Keine dieser Darstellungen ersetzt das Prüfen des Algorithmus. Auch ein übersichtliches Diagramm kann Fehler enthalten. Entscheidend ist, ob der beschriebene Ablauf das gewünschte Problem tatsächlich löst.


Vom Algorithmus zum Programm

Ein Algorithmus beschreibt, wie eine Aufgabe gelöst werden soll. Damit ein Computer ihn ausführen kann, muss er in eine geeignete Form gebracht werden.

Dafür muss man nicht unbedingt von Anfang an Programmcode schreiben. Blockbasierte Programmierumgebungen wie Scratch ermöglichen es, Programme aus grafischen Bausteinen zusammenzusetzen. Die Bausteine stehen für Anweisungen, Bedingungen, Schleifen oder andere Programmstrukturen und lassen sich wie Puzzleteile miteinander verbinden.[3][4]

Anders als bei einem Programmablaufplan wird dabei nicht nur der Ablauf beschrieben: Die zusammengesetzten Blöcke bilden ein ausführbares Programm. So lassen sich beispielsweise kleine Spiele, Animationen und interaktive Geschichten entwickeln.

Auch wenn du später mit einer textbasierten Programmiersprache wie JavaScript arbeitest oder eine KI Programmcode erzeugen lässt, bleiben die grundlegenden Strukturen dieselben. Wer sie versteht, kann Programme besser nachvollziehen, überprüfen und verbessern.



Weiterführend: UML-Aktivitätsdiagramme

Für umfangreichere Softwareprojekte gibt es mit der Unified Modeling Language (UML) eine standardisierte Sprache zur Modellierung von Software und anderen Systemen. Ihre Aktivitätsdiagramme stellen Abläufe, Entscheidungen und parallele Aktivitäten grafisch dar.

Sie gehen damit über die einfachen Darstellungen hinaus, die du in diesem Artikel kennengelernt hast. Für den Einstieg in algorithmisches Denken reichen Pseudocode und einfache Struktogramme oder Programmablaufpläne jedoch aus.

Weblinks

  1. ↑ Wikipedia: Algorithmus
  2. ↑ Wikipedia: Programmablaufplan
  3. ↑ Wikipedia: Scratch (Programmiersprache)
  4. ↑ Scratch: das deutschsprachige Scratch-Wiki