GregKalender - JulKalender - Kalender

dubidu

Mitglied
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

Mitglied
Also das hab ich bisher:
Java:
  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:

Java:
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
 
S

SlaterB

Gast
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
 
Zuletzt bearbeitet von einem Moderator:

Kevin.

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

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

Java:
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..
 
S

SlaterB

Gast
Fehlermeldung posten?!

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

Neue Themen


Oben