// Stephan Bazalka // EProg Runde 3, BspNr. 3126 // Matrikelnummer: 0225725 // eMail: bazalka@gmx.net // WICHTIGE ANMERKUNG // ------------------ // Lt. Spezifikation der Teillösung, die ich bekommen // habe (Wochentag.java), wird jedes Datum als 19JJ // interpretiert! Daher liefert die Eingabe des heutigen // Datums einen "falschen" Wochentag! // Das ist aber Absicht im Sinne der Spezifikation der // Teillösung. // (Ich fürchte nur, sie wird nicht mitgeliefert, deswegen // schreib ichs überall hin! import eprog.*; public class Anzeige extends EprogIO { // Array zur Speicherung von Trennzeichen-Position static int[] trennPos = new int[4]; public static void main(String[] args) throws EprogException { String eingabe = einlesen(); // untersuchen() liefert true, wenn Trennzeichen gefunden wurden // und false, wenn die Eingabe nur aus Zahlen besteht und die Länge 10 hat. if (untersuchen(eingabe)) { ausgeben(mitTrennzeichenBerechnen(eingabe)); } else { ausgeben(ohneTrennzeichenBerechnen(eingabe)); } } public static String einlesen() { String eingabe = new String(); eingabe = readWord(); return eingabe; } public static boolean untersuchen(String eingabe) { boolean trennIdent = false; boolean allesZahlen = true; int i = 0; int anzahlTrenn = 0; // Durchläuft die gesamte Eingabe und überprüft für jedes Zeichen: // Ob es (bzw. sein Unicode) zwischen a und b bzw. A und B liegt (Buchstaben sind nicht erlaubt!) // Ob es zwischen 0 und 9 liegt (dann sinds lauter Zahlen) while( i<eingabe.length() ) { if ((eingabe.charAt(i) > 'a' && eingabe.charAt(i) < 'z') || (eingabe.charAt(i) > 'A' && eingabe.charAt(i) < 'Z')) { ausgeben("FALSCHE EINGABE"); } else if (eingabe.charAt(i) > '9' || eingabe.charAt(i) < '0' ) { trennPos[anzahlTrenn++] = i; allesZahlen = false; } i++; } // Überprüft, ob alle Trennzeichen ident sind. if ((eingabe.charAt(trennPos[0]) == eingabe.charAt(trennPos[1]) && eingabe.charAt(trennPos[1]) == eingabe.charAt(trennPos[2]) && eingabe.charAt(trennPos[2]) == eingabe.charAt(trennPos[3]))) { trennIdent = true; } // Wenn die Eingabe nur als Zahlen besteht und die Länge 10 hat (TTMMJJHHMM) // dann wird falsch (also kein Trennzeichen vorhanden) zurückgegeben. // Wenn es genau vier idente Trennzeichen gibt, wird true retourniert. // Wenn nichts davon zutrifft, muss die Eingabe falsch sein! if (allesZahlen == true && eingabe.length() == 10) { return false; } else if (anzahlTrenn == 4 && trennIdent == true) { return true; } else { ausgeben("FALSCHE EINGABE"); return false; } } public static int[] ohneTrennzeichenBerechnen(String eingabe) { boolean Fehler = false; int laenge = 0; int[] daten = new int[5]; laenge = eingabe.length(); // Teil die Eingabe in "2er-Stückerl" auf. // daten[] enthält dann die int-Werte der Eingabe. try { daten[0] = Integer.parseInt(eingabe.substring(0,2)); daten[1] = Integer.parseInt(eingabe.substring(2,4)); daten[2] = Integer.parseInt(eingabe.substring(4,6)); daten[3] = Integer.parseInt(eingabe.substring(6,8)); daten[4] = Integer.parseInt(eingabe.substring(8,10)); } catch (NumberFormatException e) { ausgeben("FALSCHE EINGABE"); ; } catch (StringIndexOutOfBoundsException e) { ausgeben("FALSCHE EINGABE"); ; } return daten; } public static int[] mitTrennzeichenBerechnen(String eingabe) { int laenge = 0; int[] daten = new int[5]; laenge = eingabe.length(); int i = 0; // Ein Eingabestückerl darf nicht länger als zwei Zeichen sein. if ((eingabe.substring(0,trennPos[0]).length() > 2) || (eingabe.substring(trennPos[0]+1, trennPos[1]).length() > 2) || (eingabe.substring(trennPos[1]+1, trennPos[2]).length() > 2) || (eingabe.substring(trennPos[2]+1, trennPos[3]).length() > 2) ) { ausgeben("FALSCHE EINGABE"); } // Zerstückelt die Eingabe. Jeweils zwischen zwei Trennzeichen stehen // die Daten. try { daten[0] = Integer.parseInt(eingabe.substring(0,trennPos[0])); daten[1] = Integer.parseInt(eingabe.substring(trennPos[0]+1, trennPos[1])); daten[2] = Integer.parseInt(eingabe.substring(trennPos[1]+1,trennPos[2])); daten[3] = Integer.parseInt(eingabe.substring(trennPos[2]+1,trennPos[3])); daten[4] = Integer.parseInt(eingabe.substring(trennPos[3]+1,laenge)); } catch (NumberFormatException e) { ausgeben("FALSCHE EINGABE"); ; } catch (StringIndexOutOfBoundsException e) { ausgeben("FALSCHE EINGABE"); ; } return daten; } public static void ausgeben(String raus) { // Steuert die Ausgabe. // Wenn "FALSCHE AUSGABE" ausgegeben werden soll, // wird das Programm beendet. // So will ich viele verstreute System.exit(0) im Quelltext verhindern. println(raus); if (raus.equals("FALSCHE EINGABE")) { System.exit(0); } } public static void ausgeben(int[] daten) { String[] felder = new String[10]; String ergebnis = new String(); // Das sind die Zahlenkolonnen // Zum Testen des Programms empfiehlt es sich, in Klammer einfach // die Ziffer, die die Zahlenkollone darstellt, hinzuschreiben. // Also felder[0] = "123456 (0)"; felder[0] = "123456"; felder[1] = "23"; felder[2] = "12457"; felder[3] = "12347"; felder[4] = "2367"; felder[5] = "13467"; felder[6] = "134567"; felder[7] = "1236"; felder[8] = "1234567"; felder[9] = "123467"; // Sind die Daten im Bereich des möglichen? if (daten[3] > 23 || daten[4] > 59) { ausgeben("FALSCHE EINGABE"); } // Ruft eine andere Klasse zur Berechnung des Wochentags auf String datum = new String(Wochentag.berechneTag(daten[0], daten[1], daten[2])); // Wenn das Datum ungültig ist, wird abgebrochen if (datum.equals("FALSCHE EINGABE")) { ausgeben("FALSCHE EINGABE"); } // Berechnet restlichen vier Stellen der Ausgabe (die ersten 2 sind das Datum) // Um sicherzustellen, dass es wirklich 4 Stellen sind, werden zuerst die Minuten bzw. Stunden // durch 10 dividiert (und alle nach dem Komma abgeschnitten. // Ist der Wert kleiner als 10 kommt also 0 heraus. // Anschließend wird noch eine Modulodivision durchgeführt. // Bsp: Minuten = 7 (entspricht daten[3]) // Die ganzzahle Division durch 10 liefert 0. // Die Mod.division 7 % 10 liefert 7. Aus 7 wurde folglich aufwändige if-Schleifen 07. ergebnis = datum + " " + felder[(int)Math.floor(daten[3]/10)] + " " + felder[daten[3]%10] + " " + felder[(int)Math.floor(daten[4]/10)] + " " + felder[daten[4]%10]; println(ergebnis); } }