Aufgabe 1106 Maskdate: Datum formatieren
Teil der ersten Übungsrunde
"AU Einführung in das Programmieren" an der TU-Wien
Autor: Starzinger Michael, <e0306126@student.tuwien.ac.at>
Datum: Dienstag, 21. Oktober 2003
-------------------------------------------------------------------------------------

--> Aufgabenstellung:
Die Aufgabe war es, ein Programm zu schreiben welches ein Datum in einem bestimmten 
Format einließt (DD-MM-YYYY oder DD/MM/YYYY) und es anhand eines beinahe beliebigen 
Format-Strings umformatiert. (Details siehe Spezifikation)


--> Implementation und Wiederverwendbarkeit:
Die hier vorgestellte Implementation besteht aus zwei Klassen. Einmal aus dem 
Programm selbst ('Maskdate') welches nur die nötige main()-Methode aufweist. Und zum 
zweiten der Klasse 'DateFormatExt' welche die eigentlichen Methoden zur Formatierung 
des Datums bereitstellt. Diese zweite Klasse kann leicht in anderen Prgrammen 
wiederverwendet werden.

Ich habe mich dazu entschlossen den Aufruf möglichst simpel zu gestallten. So 
erreicht man mit einem simplen Aufruf von "DateFormatExt.getFormattedDate()" das 
gewünschte Ergebnis. (zur genauen Beschreibung der Methode siehe unten!) Es sind alle 
Methoden der Klasse 'public', obwohl nur die gerade erwähnte benötigt wird. Dies soll 
die Wiederverwendebarkeit noch um einen Grad steigern.


--> Fehlerbehandlung:
Die Funktion "getFormattedDate()" ist in der Lage auf fehlerhafte Eingaben zu 
reagieren. Das heisst, sie löst eine Exception vom Typ "EprogException" aus falls 
Fehler in den Eingabedaten vorliegen. Ob diese Exception in Ihrem Programm abgefangen 
wird oder nicht bleibt Ihnen überlassen.


--> Methoden:
Es folgt eine Liste der Methoden der Klasse "DateFormatExt"

(*) boolean checkDateStr(String date, String pattern)
  BEMERKUNG: Der Datums-String wird Anhand des mitgelieferten Patterns auf 
korrektheit untersucht. Beide Strings werden zeichenweise verglichen. Wobei ein "x" 
im Pattern symbolisiert, dass an dieser Stelle eine Ziffer im Datum enthalten sein 
muss. Jedes andere Zeichen (ausser dem "x") muss im Datum exakt enthalten sein. 
Somit führt ein Aufruf mit dem Pattern "xx-xx-xxxx" zu einem der zwei gewünschten 
Datums-Formate.
  OUTPUT: Liefert 'true' falls das Pattern stimmt, 'false' wenn ein Fehler erkannt 
wurde. Es wäre ohne weitere möglich statt eines Boolean-Wertes auch die Position 
des Fehlers zurückzugeben. Dies liese sich mit wenigen Modifikationen 
bewerkstelligen, ist jedoch in diesem Beispiel überflüssig.

(*) boolean checkDate(int day, int month, int year)
  BEMERKUNG: Führt einen Plausibilitäts-Check der eingegebenen Zahlen durch. Dabei 
werden Bereichsüberprüfungen durchgeführt (zB 0<month<=12). Es wird ebenso erkannt 
ob die Tag-Monat Kombination zulässig ist (zB 31.Nov nicht gültig). Es wird sogar 
auf ein Schaltjahr bei der Überprüfung des Februars berücksichtigt.
  INPUT: Das zu prüfende Datum. Die Notation dürfte selbsterklärend sein, alle Zahlen 
beginnen bei 1 (als zB 1 für Januar).
  OUTPUT: Hier ebenso 'true' für Datum gültig, 'false' falls ungültig.

(*) boolean isLeap(int year)
  INPUT: Die übergebene Jahreszahl wird auf ein Schaltjahr (leap vom englischen 'leap 
year' für Schaltjahr) geprüft.
  OUTPUT: 'true': ist Schaltjahr, 'false' ist kein Schaltjahr

(*) String getDayName(int day) / getMonthName(int month) / ...
  INPUT: Der Tag/Monat muss dieser Methode als Zahl übergeben werden. Dabei ist zu 
beachten, dass hierbei von 0 zu zählen begonnen wird!
  OUTPUT: Den String der den entsprechenden Namen in englischer Sprache und 
Großbuchstaben enthält.

(*) byte getDayOfWeek(int d, m, y)
  INPUT: Das Datum in gewohnter Notation, also Tag, Monat und Jahr als Zahl.
  OUTPUT: Eine Zahl die den Wochentag repräsentiert, wobei 0=Sonntag.
  BEMERKUNG: Auch hier werden alle Schaltjahre in Betracht gezogen.

(*) String getFormattedNumeric(int numeric, int count)
  INPUT: Ein numerischer Wert und die gewünschte Anzahl der Stellen
  OUTPUT: Ein String der genau 'count' Zeichen enthält

(*) String getFormattedDate(String date, String format)
  INPUT: Das Datum und der Format-String wie in der Spezifikation definiert als 
String.
  OUTPUT: Einen formatierten String laut Definition, wenn die Eingabedaten korrekt 
waren.
  BEMERKUNG: Sollte ein Fehler auftreten wird die Exception 'EprogException' 
ausgelöst. Eine kleine Beschreibung kann dann mit 'e.getMessage()' abgerufen 
werden. Die Fehlerbeschreibungen sind nicht sonderlich aussagekräftig, was daran 
liegt, dass sie in meinem Beispielprogramm nicht zur verwendung kommen.


--> Weitere Fragen?
Sollten weitere Fragen bestehen, so verweise ich auf den Quellcode oder die 
Möglichkeit mir eine eMail zu schreiben.

-------------------------------------------------------------------------------------