2016-11-21 61 views
1

我的程序讀取3個代表日期的整數和代表天數的第四個整數,並計算日期後的日期。Java:將日期手動添加到日期

我正在使用blueJ,我不明白爲什麼輸出的日期不起作用 - 閏年不起作用,唯一的情況是它的工作原理和出現無效的情況是當我輸入一天32/33等我哪裏錯了?順便說一下,除了if和/或booleans/switch之外,我們不允許使用其他任何東西。

我複製我從BlueJ的直寫的代碼:

import java.util.Scanner; 

public class Dates 
{ 
    public static void main (String[]args) 
    { 
     int day, month, year, num; 
     int daysInMonth = 0; 
     final int JAN = 1; 
     final int FEB = 2; 
     final int MAR = 3; 
     final int APR = 4; 
     final int MAY = 5; 
     final int JUN = 6; 
     final int JUL = 7; 
     final int AUG = 8; 
     final int SEP = 9; 
     final int OCT = 10; 
     final int NOV = 11; 
     final int DEC = 12; 
     final int LeapYear = 29; 
     final int NotLeapYear = 28; 
     final int MinMonthsInYear = 1; 
     final int MaxMonthsInYear = 12; 

     Scanner scan = new Scanner(System.in); 
     System.out.println("This program reads 3 integers representing  a date and a fourth " + 
         "integer representing amount of days, and calculates the date " + 
         "after the amount of days."); 
     System.out.println("Please enter 3 integers- the day, the month and the year");      
     day = scan.nextInt(); 
     month = scan.nextInt(); 
     year = scan.nextInt(); 

     switch (daysInMonth) 
     { 
      case JAN: 
      case MAR: 
      case MAY: 
      case JUL: 
      case AUG: 
      case OCT: 
      case DEC: 
       daysInMonth=31; 
       break; 
      case APR: 
      case JUN: 
      case SEP: 
      case NOV: 
       daysInMonth=30; 
       break; 
      case FEB: 
       if((year%400)==0 || (year%4)==0 && (year%100)!=0) 
       { 
        daysInMonth=LeapYear; 
       } 
       else 
       { 
        daysInMonth=NotLeapYear; 
       } 
       break; 
      default: 
       System.out.println("The original date " +day + "/" +month + "/" +year + " is invalid."); 
       return; 
     } 

     if (month<1 && month>12 || year<0) 
     { 
      System.out.println("The original date " +day + "/" +month + "/" +year + " is invalid."); 
      return; 
     } 

     System.out.println("Please enter an integer which represents the number of days");  
     num = scan.nextInt(); 
     if (num<1 && num>10 && num<=0) 
     { 
      System.out.println("The number of days must be between 1-10"); 
      return; 
     } 

     System.out.println("The original date is " +day + "/" +month + "/" +year + "."); 

     if (JAN>31 || MAR>31 || MAY>31 || JUL>31 || AUG>31 || OCT>31 | DEC>31) 
     { 
      month++; 
     } 
     if (APR>30 || JUN>30 || SEP>30 || NOV>30) 
     { 
      month++; 
     } 
     if (DEC>31) 
     { 
      year++; 
     } 

     System.out.println("After num days the date is " + day + "/" + month + "/" + year + ".");  
    } 
} 
+0

數字如何小於1且大於10? if(num <1 && num> 10 && num <= 0)。你不是說如果(號碼<1 || num > 0)?兩個垂直條是邏輯或操作符。兩個&符號是邏輯運算符。 – MikeJRamsey56

+0

「開關(daysInMonth)」是錯誤的。 daysInMonth應該是28到31或0的東西,如果初始化,但你的案例詢問從1到12的數字。編輯:看過你的其他條件,如「if(DEC> 31)」,我得出結論,你在進一步做任何事之前,應該回到基礎知識。你似乎沒有完全理解條件是如何工作的。您可能想要創建一個測試用例,首先在紙上對其進行評估,然後使用調試器對其進行測試,以確定程序是否完全相同。因爲在非常多的位置,它並沒有達到預期的目的。 – Aziuth

回答

1

像@ MikeJRamsey56說,有蟲子在你的if語句。還有一些其他問題,例如daysInMonth總是0。我不希望他們都單獨叫出了你,你可以更好地瞭解它,如果你自己找到他們,但這裏的一些要點要記住:

  • ||手段「或」中「如果OR b是真實的「 - 僅當雙方都是假的,塊才被跳過
  • &&的意思是「和」,如「如果AND b是真實的」 - 該塊被跳過,除非雙方均爲真。
  • 仔細檢查每個塊的意圖,並考慮在每個塊之上添加註釋,如// if the number of days is more than the current month, move on to the next month。這可以幫助你在你的代碼中找到位置,而這實際上並不是你在if聲明中放置的位置。
  • 你可能不想說像JAN>31 - JAN是一個常數(final),因此總是有一個值1。換句話說,該表達式相當於1>31,它總是錯誤的。
  • & and |(不要與&&||混淆)是bitwise-operators;沒有太多細節,他們不是你通常想要使用的操作員。如果你在你的代碼中使用它們,並且你不打算按位操作,結果將會出錯/中斷。
  • 很容易創建難以理解的條件 - 例如Java如何解析a || b && c || drules實際上是指定的,但它仍然很容易迷惑自己。作爲一個經驗法則,將多個條件組合成括號是一個好主意,所以你的意圖更清晰。 a || (b && (c || d))
  • 逐行掃描您的程序;傳遞一個你期望觸發你的第一個條件的輸入 - 做到了嗎?如果沒有,那麼一旦確認有條件的工作正如預期的那樣進行下一步,就修復它。以有序,結構化的方式進行調試,可以讓您劃分工作範圍,並確信問題的子部分正常工作。然後,一旦你知道所有的子部分工作,你應該確信整個事情的工作。這(實質上)unit testing背後的想法,但不要擔心,如果這是一個你還沒有探索的概念。

我希望這足以開始!

+0

謝謝dimo,我會把這個信息再試一次,但我有一個問題,如果|和&在這裏不是很適合,所以我能做什麼? – Tofixx

+0

@Tofixx在你的評論中你的問題沒有意義。在答案dimo414解釋了單字符|和&是按位運算符而不是你想要的。雙字符||和&&具有完全不同的含義。請重新閱讀此答案,如果不解決,請重新提出您的問題。 –

+0

@Tofixx澄清了這一點子彈點。 – dimo414