Konstruktor Datum

D

DigitalOlli

Gast
Ich bin noch Java Anfänger und habe eine Aufgabe bekommen. Komme da aber nicht wirklich weiter, weiss nicht wie ich den Konstruktor schreiben soll.

Hier mal die Aufgabe:

Dabei sind:
d TagimMonat(1≤d≤31)
m Monat (3 ≤ m ≤ 14). In die Formel müssen Januar und Februar als Monate 13 und 14 des Vorjahres eingesetzt werden. (Man muss also jeweils 12 zu den Monaten 1 und 2 addieren und das Jahr um 1 heruntersetzen.)
j Jahr im Jahrhundert (0 ≤ j ≤ 99, z.B. die 10 im Jahr 2010) c Jahrhundert (z.B. die 20 im Jahr 2010) w Index des Wochentages, gezählt ab 0 = Sonntag bis 6 = Samstag

Die Methode hab ich schon fertig. Aber mit dem Konstruktor komme ich nicht klar,

Kann hier leider nicht die ganze Aufgabe reinstellen.

Villeicht kann mir wer helfen, gerne auch per ICQ.

mfg

Hier mal mein bisheriger Code:

Java:
public class Datum {
    private int tag;
    private int monat;
    private int jahr;
    private int jahrhundert;
    // Konstruktor
    public Datum (int tag , int monat, int jahr){
        this.tag = tag;
        
        
    }
    
    // Methode berechneWochentag
    public int berechneWochentag(){
        return (tag+(26*(monat+1))/10+(5+jahr)/4+jahrhundert/4+5*jahrhundert-1)%7;
        
    }
    
    // Name ausgeben Wochentag
    
    public String nameWochentag(){
        return berechneWochentag()==0?"Sonntag":berechneWochentag()==1?"Montag":berechneWochentag()==2?"Dienstag":berechneWochentag()==3?"Mittwoch":berechneWochentag()==4?"Donnerstag":berechneWochentag()==5?"Freitag":"Samstag";
    
    
    }
    public String toString(){
        return (String) (tag<10?tag+1:tag + "." + this.monat + "." + this.jahr + "."+ this.jahrhundert);
        
    }
    
}
 
Zuletzt bearbeitet von einem Moderator:
S

SlaterB

Gast
> Aber mit dem Konstruktor komme ich nicht klar,
gehts genauer?
du schreibst komplizierte Methoden aber eine Zeile wie
> this.tag = tag;
ist unverständlich?
 
D

DigitalOlli

Gast
hi
ich glaub ich muss mal die ganze aufgabe reinschreiben.

Ja der Konstruktor ist ja nicht fertig . das war nur der erste teil. aber ich komme nicht weiter.

Als Anhang hab ich die PDF eingefügt.
 

Anhänge

  • aufgabe datum.pdf
    118,6 KB · Aufrufe: 30
S

SlaterB

Gast
ich sehe keine zusätzlichen Infos im PDF,

angenommen ich behaupte, der Konstruktor sei fertig,
was glaubst du daran nicht, welches Fehlverhalten beobachtest/ vermutest du,
welche zusätzliche Funktionalität fehlt dir noch komplett

was zum Himmel ist die Frage?
 
D

DigitalOlli

Gast
Hi

Scheint etwas kompliziert zu sein.

Also meine Ausgabe in der Main Methode funktioniert nicht wie gewünscht:

2. für dieses Datum-Objekt den Wochentag auf dem Bildschirm auszugeben
3. dieses Datum-Objekt als Zeichenkette auf dem Bildschirm auszugeben.

Das klappt nicht.

Main Methode:

Java:
public class DatumTest {
public static void main (String []args){
    Datum neuesDatum = new Datum (1,11,2011);
    System.out.println(neuesDatum.nameWochentag());
    System.out.println(neuesDatum.toString());
}
}
 
Zuletzt bearbeitet von einem Moderator:
S

SlaterB

Gast
interessant wie du daraus ein Konstruktor-Problem vermutest, was aber durchaus besteht,

schauen wir uns diesen Konstruktor nochmal an: 3 Parameter a, b und c, wichtige Werte die du aus der main übergibst
es gibt auch drei Klassenattribute a, b und c, die diese Werte sicher speichern sollen,

dann hast du eine Code-Zeile drin, die einen der Parameter-Werte im zugehörigen Klassenattribut speicherst,
die anderen beiden Parameter ignorierst du,

ähnlicher Code, z.B.
> this.monat = monat;
ist undenkbar selber hinzuschreiben?
eine dritte Code-Zeile ist auch noch nötig

-----

ich befürchte allerdings, dass auch mit richtigem Konstruktor nichts gutes in dem Programm herauskommt,
da sind noch Fehler drin, 10fach komplizierter als ein Konstruktor, den sogar ein Programm automatisch generieren könnte

(edit: oh, die Formel ist gegeben, dann kommt sie vielleicht wirklich hin)
 
Zuletzt bearbeitet von einem Moderator:
D

DigitalOlli

Gast
wo liegen denn die fehler,? bin wie gesagt noch anfänger in diesem bereich.

eclipse erzeugt schonmal den wochentag , aber keine ander weitige ausgabe deswegen hatte ich an ein konstruktor problen gedacht.


mfg
 
S

SlaterB

Gast
(tag<10?tag+1:tag + "." + this.monat + "." + this.jahr + "."+ this.jahrhundert);

bedeutet

if (tag<10) {
tag+1;
} else {
tag + "." + this.monat + "." + this.jahr + "."+ this.jahrhundert
}
 
M

Marcinek

Gast
Ich würde mal anfange zu lesen.

SlaterB hat die antwort auf diese Frage detaliert beschrieben...

Da jahrhundert immer 0 ist, wird auch die Berechnung des Wochentags krude, da dort viele summen einfach so 0 werden.

Es fehlt die Berechnung von jahrhundert lt aufgabe c und j (was das jahr im jahrhundert ist)
 
Zuletzt bearbeitet von einem Moderator:
D

DigitalOlli

Gast
steh irgendwie auffem schlauch.

die berechnung von jahrhundert , wie kann ich die anlegen ? 20 plus das jahr ?

mfg
 
Zuletzt bearbeitet von einem Moderator:
M

Marcinek

Gast
20 + jahr?

und dann? -Erscheint mir kein guter Ansatz.

Jahrhundert sind doch die Anzahl der 100 er in 2000 und jahr im jahrhundert ist der Rest davon.
 
D

DigitalOlli

Gast
Müsste doch 2000 /100 dann habe ich die Anzahl 100er in den 2000.

Aber bringt micht auch nicht wirklcih weiter.

Muss ich diese Rechnung in den Konstruktor schreiben oder in die Methode?
 
Zuletzt bearbeitet von einem Moderator:
M

Marcinek

Gast
ok also das ergebnis speichert man idealerweise in variablen

Code:
int ergebnis = 2000 / 100;

Das kannst du in java nicht schreiben?

Wenn dich das nicht weiter bringt, dann kann ich dir leider nicht helfen... =(
 
D

DigitalOlli

Gast
Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
at Datum.toString(Datum.java:30)
at DatumTest.main(DatumTest.java:6)

Das sind die Fehler die ich immer noch bekommen.
 
D

DigitalOlli

Gast
Java:
public class Datum {
    private int tag;
    private int monat;
    private int jahr;
    private int jahrhundert = 2000/100;
    // Konstruktor)
    public Datum (int tag , int monat,int jahrhundert){
        this.tag = tag;
        this.monat = monat;
        this.jahrhundert = jahrhundert;
        
    }
    

    // Methode berechneWochentag
    public int berechneWochentag(){
        return (tag+(26*(monat+1))/10+(5+jahr)/4+jahrhundert/4+5*jahrhundert-1)%7;
        
    }
    
    // Name ausgeben Wochentag
    
    public String nameWochentag(){
        return berechneWochentag()==0?"Sonntag":berechneWochentag()==1?"Montag":berechneWochentag()==2?"Dienstag":berechneWochentag()==3?"Mittwoch":berechneWochentag()==4?"Donnerstag":berechneWochentag()==5?"Freitag":"Samstag";
    
    
    }
    public String toString(){
        return (String) (tag<10?tag+1:tag + "." + monat + "." + jahr + "."+ jahrhundert);
        
    }
    
}

So sieht jetzt die Klasse Datum aus.

Die main Methode so:
Java:
public class DatumTest {
public static void main (String []args){
    Datum neuesDatum = new Datum (1,11,2011);
    System.out.println(neuesDatum.nameWochentag());
    System.out.println(neuesDatum.toString());
}
}
 
S

SlaterB

Gast
-->
(tag<10?tag+1:tag + "." + this.monat + "." + this.jahr + "."+ this.jahrhundert);

bedeutet

if (tag<10) {
tag+1;
} else {
tag + "." + this.monat + "." + this.jahr + "."+ this.jahrhundert
}
<---

verwende ganz einfach erstmal dieses ( ? : ) gar nicht, das ist viel zu kompliziert,
verwende if und else und baue einen String zusammen

String st = "";
if (..) {
st += ...;
}
 
D

DigitalOlli

Gast
Laut unserem Prof sollen wir noch keine If usw einbauen.
Hinweis: die Methodenrümpfe sollen nur unter Verwendung von Ausdrücken (Inhalt der VL06) also ohne Kontrollstrukturen (z.B. if-Statement) imple- mentiert werden.
 
S

SlaterB

Gast
meine Güte, ( ? : ) ist aber eigentlich nur eine Kurzform davon,

damit es mal weitergeht:
schreibe
(tag<10?tag+1:tag) + "." + this.monat + "." + this.jahr + "."+ this.jahrhundert;
statt
(tag<10?tag+1:tag + "." + this.monat + "." + this.jahr + "."+ this.jahrhundert);

wobei ich eh kaum verstehe, wieso da der Tag um 1 erhöht wird..
 
D

DigitalOlli

Gast
Java:
public class Datum {
    private int tag;
    private int monat;
    private int jahr;
    private int jahrhundert ;
    // Konstruktor)
    public Datum (int tag , int monat,int jahr){
        this.tag = tag;
        this.monat = monat<3?monat+12:monat;
        this.jahr = (monat<3?jahr-1:jahr)-2000;
        this.jahrhundert = jahr/100;
        
    }
    

    // Methode berechneWochentag
    public int berechneWochentag(){
        return (tag+(26*(monat+1))/10+(5+jahr)/4+jahrhundert/4+5*jahrhundert-1)%7;
    
    }
    // Name ausgeben Wochentag
    
    public String nameWochentag(){
        return berechneWochentag()==0?"Sonntag":berechneWochentag()==1?"Montag":berechneWochentag()==2?"Dienstag":berechneWochentag()==3?"Mittwoch":berechneWochentag()==4?"Donnerstag":berechneWochentag()==5?"Freitag":"Samstag";
    
    
    }
    
    



    public String toString(){
        return (tag<10?"0":"")+ this.tag + "." + "" + this.monat + "." + this.jahrhundert + this.jahr;
        
    }
    
}

Main wie oben.

Ich habe es alles soweit hinbekommen, nur leider wirft er mir einen Dienstag für den 08.12.2011 aus.
Es muss aber ein Donnerstag sein.
Ich weiss nicht wodrann das liegt.

mfg
 
M

Marcinek

Gast
1. Ist das nach der Aufgabenstellung die inkorrekteste Lösung, die man sich denken kann..

Man sollte doch keine ifs benutzen? - Auch der terziere Vergleichsoperator ist eine Kontrollstruktur...

:rolleyes:

2. Ich kann dir jetzt schon sagen, so wie du es gemacht hast, wird es maybe für den EINEN Fall 1.11.2011 klappen...

bei 1.11.1999 => boom..

Wegen deinem Problem: Vermutlich ist 1= Sonntag ud damit verschiebt sich der index.

3) Was genau steckt hier hinter:

monat<3?monat+12:monat;

????? Was soll das bewirken? - Also fachlich..
 
D

DigitalOlli

Gast
Also es geht ja dadrumm das der jan und feb quasi 13 und 14 monat sind.
Monat (3 ≤ m ≤ 14). In die Formel müssen Januar und Februar als Monate 13 und 14 des Vorjahres eingesetzt werden. (Man muss also jeweils 12 zu den Monaten 1 und 2 addieren und das Jahr um 1 heruntersetzen.)

bewirken soll das wenn monat <3 ist sollen 12 hinzuadiert werden.

Sonntag ist die 0

keine ahnung wodrann es liegt
 
M

Marcinek

Gast
Entweder du debugst deinen Code, oder du erstellst entsprechende Debugausgaben, um zu sehen was da genau gemacht wird...

Werden alle benötigten wertr

d m c j richtig berechnet?
 

SpecialKay

Mitglied
hi olli,

als erstes: ich würd den konstruktor ändern. dinge wie this.tag = tag sind garnicht schön. nimm lieber this.tag = t.

außerdem solltest du dann neue variablen benutzen. nimmst du zum beispiel den 6.2.2010 wird bei der methode toString() 06.14.2009 zurückgegeben... oder irre ich mich?
nimm sachen wie int neuermonat = this.monat>3 ? this.monat+12 : this.monat;
bei tag kann es natürlich so bleiben wie es ist, weil du nichts beim tag verändern musst.

nächstes problem ist, dass du in deiner berechnung 5+jahr stehen hast. es muss aber 5*jahr heißen.

"this.jahr = (monat<3?jahr-1:jahr)-2000;" ist natürlich auch falsch. das funktioniert nur bei jahren >2000.
mach einfach modulo 100, dann hast du den rest. bei 2010 wären es dann 10.

und zum schluss:
bist du sicher, dass unser prof in der uml nameWochentag() und int jahrhundert geschrieben hat?
mach das mit dem wochentagname einfach in der main von DatumTest.
hast du ein glück, dass du auf einen kommilitonen gestoßen bist ;)
 
Zuletzt bearbeitet:

Xpisto

Aktives Mitglied
Hi, hier ist der kommolitone nummer zwei :p

Ich bin auch soweit gut voran gekommen, nur hake ich bei der zuweisung der zahlen zu den Tagen.
Ich weiss nicht wirklich weiter, habs mit enum versucht, allerdings weiss ich nicht ob dass so überhaupt zulässig ist, und funktioniert hats auch net. (Abgehakt)

So das erste Problem mit der zuweisung hab ich gelöst, hab mich da zu schnell verwirren lassen :)

Desweiteren habe ich nun auch das Problem, dass bei mir beim 6.2.2010 der 6.14.2009 ausgegeben wird, dabei habe ich den konstruktor bisher immer so geschrieben und es lief alles super.
 
Zuletzt bearbeitet:
M

Marcinek

Gast
Ohne Code kann niemand helfen.

Nur soviel: Natürlich muss die umsetzung index zu tag durch die Klasse gemacht werden und nicht durch den aufrufer -.-
 

Neue Themen


Oben