2 回答

TA貢獻1871條經驗 獲得超8個贊
發生這種情況是因為您break在IF范圍內->如果年份不是1,則繼續第3種情況。
您可以使用if else子句:
case 2:
if(year == 1) {
days = 29;
} else {
days = 28;
}
break;
但是我要提醒您,year != 1這并不意味著它的2月獲得28天,也許您想要這樣:
case 2:
if(!isLeapYear(year)) {
days = 29;
} else {
days = 28;
}
break;

TA貢獻1946條經驗 獲得超3個贊
除了關于if語句和的switch問題外,首先使用leap年檢查的方法還需要解決一些問題。這是下面原始代碼的開頭:
public static boolean isLeapYear(int year) {
if(year < 1 && year > 9999) {
return false;
} else {
...
這種情況year < 1 && year > 9999永遠不會發生,因為year不能同時小于1和大于9999,所以這是多余的。
除此之外,用于確定年份是否為a年的算法如下(以純英語顯示):
看看該年份是否可以被4整除。如果不是,則該年份不能是a年(返回false)。
在這里,一年可以平均除以4(在步驟1中確定)。如果不能被100整除,則為is年(返回true)。
在這里,年份可以被4除以100,也可以除以100。如果該年份也可以被400除以,那么它就是leap年。否則不是。
將以上所有考慮因素放入代碼中,可以使其更具可讀性:
public static boolean isLeapYear(int year) {
if (year % 4 != 0) {
// year is not evenly divisible by 4 (it has a remainder, can't be a leap year).
return false;
}
// year is evenly divisible by 4
if (year % 100 != 0) {
// divisible by 4 and not 100, it's a leap year
return true;
}
// divisible by 4 and also 100
if (year % 400 != 0) {
// divisible by 4, 100 and not by 400
return false;
}
// divisible by 4, 100 and 400
return true;
}
考慮到您的getDaysInMonth方法,我們有以下情況,其中1 =一月,2 =二月,依此類推:
30天:9月(9),4月(4),6月(6),11月(11)
31天:除2月(2)以外的所有其他日子(a年28、29)
public static int getDaysInMonth(int month, int year) {
switch (month) {
case 9:
case 4:
case 6:
case 11:
return 30;
case 2:
if (isLeapYear(year)) {
return 29;
} else {
return 28;
}
default:
return 31;
}
}
關于參數的驗證,如果您正在接收用戶輸入,則應在用于計算的方法之外對所有參數進行驗證(傳遞已被驗證的方法輸入,而不是直接在其中進行驗證)。
添加回答
舉報