Pseudocode
https://oer-informatik.de/pseudocode
https://bildung.social/@oerinformatik/112027742368445364/
tl/dr; (ca. 6 min Lesezeit): Die Dokumentation oder der Entwurf von Algorithmen soll häufig unabhängig von einer spezifischen Programmiersprache erfolgen. Eine Möglichkeit ist es, Pseudocode zu verwenden. Drei verbreitete Pseudocode-Notationen werden hier dargestellt: JANA, Pseudo-Pascal und eine deutsche Übersetzung von Pseudo-Pascal. Für alle Varianten werden Schlüsselwörter und Konstrukte aufgezeigt, um Algorithmen mit Pseudocode beschreiben zu können. (Zuletzt geändert am 17.04.2024)
Darstellungsformen von Algorithmen
Um Algorithmen allgemeinverständlich auszudrücken, ohne den Adressatenkreis auf eine Programmiersprache einzugrenzen, werden häufig Programmiersprachen-unabhängige Ausdrucksformen gewählt. Neben
dem Programmablaufplan (PAP, DIN 66001) (siehe Übersicht der Programmentwurfstechniken),
dem Nassi-Shneiderman-Diagramm (“Struktogramm”, DIN 66261) (siehe Übersicht der Programmentwurfstechniken)
oder dem UML-Aktivitäts-Diagramm (siehe gesonderter Artikel)
ist dies v.a. auch eine natürlichsprachlich vereinfachte und syntaxfreie Form des Programmcodes - der Pseudocode.
Geläufige Pseudocode-Notationen
Für Pseudocode gibt es kein festes einheitliches Regelwerk, vielmehr muss eine für den Adressatenkreis passende Variante gewählt werden: Häufig wird eine geläufige Programmiersprache vereinfacht. Beispielhaft werden hier drei Varianten vorgestellt, die häufig eingesetzt werden:
JANA: Insbesondere für Entwickler*innen mit Java/C/C++/C#-Kenntnissen leicht verständliche Notation (Java-Based Abstract Notation for Algorithms)
Pseudo-Pascal: An die Programmiersprache Pascal angelehnte Variante (v.a. in älteren Lehrwerken verbreitet)
deutsches Pseudo-Pascal (eigene Namensschöpfung): eine eingedeutschte Pseudo-Pascal-Variante, die vor allem im Bereich der Fachinformatiker*innen-Ausbildung verwendet wird (da die IHK sie in den Prüfungen und Beispiellösungen verwendet).
Alle diese Varianten lassen sich mit etwas Übung gleichwertig nutzen. Ungeübt ist es empfehlenswert, nahe an einer vertrauten Programmiersprache zu bleiben. Man sollte dann allerdings aufpassen, dass man auf den Einsatz von Sprachkonstrukten verzichtet, die es nur in bestimmten Programmiersprachen gibt (z.B. Lambda-Ausdrücke, Annotations, Dekorator, bestimmte Iterations- Bedingungsabkürzungen).
Für angehende Fachinformatiker*innen kann es sinnvoll sein, sich direkt mit dem deutschen Pseudo-Pascal vertraut zu machen: Es wird häufig in den Musterlösungen der IHK-Prüfung verwendet und wurde zuletzt auch einmal in der Notationshilfe zur Prüfung abgedruckt.
Wesentliche Eigenschaften von Pseudocode
Wichtig bei der Erstellung von Pseudocode ist:
Verständlichkeit des Pseudocodes ist wichtiger als starre Konventionen!
Unnötige Details vermeiden: das Offensichtliche kann als bekannt vorausgesetzt werden!
Im Kontext bleiben: Wer ist Adressat und in welcher Problemdomäne befinde ich mich? Wem beantworte ich mit dem Pseudocode welche Frage?
Stimmige Abstraktionsgrade wählen: Baut der Abstraktionsgrad meiner Operationen auf den Abstraktionsgrad des umgebenden Moduls auf? Das Single Layer of Abstraction (SLA)-Prinzip gilt auch für Pseudocode!
Beispiele für Pseudocode
Definition von Blöcken (Scopes / Suites)
Programmblöcke definieren den Gültigkeitsbereich von lokalen Variablen und markieren das Ende von Schleifen und Bedingungen. Wie in Java üblich erfolgt die Blockdefinition bei JANA in geschweiften Klammern. In den Pascal-Pseudocodes wird jedes Schlüsselwort mit end
und dem Schlüsselwort beendet. Alternativ ist auch die Einrückung als Blockdefinition möglich (Python-Stil). Dies ist jedoch insbesondere bei handschriftlicher Notation ggf. fehleranfällig und schwer zu korrigieren.
JANA | Pseudo-Pascal | deutsches Pseudo-Pascal |
---|---|---|
{ Anweisung } |
for (...) Anweisung end for |
WENN (...) Anweisung ENDE WENN |
Deklaration von Datentypen
Variablen, die nicht als Parameter übergeben werden (oder als global gültig definiert wurden), sollten in irgendeiner Form deklariert werden. Abhängig von der gewählten Pseudocode-Art wird Datentyp oder Name zuerst genannt. Bei Pseudo-Pascal erfolgt die Typdeklaration mit dem Doppelpunkt :
.
JANA | Pseudo-Pascal | deutsches Pseudo-Pascal |
---|---|---|
int i |
i: int |
i: GANZZAHL |
int i := 0 |
i: int := 0 |
i: GANZZAHL := 0 |
Object o |
o: Object |
o: OBJEKT |
Die implizite Deklaration und Initialisierung sollte bei Pseudo-Pascal vermieden werden, da sie unübersichtlich wird. Bei JANA ist empfehlenswert für Zuweisungen mit :=
zu kennzeichnen (nach Standard würde =
reichen, ist aber weniger deutlich).
Es sollten keine Programmiersprachen-spezifischen Datentypen verwendet werden. Üblich sind etwa folgende Standardtypen:
JANA | Pseudo-Pascal | deutsches Pseudo-Pascal | Beispiel |
---|---|---|---|
int | integer | GANZZAHL | -1, 0, 1, 2 |
float | real | GLEITKOMMAZAHL | 0.0 |
char | char | ZEICHEN | ‘a’, ‘b’, ‘c’ |
boolean | boolean | WAHRHEITSWERT | true, false |
String | String | ZEICHENKETTE | “Hallo Welt” |
Operatoren
Operator | Erläuterung |
---|---|
+ ,- ,/ ,* |
Mathematische Operatoren |
& |
sollte kommentiert werden, ob es sich um Bitoperation oder Konkatenierung handelt |
:= |
Zur besseren Unterscheidung von Zuweisungsoperator und Vergleichsoperator sollte im Pseudocode “:=” für Zuweisungen verwendet werden (i := i+1 ) (in JANA gilt eigentlich = als Zuweisung) |
< , > , == , != |
Vergleichsoperatoren (Ergebnis == true ) |
: |
Bei Pseudo-Pascal: Deklaration von Datentypen (text : String ); sollte nicht für Division verwendet werden! |
AND , OR , NOT |
Logische Operatoren. Auch Deutsch möglich. & bzw. | sollte wegen Doppeldeutigkeit vermieden oder per Kommentar erläutert werden. (i>5 AND b==2 ) |
Selektion / bedingte Anweisung
Einfache Bedingung
JANA | Pseudo-Pascal | deutsches Pseudo-Pascal |
---|---|---|
if (...){ Anweisung }else if (...){ Anweisung }else{ Anweisung } |
if (...) then Anweisung else if (...) Anweisung else Anweisung end if |
WENN (...) DANN Anweisung SONST WENN (...) DANN Anweisung SONST Anweisung ENDE WENN |
Bedingung mit Mehrfachauswahl
JANA | Pseudo-Pascal | deutsches Pseudo-Pascal |
---|---|---|
switch (variable) { case 1: {Anweisung} case >=2: {Anweisung} default: {Anweisung} } |
case variable of 1: Anweisung >=2: Anweisung else Anweisung end case |
WERT VON variable ENTSPRICHT 1: Anweisung >=2: Anweisung SONST Anweisung ENDE WERT VON |
In JANA sind im Gegensatz zu Java keine break
-Statements nötig, zudem können auch booleansche Ausdrücke (>=2
) genutzt werden.
Iterationen / Wiederholungsstrukturen
Kopfgesteuerte Schleifen
JANA | Pseudo-Pascal | deutsches Pseudo-Pascal |
---|---|---|
while (...){ Anweisung } |
while (...) do Anweisung end while |
SOLANGE (...) Anweisung ENDE SOLANGE |
Fussgesteuerte Schleifen
JANA | Pseudo-Pascal | deutsches Pseudo-Pascal |
---|---|---|
do { Anweisung } while (...) |
repeat Anweisung until (...) |
WIEDERHOLE Anweisung SOLANGE (...) |
Zählergesteuerte Schleifen
JANA | Pseudo-Pascal | deutsches Pseudo-Pascal |
---|---|---|
for (...) { Anweisung } |
for (...) Anweisung end for |
ZÄHLE i VON 0 BIS 7 Anweisung ENDE ZÄHLE |
Die zur iterierende Menge kann relativ frei eingegeben werden, solange sie eindeutig definiert wird. Denkbar ist z.B.:
for (int i = 1..10)
for (int i; i<=10; i++)
for (int i = 1, 2, 3, .., 10)
Iterationen durch Mengen/Listen können auch in Kurzschreibweise erfolgen:
JANA | Pseudo-Pascal | deutsches Pseudo-Pascal |
---|---|---|
foreach (String txt in txtList) { Anweisung } |
foreach element in list Anweisung next element |
FÜR JEDES element VON liste Anweisung NÄCHSTES element |
Methodendeklaratione
JANA | Pseudo-Pascal | deutsches Pseudo-Pascal |
---|---|---|
String halloWelt(String text){ return "Hallo " & text } |
FUNCTION halloWelt(text: String) : String Anweisung END halloWelt() |
FUNKTION halloWelt(text: String) : String RÜCKGABE "Hallo " & text ENDE halloWelt() |
Aufgerufen wird die obige Methoden einheitlich im Pseudocode mit halloWelt("Herbert")
.
Arrays und Collections
Arrays und Objektsammlungen können im Pseudocode ebenfalls eingesetzt werden, wobei auch hier auf sprachspezifische Konstrukte wo immer möglich verzichtet werden sollte (z.B. Dictionaries, Maps, Sets).
JANA | Pseudo-Pascal | deutsches Pseudo-Pascal |
---|---|---|
int zahlenfeld[] |
zahlenFeld = array [] of integer |
zahlenFeld = eindimensionales Ganzzahlen-Array |
int zahlenfeld[1..100] |
zahlenFeld = array [1..100] of integer |
zahlenFeld = eindimensionales Ganzzahlen-Array mit 100 Elementen |
zahlenfeld[n, m] |
zahlenFeld = array [1..n, 1..m] of integer |
zahlenFeld = zweidimensionales Ganzzahlen-Array |
zahlen2D[].length |
zahlen2D[].length |
zahlen2D[].LÄNGE |
Zu beachten ist, dass bei Java/C der Array-Index üblicherweise mit 0 anfängt, bei Pascal mit 1: es sollte daher eindeutig beschrieben werden, welche Variante man wählt (obige Beispiele haben daher unterschiedlich viele Elemente!).
Objekte / Klassen
In selteneren Fällen wird Pseudocode auch zur Darstellung objektorientierter Programmblöcke verwendet. Häufig ist hier jedoch die direkte Implementierung in einer Sprache oder die Darstellung über UML zielführender.
JANA | Pseudo-Pascal | deutsches Pseudo-Pascal | |
---|---|---|---|
Kopf | class Auto{ ... } |
class Auto ... end class |
KLASSE Auto ... ENDE KLASSE Auto |
Typdeklartion Instanziierung |
Auto a := new Auto() |
a : Auto a := new Auto() |
a : Auto a := INSTANZ VON Auto() |
Konstruktor | public Auto(){ Anweisung } |
public CONSTRUCTOR Auto() Anweisung END Auto() |
ÖFFENTLICH KONSTRUKTOR Auto() Anweisung ENDE Auto() |
Getter | public String getName(){ return name } |
public Function getName(): String Anweisung END getName() |
ÖFFENTLICH FUNKTION getName():String RÜCKGABE name ENDE getName() |
Setter | public void setName(String name){ this.name := name } |
public FUNCTION setName(name: String) :void this.name := name END setName() |
ÖFFENTLICH FUNKTION setName(name: String) :void this.name := name ENDE setName() |
Kommentare
Kommentare sind in den verbreitesten Notationen möglich, z.B.:
// Kommentar
/* Kommentar */
# Kommentar
Links und weitere Informationen
Hinweis zur Nachnutzung als Open Educational Resource (OER)
Dieser Artikel und seine Texte, Bilder, Grafiken, Code und sonstiger Inhalt sind - sofern nicht anders angegeben - lizenziert unter CC BY 4.0. Nennung gemäß TULLU-Regel bitte wie folgt: “Pseudocode” von Hannes Stein, Lizenz: CC BY 4.0. Der Artikel wurde unter https://oer-informatik.gitlab.io/algorithmik/pseudocode/pseudocode.html veröffentlicht, die Quelltexte sind in weiterverarbeitbarer Form verfügbar im Repository unter https://gitlab.com/oer-informatik/algorithmik/pseudocode. Stand: 17.04.2024.
[Kommentare zum Artikel lesen, schreiben] / [Artikel teilen] / [gitlab-Issue zum Artikel schreiben]