# Richtig nach Fehlern suchen



## Hallo1234 (30. Mai 2021)

Hallo, hier ein etwas längerer Code und die Aufgabe dazu. Ich kann den Fehler einfach nicht finden. Es soll der Tag durch die Eingabe des Datums ermittelt werden. 
Nur leider stimmen Datum und Tag bei der Ausgabe nicht immer überein. Habt ihr Tipps, wie man richtig nach Fehlern im Code sucht? Falls ihr Zeit habt, das alles durchzugehen, um den Fehler zu finden - tausend Dank!  Ich hoffe, es ist trotz der umständlichen Variablennamen übersichtlich.


```
import java.util.Scanner;
public class Wochentag {

    public static void main(String[] args) {
        Scanner s = new Scanner(System.in);
        System.out.print("Tag: ");
        int tag = s.nextInt();
        System.out.print("Monat: ");
        int monat = s.nextInt();
        System.out.print("Jahr: ");
        int jahr = s.nextInt();
        
        int ganzzahligerAnteilEinesViertels = addGZAnteilEinesViertels(jahr);
        int addMonthNumber = addNumberDependingOnMonth(monat, ganzzahligerAnteilEinesViertels, jahr);
        int addDayToResult = addDay(addMonthNumber, tag);
        int addDecadeToResult = addNumberDependingOnDecade(addDayToResult, jahr);
        int istSchaltjahr = schaltjahr(jahr, monat, addDecadeToResult);
        int modolo7 = modolo7(istSchaltjahr, tag, monat, jahr);
    }
    public static int addGZAnteilEinesViertels(int jahr) {
        String jahrS = Integer.toString(jahr);
        int lastTwoOfJahr = Integer.valueOf(jahrS.substring(jahrS.length()-2));
        int ganzzahligerAnteilEinesViertels = lastTwoOfJahr + lastTwoOfJahr/4;
        //System.out.println(ganzzahligerAnteilEinesViertels);
        return ganzzahligerAnteilEinesViertels;
        }
    public static int addNumberDependingOnMonth(int monat, int ganzzahligerAnteilEinesViertels, int jahr) {
        int addMonthNumber = 0;
        
        if(monat == 1||monat == 10) {
            addMonthNumber = 1+ganzzahligerAnteilEinesViertels;
        }else if(monat == 2||monat == 3||monat == 11) {
            addMonthNumber = 4+ganzzahligerAnteilEinesViertels;
        }else if(monat == 4||monat == 7) {
            addMonthNumber = 0+ganzzahligerAnteilEinesViertels;
        }else if(monat == 5) {
            addMonthNumber = 2+ganzzahligerAnteilEinesViertels;
        }else if(monat == 6) {
            addMonthNumber = 5+ganzzahligerAnteilEinesViertels;
        }else if(monat == 8) {
            addMonthNumber = 3+ganzzahligerAnteilEinesViertels;
        }else if(monat == 9||monat == 12) {
            addMonthNumber = 6+ganzzahligerAnteilEinesViertels;
        }
        //System.out.println(addMonthNumber);
        return addMonthNumber;
    }
    public static int addDay(int addMonthNumber, int tag) {
        int addDayToResult = tag + addMonthNumber;
        //System.out.println(addDayToResult);
        return addDayToResult;
    }
    public static int addNumberDependingOnDecade(int addDayToResult, int jahr) {
        int addDecadeToResult = 0;
        String jahrS = Integer.toString(jahr);
        int lastTwoOfJahr = Integer.valueOf(jahrS.substring(jahrS.length()-2));
        if(lastTwoOfJahr == 18) {
            addDecadeToResult = addDayToResult+2;
        }else if(lastTwoOfJahr == 19) {
            addDecadeToResult = addDayToResult;
        }else if(lastTwoOfJahr == 20) {
            addDecadeToResult = addDayToResult+6;
        }else if(lastTwoOfJahr == 21) {
            addDecadeToResult = addDayToResult+4;
        }
        //System.out.println(addDecadeToResult);
        return addDecadeToResult;
    }
    public static int schaltjahr(int jahr, int monat, int addDecadeToResult) {
        boolean schaltjahr = false;
        int istSchaltjahr = 0;
        
        if(jahr%4 == 0 && jahr%100 !=0) {
            schaltjahr = true;
        }else if(jahr%4 == 0 && jahr%100 == 0) {
            schaltjahr = false;
        }else if(jahr%4 == 0 && jahr%100 == 0 && jahr%400 == 0) {
            schaltjahr = true;
        } 
        
        if(schaltjahr && monat == 1|| monat == 2) {
            istSchaltjahr = addDecadeToResult-1;
        }else if(schaltjahr == false){
            istSchaltjahr = addDecadeToResult;
        }
    
        //System.out.println(istSchaltjahr);
        return istSchaltjahr;
    }
    public static int modolo7(int istSchaltjahr, int tag, int monat, int jahr) {
        int Sa = 0;
        int So = 1;
        int Mo = 2;
        int Di = 3;
        int Mi = 4;
        int Do = 5;
        int Fr = 6;
        int[] day = {Sa, So, Mo, Di, Mi, Do, Fr};
        int modolo7 = istSchaltjahr%7;
        //System.out.println(modolo7);
        if(modolo7 == Sa) {
            System.out.println("Sa");
        }else if(modolo7 == So) {
            System.out.println("So");
        }else if(modolo7 == Mo) {
            System.out.println("Mo");
        }else if(modolo7 == Di) {
            System.out.println("Di");
        }else if(modolo7 == Mi) {
            System.out.println("Mi");
        }else if(modolo7 == Do) {
            System.out.println("Do");
        }else if(modolo7 == Fr) {
            System.out.println("Fr");
        }
        System.out.println("Datum: "+tag+"."+monat+"."+jahr);
        return modolo7;
    }
    }
```
Die Aufgabe:


----------



## Barista (30. Mai 2021)

Hallo1234 hat gesagt.:


> Habt ihr Tipps, wie man richtig nach Fehlern im Code sucht?


1. Debugger benutzen.

2. Alle möglichen Zwischenergebnisse mit System.out.println ausgeben bis man den Fehler eingekreist hat.


----------



## kneitzel (30. Mai 2021)

Deine Schaltjahr Erkennung ist auf jeden falsch. Die letzte else if Bedingung wird nie erreicht, denn da wäre die erste ja schon angesprungen.
Und ganz nebenbei musst Du nicht prüfen, ob etwas durch 4 oder 100 Teilbar ist, wenn du die Teilbarkeit durch 400 testest (Was durch 400 teilbar ist, ist immer auch durch 4 und 100 teilbar). Gleiches gilt bei 100 und 4.

Also immer das stärkste zuerst prüfen: Ist es durch 400 teilbar? -> Schaltjahr.
Ansonsten prüfe, ob es durch 4 und nicht durch 100 teilbar ist -> Schaltjar /  sonst kein Schaltjahr.
Da das letzte ein if mit return true else return false ist, kannst Du gleich die Bedingung vom if zurück geben.

Aber Deine Methode istSchaltjahr ist auch von dem, was sie mach, extrem dubios. Statt einem boolean gibt sie ein int zurück. Das ist also nicht einfach nur ein istSchaltjahr. Daher bei Code immer auf saubere Bezeichner achten. Das ist sonst schon direkt ein Eigentor. 

Logik also immer sauber implementieren und nichts vermischen! Da blickt sonst niemand durch (incl. Dir wie es gerade scheint  )


----------



## LimDul (31. Mai 2021)

```
if(schaltjahr && monat == 1|| monat == 2)
```
Die Zeile ist auch Falsch. Grundsätzlich eine Empfehlung: Sobald man mehrere verschiedene Operatoren vermischt - immer Klammern setzen. Die Zeile oben ist äquivalent zu:


```
if((schaltjahr && monat == 1) || monat == 2) {
```
Was mit Sicherheit nicht ist, was du willst.


----------



## LimDul (31. Mai 2021)

Und schau dir mal deine Methode für das Jahrhundert genau an, du nimmst da die falschen Stellen des Strings. (Das kann man übrigens auch durch mathematische Operationen lösen, anstelle über Strings zu gehen)


----------



## Hallo1234 (31. Mai 2021)

Vielen Dank für eure Antworten. Ich werde eure Tipps umsetzen und dann Bescheid geben, wenn es funktioniert. 


LimDul hat gesagt.:


> Das kann man übrigens auch durch mathematische Operationen lösen


Wie könnte man das machen?


----------



## LimDul (31. Mai 2021)

Wenn du die letzten 2 Zeichen einer Zahl haben willst => Modulo Operation 
Wenn du die ersten 2 Zeichen einer Zahl haben willst => Integer Division

Jeweils mit den passenden 10er Potenzen.


----------



## Hallo1234 (31. Mai 2021)

Super danke, habe alles abgeändert und es funktioniert jetzt : D


----------



## CyborgIstDoof (2. Jun 2021)

Hier noch die etwas komprimiertere Form (kann manchmal bei der Fehlersuche nützlich sein):


```
public class Wochentag {
    public static String wochentag(int jahr, int monat, int tag) {
        return new String[] { "Sa", "So", "Mo", "Di", "Mi", "Do", "Fr" }[ ((jahr % 100) + (jahr % 100) / 4 +
                  new int[] { 1, 4, 4, 0, 2, 5, 0, 3, 6, 1, 4, 6 }[monat - 1] + tag +
                  new int[] { 2, 0, 6, 4 }[jahr / 100 - 18] - (monat <= 2 && jahr % 4 == 0 && jahr % 100 != 0 ? 1 : 0)) % 7 ];
    }

    public static void main(String[] args) {
        System.out.println(wochentag(2021, 6, 2));
        System.out.println(wochentag(2021, 6, 3));
        System.out.println(wochentag(2021, 6, 4));
        System.out.println(wochentag(2021, 6, 5));
        System.out.println(wochentag(2021, 6, 6));
        System.out.println(wochentag(2021, 6, 7));
        System.out.println(wochentag(2021, 6, 8));

        System.out.println(wochentag(2024, 2, 28));
        System.out.println(wochentag(2024, 2, 29));
        System.out.println(wochentag(2024, 3, 1));
        System.out.println(wochentag(2024, 3, 2));
        System.out.println(wochentag(2024, 3, 3));
        System.out.println(wochentag(2024, 3, 4));
        System.out.println(wochentag(2024, 3, 5));
        System.out.println(wochentag(2024, 3, 6));
        System.out.println(wochentag(2024, 3, 7));

        System.out.println(wochentag(2024, 7, 1));
    }
}
```


----------

