PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Java Programmierer hier?



Kermit
12.12.2007, 18:31
Moin,

ich habe da so eine berühmt berüchtigte Java Programmieraufgabe für BWL Studenten zu lösen...

Gibt es hier einen Java - Experten, der mal über meine Lösung schauen könnte?

Hr.Nitsche
12.12.2007, 19:27
kannst sie mir mal schicken;)

Kermit
12.12.2007, 19:29
mach ich :gut:

Hr.Nitsche
12.12.2007, 19:34
Aber mit Aufgabe :D

Hr.Nitsche
12.12.2007, 19:39
Habs bekommen. Wenn ich mit meinem Zeug fertig bin schau ich mal drüber :gut:

Kermit
12.12.2007, 20:08
Der Teil 2 ist jetzt auch fertig- für Teil 3 brauche ich glaube ich noch ein wenig :(

chris01
12.12.2007, 20:13
da hr.nitsche schneller war, ist gut.
im zweifelsfall, kann auch ich mal drüberschaun.

wirtschaft und programmieren ... *LOOOL*
welcher idiot hat den lehrplan entworfen :D

Hr.Nitsche
12.12.2007, 20:16
Schau nur mal drüber Christoph, bin auch nur Wirtschaftsstudent :D

Kermit
12.12.2007, 20:17
Original von chris01
da hr.nitsche schneller war, ist gut.
im zweifelsfall, kann auch ich mal drüberschaun.

wirtschaft und programmieren ... *LOOOL* welcher idiot hat den lehrplan entworfen :D

:rofl:

Ich werde den Spaß hier mal einstellen... zur allgemeinen Belustigung ;)

Aufgabe:

Schreiben Sie ein JAVA-Programm mit Testplan, das Folgendes tut:
Prüfen zweier eingelesener Kalenderdaten auf Gültigkeit. Die Eingabe erfolgt über ein DOSFenster in der Komandozeile. Über diese ist ebenfalls anzustoßen und als Ergebnis auszugeben:
1. Anzahl der Tage ab 1. Januar des jeweiligen Datums
2. Differenz der Kalenderdaten in Tagen
3. Anzahl der Werktage ab einem eingegebenen Datum bis zum Tagesdatum
Mögliche Daten: 1901 bis 2100, alle anderen gelten als ungültig.
Der 1.1.1901 war ein Dienstag (falls Sie das brauchen).
Bedingungen
● Es muss mindestens zwei Klassen mit entsprechenden Methoden geben:
1. Alle Operationen zu einem Datum mit den nötigen variablen Daten
und Konstanten.
2. Die Operationen zu mehr als einem Datum und der main-Methode.
● Die Systemklasse GregorianCalender darf nur benutzt werden, um das Tagesdatum festzustellen. Alle anderen Berechnungen zu Kalenderdaten sind selbst zu entwerfen und zu testen.

Quellcode by Martin Teil 1 & 2:

import java.io.*;
import java.text.*;
import java.util.*;

class Datum {

public static int differenz;
public static int tage[] = new int[2];
public static int tagesdatum[] = new int[3];
public static int datum[][] = new int[2][3];
public static int month[][] = new int[2][12];

void einlesenDatum() throws IOException {
int i;
int z=0;
do {
month[z][0]=31; month[z][1]=28; month[z][2]=31; month[z][3]=30; month[z][4]=31; month[z][5]=30;
month[z][6]=31; month[z][7]=31; month[z][8]=30; month[z][9]=31; month[z][10]=30; month[z][11]=31;
int l = z+1;
BufferedReader dt =
new BufferedReader ( new InputStreamReader (System.in) );
do {
System.out.println("\nBitte das Jahr des "+l+". Datums zwischen 1901 und 2100 eingeben:");
datum[z][2] = Integer.parseInt (dt.readLine());
} while (datum[z][2] <1901 || datum[z][2] >2100);
if (datum[z][2]%400 == 0){
month[z][1]=29;
} else if (datum[z][2]%4 == 0 && datum[z][2]%100 != 0) {
month[z][1]=29;}
do {
System.out.println("\nBitte den Monat des "+l+". Datums zwischen 1 und 12 eingeben:");
datum[z][1] = Integer.parseInt (dt.readLine());
datum[z][1]--;
} while (datum[z][1] <0 || datum[z][1] >11);
do {
i = datum[z][1];
System.out.println("\nBitte den Tag des "+l+".Datums eingeben:");
System.out.println("(bei ungueltiger Eingabe bitte erneut versuchen)");
datum[z][0] = Integer.parseInt (dt.readLine());
} while (datum[z][0]<1|| datum[z][0]>month[z][i]);

System.out.print("Das "+l+". Datum lautet: "+datum[z][0]+".");
System.out.println(datum[z][1]+1+"."+datum[z][2]);
z=z+1;
} while (z<2);
}

void tagesdatum() throws IOException {
GregorianCalendar kal = new GregorianCalendar();
tagesdatum[0] = kal.get(GregorianCalendar.DATE);
tagesdatum[1] = kal.get(GregorianCalendar.MONTH)+1;
tagesdatum[2] = kal.get(GregorianCalendar.YEAR);
}

void tageberechnen() throws IOException {
int z=0;
for (int p=2;z<p; z++){
for (int i=0; i<datum[z][1]; i++)
{ tage[z] += month[z][i]; }
tage[z] += datum[z][0];
int l=z+1;
System.out.println("\nDie Zeitspanne "+l+". Datum vom 1.1."+datum[z][2]+" bis zum "+datum[z][0]+"."
+(datum[z][1]+1)+"."+datum[z][2]+" betraegt: "+tage[z]+" Tage");
}
}
}

public class Aufgabe extends Datum {

void differenzdaten() throws IOException {
int i=0,z=0,t=0;
if (datum[0][2]<datum[1][2]){
i=datum[0][2];
t=-tage[0]+tage[1];}
else { i=datum[1][2];
t=tage[0]-tage[1]; }
for (int p=datum[0][2]+datum[1][2]-i; i<p; i++){
if (i%400==0){
z=366;
} else if (i%4==0&&i%100!=0){
z=366;
} else {
z=365;
}
differenz=differenz+z;
}
differenz=differenz+t;
System.out.println("\nDie Differenz zuwischen den beiden eingegebenen Daten betraegt "+differenz+" Tage");
}

public static void main(String[] args) throws IOException {

Datum a = new Datum();
a.einlesenDatum();
a.tagesdatum();
a.tageberechnen();

Aufgabe b = new Aufgabe();
b.differenzdaten();
}}

preppyking
12.12.2007, 20:33
Original von Kermit

Original von chris01
da hr.nitsche schneller war, ist gut.
im zweifelsfall, kann auch ich mal drüberschaun.

wirtschaft und programmieren ... *LOOOL* welcher idiot hat den lehrplan entworfen :D

:rofl:

Ich werde den Spaß hier mal einstellen... zur allgemeinen Belustigung ;)

Aufgabe:

Schreiben Sie ein JAVA-Programm mit Testplan, das Folgendes tut:
Prüfen zweier eingelesener Kalenderdaten auf Gültigkeit. Die Eingabe erfolgt über ein DOSFenster in der Komandozeile. Über diese ist ebenfalls anzustoßen und als Ergebnis auszugeben:
1. Anzahl der Tage ab 1. Januar des jeweiligen Datums
2. Differenz der Kalenderdaten in Tagen
3. Anzahl der Werktage ab einem eingegebenen Datum bis zum Tagesdatum
Mögliche Daten: 1901 bis 2100, alle anderen gelten als ungültig.
Der 1.1.1901 war ein Dienstag (falls Sie das brauchen).
Bedingungen
● Es muss mindestens zwei Klassen mit entsprechenden Methoden geben:
1. Alle Operationen zu einem Datum mit den nötigen variablen Daten
und Konstanten.
2. Die Operationen zu mehr als einem Datum und der main-Methode.
● Die Systemklasse GregorianCalender darf nur benutzt werden, um das Tagesdatum festzustellen. Alle anderen Berechnungen zu Kalenderdaten sind selbst zu entwerfen und zu testen.

Quellcode by Martin Teil 1 & 2:

import java.io.*;
import java.text.*;
import java.util.*;

class Datum {

public static int differenz;
public static int tage[] = new int[2];
public static int tagesdatum[] = new int[3];
public static int datum[][] = new int[2][3];
public static int month[][] = new int[2][12];

void einlesenDatum() throws IOException {
int i;
int z=0;
do {
month[z][0]=31; month[z][1]=28; month[z][2]=31; month[z][3]=30; month[z][4]=31; month[z][5]=30;
month[z][6]=31; month[z][7]=31; month[z][8]=30; month[z][9]=31; month[z][10]=30; month[z][11]=31;
int l = z+1;
BufferedReader dt =
new BufferedReader ( new InputStreamReader (System.in) );
do {
System.out.println("\nBitte das Jahr des "+l+". Datums zwischen 1901 und 2100 eingeben:";);
datum[z][2] = Integer.parseInt (dt.readLine());
} while (datum[z][2] <1901 || datum[z][2] >2100);
if (datum[z][2]%400 == 0){
month[z][1]=29;
} else if (datum[z][2]%4 == 0 && datum[z][2]%100 != 0) {
month[z][1]=29;}
do {
System.out.println("\nBitte den Monat des "+l+". Datums zwischen 1 und 12 eingeben:";);
datum[z][1] = Integer.parseInt (dt.readLine());
datum[z][1]--;
} while (datum[z][1] <0 || datum[z][1] >11);
do {
i = datum[z][1];
System.out.println("\nBitte den Tag des "+l+".Datums eingeben:";);
System.out.println(";(bei ungueltiger Eingabe bitte erneut versuchen)";);
datum[z][0] = Integer.parseInt (dt.readLine());
} while (datum[z][0]<1|| datum[z][0]>month[z]);

System.out.print("Das "+l+". Datum lautet: "+datum[z][0]+".";);
System.out.println(datum[z][1]+1+"."+datum[z][2]);
z=z+1;
} while (z<2);
}

void tagesdatum() throws IOException {
GregorianCalendar kal = new GregorianCalendar();
tagesdatum[0] = kal.get(GregorianCalendar.DATE);
tagesdatum[1] = kal.get(GregorianCalendar.MONTH)+1;
tagesdatum[2] = kal.get(GregorianCalendar.YEAR);
}

void tageberechnen() throws IOException {
int z=0;
for (int p=2;z<p; z++){
for (int i=0; i<datum[z][1]; i++)
{ tage[z] += month[z]; }
tage[z] += datum[z][0];
int l=z+1;
System.out.println("\nDie Zeitspanne "+l+". Datum vom 1.1."+datum[z][2]+" bis zum "+datum[z][0]+"."
+(datum[z][1]+1)+"."+datum[z][2]+" betraegt: "+tage[z]+" Tage";);
}
}
}

public class Aufgabe extends Datum {

void differenzdaten() throws IOException {
int i=0,z=0,t=0;
if (datum[0][2]<datum[1][2]){
i=datum[0][2];
t=-tage[0]+tage[1];}
else { i=datum[1][2];
t=tage[0]-tage[1]; }
for (int p=datum[0][2]+datum[1][2]-i; i<p; i++){
if (i%400==0){
z=366;
} else if (i%4==0&&i%100!=0){
z=366;
} else {
z=365;
}
differenz=differenz+z;
}
differenz=differenz+t;
System.out.println("\nDie Differenz zuwischen den beiden eingegebenen Daten betraegt "+differenz+" Tage";);
}

public static void main(String[] args) throws IOException {

Datum a = new Datum();
a.einlesenDatum();
a.tagesdatum();
a.tageberechnen();

Aufgabe b = new Aufgabe();
b.differenzdaten();
}}

8o 8o 8o 8o 8o

Kermit
12.12.2007, 21:05
Wieso guckst Du 8o?

Unverständnis oder Erstaunen über schlechten Programmierstil? :grb:

chris01
12.12.2007, 21:09
:gut:

ich finds lustig, wie das forum die syntax mit smilies aufbessert.

preppyking
12.12.2007, 21:12
Unverständnis :dr: X( :D :D :D

chris01
12.12.2007, 21:16
die ganze zeit-sache ist in der it wirklich ein übel. zeitumstellung macht jedes jahr probleme. hier ein kleiner auszug:


* Eine Minute hat nicht immer 60 Sekunden (z.B. wenn vom Internationalen Erd-Rotations-Service (IERS) angeordnete Schaltsekunden eingefügt werden, was 2006-01-01 zum 23. Mal seit 1972 passierte).
* Ein Tag hat nicht immer 24 Stunden (z.B. bei Sommer-/Winterzeitumstellung).
* Eine Woche hat nicht immer 7 Tage (z.B. die erste Woche im Jahr).
* Ein Jahr hat nicht immer 365 Tage (z.B. in Schaltjahren und bei Kalenderanpassungen).
* Die Berechnung, ob ein Jahr ein Schaltjahr ist, ist nicht immer fehlerfrei (alle 4 Jahre, außer alle 100, wenn nicht durch 400 teilbar).
* Es wurden mehrmals mehrere Tage ausgelassen, um den Kalender an das tatsächliche Sonnenjahr anzupassen (z.B. folgte auf Donnerstag 4. Oktober 1582 als nächster Tag Freitag 15. Oktober 1582).
* Es gibt nicht das Jahr 0. Nach 1 B.C. (vor Christi) folgte 1 A.D. (nach Christi).
* Die Zahl der Tage, ab der diese Tage als erste Woche im Jahr gelten, ist unterschiedlich definiert.
* Der Wochenanfang ist manchmal mit Sonntag und manchmal mit Montag definiert.
* Es gibt unterschiedliche Behandlungen von zweistelligen Jahreszahlen. Sie können als Jahreszahlen im ersten Jahrhundert A.D. gemeint sein oder es muss 1900 oder bei kleinen Werten vielleicht auch 2000 dazu addiert werden.
* Die Angabe 01/02/03 kann in Deutschland 2003-02-01, in USA 2003-01-02 und in asiatischen Staaten 2001-02-03 bedeuten.
* Die Uhrzeit kann bis 12 AM/PM oder bis 24 h zählen.
* Zeitzonen müssen berücksichtigt werden. Die Bestimmung der Zeitzone eines Ortes ist nicht einfach.
* Es gibt unterschiedliche und sich ändernde lokale Bestimmungen und Anfangs-/Endzeiten zur Sommer-/Winterzeit.
In Europa beginnt die Sommerzeit seit 1980 am letzten Sonntag im März, endete bis 1995 am letzten Sonntag im September und endet seit 1996 am letzten Sonntag im Oktober.
* Der Unterschied von Sommer- zur Winterzeit beträgt nicht immer eine Stunde. Zum Beispiel galt 1947 in Deutschland die Hochsommerzeit (MEHSZ) mit zwei Stunden Unterschied.
* Es gibt verschiedene Kalendersysteme (z.B. 1-Jan-2000 (Gregorian) = 23-Tevet-576 (Hebrew) = 24-Ramadan-1420 (Islamic)).
* Der bei Astronomen beliebte 'Julian Day calendar' (Zyklen von 7980 astronomischen Jahren beginnend ab 1. Jan. 4713 B.C.) ist nicht das Gleiche wie der von Julius Caesar eingeführte und bei einigen Orthodoxen heute noch benutzte 'Julian Calendar' (in Europa von 1. Jan. 45 B.C. bis 4. Okt. 1582 A.D.).
* Die Länder, die sich auf den (von Papst Gregory XIII eingeführten) gregorianischen Kalender umgestellt haben, haben dies zu sehr verschiedenen Zeiten vollzogen, wodurch historische Berechungen erschwert werden (viele europäische Länder 1582, aber z.B. China erst 1949 und andere Länder gar nicht).
* Es gibt Beschränkungen im Wertebereich der Programmiersprachen-Funktionen.
Z.B. in Java akzeptiert Date 290 Millionen Jahre B.C. (vor Christi) bis 290 Millionen Jahre A.D. (nach Christi), aber GregorianCalendar akzeptierte vor JDK 1.2 kein Datum früher als 4713 B.C.
Noch gravierender: 2038-01-19 sind 2^31 Sekunden seit 1970-01-01 vergangen und damit endet der Wertebereich des unter Unix und Windows bei 32-Bit-Programmierung in C üblichen time_t.
* zeitstempel können links- oder rechtsbündig sein, wenn man zeitreihen hat

Kermit
12.12.2007, 21:19
ok- Danke Chris :grb: aber irgendwie bringt mich das nicht weiter ;)

HorstDJ
12.12.2007, 21:27
Druck einfach sicherheitshalber Chris' Text aus oder noch besser lerne ihn auswendig...und wenn dein Prof irgendetwas gegen dein Programm sagt, erklärt du ihm damit, dass die Fragestellung schon viel zu ungenau ist und du deshalb das Programm gar nicht besser machen konntest... :D :D :D


Liebe Grüße

Stefan

chris01
12.12.2007, 21:29
mein erstes problem ist schon die angabe:

- du sollt 2 datums :D einlesen, liest aber nur 1, ok mal
- was ist "jeweiliges Datum"? das ersteingelesene, das aktuelle datum, ...??
- wie ist der werktag definiert? mo-fr, auch feitertage, kulturkreis :D...?



edit: stefan hat ganz klar recht, die angabe ist nicht zu gebrauchen.

edit: in deinem beispiel nimmt das einlesen und prüfen ziemlich viel platz sein und verschleiert daher oft den blick aufs wesentliche (die datumsarithmetik). ich würd daher das einlesen/prüfen durch einen regulären erledigen. das würde dir aber der assistent wohl kaum abkaufen.

weiters spreche ich aus eigenerer erfahrung, was jedoch nicht allgemeingültig ist und in einführungslvas wohl auch nicht so gilt:
wichtig ist, dass du weisst was du tust bzw. getan werden muss. ob man das jetzt perfekt in code umgesetzt hat ist (zumindest in höheren semestern) nicht so wichtig.

HorstDJ
12.12.2007, 21:32
Ich muss mich jetzt auch nochmal vor Chris :verneig: :verneig: :verneig: :verneig: :verneig: :verneig: :verneig: :verneig: :verneig: :verneig: :verneig: :verneig: :verneig: :verneig: :verneig: :verneig: :verneig: :verneig: :verneig: :verneig: :verneig:
Genial, wie du alle Probleme beim Datum zusammengestellt hast.
Vielen Dank.

Ganz liebe Grüße

Stefan

chris01
12.12.2007, 21:36
glaubst doch nicht wirklich stefan, dass ich die ganze zeittheorie da selbst geschrieben hab. ich kann kaum den MO vom FR unterscheiden :D

HorstDJ
12.12.2007, 21:40
X( X( Dachte ich schon :motz: :motz: :motz: :motz:
Mich so auf den Arm nehmen :motz: :motz: X( X( X(
Und ich bedank mich auch noch X( X(
Aber wenigstens hast du es gut zusammengetragen... :D :D :D

Die Fragestellung ist wirklich ein Problem...wie Chris schon sagt...was sind Werktage?...mit Samstag ohne Samstag... :ka: Normal ja mit, wobei hier glaube ich eher Mo-Fr gemeint ist.

Naja trotzdem viel Glück damit :D


Liebe Grüße


Stefan

Kermit
12.12.2007, 21:46
Original von chris01
mein erstes problem ist schon die angabe:

- du sollt 2 datums :D einlesen, liest aber nur 1, ok mal
- was ist "jeweiliges Datum"? das ersteingelesene, das aktuelle datum, ...??
- wie ist der werktag definiert? mo-fr, auch feitertage, kulturkreis :D...?



edit: stefan hat ganz klar recht, die angabe ist nicht zu gebrauchen.

edit: in deinem beispiel nimmt das einlesen und prüfen ziemlich viel platz sein und verschleiert daher oft den blick aufs wesentliche (die datumsarithmetik). ich würd daher das einlesen/prüfen durch einen regulären erledigen. das würde dir aber der assistent wohl kaum abkaufen.

weiters spreche ich aus eigenerer erfahrung, was jedoch nicht allgemeingültig ist und in einführungslvas wohl auch nicht so gilt:
wichtig ist, dass du weisst was du tust bzw. getan werden muss. ob man das jetzt perfekt in code umgesetzt hat ist (zumindest in höheren semestern) nicht so wichtig.

Ok- da kann ich schon mehr mit anfangen. :D

Die Fragestellung ist etwas ungenau- das Stimmt...
Ich denke ein Werktag ist alles außer Sonntag - Feiertage außen vor.
Aber das kommt ja auch erst in Aufg.3 dran.

Ich lese doch aber zwei mal Datum ein - in dem Void Abschnitt einlesenDatum() läuft dieser ganze Klumpatsch zwei mal.
Problem ist, dass ich die Daten als jeweils 6 ganze Zahlen einlesen soll... was ja eigentlich keinen Sinn macht- aber gut. :grb:

Ich bin jetzt soweit, dass er mir auch schon die Wochentage auswirft zu den einzelnen Daten- was allerdings so wirklich keinen weiterbringt... ich glaube ich bin da auf dem Holzweg für Aufg.3 :(X(

chris01
12.12.2007, 21:47
gibt mir detail, dann will ich dir schon helfen!!
also die angabe konkretisieren.

was ist mit "jeweiliger tag" gemeint und wie hängen die beiden eingabedatums zusammen



noch ein tipp: für die berechnungen ist es vielleicht gut, wenn man das ganze normiert. also z.B. alles auf sekunden ab einer basis.

unix macht da alles ab 1.1.1900 utc 0h in sekunden.



und das vorhin hat ich ernst gemeint: wenn es lt. angabe unklarheiten gibt, dann ist es sicherlich besser diese klar zu definieren (also z.B. werktage sind von mo-fr, egal ob feiertag etc) und danach zu entwickeln. dem prof. interessiert nämlich nicht die zahl die an ende rauskommt, sondern nur wie du das gemacht hast und ob du das auch verstehts. sonst könnte auch ein affe das beispiel beurteilen.

edit: das hab ich mit verschleiern gemeint! ich verdien seit fast 10 jahren mein geld mit softwareengineering und hat selbst überlsesen, dass du beim einlesen ne schleife drüber hast. das ist aber jetzt mal für dich egal.

Kermit
12.12.2007, 21:55
Jeweiliges Datum soll wohl jeweils eins der beiden eingelesenen Daten sein.

Also wenn ich als Datum den 12.12.2007 eingebe soll das Programm die Anzahl der Tage vom 1.1.07 bis zum 12.12.07 ausrechnen... So hab ich das jedenfalls umgesetzt.

=)
Also um die Anzahl der Werktage zu berechnen, habe ich erstmal die Anzahl der Tage vom 1.1.1901 bist zum jeweiligen Datum berechnet.
Daraus ergibt sich dann, da man ja weis, dass der 1.1. ein Dienstag ist welcher Wochentag zu den eingegebenen Daten gehört. Das ist aber ja nur Spielerei und gehört nicht zur Aufgabe - aber ich kann ja so feststellen, wie viele volle Wochen und damit wie viele Werktage es sind...

Kann man den Gedankengang nachvollziehen?

chris01
12.12.2007, 21:59
die aufgabe besteht ja aus 2 teilen:
1. datumsarithmetik, hat nichts mit programmieren zu tun, sondern mit mathe
2. umsetzen in code

kann man aufgrund algorithmik sofort durch eine formel bestimmen, was für ein tag ein beliebiges datum ist???

wenn nicht würd ich einmalig eine funktion schreiben, die weiss, dass der 1.1.xxx ein xx ist und dann jeweils einen tag dazuzählt und mitzählt. wenn man das öfters braucht kann man sich ja eine tabelle speichern. das ist ganz trivial, nicht elegant aber trivial.

mit so einer tabelle kann man auch tage ab einem anderen beginndatum locker mit einer kleinen schleife zählen, indem man die tabelle durchläuft. wenn man dann statt kennzeichen für werktag (z.B. 0) und nicht-wt (z.B. 1) nocht andere kennezchen einführt kann man schnell alles beliebige auswerten.
in der schleife muss man dann nur durch beliebige ifs schaun, was man will und mitzählen.


!! ich weise nochmals darauf hin, dass dies eine lösung ohne viel wissen ist. man muss nur wissen, dass die woche 7 tabe mit mo, di, ... hat. da gibts bestimmt intelligentere mathematisch basierte vorgehen, die weniger iterativ sind !!

chris01
12.12.2007, 22:07
wusst ichs doch: wochentagberechnung von einem datum
google nach zellers kongruenz :gut:

Kermit
12.12.2007, 23:50
Ich habe fertig:

import java.io.*;
import java.text.*;
import java.util.*;

class Datum {

public static int tage[] = new int[3];
public static int tagesdatum[] = new int[3];
public static int datum[][] = new int[2][3];
public static int month[][] = new int[3][12];

void einlesenDatum() throws IOException {
int i;
int z=0;
do {
month[z][0]=31; month[z][1]=28; month[z][2]=31; month[z][3]=30; month[z][4]=31; month[z][5]=30;
month[z][6]=31; month[z][7]=31; month[z][8]=30; month[z][9]=31; month[z][10]=30; month[z][11]=31;
int l = z+1;
BufferedReader dt =
new BufferedReader ( new InputStreamReader (System.in) );
do {
System.out.println("\nBitte das Jahr des "+l+". Datums zwischen 1901 und 2100 eingeben:");
datum[z][2] = Integer.parseInt (dt.readLine());
} while (datum[z][2] <1901 || datum[z][2] >2100);
if (datum[z][2]%400 == 0){
month[z][1]=29;
} else if (datum[z][2]%4 == 0 && datum[z][2]%100 != 0) {
month[z][1]=29;}
do {
System.out.println("\nBitte den Monat des "+l+". Datums zwischen 1 und 12 eingeben:");
datum[z][1] = Integer.parseInt (dt.readLine());
datum[z][1]--;
} while (datum[z][1] <0 || datum[z][1] >11);
do {
i = datum[z][1];
System.out.println("\nBitte den Tag des "+l+".Datums eingeben:");
System.out.println("(bei ungueltiger Eingabe bitte erneut versuchen)");
datum[z][0] = Integer.parseInt (dt.readLine());
} while (datum[z][0]<1|| datum[z][0]>month[z][i]);

System.out.print("\nDas "+l+". Datum lautet: "+datum[z][0]+".");
System.out.println(datum[z][1]+1+"."+datum[z][2]);
z=z+1;
} while (z<2);
}

void tagesdatum() throws IOException {
month[2][0]=31; month[2][1]=28; month[2][2]=31; month[2][3]=30; month[2][4]=31; month[2][5]=30;
month[2][6]=31; month[2][7]=31; month[2][8]=30; month[2][9]=31; month[2][10]=30; month[2][11]=31;
GregorianCalendar kal = new GregorianCalendar();
tagesdatum[0] = kal.get(GregorianCalendar.DATE);
tagesdatum[1] = kal.get(GregorianCalendar.MONTH);
tagesdatum[2] = kal.get(GregorianCalendar.YEAR);
if (tagesdatum[2]%400 == 0){
month[2][1]=29;
} else if (tagesdatum[2]%4 == 0 && tagesdatum[2]%100 != 0) {
month[2][1]=29;}
}

void tageberechnen() throws IOException {
int z=0;
for (int p=2 ;z<p; z++){
for (int i=0; i<datum[z][1]; i++)
{ tage[z] += month[z][i]; }
tage[z] += datum[z][0]-1;
System.out.println("\nDie Differenz vom 1.1."+datum[z][2]+" bis zum "+datum[z][0]+"."
+(datum[z][1]+1)+"."+datum[z][2]+" betraegt: "+tage[z]+" Tage");
}
for (int i=0; i<tagesdatum[1]; i++)
{tage[2] += month[2][i];}
tage[2] += tagesdatum[0]-1;
}
}

public class Aufgabe extends Datum {

public static int differenz;
public static int werktage[] = new int[2];

void differenzdaten() throws IOException {
int i=0,z=0,t=0;
if (datum[0][2]<datum[1][2]){
i=datum[0][2];
t=-tage[0]+tage[1];}
else if (datum[0][2]>datum[1][2]){
i=datum[1][2];
t=tage[0]-tage[1]; }
else {
if (tage[0]<tage[1]){
i=datum[0][2];
t=tage[1]-tage[0];}
else{
i=datum[0][2];
t=tage[0]-tage[1];}}
for (int p=datum[0][2]+datum[1][2]-i; i<p; i++){
if (i%400==0){
z=366;
} else if (i%4==0&&i%100!=0){
z=366;
} else {
z=365;
}
differenz=differenz+z;
}
differenz=differenz+t;
System.out.println("\nDie Differenz zuwischen den beiden eingegebenen Daten betraegt "+differenz+" Tage");
}

// Beachte: Mit dem folgenden Abschnitt lässt sich auch der jeweilige Wochentag anzeigen,
// da das bei dieser Art der Aufgabenlösung quasi mit abgefallen ist.
// Um der Aufgabenstellung genüge zu tun, habe ich die enstprechenden Prints "Stillgelegt".

void differenztag() throws IOException {
int i=2,y=0;
String wt = "";
int anzwt[] = new int[3];
int u[] = new int[3];
for (int z=0; z<i; z++){
int p=0;
for (int j=1901; j<datum[z][2]; j++){
if (j%400==0){
y=366;
} else if (j%4==0&&j%100!=0){
y=366;
} else {
y=365;
}
p=p+y;}
u[z]=u[z]+p+tage[z];}
int h=0,p=0;
for (int j=1901; j<tagesdatum[2]; j++){
if (j%400==0){
y=366;
} else if (j%4==0&&j%100!=0){
y=366;
} else {
y=365;
}
p=p+y;
u[2]=p+tage[2];}
for (int z=0; z<3; z++){
if (u[z]%7==0){
wt="Dienstag";
anzwt[z]=u[z]/7*6;
}else if (u[z]%7==6){
wt="Montag";
anzwt[z]=u[z]/7*6+u[z]%7;
}else if (u[z]%7==5){
wt="Sonntag";
anzwt[z]=u[z]/7*6+u[z]%7;
}else if (u[z]%7==4){
wt="Samstag";
anzwt[z]=u[z]/7*6+u[z]%7;
}else if (u[z]%7==3){
wt="Freitag";
anzwt[z]=u[z]/7*6+u[z]%7;
}else if (u[z]%7==2){
wt="Donnerstag";
anzwt[z]=u[z]/7*6+u[z]%7;
}else if (u[z]%7==1){
wt="Mittwoch";
anzwt[z]=u[z]/7*6+u[z]%7;}

//System.out.println("\nDer Wochentag des "+(z+1)+". Datums ist ein "+wt);
//System.out.println("\nDie Anzahl der Werktage ab 1.1.1901 bis zum "+(z+1)+". Datums betraegt "+anzwt[z]);

}
for (int e=0; e<2; e++){
if (anzwt[e]<anzwt[2]){
werktage[e]=anzwt[2]-anzwt[e];}
else {
werktage[e]=anzwt[e]-anzwt[2];}
System.out.println("\nDie Anzahl an Werktagen zwischen dem "+(e+1)+". Datum und heute betraegt "+werktage[e]);}

}

public static void main(String[] args) throws IOException {

Datum a = new Datum();
a.einlesenDatum();
a.tagesdatum();
a.tageberechnen();

Aufgabe b = new Aufgabe();
b.differenzdaten();
b.differenztag();
}
}

Ich weiß nicht schön, aber selten :D
Der Ergebnis passt jedenfalls.... :jump:

Danke Chris für Deine Hilfe :gut: Ich weiß das zu sehr zu schätzen!

benjik
13.12.2007, 11:49
Original von Kermit
Ich habe fertig:

import java.io.*;
import java.text.*;
import java.util.*;

class Datum {

public static int tage[] = new int[3];
public static int tagesdatum[] = new int[3];
public static int datum[][] = new int[2][3];
public static int month[][] = new int[3][12];

void einlesenDatum() throws IOException {
int i;
int z=0;
do {
month[z][0]=31; month[z][1]=28; month[z][2]=31; month[z][3]=30; month[z][4]=31; month[z][5]=30;
month[z][6]=31; month[z][7]=31; month[z][8]=30; month[z][9]=31; month[z][10]=30; month[z][11]=31;
int l = z+1;
BufferedReader dt =
new BufferedReader ( new InputStreamReader (System.in) );
do {
System.out.println("\nBitte das Jahr des "+l+". Datums zwischen 1901 und 2100 eingeben:");
datum[z][2] = Integer.parseInt (dt.readLine());
} while (datum[z][2] <1901 || datum[z][2] >2100);
if (datum[z][2]%400 == 0){
month[z][1]=29;
} else if (datum[z][2]%4 == 0 && datum[z][2]%100 != 0) {
month[z][1]=29;}
do {
System.out.println("\nBitte den Monat des "+l+". Datums zwischen 1 und 12 eingeben:");
datum[z][1] = Integer.parseInt (dt.readLine());
datum[z][1]--;
} while (datum[z][1] <0 || datum[z][1] >11);
do {
i = datum[z][1];
System.out.println("\nBitte den Tag des "+l+".Datums eingeben:");
System.out.println("(bei ungueltiger Eingabe bitte erneut versuchen)");
datum[z][0] = Integer.parseInt (dt.readLine());
} while (datum[z][0]<1|| datum[z][0]>month[z][i]);

System.out.print("\nDas "+l+". Datum lautet: "+datum[z][0]+".");
System.out.println(datum[z][1]+1+"."+datum[z][2]);
z=z+1;
} while (z<2);
}

void tagesdatum() throws IOException {
month[2][0]=31; month[2][1]=28; month[2][2]=31; month[2][3]=30; month[2][4]=31; month[2][5]=30;
month[2][6]=31; month[2][7]=31; month[2][8]=30; month[2][9]=31; month[2][10]=30; month[2][11]=31;
GregorianCalendar kal = new GregorianCalendar();
tagesdatum[0] = kal.get(GregorianCalendar.DATE);
tagesdatum[1] = kal.get(GregorianCalendar.MONTH);
tagesdatum[2] = kal.get(GregorianCalendar.YEAR);
if (tagesdatum[2]%400 == 0){
month[2][1]=29;
} else if (tagesdatum[2]%4 == 0 && tagesdatum[2]%100 != 0) {
month[2][1]=29;}
}

void tageberechnen() throws IOException {
int z=0;
for (int p=2 ;z<p; z++){
for (int i=0; i<datum[z][1]; i++)
{ tage[z] += month[z][i]; }
tage[z] += datum[z][0]-1;
System.out.println("\nDie Differenz vom 1.1."+datum[z][2]+" bis zum "+datum[z][0]+"."
+(datum[z][1]+1)+"."+datum[z][2]+" betraegt: "+tage[z]+" Tage");
}
for (int i=0; i<tagesdatum[1]; i++)
{tage[2] += month[2][i];}
tage[2] += tagesdatum[0]-1;
}
}

public class Aufgabe extends Datum {

public static int differenz;
public static int werktage[] = new int[2];

void differenzdaten() throws IOException {
int i=0,z=0,t=0;
if (datum[0][2]<datum[1][2]){
i=datum[0][2];
t=-tage[0]+tage[1];}
else if (datum[0][2]>datum[1][2]){
i=datum[1][2];
t=tage[0]-tage[1]; }
else {
if (tage[0]<tage[1]){
i=datum[0][2];
t=tage[1]-tage[0];}
else{
i=datum[0][2];
t=tage[0]-tage[1];}}
for (int p=datum[0][2]+datum[1][2]-i; i<p; i++){
if (i%400==0){
z=366;
} else if (i%4==0&&i%100!=0){
z=366;
} else {
z=365;
}
differenz=differenz+z;
}
differenz=differenz+t;
System.out.println("\nDie Differenz zuwischen den beiden eingegebenen Daten betraegt "+differenz+" Tage");
}

// Beachte: Mit dem folgenden Abschnitt lässt sich auch der jeweilige Wochentag anzeigen,
// da das bei dieser Art der Aufgabenlösung quasi mit abgefallen ist.
// Um der Aufgabenstellung genüge zu tun, habe ich die enstprechenden Prints "Stillgelegt".

void differenztag() throws IOException {
int i=2,y=0;
String wt = "";
int anzwt[] = new int[3];
int u[] = new int[3];
for (int z=0; z<i; z++){
int p=0;
for (int j=1901; j<datum[z][2]; j++){
if (j%400==0){
y=366;
} else if (j%4==0&&j%100!=0){
y=366;
} else {
y=365;
}
p=p+y;}
u[z]=u[z]+p+tage[z];}
int h=0,p=0;
for (int j=1901; j<tagesdatum[2]; j++){
if (j%400==0){
y=366;
} else if (j%4==0&&j%100!=0){
y=366;
} else {
y=365;
}
p=p+y;
u[2]=p+tage[2];}
for (int z=0; z<3; z++){
if (u[z]%7==0){
wt="Dienstag";
anzwt[z]=u[z]/7*6;
}else if (u[z]%7==6){
wt="Montag";
anzwt[z]=u[z]/7*6+u[z]%7;
}else if (u[z]%7==5){
wt="Sonntag";
anzwt[z]=u[z]/7*6+u[z]%7;
}else if (u[z]%7==4){
wt="Samstag";
anzwt[z]=u[z]/7*6+u[z]%7;
}else if (u[z]%7==3){
wt="Freitag";
anzwt[z]=u[z]/7*6+u[z]%7;
}else if (u[z]%7==2){
wt="Donnerstag";
anzwt[z]=u[z]/7*6+u[z]%7;
}else if (u[z]%7==1){
wt="Mittwoch";
anzwt[z]=u[z]/7*6+u[z]%7;}

//System.out.println("\nDer Wochentag des "+(z+1)+". Datums ist ein "+wt);
//System.out.println("\nDie Anzahl der Werktage ab 1.1.1901 bis zum "+(z+1)+". Datums betraegt "+anzwt[z]);

}
for (int e=0; e<2; e++){
if (anzwt[e]<anzwt[2]){
werktage[e]=anzwt[2]-anzwt[e];}
else {
werktage[e]=anzwt[e]-anzwt[2];}
System.out.println("\nDie Anzahl an Werktagen zwischen dem "+(e+1)+". Datum und heute betraegt "+werktage[e]);}

}

public static void main(String[] args) throws IOException {

Datum a = new Datum();
a.einlesenDatum();
a.tagesdatum();
a.tageberechnen();

Aufgabe b = new Aufgabe();
b.differenzdaten();
b.differenztag();
}
}

Ich weiß nicht schön, aber selten :D
Der Ergebnis passt jedenfalls.... :jump:

Danke Chris für Deine Hilfe :gut: Ich weiß das zu sehr zu schätzen!

Ich raff zwar null von java aber ich denke ich habe einen schreibfehler gefunden.
Aber ansonsten respekt!