Richtig nach Fehlern suchen

Hallo1234

Bekanntes Mitglied
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.

Java:
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:
1622399201875.png
1622399216718.png
 
K

kneitzel

Gast
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

Top Contributor
Java:
        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:

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

LimDul

Top Contributor
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)
 

LimDul

Top Contributor
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.
 
Hier noch die etwas komprimiertere Form (kann manchmal bei der Fehlersuche nützlich sein):

Java:
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));
    }
}
 

Neue Themen


Oben