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

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).

Creative Commons Lizenzvertrag

Kommentare gerne per Mastodon, Verbesserungsvorschläge per gitlab issue (siehe oben). Beitrag teilen: