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.
Ergebnis 21 bis 27 von 27
Thema: Java Programmierer hier?
-
12.12.2007, 21:46 #21Original von chris01
mein erstes problem ist schon die angabe:
- du sollt 2 datumseinlesen, 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...?
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.
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.
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.3Gruß,
Martin
-
12.12.2007, 21:47 #22mfg Christoph
-
12.12.2007, 21:55 #23
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?Gruß,
Martin
-
12.12.2007, 21:59 #24
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 !!mfg Christoph
-
12.12.2007, 22:07 #25
wusst ichs doch: wochentagberechnung von einem datum
google nach zellers kongruenzmfg Christoph
-
12.12.2007, 23:50 #26
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
Der Ergebnis passt jedenfalls....
Danke Chris für Deine HilfeIch weiß das zu sehr zu schätzen!
Gruß,
Martin
-
13.12.2007, 11:49 #27Original 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
Der Ergebnis passt jedenfalls....
Danke Chris für Deine HilfeIch weiß das zu sehr zu schätzen!
Aber ansonsten respekt!An diesem Tisch wird nicht gelogen!
Beste, Ben
Ähnliche Themen
-
Editor - Java
Von weyli im Forum Off TopicAntworten: 5Letzter Beitrag: 06.05.2010, 11:34 -
Hats hier Programmierer?
Von Donluigi im Forum Off TopicAntworten: 0Letzter Beitrag: 11.08.2009, 22:24 -
Java
Von Okatu im Forum Off TopicAntworten: 3Letzter Beitrag: 22.09.2005, 15:14
Lesezeichen