Java-Method程序-使用switch case和Method

Java-Method程序-使用switch case和Method,java,methods,switch-statement,Java,Methods,Switch Statement,我正在写一个程序,它接收用户的出生信息,年,月,日,小时,分钟。计划如下: 使用getRangedInt方法输入年份(1965-2000),月份 (1-12)、出生日*、出生小时数(1-24)、出生分钟数(1-59) 注意:使用switch()条件选择器结构来限制用户 他们出生月份的正确天数。对于 例如,如果他们出生于2月[1-29日],10月[1-31日]。提示:有 这里只有几个小组,而不是12个不同的小组 我完全搞不懂白天的部分。我已经设法让其他的一切工作,除了了解我今天应该做什么 我的代码

我正在写一个程序,它接收用户的出生信息,年,月,日,小时,分钟。计划如下:

使用
getRangedInt
方法输入年份(1965-2000),月份 (1-12)、出生日*、出生小时数(1-24)、出生分钟数(1-59)

注意:使用switch()条件选择器结构来限制用户 他们出生月份的正确天数。对于 例如,如果他们出生于2月[1-29日],10月[1-31日]。提示:有 这里只有几个小组,而不是12个不同的小组

我完全搞不懂白天的部分。我已经设法让其他的一切工作,除了了解我今天应该做什么

我的代码:

public static void main(String[] args) 
{
    int year, month, day, hour, minutes;
    String msg="";
    boolean done = true;
    Scanner in = new Scanner(System.in);

    while(done)
    {
        year = SafeInput.getIntInRange(in, "Enter the year you were born: ", 1965, 2000);       
        month = SafeInput.getIntInRange(in, "Enter your month of birth: ", 1, 12);
        day = SafeInput.getIntInRange(in, "Enter the day you were born: ", day, day);      
        hour = SafeInput.getIntInRange(in, "Enter the hour you were born in: ", 1, 24);
        minutes = SafeInput.getIntInRange(in, "Enter the minutes you were born: ", 1, 59);

        System.out.println("You were born: " + year + " , " + msg + " , " + hour + " hr. " + minutes + " mins. ");

        done = SafeInput.getYNConfirm(in, "Would you like to play again?");
    }
}
getIntInRange
只需进行基本输入即可获得范围内的数字。
我很困惑,因为我不知道如何计算当天的范围,因为还应该使用开关。

这里,您的日期取决于输入的月份。因此,首先,您希望将用户输入的月份作为一个整数,就像您现在所做的那样,并继续在开关中使用该数字:

int month = 0;
int numberOfDays;

        switch (month) {
            case 1:  numberOfDays = DaysInJanuary;
                     break;
            case 2:  numberOfDays = DaysInFebruary;
                     break;
            case 3:  numberOfDays = DaysInMarch;
                     break;
            case 4:  numberOfDays = DaysInApril;
                     break;
            case 5:  numberOfDays = DaysInMay;
                     break;
            case 6:  numberOfDays = DaysInJune;
                     break;
            case 7:  numberOfDays = DaysInJuly;
                     break;
            case 8:  numberOfDays = DaysInAugust;
                     break;
            case 9:  numberOfDays = DaysInSeptember;
                     break;
            case 10: numberOfDays = DaysInOctober;
                     break;
            case 11: numberOfDays = DaysInNovember;
                     break;
            case 12: numberOfDays = DaysInDecember;
                     break;
            default: throw new IllegalArgumentException("Not a valid month");
                     break;
        }
然后,您可以继续为“最大日”范围设置变量

day = SafeInput.getIntInRange(in, "Enter the day you were born: ", 1, numberOfDays);

希望这有帮助。

这是一个非常奇怪的要求

它看起来像是向您请求的内容,看起来像这样:

int numberOfDays;
switch (month) {
case 1: // $FALL-THROUGH
case 3: // $FALL-THROUGH
case 5: // $FALL-THROUGH
case 7: // $FALL-THROUGH
case 9: // $FALL-THROUGH
case 11:
    numberOfDays = 31;
    break;
case 4: // $FALL-THROUGH
case 6: // $FALL-THROUGH
case 8: // $FALL-THROUGH
case 10: // $FALL-THROUGH
case 12:
    numberOfDays = 30;
    break;
case 2:
    numberOfDays = (0 == year / 4) ? 29 : 28;
    break;
default:
    throw new IllegalArgumentException("month not 1-12");
} // switch (too long for my liking)
然后

day = SafeInput.getIntInRange(in, "Enter the day you were born: ", 1, numberOfDays);
这利用了Switchs中可用的fall-through构造,因此如果您满足一个条件,您将一直执行到返回语句(或break/throw)


请记住,另一种选择是:

private static final Set<Integer> MONTHS_30_DAYS = Sets.newTreeSet(4, 6, 8, 10, 12);
private static final Set<Integer> MONTHS_31_DAYS = Sets.newTreeSet(1, 3, 5, 7, 9, 11);

public static int numberOfDays(int month, int year) {
   if (MONTHS_30_DAYS.contains(month)) {
      return 30;
   } else if (MONTHS_31_DAYS.contains(month)) {
      return 31;
   } else {
     return (0 == year / 4) ? 29 : 28;
   }
}
private static final Set MONTHS\u 30\u DAYS=Sets.newTreeSet(4,6,8,10,12);
私人静态终凝月数31天=套新树集(1,3,5,7,9,11);
公共静态整数天数(整数月,整数年){
if(月数30天包含月数){
返回30;
}else if(月\u 31天包含(月)){
返回31;
}否则{
回报率(0==年/4)?29:28;
}
}

如果需要使用switch语句,可以按其中的天数拆分月份。将有3个小组。然后,您可以按如下方式使用switch语句:

    switch (month) {
        case 1:
        case 3:
        case 5:
            return 31;

        case 2: {
            if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0)) 
                return 29; 
            else 
                return 28;
            }

        case 4:
        case 6:
            return 30;

        default:
            throw new IllegalArgumentException("some error text");
    }

示例中的switch语句不完整,您应该每月编写一个case语句。基本上,您返回的是天的上限值。

您的
范围取决于用户输入的上一个
编号,因此您必须检查该值才能知道显示哪一天范围。提示告诉您的是,您不需要每个月都有不同的有效天数范围,因为某些月份的有效天数范围相同。以下是一个月的天数:

January     31
February    28/29
March       31
April       30
May         31
June        30
July        31
August      31
September   30
October     31
November    30
December    31
如您所见,只有3个组,作业希望您在
开关中不
中断
时利用故障排除:

int upperDaysLimit;
switch(month) {
    case 1:
    case 3:
    case 5:
    //...
    case 12: upperDaysLimit = 31;
             break;
    case 4:
    case 6:
    // and so on
}
现在您可以在天数查询中使用该范围限制:

day = SafeInput.getIntInRange(in, "Enter the day you were born: ", 1, upperDaysLimit);

为什么不干脆
1,7
?这和其他选择一样。(顺便说一句,
1,59
分钟没有意义-它要么是
1,60
要么是
0,59
)@Elazar它是月日,而不是周日,月有不同的长度。@Elazar但你在另一方面是正确的-0分钟应该是一个有效的选择。(7:60将是一个相当奇怪的时间,所以我认为0比60好。)我知道这是因为,但这是我们被告知要做的。这个程序完全把我弄糊涂了。@AdamKotwasinski实际上这是一个很好的切换练习。我想这真的很好,万一他们再次改变8月份的天数?12月份的
天数是多少?看起来像某种类型的名称。@user1803551我假设它是一个常量。当你不
中断
返回
抛出
或停止执行时。@AdamKotwasinski这与什么有关?什么是
集合。newTreeSet
?如果返回
,什么是
?@user1803551修复了它。