Как с помощью этого метода напечатать количество дней во всех 12 месяцах

У меня есть код, который принимает пользовательский ввод как год, месяц, а затем дату. У меня есть три метода: один получает день недели, другой - количество дней в этом месяце, а другой вычисляет, является ли этот год високосным.

Когда пользователь вводит год в месяц и дату, например «2016 3 3», я хочу, чтобы мой код затем перечислял месяцы от 1 до 12 и рядом с каждым числом количество дней в этом месяце. Код, который у меня есть для всех трех методов, выглядит следующим образом.

class Date {

int year, month, day;

Date(int y, int m, int d) {
    year = y;
    month = m;
    day = d;
}

/**
 * This method returns the day of the week as an integer: 0 and 6: Sunday
 * and Saturday 1 - 5: Weekdays
 */
public int getDayOfWeek() {

    int y0 = year - (14 - month) / 12;
    int x = y0 + y0 / 4 - y0 / 100 + y0 / 400;
    int m0 = month + 12 * ((14 - month) / 12) - 2;
    int d0 = (day + x + (31 * m0) / 12) % 7;

    return d0;
}
/**
 * This method returns the number of days in a given month an integer
 */
public int getDaysInMonth(int month) {

    int daysInMonth = (int) (28 + (Math.floor(month / 8.0) + month) % 2 + 2 % month + 2 * Math.floor(1.0 / month));

    if (month == 2 && isLeapYear()) {
        daysInMonth += 1;
    }
    return daysInMonth;
}


public boolean isLeapYear() {

    boolean isLeapYear = true;

    if (year % 4 != 0) {
        isLeapYear = false;
    }
    else {  
        if (year % 100 != 0) {
            isLeapYear = true;
        }
        else if (year % 400 != 0) {
            isLeapYear = false;
        }
    else { 
            isLeapYear = true;
         }
    }



    return isLeapYear;
} 

Я учусь на первом курсе информатики и все еще очень новичок в этом, я смотрел на этот код и гуглил большую часть дня и, похоже, ничего не могу понять, любая помощь будет оценена .

Я знаю, что это неправильно, но это все, что мне удалось придумать до сих пор.

public void printDaysInMonth() {
    int m = getDaysInMonth(month);
    System.out.println("Month  " + "  Days");
    for (int i=0; i<12; i++) {
        System.out.println(m);
    }
}

В цикле forprintDaysInMonth() рассмотрите возможность печати getDaysInMonth(i).

Arnaud 17.09.2018 09:52
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
324
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы на правильном пути, но вы назначаете свою переменную m вне цикла for и, таким образом, каждый раз печатаете один и тот же месяц. Вместо этого попробуйте назначить его и распечатать внутри цикла, который у вас уже есть:

public void printDaysInMonth() {
    for (int i = 1; i <= 12; i++) {
        int m = getDaysInMonth(i);
        System.out.println("Month " + i + " has " + m  + "days.");
    }
}

Поскольку ваш метод getDaysInMonth уже учитывает високосные годы, этого должно быть достаточно!

Спасибо! Это мне очень помогло! Объяснение было очень ясным и легким для понимания.

Sam Black 17.09.2018 10:06

В Java 8 вы можете использовать приведенный ниже код для упрощения манипуляций с датой:

public static void main(String[] args) {
    LocalDate date1=getDate(12,12,2020);

int dayOfWeek=getDayOfWeek(date1);

boolean isLeapYear=isLeapYear(date1);
    System.out.println("date: "+date1);
    System.out.println("dayOfWeek: "+dayOfWeek);
    System.out.println("is Leap year: "+isLeapYear);
}

// Вернет значение LocalDate

private static LocalDate getDate(int date,int month, int year){
    return LocalDate.of(year,month,date);
}

// вернет Dayofweek

private static int getDayOfWeek(LocalDate date){
    return date.getDayOfWeek().getValue();
}

// Вернет истину / ложь, если год не високосный

private static boolean isLeapYear(LocalDate date){
    return date.isLeapYear();
}

/ * Если вы хотите распечатать дни всех месяцев определенного года, используйте метод ниже * /

public void printLengthsOdDaysInMonthsOfYearPassed(int year){
    year=2020;
    for(int i=1;i<=12;i++){
        LocalDate date2=LocalDate.of(year,i,1);

        int length=date2.getMonth().maxLength();
        System.out.println("Month: "+i+ " length: "+length);
        System.out.println("is leap year: "+date2.isLeapYear());
    }
}

Я думаю, что OP попытался вручную написать расчеты в качестве упражнения, поэтому, вероятно, не примет решение с использованием библиотечных методов. Для производственного кода методы библиотеки - единственный правильный путь, поэтому все остальные могут извлечь выгоду из этого ответа.

Ole V.V. 21.04.2020 19:05

Другие вопросы по теме