私のプログラムの計算が間違って出力されていますが、コードは正しいと思われますか?

import java.util.Scanner; 
import java.util.InputMismatchException;

public class date {
public static int t1;           //integers for methods
public static int t2;
public static int x = 0;        //integer for looping
public static int y1;
public static int m1;
public static int d1;
public static int y2;
public static int m2;
public static int d2;

public static void date1() {
    do                                                                      //along with "while" statement. Makes loop if error occurs
{   
    Scanner scanner = new Scanner(System.in);
    try {                                                                  //try (run program as normal)
        System.out.println("Please enter the first date ");
        System.out.println("Please enter the year: ");                      //entering date
        y1 = scanner.nextInt();

        System.out.println("Please enter the month: ");
        m1 = scanner.nextInt();

        System.out.println("Please enter the day: ");
        d1 = scanner.nextInt();
        break;                                                             //break loop if input is correct
    } catch (InputMismatchException inputMismatchException) {              //response to "Try". if input is incorrect error will be displayed
        scanner.nextLine();
        System.err.println("You must enter intergers. Please try again. ");
    }
     x = x + 1 ;                                                               //set loop to three attempts
}   while (x < 3) ;                                                         //do process occurs while attempts are under < 4

}

public static void caldate1() {
    do                                                                      //along with "while" statement. Makes loop if error occurs
{   
    int j = 693502;
    try {
        if (m1 == 1 || m1 == 3 || m1 == 5 || m1 == 7 || m1 == 8 || m1 == 10 //if/else statements to set proper numbers of days in each month
                || m1 == 12) {
            t1 = ((365 * y1) + d1 + 31);
        } else if (m1 == 2) {
            t1 = ((365 * y1) + d1 + 28);
        } else if (m1 == 4 || m1 == 6 || m1 == 9 || m1 == 11) {
            t1 = ((365 * y1) + d1 + 30);
        }
        if (t1 >= j)                                                        //if/else statement to catch error if date inputted isnt over jan 1st 1900
        { break;}                                                          //break loop if date is greater or equal to jan 1st 1900
        else {
            System.err.printf("Please enter a date after Jan 1st 1900.\n");
        }
    } catch (InputMismatchException inputMismatchException) {                   //error if date too small
        System.err.println("You must enter intergers. Please try again. ");
    }
     x = x + 1 ;                                                               //set loop to three attempts
    }   while (x < 3) ; 
}

public static void date2() {
    do                                                                     //process to follow if length == 5
{   
    Scanner scanner = new Scanner(System.in);
    try  {                                                                 //try (run program as normal)
        System.out.println("Please enter the second date ");
        System.out.println("Please enter the year: ");                      //entering second date
        y2 = scanner.nextInt();

        System.out.println("Please enter the month: ");
        m2 = scanner.nextInt();

        System.out.println("Please enter the day: ");
        d2 = scanner.nextInt();
          break;                                                               //break loop if input is correct
    } catch (InputMismatchException inputMismatchException) {              //  response to "try". if input is incorrect error will be displayed
        scanner.nextLine();
        System.err.println("You must enter intergers. Please try again. ");
    }
     x = x + 1 ;                                                               //set loop to three attempts
}   while (x < 3)  ;                                                            //do process occurs while attempts are under < 4

}

public static void caldate2() {
     do                                                                 //all code is same as in caldate1()... just second set of variables.
{   
    int j = 693502;
    try {
        if (m2 == 1 || m2 == 3 || m2 == 5 || m2 == 7 || m2 == 8 || m2 == 10
                || m2 == 12) {
            t2 = ((365 * y2) + d2 + 31);
        } else if (m2 == 2) {
            t2 = ((365 * y2) + d2 + 28);
        } else if (m2 == 4 || m2 == 6 || m2 == 9 || m2 == 11) {
            t2 = ((365 * y2) + d2 + 30);
        }
        if (t2 >= j) 
        { break;}
        else {
            System.err.printf("Please enter a date after Jan 1st 1900.\n");
        }
    } catch (InputMismatchException inputMismatchException) {
        System.err.println("You must enter intergers. Please try again. ");
    }
     x = x + 1  ;                                                              //set loop to three attempts
    }   while (x < 3) ; 
}
public static void finaldate1() {
    x = Math.abs(t1 - t2);  //calculate total day difference. output absolute value so that result is always positive
    System.out.println("The difference between the two dates is: " + x  + " days.");    
}

public static void main(String[] args) {

    date1();
    caldate1();
    date2();
    caldate2();
    finaldate1();


}
    }

たとえば、2011年2月28日と2011年3月1日を入力します。 日数は1でなければなりません。しかし、それは24と計算されます。誰でも問題の内容を知ることができますか?他の日付を入力すると、日付が正しく計算されるためです。

0
こんにちはテオ、あなたはデバッガを使用して、プログラムをステップしましたか?通常、デバッガはこの種の問題を理解するのに本当に良いです。
追加された 著者 Steve,
@Inerdia:宿題。
追加された 著者 BalusC,
単に Calendar
追加された 著者 millimoose,
私は一般的にあなたのコードをまず解き放つことをお勧めします。フィールドをローカル変数として使用しないでください。 do..while を使用して、一定数の反復でループを実行しないでください。関数の間のデータをパラメータとして交換し、フィールドの代わりに値を返します。 j に割り当てられているマジックナンバーが何を意味するのかははっきりしません。それが何であれ、それは決して変わらず、一定でなければなりません。 calcdatefinaldate の目的は明確ではありません。 calcdate1calcdate2 が同じ計算を実行する場合、それらは1つの関数でなければなりません。
追加された 著者 millimoose,
また、InputMismatchExceptionがスローされない場所を捕まえる必要はありません。
追加された 著者 millimoose,
月別のスケーリングがありますか?つまり、2月の場合、(年* 365)+31(1月の日数)+日となります。なぜ2月に+28か?私はy、m、dをtに変換するアルゴリズムはすべて間違っていると思います。また、一度実行するだけでdo-whileループでラップされるのはなぜですか?
追加された 著者 Akron,
うん、私は同じことを考えていた。
追加された 著者 CamelSlack,
その学校への帰属
追加された 著者 Theo Lopez de Castilla,

3 答え

うん。それをしないでください。 2つのGregorianCalendarクラスを作成し、両方をミリ秒に変換し、差を求めるために減算します。その後、日に戻って変換します。

GregorianCalendarが0に基づいてばかげているので、あなたが月を見ていることを確認してください。

1
追加された
実際、既存のAPIを使用することは通常、宿題には適用されません。
追加された 著者 BalusC,

私はジョーダの時間を使用することをお勧めします。あまりにも面倒なく、簡単な数学を日付で行うことができ、1から12までの月を数えます。

DateMidnight dm1 = new DateMidnight(y1, m1, d1);
DateMidnight dm2 = new DateMidnight(y2, m2, d2);
Days days = Days.daysBetween(dm1, dm2);
int dayCount = days.getDays();
1
追加された
既存の解決策を使用することはおそらく受け入れられない可能性があることは既に宿題の割り当てであることが確認されています。
追加された 著者 millimoose,
ああ、そうです、答えが出る前に私は宿題を見ませんでした。
追加された 著者 F.J,

あなたのアルゴリズムにこれを適応させてみてください。私は毎月の日数を表す整数の配列を持っています。次に、2月(月== 2)などを見ている場合、配列の2番目の要素の前にあるすべての値を合計(t)に追加します。私はまた、あなたのデザインが現在醜いので、パラメータを追加することでメソッドを再構成しました(まったく同じことをするが、2回書く)。

編集:私は月が0を入力するとインデックスされていると仮定します。そうでなければ、このメソッドに渡す前に1を引いてください。

public static int months[] = new int {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    //Note Im assuming error checking has already been done on the data (especially month)
public static int caldate(int year, int month, int day)
{
    int t = 0;
    t += year * 365;//assume no leap years

    for(int i = 0; i < month && i < 12; i++)
    {
       t += months[i];
    }

    t += day;

    return t;
}
0
追加された