Geschachtelte Fallunterscheidungen
Datumsangaben umwandeln
Ziel ist es hier, Datumsangaben vom Punkt-Format in das internationale Standardformat umzuwandeln:
Umwandlung: Punktformat -> Standardformat Fall A: 26.12.2013 -> 2013-12-26 Fall B: 21.2.2013 -> 2013-02-21 Fall C: 6.12.2013 -> 2013-12-06 Fall D: 6.2.2013 -> 2013-02-06
Teilbereiche einer Zeichenkette bestimmen
Bei einer Implementierung muss man auf bestimmte Zeichen oder auch Teilbereiche einer Zeichenkette zugreifen.
Im Abschnitt Modularisierung wurden hierfür geeignete Funktionen entwickelt und
in einem Modul Teilzeichenketten.elm
bereitgestellt.
module Teilzeichenketten exposing (..)
zeichenAnPos: Int -> String -> String
zeichenAnPos n text =
String.slice (n-1) n text
zeichenVorPos: Int -> String -> String
zeichenVorPos n text =
String.slice 0 (n-1) text
zeichenNachPos: Int -> String -> String
zeichenNachPos n text =
String.slice n (String.length text) text
zeichenZwischenPos: Int -> Int -> String -> String
zeichenZwischenPos n m text =
String.slice n (m-1) text
Aufgabe 1
Teste noch einmal die Funktionen aus dem Modul Teilzeichenketten.elm
in der REPL mit geeigneten Funktionsaufrufen.
> import Teilzeichenketten exposing (..)
> zeichenAnPos 3 "26.12.2013"
...
> zeichenVorPos 3 "26.12.2013"
...
> zeichenNachPos 6 "26.12.2013"
...
> zeichenZwischenPos 3 6 "26.12.2013"
...
Umwandlungsfunktionen entwickeln
Wir betrachten hier die oben aufgelisteten Fälle einzeln und entwickeln für jeden Fall eine passende Umwandlungsfunktion. Hier eine Implementierung für Fall A:
module Datumformat exposing (..)
import Teilzeichenketten exposing (..)
standardformatFallA: String -> String
standardformatFallA datum =
(zeichenNachPos 6 datum) ++ "-" ++ (zeichenZwischenPos 3 6 datum) ++ "-" ++ (zeichenVorPos 3 datum)
> import Datumformat exposing (..)
> standardformatFallA "26.01.2013"
"2013-01-26" : String
Aufgabe 2
(a) Teste selbst diese Umwandlungsfunktion mit geeigneten Funktionsaufrufen.
(b) Entwickle analog Umwandlungsfunktionen für die Fälle B, C und D. Achte darauf, dass hier führende Nullen hinzugefügt werden müssen.
Alle Fälle mit einer geschachtelten Fallunterscheidung betrachten
Für die Unterscheidung der 4 Fälle braucht man mehrere Fallunterscheidungen, die man ineinander schachtelt. Hier der Anfang einer möglichen Implementierung
einer Funktion standardformat
:
standardformat datum =
if (zeichenAnPos 3 datum == ".") && (zeichenAnPos 6 datum == ".") then
standardformatFallA datum
else
if (zeichenAnPos 3 datum == ".") && (zeichenAnPos 5 datum == ".") then
...
else
...
Aufgabe 3
Ergänze die Funktionsdefinition und teste die Funktion mit mehreren Funktionsaufrufen.
Aufgabe 4
Auch diese Schachtelung von Fallunterscheidungen ist möglich, wenn man voraussetzt, dass nur korrekte Datumsangaben im Punktformat verarbeitet werden sollen. Ergänze die Funktionsdefinition und teste sie mit allen möglichen Fällen.
standardformat datum =
if (zeichenAnPos 3 datum == ".") then
if (zeichenAnPos 6 datum == ".") then
standardformatFallA datum
else
...
else
if (zeichenAnPos 5 datum == ".") then
...
else
...