# Konstruktor Datum



## DigitalOlli (1. Nov 2010)

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 mü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, gezä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:


```
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);
        
    }
    
}
```


----------



## SlaterB (1. Nov 2010)

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


----------



## DigitalOlli (1. Nov 2010)

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.


----------



## SlaterB (1. Nov 2010)

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?


----------



## DigitalOlli (1. Nov 2010)

Hi

Scheint etwas kompliziert zu sein. 

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

2. fü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:


```
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());
}
}
```


----------



## SlaterB (1. Nov 2010)

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)


----------



## DigitalOlli (1. Nov 2010)

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


----------



## SlaterB (1. Nov 2010)

(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
}


----------



## Marcinek (1. Nov 2010)

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)


----------



## DigitalOlli (1. Nov 2010)

steh irgendwie auffem schlauch.

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

mfg


----------



## Marcinek (1. Nov 2010)

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.


----------



## DigitalOlli (1. Nov 2010)

Marcinek hat gesagt.:


> 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.




ja das schonmal gut, raff nur nicht wie ich das in quellcode umsetzte.
kleiner tip?


----------



## Clahboid (1. Nov 2010)

kleiner tip:
ganzzahlige Division fürs Jahrtausend
modulo fürs Jahr zwischen 0 und 99


----------



## Marcinek (1. Nov 2010)

Ich frage mal anders:  

Wie würde die Formel programiersprachen unabhänig aussehen?


----------



## DigitalOlli (1. Nov 2010)

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?


----------



## Marcinek (1. Nov 2010)

ok also das ergebnis speichert man idealerweise in variablen


```
int ergebnis = 2000 / 100;
```

Das kannst du in java nicht schreiben?

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


----------



## DigitalOlli (1. Nov 2010)

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.


----------



## DigitalOlli (1. Nov 2010)

```
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:

```
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());
}
}
```


----------



## SlaterB (1. Nov 2010)

-->


SlaterB hat gesagt.:


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


<---

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 += ...;
}


----------



## DigitalOlli (1. Nov 2010)

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


----------



## SlaterB (1. Nov 2010)

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..


----------



## DigitalOlli (1. Nov 2010)

```
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


----------



## Marcinek (1. Nov 2010)

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... 



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..


----------



## DigitalOlli (1. Nov 2010)

Also es geht ja dadrumm das der jan und feb quasi 13 und 14 monat sind. 
Monat (3 ≤ m ≤ 14). In die Formel mü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


----------



## Marcinek (1. Nov 2010)

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 (7. Nov 2010)

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


----------



## Xpisto (7. Nov 2010)

Hi, hier ist der kommolitone nummer zwei 

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.


----------



## Marcinek (7. Nov 2010)

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 -.-


----------

