# Einfacher Kalender



## Tyrael1985 (6. Jan 2010)

Ich möchte einen einfachen kalender erstellen der für das jahr 2010 alle tage und die dazugehörigen wochen,monate ausgibt.

wie gesagt es soll sich um einen einfachen kalender handeln,dies soll also über die ausgabe soll also über die konsole geschehen,

es handelt sich desweiteren um ein programm für einen "anfänger" also sollte die ermittlung der tage bzw monate über schleifen passieren.

ein beispiel wie es aussehen könnte wäre:

Januar 2010
1| | | | |1|2|3|
2|4|5|6|7|8|9|10|
3|11|12|13....

Die erste zahl in jeder zeile soll dann für die entsprechende kalenderwoche stehen.

Das Programm sollte dann noch eine 2.Funktion besitzen welche den Benutzer auswählen lässt welchen Monat er ausgeben möchte.

Wenn sich jemand mit einer solchen Problematik auskennt und mir bei diesem Problem weiterhelfen könnte wär ich sehr dankbar!

MfG


----------



## faetzminator (6. Jan 2010)

Da kannst du ganz einfach die Funktionalitäten von GregorianCalendar (Java Platform SE 6) verwenden. Er kann dir alle nötigen Informationen (Anzahl Tage im Monat, Wochentage, Wochennummern etc.) bereitstellen.


----------



## Tyrael1985 (6. Jan 2010)

Danke für die fixxe antwort,aber ziel der aufgabe war es nicht die funktion die in java bereits implementiert ist zu verwenden,sondern wie bereits gesagt es handelt sich um ein Programm für "anfänger".

Es sollte also der festigung der fähigkeiten dienen und eben diesen kalender mithilfe von schleifen und anderweitigen grundlagen funktionen erstellen.

MfG Tyrael


----------



## Tyrael1985 (6. Jan 2010)

Ich weiß das diese variante nicht die einfachste und schnellste methode ist und es über die bereits vorhandene funktion des GregorianCalendar
schneller und einfacher zu erstellen ginge,

aber dann wär der übungseffekt ja nichtmehr gegeben :=)

MfG Tyrael


----------



## faetzminator (6. Jan 2010)

Natürlich brauchst du auch so diese Schleifen ebenfalls. Aber willst du wirklich von Hand alle Schaltjahre, "Schaltjahrsausnahmen", Wochennummerberechnungen etc. von Hand implementieren? Keine Angst, du wirst nur schon für die Ausgabe eines Solchen Kalenders genug zu grübeln haben


----------



## Tyrael1985 (6. Jan 2010)

Nein nein es soll sich ja nicht um beliebiges Jahr handeln, sondern der Kalender soll schon aktualität besitzen, sprich also für das Jahr2010 gelten.

Und wir gehen eben davon aus das nur der wissensstand von einfachen IF/while/do-bedingungen/schleifen vorrausgesetzt ist.

Und die dazugehörigen mathematischen kenntnisse, zb das nach allen 7tagen ein zeilenumbruch geschehen muss, oder
wenn der monat sein maximum an tagen erreicht hat das programm einen neuen monat beginnen soll.

wir gehen also davon aus das keine kenntnisse über die monate vorhanden sind bis auf die anzahl ihrer tage und den anfangstag des jahres 2010,nämlich einem samstag.

restlichen informationen sollen berechnet werden und nicht nur iwo ausgelesen werden,genau das ist ja das problem vor dem ich sitze :=)

 MfG Tyrael


----------



## Wladimir (6. Jan 2010)

Also einen einfachen Kalender gibt es nicht. Es gibt nur "den" Kalender 

Um den Gregorianischen Kalender zu Berechnung musst folgendes Wissen:
1) Anzahl der Tage jedes Monats (musst du für jedes Monat speichern)
2) Schaltjahre (alle 4, alle 100 nicht, alle 400 doch (zb: Jahr 2000))
3) Wochentage Wochentagsberechnung ? Wikipedia

Das müßte eigentlich schon genügen


----------



## faetzminator (6. Jan 2010)

Wladimir hat gesagt.:


> 1) Anzahl der Tage jedes Monats (musst du für jedes Monat speichern)
> 2) Schaltjahre (alle 4, alle 100 nicht, alle 400 doch (zb: Jahr 2000))
> 3) Wochentage Wochentagsberechnung ? Wikipedia



Und eben genau diese Berechnungen nimmt dir der GregorianCalendar ab. Aber natürlich kannst du dir die Berechnungen auch von Hand programmieren, kommt schlussendlich auf das gleiche raus.
Am Einfachsten machst du es in zwei Schritten: Du erstellt ein Datenkonstrukt, aus welchem du alle benötigten Informationen auslesen kannst. Mit diesem gibst du die Daten auf der Konsole aus. Zuerst musst du diese natürlich abfüllen. Um die Funktionalität der Ausgabe zu testen, kannst du anfänglich den GregorianCalendar verwenden. Danach kannst du eigene Berechnungen schreiben, und diese mit den Ausgaben auf Grund des Outputs von GregorianCalendar vergleichen. Klingt das nach einer Idee  ?


----------



## Tyrael1985 (6. Jan 2010)

ja gut das mit dem wissen der tage der monate hab ich ja vorrasugesetzt und schaltjahrproblematik ist uninteressant da dieser kalender lediglich für das jahr 2010 gelten soll.

hat denn jmd vllt ein beispielprogramm zur hand in der nicht die funktion des Class GregorianCalendar verwendet wird,sondern die mit hilfe von schlöeifen und bedingungen die tage der einzelne monate berechnet und dies für das ganze jahr 2010 und dazu noch die jeweiligen kalenderwochen an den anfang jeder zeile stellt?!

denn wie gesagt die verwendung der bereits vorhanden funktion des Class GregorianCalendar würde zu weit führen :=)

MfG Tyrael


----------



## faetzminator (6. Jan 2010)

Du willst nicht den GregorianCalendar verwenden, aber suchst nun nach einem lauffähigen Code, welcher die Berechnungen bereits erledigt  ? Ist das durch Zufall eine Schul- oder Uniaufgabe?


----------



## Tyrael1985 (6. Jan 2010)

ja diese aufgabe soll nach meinen informationen einmal in der Uni drannkommen,

noch besuche ich das Gymnasium und bald sind ja Prüfungen danach soll es zur uni gehen und ich würd gern schon darauf vorbereitet sein und hab mir deswegen schon ein paar aufgaben besorgt aber bei dieser aufgabe verzweifel ich drann :=(!

da dacht ich mir wo könnt ich besser hilfe bekommen als in diesem forum :=)

und die kompetenz die hier an den tag gelegt wird ist auch bisher echt super :=)!

also ich wär euch sehr verbunden wenn ihr vllt mir dabei helfen könntet ohne den gregorianclaender zu verwenden!

ich weiß zwar auch das es so einfacher wäre aber wenn es in der uni nachher anders verlangt wird bringt es mir ja nichts wenn ich es darüber mache und dann nicht bestehe weil es in der aufgabe anders gefordert war :=)

MfG Tyrael


----------



## faetzminator (6. Jan 2010)

Wie bereits gesagt, kümmere dich doch erst mal um die Datensammlung per GregorianCalendar, die Datenhaltung dieser und schlussendlich die Ausgabe. Wenn du dann den GregorianCalendar gerne durch eigene Methoden ersetzt und das Programm ansonsten lauffähig ist, helfen wir gerne. Ich kann momentan keine konkrete Frage sehen, also kann ich auch keine konkrete Antwort geben. Und ich bin nicht nicht gewillt, dir zwei, drei Zeilen zu Coden, aber da wird dann der Lerneffekt wohl nicht so gross sein. Wenn du Probleme mit den Formeln / Berechnungen hast, kannst du z.B. Wladimir's Link zur Wiki folgen. Danach kannst du uns erzählen, was du bereits versucht hast bzw. wo du scheiterst und schlussendlich konkrete Fragen stellen.


----------



## Tyrael1985 (6. Jan 2010)

Ja also gehen wir davon aus ich hab die information gegebn das das jahr 2010 mit einem freitag beginnt und weiß ansonsten nur die monatstage, dann würd ich mir diese anzahl der einzelnen tage speichern,und dann anfangen einen zähler zu basteln der jedesmal nach 7tagen einen zeilenumbruch macht sodass eine neue woche beginnt

und wenn die monatstage zuende sind soll er einen neuen monat beginnen,ist mir auch soweit klar,nur das problem was dann kommt ist wie bekomme ich zb die leeren tage gesetzt,sprich wenn der monat januar zb mit einem freitag aufhört und der februar mit einem samstag beginnt,dann müssten ja die tage von montag bis freitag leer sein in dem monat februar und da weiß ich nicht wie ich das umsetzen soll?!

desweiteren weiß ich auch noch nicht so ganz wie ich den 2.zähler dazu bringe jedesmal die aktuelle kalenderwoche an den anfang der zeile zu schreiben?
wenn ich dies umgesetzt bekommen würde was denk ich noch machbar wäre mit der kalenderwoche dann steh ich vor einem weiteren problem wo ich nicht weiß wie ich das lösen könnte und zwar wenn wir wieder das problem haben das er monat mit einem freitag zb aufhört ist dies ja noch eine unabgeschlossene kalenderwoche,sodass der neue monat ja diese kalenderwoche noch weiterführt?

zb hört der januar dann freitag in der kalenderwoche 4 auf und der februar besitzt ja dann noch als kalender woche die 4.kalenderwoche bis zum sonntag und geht dann erst in die 5.kalenderwoche,wie kann ich das umsetzen?!

denn wenn ich einen zähler einbauen würde der einfach nur jeden zeile eine zahl höher setzt dann würd es dazu führen das nicht im februar mit der 4.kalenderwoche die letzten 2tage bezeichnet werden sondern mit der 5.kalenderwoche und dies würde ja zu einem falschen ergebnis führen!

MfG Tyrael


----------



## faetzminator (6. Jan 2010)

Ich hab hier mal was schnell zusammengehackt. Code ist nicht gerade optimal, aber funktioniert.

```
public static void main(String[] args) {
    int year = 2010;
    int month = 1;

    int weekDayOfFirst = 4;
    int weekNumberOfFirst = 5;
    int numberOfDays = 31;

    int columns = (numberOfDays + weekDayOfFirst - 1) / 7 + 1;
    int position = weekDayOfFirst;
    int day;

    System.out.format("       %02d.%04d\n\n", month, year); // gibt den header aus

    for (int i = 0; i < weekDayOfFirst; i++) {
        System.out.print("   "); // gibt die führenden leerzeichen der ersten woche aus
    }
    for (int i = 0; i < columns; i++) {
        do {
            day = (++position) - weekDayOfFirst;
            System.out.format("%2d ", day); // gibt einen tag aus
        } while (position % 7 != 0 && day < numberOfDays);
        System.out.format(" %2d\n", weekNumberOfFirst++); // gibt noch die wochennummer aus
    }
}
```
[c]year[/c] = das auszugebende Jahr, [c]month[/c] = der auszugebende Monat
[c]weekDayOfFirst[/c] = Wochentag des 1. (hier Montag = 0 ... Sonntag = 6)
[c]weekNumberOfFirst[/c] = Wochennummer der Woche, in welcher sich der 1. befindet
[c]numberOfDays[/c] = Anzahl Tage des Monats

Die letzten drei Werte, welche ich hier beschreibe, musst du natürlich berechnen


----------



## Wladimir (6. Jan 2010)

Du solltest ein Programm in 2 teile Teilen

1) Zuerst Daten generieren, z.B.: in ein Array, alle Tage und Wochtage des Monats 
2) Daten auf der Console anzeigen

Du machst dir eine methode showMonth (int month, int[] daysOfMonth)

Dann gehst du mit dem Cursor von der erste Woche von Montag weg jede Position durch.
Und solange der Tag den du anzeigst nicht der erste Tag des Monats ist so zeigt du Ihn leer.

(In einem GUI Kalender würden an den leeren Stellen vielleicht die Tage des Vormonats in Grau stehn)


----------



## Tyrael1985 (6. Jan 2010)

das ist ja umwerfend genau so sollte es aussehen :=)

aber eine kleine frage hab ich noch^^

könnte man die zeilen:

System.out.format("%2d ", day); // gibt einen tag aus

        System.out.format(" %2d\n", weekNumberOfFirst++);

auch durch ein system.out.print ersetzen und wenn ja wie würd das denn aussehen,denn ich hab es getestet und dann passt die formatierung der tage nichtmehr überein weil ab dem 10.tag eine verschiebung stattfindet^^

und noch eine frage welchen zweck hat  "%2d "  ?


----------



## Schumi (6. Jan 2010)

%2d sorgt wohl genau dafür, dass alles ein 2-Stelliges Format hat und so Deine einstelligen Tage die gleiche Länge haben wie die zweistelligen.


----------



## Tyrael1985 (6. Jan 2010)

Ah okay danke das würd auch erklären wieso meine system.out.print variante diesen formatierungsfehler aufwies,denn dort hab ich es einfach nur durch ein "    " versucht die leerstellen zu simulieren!


----------

