2013-06-30 61 views
1

在試圖讓我的代碼有點更具美感和短,我試圖從這個改變我的代碼:我的布爾語句的工作的一種方式,但不是在一個看似不變的方式

do 
{ 
    System.out.print("Enter day: "); 
    day = input.nextInt(); 

    if ((isLeapYear && month == 2 && (day < 1 || day > 29)) || 
      (!isLeapYear && month == 2 && (day < 1 || day > 28)) || 
      ((month == 4 || month == 6 || month == 9 || month == 11) && (day < 1 || day > 30)) || 
      ((month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || 
      month == 10 || month ==12) && (day < 1 || day > 30))) 
    { 
     System.out.println("Invalid input"); 
    } 
} 
while ((isLeapYear && month == 2 && (day < 1 || day > 29)) || 
     (!isLeapYear && month == 2 && (day < 1 || day > 28)) || 
     ((month == 4 || month == 6 || month == 9 || month == 11) && (day < 1 || day > 30)) || 
     ((month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || 
     month == 10 || month ==12) && (day < 1 || day > 30))); 

這樣:

boolean invalidDay = (isLeapYear && month == 2 && (day < 1 || day > 29)) || 
        (!isLeapYear && month == 2 && (day < 1 || day > 28)) || 
        ((month == 4 || month == 6 || month == 9 || month == 11) && (day < 1 || day > 30)) || 
        ((month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || 
        month == 10 || month ==12) && (day < 1 || day > 30)); 

do 
{ 
    System.out.print("Enter day: "); 
    day = input.nextInt(); 

    if (invalidDay) 
    { 
     System.out.println("Invalid input"); 
    } 
} 
while (invalidDay); 

第二個不按預期工作,但第一種方式完美的作品。我唯一改變的是把長布爾表達式放入一個布爾變量中。謝謝。

+5

也許你應該重新計算循環內的條件? –

+1

你嘗試用調試器來跟蹤這個方法嗎?它應該揭示你的錯誤。 –

+2

只是一個問題。如果你試圖驗證日期是否有效,應該有一個更簡單的方法。看看[這個](http://stackoverflow.com/questions/226910/how-to-sanity-check-a-date-in-java)。 – LaurentG

回答

0

通過使用布爾變量,您可以從控制檯和檢入循環中獲取日期值,但每次都不會執行檢查,但前一個值仍然存在。如果你想做同樣的事情,可以在函數中做,然後從循環中調用它。

1

invalidDay,而()永遠不會重新計算,你需要uptate它的價值在某種程度上

+0

非常感謝,這只是你們發現的另一個愚蠢的錯誤。顯然不能在詢問用戶之前使用一天。通過將布爾表達式轉化爲自己的東西,並認爲它不起作用,我以爲我錯過了一些底層的Java事物,我永遠無法弄清楚 – FoxMcWeezer

0

你缺少在表達的開始和表達年底結束括號開括號。 ..它應該是

boolean invalidDay = ((isLeapYear && month == 2 && (day < 1 || day > 29)) || 
        (!isLeapYear && month == 2 && (day < 1 || day > 28)) || 
        ((month == 4 || month == 6 || month == 9 || month == 11) && (day < 1 || day > 30)) || 
        ((month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || 
        month == 10 || month ==12) && (day < 1 || day > 30))); 
+0

@FoxMcWeezer查看我的更新 – Mac

-1

在你的while循環中,參數invalidDay永遠不會更新。你可以創建一個無效日期的方法。在這裏:

public boolean invalidDay(int day) { 
    return (isLeapYear && month == 2 && (day < 1 || day > 29)) || 
       (!isLeapYear && month == 2 && (day < 1 || day > 28)) || 
       ((month == 4 || month == 6 || month == 9 || month == 11) && (day < 1 || day > 30)) || 
       ((month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || 
       month == 10 || month ==12) && (day < 1 || day > 30)); 
} 

而現在,在你的while循環,使用方法:

while(invalidDay(n)); 

其中n是一天。

相關問題