Programımdaki hesaplamalar yanlış çıktı, ancak kod doğru görünüyor mu?

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();


}
    }

Örneğin, 28 Şubat 2011 ve 1 Mart 2011’de Gün sayısı 1 olmalıdır. Henüz 24 hesaplar. Sorunun ne olabileceğini bilen var mı? Çünkü başka tarihler girdiğimde tarihleri ​​iyi hesaplar.

0
Merhaba Theo, bir hata ayıklayıcı kullandınız ve program boyunca adım attınız mı? Genellikle bir hata ayıklayıcı bu tür sorunları çözmek için gerçekten iyidir.
katma yazar Steve, kaynak
@Inerdia: Ödev.
katma yazar BalusC, kaynak
Neden sadece Takvimi kullanmayın
katma yazar millimoose, kaynak
İlk önce kodunuzu çözmeyi öneririm. Alanları yerel değişkenler olarak kullanmayın. Sabit sayıda yineleme ile bir döngü gerçekleştirmek için do..while kullanmayın. Alanlar yerine parametreler ve dönüş değerleri olarak işlevler arasında veri değişimi. j için atanan sihirli sayının ne anlama geldiği belli değil. Her neyse, hiç değişmedi ve sabit olmalı. calcdate ve finaldate 'in amacı açık değil - hesaplamada hangi adımı temsil ediyorlar? calcdate1 ve calcdate2 aynı hesaplama yaparsa, tek bir işlev olmalıdır.
katma yazar millimoose, kaynak
Ayrıca, asla atılmayacak olan InputMismatchException'ı yakalamaya gerek yoktur.
katma yazar millimoose, kaynak
Ayda bir çeşit ölçekleme yok mu? Yani, Şubat için, (yıl * 365) + 31 (Ocak'ta gün sayısı) + günler olurdu. Şubat'ta neden 28 dolar var? Ben y, m, d'yi dönüştüren algoritmanın yanlış olduğunu düşünüyorum. Ayrıca, neden sadece bir kez idam edileceği zaman bir do-while döngüsüne sarılır?
katma yazar Akron, kaynak
Evet aynı şeyi düşünüyordum.
katma yazar CamelSlack, kaynak
okul için bir ödev
katma yazar Theo Lopez de Castilla, kaynak

3 cevap

Evet. bunu yapma. İki GregorianCalendar sınıfı oluşturun, farkı milisaniyeye dönüştürün ve farkı bulmak için çıkartın. Ardından günlere dönün.

Ayı izlediğinizden emin olun, çünkü GregorianCalendar aptalca 0'dır.

1
katma
Doğru olsa da, mevcut API'leri kullanmak genellikle ev ödevleri için geçerli değildir.
katma yazar BalusC, kaynak

Joda zamanını kullanmanızı tavsiye ederim. Tarihlerinizde çok fazla güçlük çekmeden basit matematik yapmanızı sağlar ve 1'den 12'ye kadar olan ayları sayar.

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
katma
Bunun bir ev ödevi görevi olduğu zaten mevcuttu, mevcut bir çözümü kullanmak muhtemelen kabul edilmeyecek.
katma yazar millimoose, kaynak
Ah, evet, cevap vermeden önce ödev etiketini görmedim.
katma yazar F.J, kaynak

Bunu algoritmanıza uyarlamayı deneyin. Her ayın gün sayısını gösteren bir dizi mürekkep var. Daha sonra, örneğin, Şubat (ay == 2) 'ye bakarsanız, dizideki 2. elemandan önce tüm değerleri toplamınıza (t) eklersiniz. Ayrıca, tasarımınız şu anda çirkin olduğu için parametreyi ekleyerek yöntemi yeniden yapılandırdım (Aynı şeyi yapan, ancak iki kez yazılan işlevlere sahip olmanız gerekir).

DÜZENLEME: Im, ay onlar girdiklerinde 0 endeksli varsayarak. Eğer değilse, o zaman bu yönteme geçmeden önce ondan 1 çıkarın.

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
katma