Почему мой алгоритм високосного года не работает (Java)?

Вот что у меня есть:

Scanner input = new Scanner(System.in);
    System.out.print("Enter a year: ");
    int Year = input.nextInt();
    System.out.print("Enter a month (first three letters with the first"
            + " letter uppercase): ");
    String Month = input.next();

    String ThirtyOne = "Jan" + "Mar" + "May" + "Jul" + "Aug" + "Oct" + "Dec";
    String DaysThirtyOne = ThirtyOne.substring(21) + "31";

    String Thirty = "Apr" + "Jun" + "Sep" + "Nov";
    String DaysThirty = Thirty.substring(12) + "30";

    String TwentyEight = "Feb";
    String DaysTwentyEight = TwentyEight.substring(3) + "28";
    String DaysLeapYear = TwentyEight.substring(3) + "29";


    boolean isLeapYear = ((Year % 4 == 0) && (Year % 100 != 0) && (Year % 400 == 0));

    if (ThirtyOne.contains(Month)) {
        System.out.println(Month + " " + Year + " has " + DaysThirtyOne 
                + " days in it.");
    }
    if (Thirty.contains(Month)) {
        System.out.println(Month + " " + Year + " has " + DaysThirty 
                + " days in it.");
    }
    if(TwentyEight.contains(Month)) {
        System.out.println(Month + " " + Year + " has " + DaysTwentyEight 
                + " days in it.");
    }
    if (isLeapYear) {
        System.out.println(Month + " " + Year + " has " + DaysLeapYear 
                + " days in it.");
    }

Я новичок в программировании, поэтому я не удивлюсь, если этот код выглядит незрелым. В любом случае, у меня есть ввод пользователя год и месяц (первые три буквы). Я создал булеву переменную для високосного года, которая говорит, что любой год, когда вводимые пользователем данные должны делиться на 4, 100 и 400. Затем я создал оператор if для того, чтобы распечатать это високосный год. пользовательские входы) содержит DaysLeapYear." Я думаю, что у меня что-то не так с моим алгоритмом, потому что, если бы я вынул оператор if TwentyEight и просто сохранил високосный год if, компьютер даже не распечатал, сколько дней было бы в феврале, если бы это был високосный год, Опять же, я думаю, что я ошибаюсь в алгоритме, но это может быть где-то еще, и я надеялся еще раз взглянуть на это, чтобы увидеть, видит ли кто-то что-то, чего я не являюсь, так как в конце концов я новичок в этом.

1 ответ

Решение

Во-первых, ваше состояние isLeapYear должно измениться.

boolean isLeapYear = ((Year % 4 == 0) && (Year % 100 != 0) || (Year % 400 == 0));

Далее ваш if(TwentyEight.contains(Month)) для этого нужно изменить, чтобы учесть високосный год.

if(TwentyEight.contains(Month) && !isLeapYear) {
        System.out.println(Month + " " + Year + " has " + DaysTwentyEight
                + " days in it.");
}
Другие вопросы по тегам