Java problem

hallo :)
eine classe namens Datum(t, m, j) soll vereinbart werden mit den methoden: bestimme Wochentag; Ist es ein schaltjahr oder nicht; Die anzahl der Tage zwischen einem zweitem datum;
.. Beachte, Schaltjahre werden mit einerechnet und es müssen 2 mögliche Daten sein (nicht: 33.14.2000)

Es soll ein einfaches programm werden mit einer klasse Datum und einer testKlasse in welcher die beiden Daten vereinbart und alle ergebnisse ausgegeben werden.

.. Ich weiß, es ist vllt nicht so schwer, aber ich bekomm es einfach nicht hin und bräucht hier hilfe. Falls mir jemand genau erklären kann, wie ich den abstand der beiden daten hinbekomm, danke :D - jedoch hab ich auch nichts gegen kleine denkanstöße.
danke :)
 
Zuletzt bearbeitet:
Deine Hausaufgaben? :rolleyes:

Mal ehrlich, du wirst hier keinen finden, der dir deine Hausaufgaben macht. Wenn du aber deinen bisherigen Code postest und schreibst, wo genau du Probleme hast und nicht weiter kommst, dann wird sich sicherlich jemand finden, der dir mit ein paar Denkanstößen und evtl. ein paar Zeilen Code weiterhilft. :wink:
 
Deine Hausaufgaben?

Mal ehrlich, du wirst hier keinen finden, der dir deine Hausaufgaben macht. [...]

Mist du warst schneller... ;)

Naja. Grundsätzlich würde ich sagen, dass das nicht die schwerste Aufgabe darstellt. Was nützlich sein könnte wäre eine allgemeine Abfangmethode für falsche Daten, die jedes eingelesene Datum überprüft. Ich könnte mir auch vorstellen, dass Java schon ein Datumsformat mitbringt, sodass eine Konvertierung dir wahrscheinlich alles was du brauchst zur Verfügung stellt.

Aber ich kann mich meinem Vorredner nur anschließen:

[...] Wenn du aber deinen bisherigen Code postest und schreibst, wo genau du Probleme hast und nicht weiter kommst, dann wird sich sicherlich jemand finden, der dir mit ein paar Denkanstößen und evtl. ein paar Zeilen Code weiterhilft.

Also hau erstmal rein...
 
da mal das was ich bissher hab, funktioniert auch :) nur noch abstände zwischen 2 Daten geht nicht, bin jz schon 10 stunden gesessen um ne möglichkeit zu finden, aber irgendetwas passt nie..

HTML:
public class Datum {
   private int t, m, j;
    public Datum(int t, int m, int j) {
        this.t=t;
        this.m=m;
        this.j=j;
    }
    public int getT() { return t;}
    public int getM() { return m;}
    public int getJ() { return j;}
    public String wochentag() {
        int h, ja, je, eins, zwei, drei;
        ja=j/100;
        if (m==1||m==2) {
            je=(j-1)%100;
        }
        else {
            je=j%100;
        }
        if (m==1) {
            m=13;
        }
        if (m==2) {
            m=14;
        }
        eins=(m+1)*26/10;
        zwei=je/4;
        drei=ja/4;
        h=(t+eins+je+zwei+drei-2*ja)%7;
        if (h<0) {
            h=h+7;
        }
        if (m==13||m==14) {
            if (j==2000) {
                h=h+1;
                if (h==7) {
                    h=0;
                }
            }
        }
        if (h==1) { return "Sonntag"; }
        if (h==2) { return "Montag"; }
        if (h==3) { return "Dienstag"; }
        if (h==4) { return "Mittwoch"; }
        if (h==5) { return "Donnerstag"; }
        if (h==6) { return "Freitag"; }
        if (h==0) { return "Samstag"; }
        return "falsch";
    }

    public String istSchaltjahr() {
        String schaltjahr;
        if (j%4==0&&j%100!=0||j%400==0) {
            return "Es ist ein Schaltjahr";
        }
        else {
            return "Es ist kein Schaltjahr";
        }
    }
}



public class DatumTest {
    public static void main(String[] args) {
        Datum a=einlesen();
        System.out.println("2tes Datum:");
        Datum b=einlesen();
        int tag=a.getT();
        int monat=a.getM();
        int jahr=a.getJ();
        int tag2=b.getT();
        int monat2=b.getM();
        int jahr2=b.getJ();
        String tage=a.wochentag();
        String istEinSchaltjahr=a.istSchaltjahr();
        System.out.println("Der "+tag+"."+monat+"."+jahr+" ist ein " +tage);
        System.out.println(istEinSchaltjahr);
    }

    public static Datum einlesen() {
        boolean schaltjahr;
        int t, m, j, a;
        do {
            a=0;
            t=Console.readInt("Tag: " );
            m=Console.readInt("Monat: ");
            j=Console.readInt("Jahr: ");
            if (j%4==0&&j%100!=0||j%400==0) {
                schaltjahr=true;
            }
            else {
                schaltjahr=false;
            }
            if (schaltjahr==true&&m==2&&t>29) {
                System.out.println("Dieses Datum gibt es nicht! Erneute eingabe: ");
                a=1;
            }
            if (schaltjahr==false&&m==2&&t>28) {
                System.out.println("Dieses Datum gibt es nicht! Erneute eingabe: ");
                a=1;
            }
            if (m==1&&t>31||m==3&&t>31||m==5&&t>31||m==7&&t>31||m==8&&t>31||m==10&&t>31||m==12&&t>31) {
                System.out.println("Dieses Datum gibt es nicht! Erneute eingabe: ");
                a=1;
            }
            if (m==4&&t>30||m==6&&t>30||m==9&&t>30||m==11&&t>30) {
                System.out.println("Dieses Datum gibt es nicht! Erneute eingabe: ");
                a=1;
            }
        } while(a==1);
        return new Datum(t, m, j);
    }
}
 
Zuletzt bearbeitet:
Wie wärs mit den paar Tabs, dem Codetag...

[...] bissher [...] bin jz schon 10 stunden gesessen [...] irgendetwas passt nie

...und vielleicht nem Duden? Ich meine ja nur: Bevor man anfängt eine Programmiersprache zu lernen sollte man erstmal die Muttersprache sicher können. Vielleicht hast du ja schnell geschrieben, aber auch wenn ich noch nicht lange hier unterwegs bin, weiß ich wohl, dass hier auf Sprachrichtigkeit Wert gelegt wird.

Ich könnte mir auch vorstellen, dass Java schon ein Datumsformat mitbringt, [...]

Nur als Beispiel mal hier. Das bringt alles mit was du brauchst und sollte deinen Wust von Code ein wenig übersichtlicher machen.
 
ich hab es so gelernt und so muss ich es auch schreiben ;) hab mich nun schon ewigkeiten umgesehn ob ich irgendetwas finde wie ich es auf meiner art lösen kann, nur ist das alles so geschrieben, dass ich es nicht verstehe ;) ich kann nichts dafür das man es mir so beibringt, ich mach es einfach :D
 
oh man...heute sind ja wieder hilfswütige Leute unterwegs :rolleyes: einfach auf die Bib zu verweisen ist echt spitze...

zu deinem Problem:

Abgesehen von dem Code, den du produziert hast, könntest du den Abstand von verschiedenen Daten ungefähr so lösen: Du könntest alles in Tage umwandeln und dann damit rechnen, eventuell das Ganze noch etwas aufpeppen, indem du vllt nicht alles umwandelst, sondern in deren Systemen lässt. Dabei musst du dann aber auch eventuell mit negativen Tagen, etc. rumrechnen - aber wir wollen es ja nicht zu einfach machen :)

Das wäre jetzt mein erster Gedanke, wie ich das Problem angehen würde - nicht gerade der kreativste, aber er sollte zur Lösung führen...

Grüße
 
könntest du den Abstand von verschiedenen Daten ungefähr so lösen: Du könntest alles in Tage umwandeln und dann damit rechnen

das in tage umwandeln hab ich schon versucht ;) ich hab die tage vom 1.1.1 bis zum ersten datum und die tage von 1.1.1 bis zum 2ten datum ermittelt und dann einfach minus gerechnet, falls negativ *(-1).
Nur irgendetwas hat da garnicht gepasst was das einbeziehen von den schaltjahren betrifft..
 
oh man...heute sind ja wieder hilfswütige Leute unterwegs einfach auf die Bib zu verweisen ist echt spitze...

Hast ja Recht, aber es ist schon spät und meiner Meinung würde es das Programm eindeutig simpler gestalten.

Nun also etwas konkreter: Ist "nur" der Abstand falsch oder gibt es einen anderen Fehler?


Zeig vielleicht nochmal den Code und mach einen Kommentar wo die Abstandsfunktion ist. Oben finde ich die nicht ganz.
 
Zuletzt bearbeitet:
okay...aber wieso von einem bestimmten Datum aus?

Ein normales Jahr hat 365 Tage, ein Schaltjahr 366. Wenn man jetzt einfach 2006*365 (mal abgesehen von den Schaltjahren) hat man die Tage, dann noch die Monate drauf und den konkreten Tag. Dabei musst du noch bei ein paar Sachen aufpassen, aber eigentlich sehe ich darin kein fundamentales Problem. Du kannst ja mal deinen Versuch reinstellen...

Wie realisiert du eigentlich den Vergleich? durch eine neue Methode innerhalb der Klasse?
 
es funktionieren nur die tage dazwischen nicht ;)
jap, neue Methode in der klasse (:
ja, so einfach hab ichs mir auch vorgestellt, aber irgendwie war ich dann schon ziemlich verwirrt nach dem ganzen mist den ich da gepfuscht hab, drum hab ichs gelöscht und wollt das alles von vorne anfangen. Jedoch wollt ich hald jz nachschaun ob hier irgendjemand einen einfacheren algorythmus weiß :)
oh man...heute sind ja wieder hilfswütige Leute unterwegs einfach auf die Bib zu verweisen ist echt spitze...
keine ahnung was ihr mit Bib meint :D
 
Mal "Pseudomischcode" um die Tage aus den Jahren zu extrahieren:

Code:
long anzahlTageA;

for(int JahreA; JahreA>= 0, JahreA--) {
  if(JahreA == schaltjahr) {
    anzahlTageA == anzahlTageA +366;
  }
  else {
    anzahlTageA == anzahlTageA +365;
  }
}

Das sollte klappen...
Monate schaffst du selber und dann machst du das noch mit dem 2. Datum und Rest ist wohl klar.


bib -> bibliothek/library -> hier
 
Zuletzt bearbeitet von einem Moderator:
ja aber wie genau soll ich das angehn? ;) weil schaltjahr zählt doch erst ab dem 29ten februar um 1 dazu für den fall eines schaltjahres ;) davor zählen die tage normal durch :)
 
Nimm meinen Code für die ganzen Jahre und dann schaust du ob du es beim größten Jahr auch mit einem Schaltjahr zu tun hast und ob du den 29.2 überschreitest. Wenn ja musste halt für den Februar mit 29 Tagen rechnen. Ein paar if's und das sollte laufen...

und jetzt gute Nacht.
 
HTML:
public int anzahlTage(Datum b, boolean schaltjahr1, boolean schaltjahr2) {
        int anzahlTageA, anzahlTageB, anzahl;
        boolean schaltjahrB, schaltjahrA;
        anzahlTageA=0;
        anzahlTageB=0;
        anzahl=1;
        for (int jahr1=j; jahr1>=0; jahr1--) {
            if (jahr1%4==0&&jahr1%100!=0||jahr1%400==0) {
                schaltjahrA=true;
            }
            else {
                schaltjahrA=false;
            }
            if (schaltjahrA) {
                anzahlTageA = anzahlTageA+366;
            }
            else {
                anzahlTageA = anzahlTageA+365;
            }
        }
        for (int jahr2=b.getJ(); jahr2>=0; jahr2--) {
            if (jahr2%4==0&&jahr2%100!=0||jahr2%400==0) {
                schaltjahrB=true;
            }
            else {
                schaltjahrB=false;
            }
            if (schaltjahrB) {
                anzahlTageB = anzahlTageB+366;
            }
            else {
                anzahlTageB = anzahlTageB+365;
            }
        }
        if (m<3 && schaltjahr1==true) {
            if (b.getM()<3&&schaltjahr2==true) {
                anzahl=0;
            }
        }
        if (m<3&&schaltjahr1==true) {
            if (b.getM()>3&&schaltjahr2==true) {
                anzahl=1;
            }
        }
        if (m>3&&schaltjahr1==true) {
            if (b.getM()<3&&schaltjahr2==true) {
                anzahl=1;
            }
        }
        if (m>3&&schaltjahr1==true) {
            if (b.getM()>3&&schaltjahr2==true) {
                anzahl=0;
            }
        }
        int a=anzahlTageB-anzahlTageA+anzahl;
        if (a<0) {
            a=a*(-1);
        }
        if (m==1) {
            anzahlTageA=anzahlTageA+0+t;
        }
        if (m==2) {
            anzahlTageA=anzahlTageA+31+t;
        }
        if (m==3) {
            anzahlTageA=anzahlTageA+59+t;
        }
        if (m==4) {
            anzahlTageA=anzahlTageA+90+t;
        }
        if (m==5) {
            anzahlTageA=anzahlTageA+120+t;
        }
        if (m==6) {
            anzahlTageA=anzahlTageA+151+t;
        }
        if (m==7) {
            anzahlTageA=anzahlTageA+181+t;
        }
        if (m==8) {
            anzahlTageA=anzahlTageA+212+t;
        }
        if (m==9) {
            anzahlTageA=anzahlTageA+243+t;
        }
        if (m==10) {
            anzahlTageA=anzahlTageA+273+t;
        }
        if (m==11) {
            anzahlTageA=anzahlTageA+304+t;
        }
        if (m==12) {
            anzahlTageA=anzahlTageA+334+t;
        }
        if (b.getM()==1) {
            anzahlTageB=anzahlTageA+0+b.getT();
        }
        if (b.getM()==2) {
            anzahlTageB=anzahlTageA+31+b.getT();
        }
        if (b.getM()==3) {
            anzahlTageB=anzahlTageA+59+b.getT();
        }
        if (b.getM()==4) {
            anzahlTageB=anzahlTageA+90+b.getT();
        }
        if (b.getM()==5) {
            anzahlTageB=anzahlTageA+120+b.getT();
        }
        if (b.getM()==6) {
            anzahlTageB=anzahlTageA+151+b.getT();
        }
        if (b.getM()==7) {
            anzahlTageB=anzahlTageA+181+b.getT();
        }
        if (b.getM()==8) {
            anzahlTageB=anzahlTageA+212+b.getT();
        }
        if (b.getM()==9) {
            anzahlTageB=anzahlTageA+243+b.getT();
        }
        if (b.getM()==10) {
            anzahlTageB=anzahlTageA+273+b.getT();
        }
        if (b.getM()==11) {
            anzahlTageB=anzahlTageA+304+b.getT();
        }
        if (b.getM()==12) {
            anzahlTageB=anzahlTageA+334+b.getT();
        }
        anzahl=anzahlTageA-anzahlTageB+anzahl;
        if (anzahl<0) {
            anzahl=anzahl*(-1);
        }
        return anzahl;
    }




Findet jemand den denkfehler in der methode? :) irgendwas hab ich da nicht ganz bedacht, sonst würds gehn :D ich weiß, es is verdammt lang, aber das passt schon so :D
 
Also der größte Fehler dürfte die fehlende Dokumentation sein ;)

Was passiert denn? Verzählt der sich? Für was brauchst du im Aufruf die bool-Werte bzgl. Schaltjahr?

Insgesamt sieht es viel zu kompliziert aus, was du da machst.

Ich musste das damals auch machen. Ich habe einfach Anzahl der kompletten Jahre zwischen den Daten * 365 genommen, dann diese Jahre auf jeweils Schaltjahr überprüft und ggf. +1 gemacht. Das geht in ner Schleife.

Danach für das Startjahr alle vollen Monate addiert, das geht z.B. über Konstanten und danach nur noch die fehlenden Tage, ggf. auch im Februar das Schaltjahr.
Selbes vom Prinzip her noch für das Endjahr.
 
Hat mich den ganzen Tag nicht los gelassen das Problem :wink:. Klingt freaky -ist es auch - aber hier ist meine Lösung. Habe ich natürlich nicht im Programm testen können, aber trotzdem sollte es funktionieren. Du brauchst nur eine Methode "boolean istDasEinSchaltjahr(int Jahr)". Das schaffst du schon!

Hier:
Code:
// Du brauchst eine Methode: "boolean istDasEinSchaltjahr(int Jahr)", die dir
// true/false ausgibt ob es ein Schaltjahr ist !!


public int anzahlTage(int jahrA, int jahrB, int monatA, int monatB, int tagA, int tagB) {
    int anzahlTageA = 0, anzahlTageB = 0;
		
		
	//Das ist für Datum A /////////////////////////////////////////////////////
	//Tage verarbeiten
	anzahlTageA=anzahlTageA+tagA;
		
	//Monate verarbeiten
	if (monatA>1) {
        anzahlTageA=anzahlTageA+31;
    }
    if (monatA>2) {
        anzahlTageA=anzahlTageA+28;
    }
    if (monatA>3) {
        anzahlTageA=anzahlTageA+31;
    }
    if (monatA>4) {
        anzahlTageA=anzahlTageA+30;
    }
    if (monatA>5) {
        anzahlTageA=anzahlTageA+31;
    }
    if (monatA>6) {
        anzahlTageA=anzahlTageA+30;
    }
    if (monatA>7) {
        anzahlTageA=anzahlTageA+31;
    }
    if (monatA>8) {
        anzahlTageA=anzahlTageA+31;
    }
    if (monatA>9) {
        anzahlTageA=anzahlTageA+30;
    }
    if (monatA>10) {
        anzahlTageA=anzahlTageA+31;
    }
    if (monatA>11) {
        anzahlTageA=anzahlTageA+30;
    }
		
	//Wenn Schaltjahr und der Monat über Februar ein extra Tag
	if (istDasEinSchaltjahr(JahrA)) { //Hier brauchst du die Methode "istDasEinSchaltjahr(int Jahr)"
		anzahlTageA=anzahlTageA+1;
	}
		
	//Jahre verarbeiten
	for(int x=jahrA; x>0; x--) {
		if (istDasEinSchaltjahr(x)) { //Hier brauchst du die Methode "istDasEinSchaltjahr(int Jahr)"
			anzahlTageA=anzahlTageA+366;
		} else {
			anzahlTageA=anzahlTageA+365;
		}
	}
	///////////////////////////////////////////////////////////////////////////
		
		
	//Das ist für Datum B /////////////////////////////////////////////////////
		
	//schaffst du selber [...]
		
	///////////////////////////////////////////////////////////////////////////
		
		
		
	if(anzahlTageA>=anzahlTageB) { //Gucken welches größer ist!!
		return anzahlTageB-anzahlTageA;
	} else {
		return anzahlTageA-anzahlTageB;
	}
}


PS: Für anzahlTageB, also da wo "schaffst du selber [...]" steht, musst dun das ganze darüber nochmal einfügen nur "B" anstatt "A".
 
Zuletzt bearbeitet:
Zurück
Oben