# Java Consolen Kalender



## Ren (4. Mai 2017)

```
public class Start {
    public static void main(String[] args)  {
        (new Kalender()).auswahlMenue();
    }
}//end of main

public class KalenderFunktion

{
/**

=========================================================================

* Funktion:    istSchaltjahr( int jahr )

* Parameter:    jahr (int)    : das Jahr, das auf Schaltjahr ueberprueft wird

* Rueckgabe:    (boolean)     : true, wenn das Jahr ein Schaltjahr ist

*                             : false,  wenn das Jahr nicht Schaltjahr ist

* Beschreibung: jedes 4.te Jahr ist Schaltjahr,

* (wenn sich das Jahr durch 4 ohne Rest teilen laesst, ist es Schaltjahr )

* Ausnahme davon jedes 100.te Jahr ist kein Schaltjahr

* (wenn sich das Jahr durch 100 ohne Rest teilen laesst, ist es kein Schaltjahr)

* Ausnahme davon jedes 400.ter Jahr    ist wieder Schaltjahr

* (wenn sich das Jahr durch 400 ohne Rest teilen laesst, ist es Schaltjahr)

* =========================================================================

*/

boolean istSchaltjahr(int jahr)

{

    return ((jahr%4 == 0 )&&((jahr%100 != 0 )||( jahr%400 == 0 )));

}



/**

=========================================================================

* Funktion:    schaltjahr(int jahr)

* Parameter:    jahr (int) : das Jahr, das auf Schaltjahr ueberprueft wird

* Rueckgabe:    (int)      :     1 = true, wenn das Jahr ein Schaltjahr ist

*                          :     0 = false,  wenn das Jahr nicht Schaltjahr ist

* Beschreibung: siehe --> istSchaltjahr(long jahr)

* =========================================================================

*/

int schaltjahr(int jahr)

{

    if(istSchaltjahr(jahr)) return 1;

    else return 0;

}



/**

=========================================================================

* Funktion:    tagesnummer(int tag, int monat, int jahr)

* Parameter:    tag (long)       : Tag

*               monat (long)     : Monat

*               jahr (long)      : Jahr

* Rueckgabe:    n (int)         : Tagesnummer rel. zum Jahresanfang

*                               (1=1.1.,2=2.1.,...365/366=31.12)

* Beschreibung: Algorithmus von Robertson

* =========================================================================

*/

int tagesnummer(int tag, int monat, int jahr)

{

   int d, e;

   d = (monat+10)/13;

   e = tag + (611*(monat+2))/20 - 2*d - 91;

   return (e + schaltjahr (jahr) * d );

}



/**

=========================================================================

* Funktion:    wochentag_im_jahr(int jahr, int n)

* Parameter:    jahr (long)    : Jahr

*                n (int)       : Tagesnummer rel. zum Jahresanfang

*                              (1=1.1.,2=2.1.,...365/366=31.12)

* Rueckgabe:    (int) : Wochentag (0=So, 1=Mo,..., 6=Sa)

* Beschreibung: Algorithmus von Zeller

* =========================================================================

*/

int wochentag_im_jahr(int jahr, int n)

{

   int j, c;

   j = (jahr-1) % 100;

   c = (jahr-1) / 100;

   return (28+j+n+(j/4)+(c/4)+5*c) % 7;

}

} // end of class

public class Kalender  implements IKalender {

    private static boolean beenden=false;

    public static final String[] monatName={null,"Januar","Februar","Maerz","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"};

    public static final int [] monatsTageGesamt= {0,31,28,31,30,31,30,31,30,31,30,31};

    public static final  String [] wochenDeu =  {null,"Mo", "Di", "Mi", "Do", "Fr", "Sa", "So"};

    public static final  String [] wochenEng =  {"So", "Mo", "Di", "Mi", "Do", "Fr", "Sa"};







    @Override

    public String getMonatsblatt(int jahr, int monat) {

        String monatkoerper =" ";

        System.out.println(getKopfzeileMonatsblatt(jahr, monat) );

        if (monat == 2 && (new KalenderFunktion().istSchaltjahr(jahr))){

            monatsTageGesamt[monat] = 29;



        }

        int i= monatsTageGesamt[monat];

        int w=(new KalenderFunktion()).tagesnummer(i, monat, jahr);





        monatkoerper=Integer.toString(w);

        System.out.println(monatkoerper);

        return monatkoerper;

    }



    @Override

    public String getKopfzeileMonatsblatt(int jahr, int monat) {

        String kopfzeile = " ";

        String ersteZeile=" "; // Zeil für Monat und Jahr

        String zweiteZeile;//Zeile für die Wochentage, einmal Englisch und Deutsche Schreibweise

        String monatsName =monatName[monat];



        //ausgabe

        Ausgabe.ausgabeKopfzeile();

        do{

            //eingabe

            int auswahl=Eingabe.inKopfzeiele();

            //auswerten

            switch(auswahl){

            case 1://Deutsche Schreibweise

                ersteZeile =" "+"******************"+ monatsName + " "+ jahr + "*******************\n ";

                zweiteZeile=wochenDeu[1]+"\t"+wochenDeu[2]+"\t"+wochenDeu[3]+"\t"+wochenDeu[4]+"\t"+wochenDeu[5]+"\t"+wochenDeu[6]+"\t"+wochenDeu[7];

                kopfzeile =ersteZeile+zweiteZeile; //weisse alles den return sting zurueck

                System.out.println(kopfzeile);

                break;

            case 0://Englische Schreibweise

                ersteZeile =" "+"******************"+ monatsName +" "+ jahr+ "*******************\n ";

                zweiteZeile=wochenEng[0]+"\t"+wochenEng[1]+"\t"+wochenEng[2]+"\t"+wochenEng[3]+"\t"+wochenEng[4]+"\t"+wochenEng[5]+"\t"+wochenEng[6];

                kopfzeile =ersteZeile+zweiteZeile; //weisse alles den return sting zurueck

                System.out.println(kopfzeile);

                break;

            }

        }while(beenden==false);





        return kopfzeile;

    }



    @Override

    public void zeigeMonat(int jahr, int monat) {

        //hier Monatsblatt ausgeben

        //getKopfzeileMonatsblatt(jahr,monat);



        String tmp = getMonatsblatt(jahr,monat);

        System.out.println(tmp);

    }



    @Override

    public void zeigeJahr(int jahr) {

        //hier 12 Monatsblätter zeigen

        for(int i=1;i<=12;i++){

          

        }





    }



    @Override

    public int liesMonat() {

        int ret = -1;

        //ausgabe

        Ausgabe.ausgabeMonatsEingabe();

        //eingabe

        ret=Eingabe.liesMonat();

        return ret;

    }



    @Override

    public int liesJahr() {



        int ret = -1;

        //ausgabe

        Ausgabe.ausgabeJahrEingabe();

        //eingabe

        ret=Eingabe.liesJahr();

        return ret;

    }



    @Override

    public void auswahlMenue() {



        do{

            //ausgabe

            Ausgabe.ausgabeAuswahl();

            //eingabe

            int auswahl=Eingabe.eingabeAuswahl();



            //auswerten

            switch(auswahl){

            case 1://Das ganze Jahr

                int jahr = this.liesJahr();

                this.zeigeJahr(jahr);

                break;

            case 2://Monatsblatt

                jahr =this.liesJahr();

                int monat=this.liesMonat();

                this.zeigeMonat(jahr, monat);

                break;

            case 0://Programm ende

                beenden=true;

                break;

            }

        }while(beenden==false);

        System.out.println("Das Programm wird benndet");

    }

}//end of class

public interface IKalender {

    /**

    * Beschreibung: Erzeugt ein Monatsblatt des Jahreskalenders

    * und gibt das Monatsblatt in Stringform zurück.

    * Das Monatsblatt wird in einenm String mit Zeilenumbruechen abgelegt.

    * Das Monatsblatt enthält immer die Kopfzeile für den entsprechenden Monat.

    * Beispiel:

    *

    ******************* Mai 2017 ******************

    So    Mo    Di    Mi    Do    Fr    Sa

          01    02    03    04    05    06

    07    08    09    10    11    12    13

    14    15    16    17    18    19    20

    21    22    23    24    25    26    27

    28    29    30    31

    *

    * @param jahr - das Jahr zum Monat

    * @param monat - der Monat, das angezeigt werden soll

    * @return String - der zusammengebastelte String

    */

    public String getMonatsblatt(int jahr, int monat);

  

    /**

    * Methode, um die Kopfzeile eines Monatsblattes in Stringform zurückzugeben.

    * Dieses erfordert die Uebergabe des Monats und des Jahres als Integer

    * und liefert die Kopfzeile komplett als String zurueck.

    * @param jahr - das Jahr zum Monat

    * @param monat - der Monat, das angezeigt werden soll

    * @return liefert die Kopfzeile komplett als String zurueck

    *    Beisiel:

        ******************* Mai 2016 ******************

        So    Mo    Di    Mi    Do    Fr    Sa

    *        

    */

    public String getKopfzeileMonatsblatt(int jahr, int monat);

  

    /**

    * Methode zur Ausgabe eines Monatsblattes auf der Konsole

    *

    * @param jahr - das Jahr zum Monat

    * @param monat - der Monat, das angezeigt werden soll

    */

    public void zeigeMonat(int jahr, int monat);

  

    /**

    * Methode zur Ausgabe aller Monatsblaetter eines Jahres auf der Konsole

    * @param jahr - das Jahr, das angezeigt werden soll

    */

    public void zeigeJahr(int jahr);

  

    /**

    * Die Methode liest eine Monatszahl ein,

    * evaluiert diese Zahl auf den gültigen Bereich [1,..,12]

    * und gibt die eingelese und überrüfte Monatszahl zurück.

    * Wenn der Benutzer keine gültige Monatszahl eingibt, verbleibt

    * das Programm in der Einlese-Schleife.

    * @return int - der eingelesene Monat

    */

    public int liesMonat();



    /**

    * Die Methode liest eine Jahreszahl ein,

    * evaluiert diese Zahl auf den gültige Ziffern

    * und gibt die eingelese und überrüfte Jahreszahl zurück.

    * Wenn der Benutzer keine gültige Jahresangabe macht, verbleibt

    * das Programm in der Einlese-Schleife.

    * @return int - das eingelesene Jahr

    */

    public int liesJahr();



    /**

    * stellt das Auswahlmenue dar und liest die Benutzeruswahl ein

    * die Benutzerauswahl wird evaluiert auf Gültigkeit

    * Wenn der Benutzer keine gültige Engabe macht, verbleibt

    * das Programm in der Einlese-Schleife.

    */

    public void auswahlMenue();

}// end of interface


package io;
public class Ausgabe {



    public static void ausgabeAuswahl(){

        System.out.println();

        System.out.println("Auswahl:    [1] Kalender fuer das ganze Jahre");

        System.out.println("Auswahl:    [2] Ausgabe Monatsblatt");

        System.out.println("Auswahl:    [0] Ende des Programms");

    }



    public static void ausgabeKopfzeile() {

        System.out.println();

        System.out.println("Auswahl:    [1] Deutsche Schreibweise (Wochentage)");

        System.out.println("Auswahl:    [0] Amerikanische Schreibweise (Wochentage)");

  

    }



    public static String zeigeMonatsblatt(String kopfzeile, String monatkoerper){

  

        return monatkoerper;

      

      

    }



    public static void ausgabeJahrEingabe(){

        System.out.println("Bitte geben Sie eine Jahreszahl ein:");

    }



    public static void ausgabeMonatsEingabe(){

        System.out.println("Bitte geben Sie eine Monatszahl ein:");

    }

}

package io;



import java.util.Scanner;

public class Eingabe {

    private static Scanner scan = new Scanner(System.in);

    private static boolean ende= true;//gehen von Fehler aus





    /**

    * @return liefert den eingelesen Wert zurück

    */

    public static int eingabeAuswahl(){

        int retWert= -1;

        //        einlesen

        //        evaluiren auf gültigkeit

        //        solange bis Werte gültig  

        do{

            String tmp = scan.next();

            if(tmp.equals("1")||tmp.equals("2")||tmp.equals("0") ){

                //konvertieren

                retWert = Integer.parseInt(tmp);

                ende=false;

            }

            else{

                System.out.println("Bitte Menuepunkte auswaehlen:");

            }

        }while(ende == true);

        return retWert;



    }

    /**

    * Georgischen Kalender ab 1582

    * @return int- gibt die eingeben Jahres Zahl zurueck

    */

    public static int liesJahr() {



        int jahr= -1;



        //        einlesen

        //        evaluiren auf gültigkeit

        //        solange bis Werte gültig  

        do{

            try {

                String strJahr = scan.next();

                int tmpjahr = Integer.parseInt(strJahr);

                if (tmpjahr >= 1582) {

                    jahr = tmpjahr;

                } else{

                    System.out.println("Bitte geben Sie ein Jahr ab 1582 ein:");

                    ende=false;

                }

            } catch (NumberFormatException e) {

                System.out.println("Falsche Eingabe! Bitte geben Sie eine Zahl ein:");

            }

        }while(ende == true);



        return  jahr;



    }

    /*

    * @return int - eingelesener Monat

    */

    public static int liesMonat() {

        int monat = -1;



        do{

            try{

                //        einlesen

                //        evaluiren auf gültigkeit

                //        solange bis Werte gültig  

                String tmpMonat = scan.next();

                //konvertieren

                monat = Integer.parseInt(tmpMonat);

                if((1<=monat) && (monat<=12)){

                }

                else{

                    System.out.println("Bitte geben Sie ein Monat ein:");

                    ende=false;

                }

            }catch (NumberFormatException e){

                System.out.println("Falsche Eingabe! Bitte geben Sie eine Zahl ein:");

                ende=false;

            }

        }while(ende == true);



        return monat;

    }



    public static int inKopfzeiele() {

        int retWert= -1;

        //        einlesen

        //        evaluiren auf gültigkeit

        //        solange bis Werte gültig



        do{

            String tmpKopf = scan.next();

            if(tmpKopf.equals("1")||tmpKopf.equals("0")){

                //konvertieren

                retWert = Integer.parseInt(tmpKopf);

                ende=false;

            }else{

                System.out.println("Bitte Menuepunkte auswaehlen:");

            }

        }while(ende == true);



        return retWert;



    }



}
```
Hallo,
ich bin neu hier und muss im Rahmen meinen Studiums bis zum Sonntag ein Kalender erstellen. Aber ich komme nicht mehr weiter.
Ich hänge bei der Darstellung des Kalender.


Würde mich um schnell Hilfe freuen


----------



## VfL_Freak (4. Mai 2017)

Moin,

ich habe mich jetzt den Code jetzt nicht angetan ...



Ren hat gesagt.:


> Ich hänge bei der Darstellung des Kalender


Erklär' mal konkret, was Du damit meinst!

Gruß Klaus


----------



## Ren (4. Mai 2017)

Es hängt bei der Darstellung von den Monatsblatt:
 Die Kopfzeile mit den Wochentage soll zu ein String zusammen gebastelt werden und die Tag Ausgabe selber soll auch als String zurück geben wird. Bei mir wird nur die Kopfzeile ausgeben mehr auch nicht.
Dann soll alles in der Methode zeigeJahr() für das ganze Jahr ausgeben werden und halt zeigeMonat() nur für den eingeben Monat.

KalenderFunktion und IKalender sind vorlagen wie es sein soll und auch nutzen müssen. Und über Ein- und Ausgabe soll alles dann irgendwie zurückgeben werden.

Grüße Ren


----------



## Ren (4. Mai 2017)

VfL_Freak hat gesagt.:


> Moin,
> 
> ich habe mich jetzt den Code jetzt nicht angetan ...
> 
> ...



Ist es machtbar? Ich komme wirklich nicht weiter (siehe oben post)

grüße Ren


----------



## VfL_Freak (4. Mai 2017)

Moin,

machbar ist (fast) alles 

Also: wo genau hakt was??

Gruß Klaus


----------



## Ren (4. Mai 2017)

VfL_Freak hat gesagt.:


> Moin,
> 
> machbar ist (fast) alles
> 
> ...


******************* Mai 2017 ******************

    So    Mo    Di    Mi    Do    Fr    Sa

          01    02    03    04    05    06

    07    08    09    10    11    12    13

    14    15    16    17    18    19    20

    21    22    23    24    25    26    27

    28    29    30    31

Das es so ausgegeben wird. Die Kopfzeile habe ich schon, aber nicht die Tagesnummer für den Monat, habe schon viele Quellcodes ausprobiert, aber nirgendwo kam ein Ergebnis raus. Die Komplette Darstellung muss als String zurückgeben werden. Mit den Wechsel zwischen Deutschen Format und Amerikanisches Format.

Der Abschnitt von den Quellcode, davon ist noch mal hier runter.

```
@Override

 public static final String[] monatName={null,"Januar","Februar","Maerz","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"};

    public static final int [] monatsTageGesamt= {0,31,28,31,30,31,30,31,30,31,30,31};

    public static final String [] wochenDeu =  {"Mo", "Di", "Mi", "Do", "Fr", "Sa", "So"};

    public static final  String [] wochenEng =  {"So", "Mo", "Di", "Mi", "Do", "Fr", "Sa"};

    public String getMonatsblatt(int jahr, int monat) {

        String monatkoerper =" ";

        System.out.println(getKopfzeileMonatsblatt(jahr, monat) );

        if (monat == 2 && (new KalenderFunktion().istSchaltjahr(jahr))){

            monatsTageGesamt[monat] = 29;



        }

        int i= monatsTageGesamt[monat];

        int w=(new KalenderFunktion()).tagesnummer(i, monat, jahr);





        monatkoerper=Integer.toString(w);

        System.out.println(monatkoerper);

        return monatkoerper;

    }



    @Override

    public String getKopfzeileMonatsblatt(int jahr, int monat) {

        String kopfzeile = " ";

        String ersteZeile=" "; // Zeil für Monat und Jahr

        String zweiteZeile;//Zeile für die Wochentage, einmal Englisch und Deutsche Schreibweise

        String monatsName =monatName[monat];



        //ausgabe

        Ausgabe.ausgabeKopfzeile();

        do{

            //eingabe

            int auswahl=Eingabe.inKopfzeiele();

            //auswerten

            switch(auswahl){

            case 1://Deutsche Schreibweise

                ersteZeile =" "+"******************"+ monatsName + " "+ jahr + "*******************\n ";

                zweiteZeile=wochenDeu[1]+"\t"+wochenDeu[2]+"\t"+wochenDeu[3]+"\t"+wochenDeu[4]+"\t"+wochenDeu[5]+"\t"+wochenDeu[6]+"\t"+wochenDeu[7];

                kopfzeile =ersteZeile+zweiteZeile; //weisse alles den return sting zurueck

                System.out.println(kopfzeile);

                break;

            case 0://Englische Schreibweise

                ersteZeile =" "+"******************"+ monatsName +" "+ jahr+ "*******************\n ";

                zweiteZeile=wochenEng[0]+"\t"+wochenEng[1]+"\t"+wochenEng[2]+"\t"+wochenEng[3]+"\t"+wochenEng[4]+"\t"+wochenEng[5]+"\t"+wochenEng[6];

                kopfzeile =ersteZeile+zweiteZeile; //weisse alles den return sting zurueck

                System.out.println(kopfzeile);

                break;

            }

        }while(beenden==false);





        return kopfzeile;

    }



    @Override

    public void zeigeMonat(int jahr, int monat) {

        //hier Monatsblatt ausgeben

        //getKopfzeileMonatsblatt(jahr,monat);



        String tmp = getMonatsblatt(jahr,monat);

        System.out.println(tmp);

    }



    @Override

    public void zeigeJahr(int jahr) {

        //hier 12 Monatsblätter zeigen

        for(int i=1;i<=12;i++){

       

        }





    }
```


----------



## Ren (6. Mai 2017)

Habe jetzt die Darstellung muss es nur noch Formatieren


----------



## mrBrown (6. Mai 2017)

Und wo liegt das Problem?


----------



## Ren (6. Mai 2017)

mrBrown hat gesagt.:


> Und wo liegt das Problem?


Die Tage sind nicht unter den richtigen Wochentagen. 
Im Amerikanischen und Deutschen Format liegt das Problem vor.


----------



## Ren (20. Mai 2017)

Hey,
die Problem davor konnte ich noch nach der Abgabe lösen. Sitze nun an der Versetzung bin aktuelle soweit gekommen. Ich muss jetzt Feiertage in den Kalender einbauen und mit ein Stern vor den Tag und nach den Tag gezeichnet und nochmal so als Syso ausgeben. Dafür wurde die KalenderFunktionen erweitert.

*Mein Problem ist, ich weiß nicht wie ich die Feiertage im Kalender anzeigen soll bzw. das nur die Feiertage 2-Sternchen habe.Weiß aber nicht wie es umsetzte soll.
Des Weiten sollen wir ein Jahresplanes haben, wo man die Events mit angezeigt werden soll. Das heißt ich muss jede Zeile einzeln in eine Liste einlesen (so der Gedanke). Weiß aber nicht wie es umsetzte soll.
*
KalenderFunktionen.class (die Erweiterung)

```
/**
=========================================================================
* Funktion:    ostersonntag(int jahr)
* Parameter:    jahr (int)    : Jahr
* Rueckgabe:    (int)         : Tagesnummer des Ostersonntag rel. zum Jahresanfang
* Beschreibung: Algorithmus "Computus ecclesiasticus"
* 325 n.Chr. wurde Ostern auf den Sonntag nach
* dem ersten Fruehlingsvollmond festgelegt. Damit
* liegt Ostern zwischen dem 22. Maerz und dem 25. April.
* =========================================================================
*/
int ostersonntag(int jahr)
{
   int gz, jhd, ksj, korr, so, epakte, n;

   gz = (jahr%19)+1;
   jhd = jahr/100+1;
   ksj = (3*jhd)/4-12;
   korr = (8*jhd+5)/25-5;
   so = (5*jahr)/4-ksj-10;
   epakte = (11*gz+20+korr-ksj) % 30;
   if ( (epakte == 25 && gz > 11) || epakte == 24 )
      epakte++;
   n = 44-epakte;
   if ( n < 21 )
      n = n + 30;
   n = n + 7 - (so+n) % 7;
   n += schaltjahr(jahr);
   return n+59;
}
/**
=========================================================================
* Funktion:    julian_date (int jahr, int monat, int tag)
* Parameter:    tag (int)        : Tag
*                monat (int)     : Monat
*                jahr (int)        : Jahr
* Rueckgabe:    (long)             : Anzahl der Tage seit dem 1.1.4713 vor Christus
* Beschreibung: Das Julianische Datum  gibt die Anzahl der Tage
* seit dem 1.1.4713 vor Christus (astronomisches Datum) an.
* Algorithmus von R. G. Tantzen
* =========================================================================
*/
long julian_date(int tag, int monat, int jahr)
{
    long     c, y;

    if (monat>2)
        monat = monat - 3;
    else
    {
        monat = monat + 9;
        jahr--;
    }
    tag = tag + (153*monat+2) / 5;
    c = (146097L * (jahr / 100L))/4L;
    y = (1461L * (jahr % 100L))/4L;
    return c+y+tag+1721119L;
}


/**
=========================================================================
* Funktion:    kalenderDatumFuerJD( long jd )
* gibt zu einem Julian Date den gregorianisches Kalendertag zurück
*
* Der gregorianische Kalender gilt nur für jd >= 2299161 (entspicht dem Jahr 1582 greg./ Tag? Monat?)
* davor gilt der Julianische Kalender
*
* Parameter:    jd (long)        : Julianische Tag
* Rueckgabe:    (String)       : Tagesdatum im gregorianischen Kalender
*                             
* Beschreibung:  Algorithmus von Udo Heyl
* =========================================================================
*/
public String kalenderDatumFuerJD( long jd ){
      String datum = "";
     
      long omega = 0L;
      long A  = 0L;
     
      // Der gregorianische Kalender gilt nur für JD größer/gleich 2299161 (1582 greg.)
      // davor gilt der Julianische Kalender
      if( jd >= 2299161){
          omega = (long) Math.floor( (jd - 1867216.25)/(36524.25));
         // System.out.println("TEST: omega = " + omega);
     
          A =  jd + 1 + omega - (long)Math.floor(omega/4);
      }
      else {
          A = jd;
      }
     // System.out.println("TEST: A = " + A);
     
      long B = A + 1524L;
     // System.out.println("TEST: B = " + B);
     
      long C = (long)Math.floor((B - 122.1)/(365.25));
     // System.out.println("TEST: C = " + C);
     
      long D = (long) Math.floor(365.25 * C);
     // System.out.println("TEST: D = " + D);
     
      long E = (long) Math.floor((B - D)/30.6001);
     // System.out.println("TEST: E = " + E);
     
      double tag = (B - D - (long)Math.floor(30.6001 * E) + 0.5);
     // System.out.println("TEST: tag = " + tag);
     
      double monat = (((E + 10) % 12)+1);
     // System.out.println("TEST: monat = " + monat);
     
      double jahr = (C - 4715 - (long)Math.floor(0.85 + monat/20));
     // System.out.println("TEST: jahr = " + jahr);
     
//      System.out.print("Julian Date = " + jd);
//      System.out.println("  Gregorianisches Datum " + tag +" " + (int)monat +" " + (int)jahr );
      return datum;
}
```

Kalender.class

```
public HashMap<Integer, String> getEvent(int jahr){
        KalenderFunktionen kf = new KalenderFunktionen();
        int ostern = kf.ostersonntag(jahr);
        //long julianDate= kf.julian_date(tagesnummer, tageImMonat, jahr);
        String intervall="";
        String name="";
        int datum;

        //Rosenmonatag
        int rosenmontag=ostern-48;
        //Achermittwoch
        int achermittwoch= ostern-46;
        //Grünendonnerstag
        int gruendonnerstag = ostern-3;
        //Karfreitag
        int kafreitag = ostern - 2;
        //Ostermontag
        int ostermontag = ostern+1;
        //ChristiHimmelfahrt
        int christiHimmelfahrt = ostern+39;
        //Pfingstsonntag
        int pfingstsonntag = ostern+49;
        //Pfingstmontag
        int pfingstmontag = ostern+50;
        //Fronleichnam
        int fronleichnam = ostern+60;
        //Muttertag
        int muttertag = ostern+12;

        //Deklartion von HashMap für die Feiertage
        HashMap <Integer,String> feiertage = new HashMap<Integer,String>();
        feiertage.put(24, "Heiliger Abend");
        feiertage.put(25, "Weihnachten");
        feiertage.put(26, "Weihnachten");
        feiertage.put(31, "Sylvester");
        feiertage.put(1, "Neuejahr");
        feiertage.put(14, "Valentinstag");
        feiertage.put(03, "Tag der Deutscheneinheit");
        feiertage.put(01,"Tag der Arbeit");
        feiertage.put(rosenmontag, "Rostenmontag");
        feiertage.put(achermittwoch,"Achermittwoch");
        feiertage.put(gruendonnerstag, "Gruendonnerstag");
        feiertage.put(kafreitag, "Karfreitag");
        feiertage.put(ostern, "Ostermontag");
        feiertage.put(ostermontag, "Ostermontag");
        feiertage.put(christiHimmelfahrt, "Christi Himmelfahrt");
        feiertage.put(pfingstsonntag,"Pfingstsonntag");
        feiertage.put(pfingstmontag, "Pfingstmontag");
        feiertage.put(fronleichnam, "Fronleichnam");
        feiertage.put(muttertag, "Muttertag");


        if(muttertag == pfingstsonntag){
            muttertag-=7;
        }
        return feiertage;

    }
    @Override
    public String getMonatsblatt(int jahr, int monat) {
        KalenderFunktionen kf = new KalenderFunktionen();
        int tagesnummer = kf.tagesnummer(1, monat, jahr);
        int wochentag = kf.wochentag_im_jahr(jahr, tagesnummer);
        int tageImMonat = MONATTAGEGESAMT[monat-1];
        String monatkoerper =getKopfzeileMonatsblatt(jahr, monat);
        String stern="";
        int modus=-1;
        //Feiertage zuweisen und co.
        //HolidayManaager holiday = HolidayManaager.getInstance(HolidayCalender.Germany);
        if(anfangFeiertage){
            modus=1;
            stern+="*";
        }

        //Erstellung der tabellarischen Darstellung des Kalenders
        if(anfangMontag) {
            wochentag -= 1;
            if(wochentag < 0)
                wochentag += 7;
        }
        if(monat == 2) {
            tageImMonat += kf.schaltjahr(jahr);
        }

        for (int verschiebung = 0; verschiebung < wochentag; verschiebung++) {
            monatkoerper += "\t";       
        }
        for (int tagesZahl = 1; tagesZahl <= tageImMonat; tagesZahl++) {
            if(tagesZahl == getEvent(tagesZahl)){

            }
            String ausgabeTag = tagesZahl < 10 ? "0" + Integer.toString(tagesZahl) : Integer.toString(tagesZahl);
            int umbruch = tagesZahl + wochentag;
            String ausgabeUmbruch = umbruch % 7 == 0 ? System.lineSeparator() : "";
            monatkoerper += stern+ ausgabeTag+ stern + "\t"+ ausgabeUmbruch;
        }

        return monatkoerper;
    }
```

Ausgabe.class

```
public static void ausgabeMonatsEingabe(){
        System.out.println("Bitte geben Sie eine Monatszahl ein:");
    }
    public static void ausagabeFeiertageText(String monatname){
        System.out.println("Im"+" "+monatname+" "+"gibt es folgende (Feier-)tage:");
        System.out.println();
    }
    private void ausagabeEvent(int jahr) {
        System.out.println(new Kalender().getEvent(jahr));
    }
    public static void ausgabeJahresPlaner(){
        Jahresplaner plan = new Jahresplaner(2017); // Jahr
        String tmp = plan.gibJahresplan(1, 6); // von Jan bis Juni
        System.out.println(tmp);
    }
```
Jahresplaner.class

```
// WoTag|Tag| Event (oder leer) |Tagesnummer
public class Jahresplaner {

    private KalenderFunktionen kf = new KalenderFunktionen();
    private LinkedList <LinkedList<String>> planliste = new LinkedList <> ();
    private int jahr = 2017; // Default aktuelles Jahr
   
    public Jahresplaner(int jahr) {
 
    }

    /**
     * der angegebene Monat für den Jahresplan wird zusammengebaut in der Form
     * Mai 2017       
     * Mo|01|            |121
     * Di|02|            |122
     * Mi|03|            |123
     *        usw.
     * Di|30|            |150
     * Mi|31|            |151
     * Jede Zeile wird als String in einer LinkedList<String> abgespeichert
     * @param monat (int) - 1= jan bis 12= dez
     * @return LinkedList<String> der "Monatsplan" - Container mit allen Zeilen des Monats
     */
    public LinkedList<String> baueMonat( int monat){

        return null;

    }

    /**
     * Der Jahresplan für die angegebenen Monate wird als String zurück gegeben.
     * Hinweis zur Implementierung:
     * Die Monatspläne der angegebenen Monate werden in einer
     * Container-Klasse LinkedList <LinkedList<String>> der "Planliste" zusammengefasst.
     * Damit erhält man eine 2-dimensionale Datenstruktur.
     * Um den String zusammenzubauen, wird die Datenstruktur so durchlaufen, dass jeweils
     * die ersten Zeilen aller Monate nebeneinander ausgegeben werden.
     * Der zurückgegebene String sollte folgendes Format haben:
     * Januar 2017            Februar 2017            Maerz 2017           
     * So|01|            |1    Mi|01|            |32    Mi|01|            |60   
     * Mo|02|            |2    Do|02|            |33    Do|02|            |61   
     * Di|03|            |3    Fr|03|            |34    Fr|03|            |62   
     * Mi|04|            |4    Sa|04|            |35    Sa|04|            |63   
     * Do|05|            |5    So|05|            |36    So|05|            |64   
     * Fr|06|            |6    Mo|06|            |37    Mo|06|            |65   
     * usw.
     *
     * @param von (int) - 1= jan bis 12= dez
     * @param bis (int) - 1= jan bis 12= dez
     * @return String - der Jahresplan
     */
    public String gibJahresplan(int von, int bis) {
        Kalender cal = new Kalender();
        cal.zeigeMonat(1, 6);
        return null;
    }
}
```


----------



## Ren (30. Mai 2017)

Danke für die Hilfe hier. 

Habe jemanden gefunden, der mir bei meine Fragen hilft auf GitHub.
Der mir soweit geholfen hat, das ich nur noch die Ausgabe für den Event im Kalender richtig machen muss, weil die Ausgabe nicht stimmt. Die PrintKlasse für mehre txt. datei erstellen muss und den Jahresplaner noch hinbekommen muss.

mfg
Ren


----------



## Ren (8. Jun 2017)

Hallo,
folgendes Problem:
Ich muss Event eintragen in diesen Jahresplaner. Aber  es verrutscht alles,wenn sie drin sind. Also muss ich irgendwie auf bestimmte Zeichen kürzen. Habe aber keine Idee wie.

Die Werte sind in einer HashMap gespeichert.

jahresplaner.class

```
package kalender;


import java.util.Calendar;
import java.util.LinkedList;
import java.util.Set;

public class Jahresplaner {

    private KalenderFunktionen kf = new KalenderFunktionen();
    private LinkedList <LinkedList<String>> planliste = new LinkedList <> ();
    private int jahr = 2017; // Default aktuelles Jahr
    private static final String[] MONATNAME={null,"Januar","Februar","Maerz","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"};
    private static final int [] MONATTAGEGESAMT= {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    private static final  String [] WOCHEENG =  {"So", "Mo", "Di", "Mi", "Do", "Fr", "Sa"};
    private static boolean feiertage=false;//gehe  aus das keine Feiertage angezeigt werden
    public Jahresplaner(int jahr) {
        this.jahr=jahr;
    }

    public LinkedList<String> baueMonat( int monat){  
        LinkedList<String> blatt = new LinkedList<>();
        int x=0;
        int tag=1;
        int tagesnummer = kf.tagesnummer(tag, monat, jahr);
        int wochentage = kf.wochentag_im_jahr(jahr, tagesnummer);
        int tageImMonat = MONATTAGEGESAMT[monat-1];
        String monatName =MONATNAME[monat];
        blatt.add(monatName+"\t"+jahr+"\t\t\t\t");
        if(monat == 2) {
            tageImMonat += kf.schaltjahr(jahr);
        }

            Calendar ersterImMonat = Calendar.getInstance();
            ersterImMonat.set(jahr, monat-1, 1);
            int ersterTagesZahl = ersterImMonat.get(Calendar.DAY_OF_YEAR);

            Set<Integer> key = Event.getEvent(jahr).keySet();
//            if(feiertage==true) {
//                for(int frei =0; frei <wochentage; frei++){
//                    x++;
//                }
//                for (int tagesZahl = 1; tagesZahl <= tageImMonat; tagesZahl++){
//                    if(x==7){
//                        x-=7;
//                    }
//                if(key.contains(ersterTagesZahl + tagesZahl - 1)){
//                    String wochentag = tagesZahl < 10 ? "0" + Integer.toString(tagesZahl):Integer.toString(tagesZahl);
//                    String tage = tagesnummer <10 ? "0"+Integer.toString(tagesnummer):Integer.toString(tagesnummer);
//                    blatt.add(WOCHEENG[x]+"|"+wochentag+ "|"+"   "+"|"+tage+"\t");
//                    x++;
//                    tagesnummer++;
//                }
//            }
//        }
//        else{
            for(int frei =0; frei <wochentage; frei++){
                x++;
            }
            for (int tagesZahl = 1; tagesZahl <= tageImMonat; tagesZahl++){
                if(x==7){
                    x-=7;
                }
                if(key.contains(ersterTagesZahl + tagesZahl - 1)){
                String wochentag = tagesZahl < 10 ? "0" + Integer.toString(tagesZahl):Integer.toString(tagesZahl);
            String tage = tagesnummer <10 ? "0"+Integer.toString(tagesnummer):Integer.toString(tagesnummer);
            blatt.add(WOCHEENG[x]+"|"+wochentag+ "|"+Event.getName(tagesZahl, monat, jahr)+"\t"+"|"+tage+"\t");
            }
                else{
                    String wochentag = tagesZahl < 10 ? "0" + Integer.toString(tagesZahl):Integer.toString(tagesZahl);
                    String tage = tagesnummer <10 ? "0"+Integer.toString(tagesnummer):Integer.toString(tagesnummer);
                    blatt.add(WOCHEENG[x]+"|"+wochentag+ "|"+"\t\t\t\t"+"|"+tage+"\t");
                }
            x++;
            tagesnummer++;
        }  
//    }
    return blatt;
}

public String gibJahresplan(int von, int bis) {
    String plan = "";
  
    String monatString="";
    LinkedList<String> monatList = new LinkedList<String>();
    for(int j=von;j<=bis;j++){
        planliste.add(baueMonat(j));
    }
    for(int zeile=0;zeile < 32;zeile++) {
        for (int i = 0;i < planliste.size();i++) {
            monatList = planliste.get(i);
            try {
                monatString = monatList.get(zeile);
            } catch (IndexOutOfBoundsException e) {
                monatString = "            ";
            }
            if (monatString != null) { // manche Monate haben weniger Zeilen
                plan += monatString;
            }
        }
        plan += "\n";
    }
    return plan;
}
}
```

Event.class

```
package kalender;

import java.util.Calendar;
import java.util.HashMap;

import io.Ausgabe;

public class Event {
    private static int ostern;
    private static int rosenMontag;
    private static int achserMittwoch;
    private static int gruenDonnerstag;
    private static int fronleichnam;
    private static int christiHimmelfahrt;
    private static int karFreitag;
    private static int pfingstSonntag;
    private static int pfingstMontag;
    private static int osterMontag;
    private static int fastnacht;
    private static KalenderFunktionen kf = new KalenderFunktionen();
    private static HashMap <Integer, String> feiertag = new HashMap<Integer, String> ();

    public static int getOsterMontag(){
        osterMontag=ostern+1;
        return osterMontag;
    }
    public static int getRosenmontag(){
        rosenMontag=ostern-48;
        return rosenMontag;
    }
    public static int getAchermittwoch(){
        achserMittwoch=ostern-46;
        return achserMittwoch;
    }

    public static int getGruendonnerstag(){
        gruenDonnerstag = ostern-3;
        return gruenDonnerstag;
    }
    public static int getKarfreitag(){
        karFreitag = ostern - 2;  
        return karFreitag;
    }
    public static int getChristiHimmelfahrt(){
        christiHimmelfahrt = ostern+39;
        return christiHimmelfahrt;
    }
    public static int getPfingstSonntag(){
        pfingstSonntag = ostern+49;
        return pfingstSonntag;
    }
    public static int getPfingstMontag(){
        pfingstMontag = ostern+50;
        return pfingstMontag;
    }
    public static int getFronleichnam(){
        fronleichnam = ostern+60;
        return fronleichnam;
    }
    public static int getFastnacht(){
        fastnacht = rosenMontag+1;
        return fastnacht;
    }
    /**
     * @param jahr
     * @return HashMap <Integer,String>
     */
    public static HashMap<Integer, String> getEvent(int jahr) {
        Calendar cal= Calendar.getInstance();
        //Zuweiseung der beweglichen Feiertage/Festtage
        ostern= kf.ostersonntag(jahr);  
        rosenMontag=getRosenmontag();
        achserMittwoch=getAchermittwoch();
        gruenDonnerstag=getGruendonnerstag();
        fronleichnam=getFronleichnam();
        christiHimmelfahrt=getChristiHimmelfahrt();
        karFreitag=getKarfreitag();
        pfingstSonntag=getPfingstSonntag();
        pfingstMontag=getPfingstMontag();
        osterMontag=getOsterMontag();
        fastnacht=getFastnacht();

        //Zuweiseung der festen Feiertage/Festtage anhand der Tagesnummer
        int neujahr = kf.tagesnummer(1, 1, jahr);
        int koenig=kf.tagesnummer(6, 1, jahr);
        int valentin = kf.tagesnummer(14, 2, jahr);
        int mai = kf.tagesnummer(1, 5, jahr);
        int maria = kf.tagesnummer(15, 7, jahr);
        int einheit = kf.tagesnummer(3,10,jahr);
        int reform = kf.tagesnummer(31, 10, jahr);
        int heiligen =kf.tagesnummer(1, 11, jahr);
        int seelen =kf.tagesnummer(2, 11, jahr);
        int martin =kf.tagesnummer(2, 11, jahr);
        int nikolaus =kf.tagesnummer(6, 12, jahr);
        int abend =kf.tagesnummer(24, 12, jahr);
        int ersterWeihnacht =kf.tagesnummer(25, 12, jahr);
        int zweiterWeihnacht =kf.tagesnummer(26, 12, jahr);
        int sylvester =kf.tagesnummer(31, 12, jahr);
        int mutterTag = 0;
        if(cal.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY){
            mutterTag=1+7;
        }else{
            mutterTag=1+(8-mutterTag)+7;
        }
        if(mutterTag==pfingstSonntag){
            mutterTag=-7;
        }

        //Beginn mit den Advent und davon aussgehende Feiertage
        Calendar erstWeihnachtCal= Calendar.getInstance();
        int vierter;
        int weekday = erstWeihnachtCal.get(Calendar.DAY_OF_WEEK);
        if (weekday == Calendar.SUNDAY){
            vierter = ersterWeihnacht-7;
        }
        else{
            vierter = ersterWeihnacht-(weekday-Calendar.SUNDAY)+2;
        }
        int dritter = vierter-7;
        int zweiter = dritter-7;
        int erster = zweiter-7;
        int totensonntag = erster-7;
        int volkstrauertag =totensonntag-7;

        //HashMap
        feiertag.put(neujahr, "Neuejahr");
        feiertag.put(koenig, "Heilige drei Könige");
        feiertag.put(valentin, "Valentinstag");
        feiertag.put(mai, "Tag der Arbeit");
        feiertag.put(maria, "Maria Himmelfahrt");
        feiertag.put(einheit, "Tag der Einheit");
        feiertag.put(reform, "Reformationstag");
        feiertag.put(heiligen, "Allerseelen");
        feiertag.put(seelen, "Allerseelen");
        feiertag.put(martin, "Martinstag");
        feiertag.put(nikolaus, "Nikolaus");
        feiertag.put(abend, "Heiligabend");
        feiertag.put(ersterWeihnacht, "1.Weihnachtstag");
        feiertag.put(zweiterWeihnacht, "2.Weichnachtstag");
        feiertag.put(sylvester, "Sylvester");
        feiertag.put(achserMittwoch, "Achsermittwoch");
        feiertag.put(rosenMontag, "Rosenmontag");
        feiertag.put(fronleichnam,"Fronleichnam");
        feiertag.put(pfingstMontag, "Pfingstmontag");
        feiertag.put(pfingstSonntag, "Pfingstsonntag");
        feiertag.put(christiHimmelfahrt, "Himmelfahrt");
        feiertag.put(fastnacht, "Fastnacht");
        feiertag.put(gruenDonnerstag, "Gruendonnerstag");
        feiertag.put(osterMontag,"Osternmontag");
        feiertag.put(ostern, "Osternsonntag");
        feiertag.put(mutterTag,"Muttertag");
        feiertag.put(karFreitag, "Karfreitag");
        feiertag.put(vierter, "4.Advent");
        feiertag.put(dritter, "3.Advent");
        feiertag.put(zweiter, "2.Advent");
        feiertag.put(erster, "1.Advent");
        feiertag.put(totensonntag, "Totensonntag");
        feiertag.put(volkstrauertag, "Volkstrauertag");

        int datum = 0;
        String name = "";
        for(Integer key:feiertag.keySet()) {
            datum=key;
            name=feiertag.get(datum);
        }
        return feiertag;
    }

    /**
     * @param int tag
     * @return String name
     */
    public static String getName(int tag, int monat, int jahr) {
        int tgnr = kf.tagesnummer(tag, monat, jahr);
        int datum =0;
        String name = "";
            for(Integer key:feiertag.keySet()) {
                if(key == tgnr){
                    datum=key;
                    new Ausgabe().getTageAusgabe(datum);
                    name=feiertag.get(datum);          
        }

            }
        return name;

    }

}
```

Mit freundlichen Grüßen

Ren


----------

