# Tage Zählen/Ausgeben - Alle Freitage der 13.



## derBollinator (14. Jan 2016)

Hallo, dies ist mein erster Beitrag im Java Forum. Freue mich hier zu sein und noch einiges zu lernen 
Ich habe eine Aufgabe zu bearbeiten, die lautet:


Welche Freitage im 20. Jahrhundert (also zwischen 1.1.1901 und 31.12.2000) fielen auf einen 13ten ? Schreiben Sie ein Programm, das alle "Freitag der 13te" im angegeben Zeitraum im Format 1900-1-1 (Jahr-Monat-Tag) auf der Konsole ausgibt (eine Ausgabe pro Zeile)!

>> Hierzu zu wissen: "dlp.writeLine()" ist eine Funktion, die in meinem compiler im Ausgabefenster eine Zeile mit dem in den Klammern definierten Inhalt schreibt.

Zusatzinformationen:

der 1.1.1900 ist ein Schaltjahr und war ein Montag

April, Juni, September und November haben 30 Tage
Januar, März, Mai, Juli, August, Oktober und Dezember haben 31 Tage
der Februar hat in normalen Jahren 28 Tage und in Schaltjahren 29 Tage
Schaltjahre sind alle durch 4 teilbaren Jahre - außer das Jahr ist auch durch 100, aber nicht durch 400 teilbar_ *>> ???Kapier ich nicht???*_

*Mein Problem:*
Ich bekomme eine Ausgabe, allerdings nicht das Richtige Ergebnis.

*Vorgehensweise:*
In meinem Code bin ich zuerst jedes Jahr und alle Monate durchgegangen und habe dann gefragt, ob es ein Schaltjahr ist oder nicht.
Jetzt frage ich welcher Monat es ist, damit ich weiß wie viele Tage ich zählen muss.
Dann gehe ich jeden Tag durch und Frage jedes mal, ob der momentane Tag ein Freitag der 13. ist.
Der Name des Tages wird mit der Variable "Tagname" definiert, welche von 1 bis 7 geht
(Also 1=Montag, 7=Sonntag), die dann wieder bei 1 anfängt, sobald 7 überschritten ist.
Habe alles entsprechend im Code Kommentiert.

*Frage:*
Wer findet den Fehler?
Habe ihr eine andere / bessere Lösung? - Ich finde meine nicht optimal, das muss doch einfacher gehen?


```
var tag;
var monat;
var jahr;
var Tagname = 1;  //Tagname=1 ist Montag, Tagname=7 ist Sonntag

for (jahr=1900; jahr<=2000; jahr++) {

   for (monat=1; monat<=12; monat++) {

     //Schaltjahr JA

     if (jahr%4===0) {

       //Monat hat 31 Tage
       if (monat==1||monat==3||monat==5||monat==7||monat==8||monat==10||monat==12) {
         for (tag=1; tag<=31; tag++) {
       
           //Check Freitag, 13.
           if (Tagname==5 && tag==13) {
             dlp.writeLine(jahr + "-" +monat+ "-" +tag);
           }
           Tagname++;
           if (Tagname==8) {Tagname=1;}

         }
       }

       //Monat hat 30 Tage
       if (monat==4 || monat==6 || monat==9 || monat==11) {
         for (tag=1; tag<=30; tag++) {
        
           //Check Freitag, 13.
           if (Tagname==5 && tag==13) {
             dlp.writeLine(jahr + "-" +monat+ "-" +tag);
           }
           Tagname++;
           if (Tagname==8) {Tagname=1;}
         }
       }

       //Monat ist Februar mit 29Tagen
       if (monat==2) {
         for (tag=1; tag<=29; tag++) {
        
           //Check Freitag, 13.
           if (Tagname==5 && tag==13) {
             dlp.writeLine(jahr + "-" +monat+ "-" +tag);
           }
           Tagname++;
           if (Tagname==8) {Tagname=1;}
         }
       }
     }

     // Schaltjahr NEIN

     else {

       //Monat hat 31 Tage
       if (monat==1||monat==3||monat==5||monat==7||monat==8||monat==10||monat==12) {
         for (tag=1; tag<=31; tag++) {
       
           //Check Freitag, 13.
           if (Tagname==5 && tag==13) {
             dlp.writeLine(jahr + "-" +monat+ "-" +tag);
           }
           Tagname++;
           if (Tagname==8) {Tagname=1;}
         }
       }

       //Monat hat 30 Tage
       if (monat==4 || monat==6 || monat==9 || monat==11) {
         for (tag=1; tag<=30; tag++) {
        
          //Check Freitag, 13.
           if (Tagname==5 && tag==13) {
             dlp.writeLine(jahr + "-" +monat+ "-" +tag);
           }
           Tagname++;
           if (Tagname==8) {Tagname=1;}
         }
       }

       //Monat ist Februar mit 28Tagen
       if (monat==2) {
         for (tag=1; tag<=28; tag++) {
       
           //Check Freitag, 13.
           if (Tagname==5 && tag==13) {
             dlp.writeLine(jahr + "-" +monat+ "-" +tag);
           }
           Tagname++;
           if (Tagname==8) {Tagname=1;}
         }
       }
     }
   }
}






AUSGABE
------------------------------------------------------------------------------
1900-13-9
1900-13-12
1901-13-6
1902-13-2
1902-13-3
1902-13-11
1903-13-8
1904-13-10
1905-13-4
1905-13-7
1906-13-9
1906-13-12
1907-13-6
1908-13-2
1908-13-8
1909-13-5
1910-13-1
1910-13-10
1911-13-4
1911-13-7
1912-13-6
1913-13-2
1913-13-3
1913-13-11
1914-13-8
1915-13-5
1916-13-1
1916-13-4
1916-13-7
1917-13-9
1917-13-12
1918-13-6
1919-13-2
1919-13-3
1919-13-11
1920-13-5
1921-13-1
1921-13-10
1922-13-4
1922-13-7
1923-13-9
1923-13-12
1924-13-3
1924-13-11
1925-13-8
1926-13-5
1927-13-1
1927-13-10
1928-13-9
1928-13-12
1929-13-6
1930-13-2
1930-13-3
1930-13-11
1931-13-8
1932-13-10
1933-13-4
1933-13-7
1934-13-9
1934-13-12
1935-13-6
1936-13-2
1936-13-8
1937-13-5
1938-13-1
1938-13-10
1939-13-4
1939-13-7
1940-13-6
1941-13-2
1941-13-3
1941-13-11
1942-13-8
1943-13-5
1944-13-1
1944-13-4
1944-13-7
1945-13-9
1945-13-12
1946-13-6
1947-13-2
1947-13-3
1947-13-11
1948-13-5
1949-13-1
1949-13-10
1950-13-4
1950-13-7
1951-13-9
1951-13-12
1952-13-3
1952-13-11
1953-13-8
1954-13-5
1955-13-1
1955-13-10
1956-13-9
1956-13-12
1957-13-6
1958-13-2
1958-13-3
1958-13-11
1959-13-8
1960-13-10
1961-13-4
1961-13-7
1962-13-9
1962-13-12
1963-13-6
1964-13-2
1964-13-8
1965-13-5
1966-13-1
1966-13-10
1967-13-4
1967-13-7
1968-13-6
1969-13-2
1969-13-3
1969-13-11
1970-13-8
1971-13-5
1972-13-1
1972-13-4
1972-13-7
1973-13-9
1973-13-12
1974-13-6
1975-13-2
1975-13-3
1975-13-11
1976-13-5
1977-13-1
1977-13-10
1978-13-4
1978-13-7
1979-13-9
1979-13-12
1980-13-3
1980-13-11
1981-13-8
1982-13-5
1983-13-1
1983-13-10
1984-13-9
1984-13-12
1985-13-6
1986-13-2
1986-13-3
1986-13-11
1987-13-8
1988-13-10
1989-13-4
1989-13-7
1990-13-9
1990-13-12
1991-13-6
1992-13-2
1992-13-8
1993-13-5
1994-13-1
1994-13-10
1995-13-4
1995-13-7
1996-13-6
1997-13-2
1997-13-3
1997-13-11
1998-13-8
1999-13-5
2000-13-1
2000-13-4
2000-13-7
```


Ich freue mich auf alle Antworten und Miträtselnden Teilnehmer


----------



## kneitzel (15. Jan 2016)

Also ich würde Dir raten, Deinen Code etwas besser zu strukturieren und Codeteile in Funktionen auszulagern. Desweiteren verstehe ich nicht wirklich Deinen Code. Die If-Abfrage nach Schaltjahr würde ich nicht aussen haben sondern nur beim  Monat Februar, denn nur dort ist dies relevant. Und ich sehe viel doppelten code - Wäre es nicht einfacher, wenn man nur eine Schleife hätte und die obere Grenze wäre eine Variable, die man einmal ermittelt hätte?

Und was verstehst Du nicht an der Logik vom Schaltjahr? Ein Schaltjahr ist, wenn das Jahr durch 4 teilbar ist und es nicht durch 100 teilbar ist, es sei denn, es ist durch 400 teilbar.

2000 z.B. ist ein Schaltjahr. Es ist durch 4 teilbar. Da es auch durch 100 teilbar ist, wäre es u.U. kein Schaltjahr, aber da es auch durch 400 teilbar ist, ist es doch wieder ein Schaltjahr. Ist doch eigentlich eine einfache Sache und wie man vorgehen kann sieht man ja jetzt an den Kontrollen, die ich gemacht habe...
Die kann man jetzt in eine einfache Funktion boolean istSchaltjahr(int jahr) packen. Ud schau doch einfach einmal, was Du sonst so an Dingen in eine Funktion packen kannst - so die alle ordentlich benannt sind und Du die Variablen gut benannt hast, wirst Du dann bestimmt einen gut lesbaren Code bekommen, bei dem dann auch Fehler leicht zu finden sein könnten. Und wenn es nicht klappen sollte, dann kannst Du die Funktionen auch erst einmal einzeln testen um zu sehen, ob die wirklich funktionieren. So könntest Du z.,B. gezielt einige Schaltjahre ausrechnen und sicher stellen, dass das Ergebnis von istSchaltjahr korrekt ist. (z.B. einfach ausgeben auf der Konsole und Du schaust dann, ob alles wie erwartet ist!)

Konrad


----------



## Joose (15. Jan 2016)

Eine frage zu deinem Code:



derBollinator hat gesagt.:


> ```
> var tag;
> var monat;
> var jahr;
> ...



Welche Sprache verwendest du denn? Java oder JavaScript?


----------



## Dukel (15. Jan 2016)

Du fängst bei 1900 an, sollst aber bei 1901 (auszugeben, nicht zu zählen) anfangen.


----------



## derBollinator (15. Jan 2016)

Joose hat gesagt.:


> Eine frage zu deinem Code:
> 
> Welche Sprache verwendest du denn? Java oder JavaScript?



Ich verwende JavaScript.


----------



## derBollinator (15. Jan 2016)

Dukel hat gesagt.:


> Du fängst bei 1900 an, sollst aber bei 1901 (auszugeben, nicht zu zählen) anfangen.



Stimmt, das habe ich übersehen. Die Lösung wird dadurch aber leider nicht richtig.


----------



## derBollinator (15. Jan 2016)

Konrad, danke für deine Tipps. Werde etwas umstrukturieren und meine Fehlversuche strukturiert angehen.


----------



## DrZoidberg (16. Jan 2016)

Hier mal eine kürzere Fassung. Ich gehe nicht alle Tage durch, sondern nur den 13. jeden Monats. Ich addiere also in jedem Schleifendurchlauf einen Monat dazu.

```
var monat, jahr, tagname = 6, //0 = montag, 6 = sonntag, der 13.01.1901 war ein sonntag
    monatsLaenge = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];

for(jahr = 1901; jahr <= 2000; jahr++) {
  for(monat = 1; monat <= 12; monat++) {
    if(tagname == 4) dlp.writeLine(jahr + "-" + monat + "-13");
    tagname = tagname + monatsLaenge[monat-1];
    if(monat == 2 && jahr%4 == 0 && (jahr%100 != 0 || jahr%400 == 0)) tagname++;
    tagname %= 7;
  }
}
```


----------

