Caesar-Verfahren in der REPL
Caesar-Verfahren
Wir werden uns auf dieser Seite damit beschäftigen, wie man einzelne Zeichen nach dem Caesar-Verfahren verschlüsseln kann. Die Verarbeitung ganzer Zeichenketten wird in einem späteren Kapitel behandelt.
Verschiebung um 3: A -> D Z -> C
Zeichen in Zahlen umwandeln und umgekehrt
Die Verarbeitung von Buchstaben erfolgt am einfachsten, wenn man ihre
Position in der ASCII-Tabelle nutzt.
Elm stellt hierzu die vordefinierten Funktionen Char.toCode
und Char.fromCode
zur Verfügung.
Bei diesen Funktionen muss man - wie bei vielen anderen auch - eine Angabe (hier Char
) hinzufügen, die angbibt,
in welcher Datei (ganz genau: in welchem Modul) die Funktion definiert wurde.
Du willst mehr über Module wissen?
In Elm werden Funktionen und Typen in Modulen organisiert.
Um die Funktion toCode
aus dem Modul Char
zu verwenden,
muss man das Modul importieren. Das geschieht mit der Anweisung import Char
.
Weil es einige Module gibt, die man sehr häufig benötigt,
importiert Elm diese Module automatisch, was beim Modul Char
der Fall ist.
Du kannst die Funktion deshalb mit Char.toCode
verwenden, ohne sie
explizit importieren zu müssen.
Man kann beim Importieren auch angeben, dass bestimmte Funktionen oder Typen
auch ohne den Modulnamen verwendet werden können sollen.
Das geschieht z.B. mit der Anweisung import Char exposing (toCode)
.
Dann kannst du die Funktion toCode
ohne den Modulnamen verwenden.
Wenn du alle Funktionen und Typen aus dem Modul Char
direkt verfügbar machen möchtest,
kannst du import Char exposing (..)
verwenden.
Elm importiert das Modul Basics
, das besonders wichtige Funktionen
wie toFloat
, +
oder round
enthält,
mit der Anweisung import Basics exposing (..)
.
Das bedeutet, dass du die Funktionen ohne den Modulnamen verwenden kannst.
Alle anderen Module, die automatisch importiert werden, wie z.B.
Char
oder String
,
importiert Elm im Wesentlichen mit einer Anweisung wie import Modulname
.
Das bedeutet, dass du die Funktionen mit dem Modulnamen verwenden musst.
Die Details der Default-Imports findest du in der Elm-Dokumentation.
Zusammenfassend kann man sagen:
Alle Funktionen aus dem Modul Basics
kannst du ohne den Modulnamen verwenden.
Dazu gehören z.B. die Funktionen toFloat
, +
und round
.
Welche Funktionen im Modul Basics
enthalten sind, kannst du
in der Dokumentation des Moduls
Basics nachschauen.
Alle anderen Funktionen, die automatisch importiert werden,
kannst du nur mit dem Modulnamen verwenden.
Dazu gehören z.B. die Funktionen Char.toCode
und
Char.fromCode
.
Wenn du selbst Module importierst, kannst du die Funktionen mit oder ohne den Modulnamen verwenden, je nachdem, wie du das Modul importierst.
Aufgabe 1
Teste die vordefinierten Funktionen Char.toCode
und
Char.fromCode
in der REPL mit Dialogen wie dem Folgenden.
Beschreibe die Wirkung der beiden Funktionen.
> Char.toCode 'A'
...
> Char.fromCode 65
...
> Char.toCode 'Z'
...
> Char.fromCode 90
...
Aufgabe 2
(a) Das Verschieben von Buchstaben im Alphabet kann man durch das Rechnen mit Zahlen umsetzen. Beschreibe die Vorgehensweise anhand des folgenden Beispiels.
'H' -> 72 -> 75 -> 'K'
(b) Teste den folgenden Ausdruck und erkläre, wie das Ergebnis zustande kommt.
> Char.fromCode ((Char.toCode 'H') + 3)
...
(c) Erkläre, warum das Verschieben von Buchstaben in dem folgenden Beispiel so nicht funktioniert.
> Char.fromCode ((Char.toCode 'X') + 3)
...
Aufgabe 3
Mit einem etwas aufwendigerem Umrechnungsverfahren kann man auch beliebige Großbuchstaben korrekt verschieben:
'A' -> 65 -> 0 -> (modBy 26 (0+3)) = 3 -> 68 -> 'D' 'B' -> 66 -> 1 -> (modBy 26 (1+3)) = 4 -> 69 -> 'E' ... 'Y' -> 89 -> 24 -> (modBy 26 (24+3)) = 1 -> 66 -> 'B' 'Z' -> 90 -> 25 -> (modBy 26 (25+3)) = 2 -> 67 -> 'C'
(a) Teste zunächst in der REPL, was die vordefinierte Funktion modBy
leistet.
(b) Beschreibe das Umrechenverfahren.
(c) Entwickle einen Ausdruck wie in Aufgabe 2, mit dem man das Verschieben von Buchstaben mit Funktionen umsetzen kann.