# Jahreskalender



## devo22 (29. Jan 2012)

Hi,
beim letzten Beispiel des Semesters komme ich leider nicht weiter ... die Aufgabe ist, vom Benützer ein Jahr zu erfragen und für dieses Jahr einen Kalender in diesem Format auszugeben:

      January
Su Mo Tu We Th Fr Sa
 1  2  3  4  5  6  7      
 8  9 10 11 12 13 14   
15 16 17 18 19 20 21  
22 23 24 25 26 27 28  
29 30 31              26

und so weiter. Das habe ich bisher:


```
import java.util.Scanner;

public class PrintCal {

	private static int year;
	         
	private static String[] months = { "January", "February", "March", "April", "May", "June", "July",
									   "August", "September", "October", "November", "December" };
	     
	private static int[] totalDays = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
	
	public static int getYear()
	    {
	        Scanner sc = new Scanner(System.in);     
	        System.out.println("Enter a year: ");
	        int year = sc.nextInt();     
	        return year;
	    }

	public boolean isLeap ()
	    {
	        if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
	        {
	            totalDays[1] = 29;
				return true;
				}
			return false;
		}
	
	public static void printCalendar(int count)
	    {
			for (int i = 0; i < 12; i++) {
				count = i;
				System.out.println(months[count] + " " + year);
				System.out.println("-----------------------------");
				System.out.println(" Su Mo Tu We Th Fr Sa");
				}
		}
  }
```

Ich speichere mir also erst mal die Monatsnamen (für den Header bei der Ausgabe) und die dazugehörige Anzahl der Tage in Arrays ab. In isLeap() wird überprüft, ob es ein Schaltjahr ist.

Nun komme ich aber nicht weiter, weil ich bei zwei Sachen nicht weiß, wie ich sie umsetzen soll:

- den ersten Tag des jeweiligen Monats herausfinden, und
- den Kalender dann sauber zu drucken.

Kann mir da jemand helfen? Wäre für jeden Tipp dankbar!!!


----------



## timbeau (30. Jan 2012)

Ich nehme an du darfst keine Klassen wie Calendar (Java 2 Platform SE 5.0) nutzen?


----------



## devo22 (30. Jan 2012)

nein, es soll ohne Calendar gehen!


----------



## timbeau (30. Jan 2012)

Ich hab was gefunden im Netz, verstehe aber die verwendete Formel selber nicht auf Anhieb. Die Klasse (leicht verändert) gibt dir den ersten Tag des Jahres aus


```
public class Datum_wochentag {
	public static void main(String[] args) throws IOException {
		BufferedReader eingabe = new BufferedReader(new InputStreamReader(
				System.in));
		System.out.println("Jahr:");
		String joar = eingabe.readLine();
		int j = Integer.parseInt(joar);
		int t, m;

		t = 1;
		m = 1;
		j = 1998;

		int m2, j2 = j;

		/*
		 * Monat kleiner als Maerz?
		 */
		if (m <= 2) {
			m2 = m + 10; // Monat wird um 10 erhoeht
			j2 = j - 1; // Jahr um 1 reduziert - also im Datum 2 Monate nach hinten verschoben
		} else
			m2 = m - 2; // Monat wird um 2 reduziert - warum?

		int c = j2 / 100; // die ersten beiden ziffern des Jahres (19)76
		int y = j2 % 100; // die letzten beiden ziffern des Jahres 19(76)

		int tmp1 = (26 * m2 - 2);
		int tmp2 = (tmp1 / 10) + t + y + y / 4;
		int tmp3 = tmp2 + c / 4;

		int h = (tmp3 - 2 * c) % 7;

		if (h < 0)
			h = h + 7;

		if (h == 0)
			System.out.println("Sonntag, " + t + "." + m + "." + j);
		if (h == 1)
			System.out.println("Montag, " + t + "." + m + "." + j);
		if (h == 2)
			System.out.println("Dienstag, " + t + "." + m + "." + j);
		if (h == 3)
			System.out.println("Mittwoch, " + t + "." + m + "." + j);
		if (h == 4)
			System.out.println("Donnerstag, " + t + "." + m + "." + j);
		if (h == 5)
			System.out.println("Freitag, " + t + "." + m + "." + j);
		if (h == 6)
			System.out.println("Samstag, " + t + "." + m + "." + j);

		System.out.println("ENDE");
	}
}
```

Dann solltest du dir eine Methode schreiben, die je nach Starttag und Anzahl Tage so eine Ausgabe praktiziert. Das geht mit nem 2-dim Array z.B.


----------



## chalkbag (30. Jan 2012)

Zwei Fehler waren noch drinnen.

Anweisung j = 1998 muss raus, und j2 muss gleich 1976 sein


```
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Datum_wochentag {
    public static void main(String[] args) throws IOException {
        BufferedReader eingabe = new BufferedReader(new InputStreamReader(
                System.in));
        System.out.println("Jahr:");
        String joar = eingabe.readLine();
        int j = Integer.parseInt(joar);
        int t, m;
 
        t = 1;
        m = 1;
        
 
        int m2, j2 = 1976;
 
        /*
         * Monat kleiner als Maerz?
         */
        if (m <= 2) {
            m2 = m + 10; // Monat wird um 10 erhoeht
            j2 = j - 1; // Jahr um 1 reduziert - also im Datum 2 Monate nach hinten verschoben
        } else
            m2 = m - 2; // Monat wird um 2 reduziert - warum?
 
        int c = j2 / 100; // die ersten beiden ziffern des Jahres (19)76
        int y = j2 % 100; // die letzten beiden ziffern des Jahres 19(76)
 
        int tmp1 = (26 * m2 - 2);
        int tmp2 = (tmp1 / 10) + t + y + y / 4;
        int tmp3 = tmp2 + c / 4;
 
        int h = (tmp3 - 2 * c) % 7;
 
        if (h < 0)
            h = h + 7;
 
        if (h == 0)
            System.out.println("Sonntag, " + t + "." + m + "." + j);
        if (h == 1)
            System.out.println("Montag, " + t + "." + m + "." + j);
        if (h == 2)
            System.out.println("Dienstag, " + t + "." + m + "." + j);
        if (h == 3)
            System.out.println("Mittwoch, " + t + "." + m + "." + j);
        if (h == 4)
            System.out.println("Donnerstag, " + t + "." + m + "." + j);
        if (h == 5)
            System.out.println("Freitag, " + t + "." + m + "." + j);
        if (h == 6)
            System.out.println("Samstag, " + t + "." + m + "." + j);
 
        System.out.println("ENDE");
    }
}
```


----------



## timbeau (30. Jan 2012)

j = 1998 muss raus, warum sollte j2 = 1976 sein?

edith: 1976 war nur als Beispiel in den Kommentaren


----------

