Berechnungen in meinem Programm werden falsch ausgegeben, aber der Code scheint richtig zu sein?

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


}
    }

Sagen Sie zum Beispiel, dass Sie den 28. Februar 2011 und den 1. März 2011 eingeben. Die Anzahl der Tage sollte 1 sein. Aber es berechnet 24. Wer weiß, was das Problem sein kann? Weil wenn ich andere Daten gebe, berechnet das Datum gerade gut.

0
Hallo Theo, hast du einen Debugger benutzt und bist schon durch das Programm gegangen? Normalerweise ist ein Debugger wirklich gut darin, diese Art von Problemen herauszufinden.
hinzugefügt der Autor Steve, Quelle
@Inerdia: Hausaufgaben.
hinzugefügt der Autor BalusC, Quelle
Warum nicht einfach Kalender verwenden ?
hinzugefügt der Autor millimoose, Quelle
Ich würde empfehlen, zuerst den Code zu entwirren. Verwenden Sie keine Felder als lokale Variablen. Verwenden Sie nicht do..while , um eine Schleife mit einer festen Anzahl von Iterationen auszuführen. Tauschen Sie Daten zwischen Funktionen als Parameter und Rückgabewerte anstelle von Feldern aus. Es ist nicht klar, was die magische Zahl bedeutet, die j bedeutet. Was auch immer es ist, es hat sich nie verändert und sollte eine Konstante sein. Der Zweck von calcdate und finaldate ist nicht klar - welcher Schritt in der Berechnung repräsentieren sie? Wenn calcdate1 und calcdate2 dieselbe Berechnung ausführen, sollten sie eine Funktion sein.
hinzugefügt der Autor millimoose, Quelle
Außerdem müssen Sie InputMismatchException nicht abfangen, wenn sie nie ausgelöst wird.
hinzugefügt der Autor millimoose, Quelle
Sollte es eine Art Monatsskalierung geben? Ich meine, für Februar wäre es (Jahr * 365) + 31 (Anzahl der Tage im Januar) + Tage. Warum gibt es im Februar eine + 28? Ich denke, der Algorithmus, der y, m, d in t konvertiert, ist alles falsch. Warum wird es in eine Do-While-Schleife eingeschlossen, wenn es nur einmal ausgeführt werden sollte?
hinzugefügt der Autor Akron, Quelle
Ja, ich dachte dasselbe.
hinzugefügt der Autor CamelSlack, Quelle
es ist eine Aufgabe für die Schule
hinzugefügt der Autor Theo Lopez de Castilla, Quelle

3 Antworten

Ja. Tu das nicht. Erstellen Sie zwei GregorianCalendar-Klassen, konvertieren Sie beide in Millisekunden, und subtrahieren Sie, um den Unterschied zu finden. Dann konvertiere zurück in Tage.

Stelle sicher, dass du den Monat ansiehst, weil GregorianCalendar dumm 0 ist.

1
hinzugefügt
Die Verwendung vorhandener APIs ist bei Hausaufgaben normalerweise nicht anwendbar.
hinzugefügt der Autor BalusC, Quelle

Ich würde empfehlen, joda Zeit zu verwenden. Es ermöglicht Ihnen einfache Mathe auf Daten ohne zu viel Aufwand und zählt Monate von 1 bis 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
hinzugefügt
Es wurde bereits festgestellt, dass dies eine Hausaufgabe ist, die Verwendung einer bestehenden Lösung wird wahrscheinlich nicht akzeptiert.
hinzugefügt der Autor millimoose, Quelle
Ah, richtig, ich habe das Hausaufgaben-Tag nicht gesehen, bevor ich geantwortet habe.
hinzugefügt der Autor F.J, Quelle

Versuchen Sie, dies in Ihren Algorithmus zu integrieren. Ich habe eine Reihe von Ints, die die Anzahl der Tage in jedem Monat darstellen. Wenn Sie beispielsweise auf Februar schauen (Monat == 2), dann würden Sie alle Werte vor dem 2. Element im Array zu Ihrer Summe (t) hinzufügen. Ich habe die Methode auch neu strukturiert, indem ich Parameter hinzugefügt habe, weil dein Design momentan hässlich ist (Du musst Funktionen haben, die genau dasselbe tun, aber zweimal geschrieben sind).

EDIT: Ich nehme an, dass Monat 0 indiziert wird, wenn sie es eingeben. Wenn es nicht ist, dann ziehe 1 davon ab, bevor du es in diese Methode überträgst.

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
hinzugefügt