https://oer-informatik.de/pseudocode
Pseudocode
tl/dr; (ca. 6 min Lesezeit): Vorstellung von drei gängigen Pseudocode-Notationen: 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.
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),
dem Nassi-Shneiderman-Diagramm (“Struktogramm”, DIN 66261)
oder dem UML-Aktivitäts-Diagramm
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 für FachinformatikerInnen zur Abschlussprüfungsvorbereitung eingesetzt werden können:
JANA: Insbesondere für Entwickler mit Java/C-Kenntnisen 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): in den IHK-Beispiellösungen wird eine Art eingedeutschtes Pseudo-Pascal verwendet. Die genutzten Elemente werden hier genannt.
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
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 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 |
---|---|---|
repeat { Anweisung } until (...) |
repeat Anweisung until (...) |
WIEDERHOLE Anweisung SOLANGE (...) |
Zählergesteuerte Schleifen
JANA | Pseudo-Pascal | deutsches Pseudo-Pascal |
---|---|---|
for (...) { Anweisung } |
for (...) Anweisung end for |
ZÄHLE VON i := 0 BIS 7 Anweisung NÄCHSTES i |
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 |
Methodendeklarationen
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
Quellen und offene Ressourcen (OER)
Die Ursprungstexte (als Markdown), Grafiken und zugrunde liegende Diagrammquelltexte finden sich (soweit möglich in weiterbearbeitbarer Form) in folgendem git-Repository:
https://gitlab.com/oer-informatik/algorithmik/pseudocode.
Sofern nicht explizit anderweitig angegeben sind sie zur Nutzung als Open Education Resource (OER) unter Namensnennung (H. Stein, oer-informatik.de) freigegeben gemäß der Creative Commons Namensnennung 4.0 International Lizenz (CC BY 4.0).