Как правильно использовать switch-statement?

#java #switch-statement

#java #switch-statement

Вопрос:

Мне нужно написать Java-программу (класс NextDay), которая вычисляет и печатает дату следующего дня, вводя день, месяц и год.

Пример вызова и вывода:

 Actual Date 12.12.2004
The next day is the 13.12.2004.
 

Входные данные также должны быть проверены на правильность! Если введено ошибочное сопоставление дат (например, 32 12 2007), должно быть InvalidDateArgumentsException создано исключение. Определите этот класс в подходящей форме как подкласс класса java.lang.Exception .

Я начал создавать его, но проблема в том; я не могу сказать, что < или> в операторах switch .Что мне делать? Вот мои классы:

 public class Date {

    private int day;
    private int month;
    private int year;

    public Date(int day, int month, int year) {
        this.day = day;
        this.month = month;
        this.year = year;
    }

    public Date getNextDay() throws Exception {
        if (isLeapYear() == true) {
            switch (month) {

                case 1:
                    day = 31;
                    break;

                case 2:
                    day = 29;
                    break;

                case 3:
                    day = 31;
                    break;

                case 4:
                    day = 30;
                    break;

                case 5:
                    day = 31;
                    break;

                case 6:
                    day = 30;
                    break;

                case 7:
                    day = 31;
                    break;

                case 8:
                    day = 31;
                    break;

                case 9:
                    day = 30;
                    break;

                case 10:
                    day = 31;
                    break;

                case 11:
                    day = 30;
                    break;

                case 12:
                    day = 31;
                    break;
            }

        }
        return new Date(day   1, month, year);

    }

    public int getDay() {
        return day;
    }

    public int getMonth() {
        return month;
    }

    public int getYear() {
        return year;
    }

    public boolean isLeapYear() {
        if (year % 4 == 0 amp;amp; year % 100 != 0 amp;amp; year % 400 == 0) {
            return true;
        }
        return false;
    }

    public String toString() {
        return this.day   "."   this.month   "."   this.year;
    }
}
 

 public class NextDay {

    public static void main(String args[]) throws Exception {
        Date dateObj = new Date(20, 5, 2016);
        System.out.println("Old Date: "   dateObj.getDay()   "."   dateObj.getMonth()   "."   dateObj.getYear()   ".");
        System.out.println("The next day is "   dateObj.getNextDay().toString()   ".");
    }
}
 

Комментарии:

1. я бы, но мне сказали, что я должен делать с switch case, это из-за моего университета, я начинающий программист, и мы изучаем switch case.

2. Вам нужно определять свой собственный Date класс? java.util.Date существует, вы знаете

3. нет, я не должен, я думаю 🙂

Ответ №1:

Вы говорите, что хотите, чтобы внутри был оператор «или» switch , верно? Если вы пишете case метки построчно, вы получаете «оператор or», например:

 switch(variable){
        case 1:
        case 2:
        case 3: {
            //.. when variable equals to 1 or 2 or 3
        }
    }
 

Таким образом, вы можете написать свой getMaxDaysInMonth метод следующим образом:

 int getMaxDaysInMonth()
{
    int daysInMonth = 0;
    switch(month)
    {
        case 1:
        case 3:
        case 5:
        case 7:
        case 8:
        case 10:
        case 12:
            daysInMonth = 31;
            break;
        case 2:
            if(isLeapYear())
            {
                daysInMonth = 29;
            }
            else
            {
                daysInMonth = 28;
            }
            break;
        case 4:
        case 6:
        case 9:
        case 11:
            daysInMonth = 30;   
    }

    return daysInMonth;
}
 

Кроме того, вы неправильно проверяете високосный год. Вот правильный способ:

 boolean isLeapYear(){
        return (year % 4 == 0 amp;amp; year % 100 != 0) || (year % 400 == 0);
    }
 

И вот как вы увеличиваете день:

 void incrementDate(){
    if((day   1) > getMaxDaysInMonth())
    {
        day = 1;        
        if (month == 12)
        {
            month = 1;
            year  ;
        }else{   
          month  ;
    }
    } else {
       day  ;
    }    
}
 

Ответ №2:

РЕДАКТИРОВАТЬ, поскольку мы не можем просто использовать стандартные классы

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

 int maxDay;
switch (month) {
case 1: maxDay = 31; break;
case 2: maxDay = isLeapYear() ? 29 : 28; break;
case 3: maxDay = 31; break;
// ... other months ...
case 12: maxDay = 31; break;
default: throw new InvalidDateArgumentsException();
}
if (isLeapYear()) {
    maxDay = 29;
}
if (day > maxDay) {
    throw new InvalidDateArgumentsException();
}
 

Комментарии:

1. ov извините, что я отнял у вас время, мой английский не так хорош, поэтому я правильно понял вопрос. Мы должны создать класс date.

2. Большое вам спасибо 🙂