На следующий день приложение на Java



Мне нужно написать 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 && year % 100 != 0 && 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() + ".");
}
}
571   2  

2 ответов:

Вы говорите, что вам нужно утверждение" или " внутри switch, верно? Если вы напишете case метки строка за строкой, вы получите "or statement", например:

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 && year % 100 != 0) || (year % 400 == 0);
    }

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

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

Редактировать, так как мы не можем просто использовать стандартные классы

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

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();
}

Comments

    Ничего не найдено.