# GregKalender - JulKalender - Kalender



## dubidu (19. Jan 2011)

Hey ich bin gerade etwas am verzeifeln - vielleicht kann mir ja jemand helfen

Ich habe folgende Aufgaben bekommen:
Gegenstand dieser Aufgabe sind die Themen Vererbung und abstrakte
Klassen.
Der Julianische Kalender wurde von Gaius Julius Caesar ( 100 v. Chr., † 44 v.
Chr.) eingeführt und wird auch heute noch in manchen Teilen der Welt verwendet. Er
unterscheidet sich vom Gregorianischen Kalender (s. Aufgabe 23, 30, 35) nur dadurch,
dass alle durch 4 teilbaren Jahre Schaltjahre sind. Die von Caesar eingeführte Schaltregel
wurde zuerst falsch interpretiert. Augustus korrigierte diesen Fehler. Seit dem Jahr 8
n. Chr. wurde die Regel korrekt angewendet.
Implementieren Sie die abstrakte Klasse Kalender sowie die beiden konkreten Klassen
GregKalender und JulKalender gemäß dem folgenden Diagramm:


abstract class Kalender
int tag
int monat
int jahr
String toString()
abstract String wochentag()


class GregKalender
...
JulKalender jdatum()
...


class JulKalender
...
GregKalender gdatum()
...

JulKalender und GregKalender jeweils extends zu Kalender


Die konkrete Methode toString() soll ein Datum in der Form „13. Januar 2011“ darstellen.
Die Methode wochentag() soll den Wochentag des aktuellen Datums berechnen (s.
Aufgabe 23). Die Methode jdatum() soll das von der Instanz repräsentierte gregorianische
Datum als julianisches Datum liefern. Entsprechend soll die Methode gdatum() das von
der Instanz repräsentierte julianische Datum als gregorianisches Datum zurückgeben.

Die folgende Tabelle enthält einige Beispiele:
Julian. Datum       Greg. Datum        Wochentag
1. Januar 8           ungültig               Sonntag
4. Oktober 1582     ungültig              Donnerstag
5. Oktober 1582    15. Oktober 1582       Freitag
22. Dezember 1600 1. Januar 1601         Montag
19. Dezember 2000 1. Januar 2001        Montag
24. Dezember 2010 6. Januar 2011      Donnerstag
31. Dezember 2010 13. Januar 2011     Donnerstag
1. Januar 2011        14. Januar 2011       Freitag
16. Dezember 2400  1. Januar 2401          Montag



Ich denke Kalender.java bekomme ich irgendwie hin - genauso wie die Wochentagsberechnung...

Aber was muss ich bei jdatum() bzw gdatum() machen? - kann mir jemand einen tipp für den anfang geben?

Naja vielleicht meldet sich ja jemand...

LG


----------



## dubidu (19. Jan 2011)

Also das hab ich bisher:

```
abstract class Kalender(){
  int tag
  int monat
  int jahr


  public void setTag(int tag) {
    this.tag = tag;
  }
  public void setMonat(int monat) {
    this.monat = monat;
  }
  public void setJahr(int jahr) {
    this.jahr = jahr;
  }

  public int getTag() {
    return this.tag;
  }
  public int getMonat() {
    return this.monat;
  }
  public int getJahr() {
    return this.jahr;
  }

  public String toString(){
  String mo = "";
      switch (monat) {
        case  1: mo = "Januar";    break;
        case  2: mo = "Februar";   break;
        case  3: mo = "MÃ¤rz";      break;
        case  4: mo = "April";     break;
        case  5: mo = "Mai";       break;
        case  6: mo = "Juni";      break;
        case  7: mo = "Juli";      break;
        case  8: mo = "August";    break;
        case  9: mo = "September"; break;
        case 10: mo = "Oktober";   break;
        case 11: mo = "November";  break;
        case 12: mo = "Dezember";  break;
      }

      System.out.println(tag + ". " + mo +  jahr);
    }

    abstract String wochentag();
}
```

außerdem noch:


```
class GregKalender extends Kalender{


public String wochentag(){

    boolean gueltig = true;
    if (jahr<=1581) gueltig = false;
    if (jahr==1582 && monat<=9) gueltig = false;
    if (jahr==1582 && monat==10 && tag<=14) gueltig = false;
    if (tag<1 || tag>31) gueltig = false;
    if (monat<1 || monat>12 ) gueltig = false;
    if ((monat==2 || monat==4 || monat==6 || monat==9 || monat==11) && (tag==31)) gueltig = false;
    if (monat==2 && tag==30) gueltig = false;
    if (monat==2 && tag==29 && jahr%4!=0 ) gueltig = false;
    if (monat==2 && tag==29 && jahr%4==0 && jahr%400!=0 && jahr%100==0) gueltig = false;

    if (!gueltig)
      System.out.println("UngÃ¼ltiges Eingabedatum!");
    else {
      int d = tag,
          y = jahr%100;
      if (monat==1 || monat==2)
        if (y>0)
          y--;
        else
          y=99;
      int c = jahr/100;
      if ((monat==1 || monat==2) && (jahr%100==0)) c--; 
      int m = monat-2;
      if (m<=0) m+=12;
      int w=((d+(13*m-1)/5+y+y/4+c/4-2*c)%7+7)%7; 

      String wt = "";
      switch (w) {
        case 0: wt = "Sonntag";    break;
        case 1: wt = "Montag";     break;
        case 2: wt = "Dienstag";   break;
        case 3: wt = "Mittwoch";   break;
        case 4: wt = "Donnerstag"; break;
        case 5: wt = "Freitag";    break;
        case 6: wt = "Samstag";    break;
      }
  return wt;
}

  public JulDatum jdatum(){ ?????
```

und das gleiche bei JulKalender.java


----------



## SlaterB (19. Jan 2011)

hast du diesen Code auch mal an einen Compiler übergeben?
der enthält ja noch diverse Fehler

-----

der entscheidene Trick ist nun, für beide Kalender-Arten eine gemeinsame konsistente Zählweise/ Datumsbestimmung einzufügen,
z.B. jeweils ein Datum in Anzahl Tage seit Jahr 0 umwandeln können,
für beide Klassen Datum -> Anzahl Tage + Anzahl Tage -> Datum implementieren,
das muss  bzw. kann für beide Klassen unabhängig geschehen, noch 'einfach' ohne Verknüpfung

die Verknüpfung ist mit dieser Vorarbeit dann relativ leicht:
dann kannst du von Julian '19. Dezember 2000' aus 48923 Tage errechen, übergibst das an Gregorian und dort wird aus den Tagen '1. Januar 2001' zurückgerechnet

bei den Wochentagen hast du ja schon komplizierte Berechnungen, ich glaube die helfen hierbei, das ist recht ähnlich


----------



## Kevin. (23. Jan 2011)

Das ist meine Kalender.java, die soll ja den Wochentag ausrechen, soweit ich verstanden hab,.. 


```
abstract class Kalender {

	int tag;
	int monat;
	int jahr;

	public Kalender() {
	}
	Kalender(int tag, int monat, int jahr) {
	this.tag = tag;
	this.monat = monat;
	this.jahr = jahr;
	}

	public void setTag(int tag) {
		this.tag = tag;
	}
	public void setMonat(int monat) {
		this.monat = monat;
	}
	public void setJahr(int jahr) {
		this.jahr = jahr;
	}
	public int getTag() {
		return this.tag;
	}
	public int getMonat() {
		return this.monat;
	}
	public int getJahr() {
		return this.jahr;
	}	
	
	
	public String toString() {
		return "datum: " + tag + "." + monat + "." + jahr; }
		
	public void wochentag(String[] args) {
		int monat2 = monat, jahr2 = jahr;
		
		if(monat<=2)
		{
		monat2 = monat + 12;
		jahr2 = jahr - 1;
		}
		
		int wochentag = (tag + 2*monat2 + (3*monat2 + 3)/5 + jahr2 + jahr2/4 - jahr2/100 + jahr2/400 + 1)%7;
		
		if(wochentag==0)
		{System.out.println("Der "+tag+"."+monat+"."+jahr+" ist ein Sonntag.");}
		if(wochentag==1)
		{System.out.println("Der "+tag+"."+monat+"."+jahr+" ist ein Montag");}
		if(wochentag==2)
		{System.out.println("Der "+tag+"."+monat+"."+jahr+" ist ein Dienstag");}
		if(wochentag==3)
		{System.out.println("Der "+tag+"."+monat+"."+jahr+" ist ein Mittwoch");}
		if(wochentag==4)
		{System.out.println("Der "+tag+"."+monat+"."+jahr+" ist ein Donnerstag");}
		if(wochentag==5)
		{System.out.println("Der "+tag+"."+monat+"."+jahr+" ist ein Freitag");}
		if(wochentag==6)
		{System.out.println("Der "+tag+"."+monat+"."+jahr+" ist ein Samstag");}
		
		
	}
		
}
```

Aber meine test.java gibt immer eine Fehlermeldung und ich sehe den Fehler einfach nicht... da sollen die werte eingegeben werden und dann eben das ergebnis ausgeben. 


```
import Prog1Tools.IOTools;

public class test {
	public static void main(String[] args) {
		Kalender k = new Kalender();
		
		
		int tag = IOTools.readInteger("Geben Sie bitte den Tag ein: ");
		int monat = IOTools.readInteger("Geben Sie bitte den Monat ein: ");
		int jahr = IOTools.readInteger("Geben Sie bitte das Jahr ein: ");
		
		k.setTag(tag);
		k.setMonat(monat);
		k.setJahr(jahr);
		
		System.out.println(wochentag);
		
		
		}
	}
```

Vielleicht kann mit jemand einen Tipp geben.. hab ein Brett vorm Kopf..


----------



## SlaterB (23. Jan 2011)

Fehlermeldung posten?!

die Variable wochentag dürfte nicht definiert sein, wenn du am Objekt k eine Methode aufrufen willst, dann tue dies aus


----------

