Berekeningen in mijn programma worden verkeerd uitgevoerd, maar de code lijkt goed te zijn?

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


}
    }

Stel dat u bijvoorbeeld 28 februari 2011 en 1 maart 2011 invoert. Het aantal dagen zou moeten zijn 1. Maar het berekent 24. Iedereen weet wat het probleem kan zijn? Omdat wanneer ik andere data invoert, de datums prima worden berekend.

0
Hallo Theo, heb je een debugger gebruikt en het programma al doorlopen? Meestal is een debugger echt goed in het achterhalen van dit soort problemen.
toegevoegd de auteur Steve, de bron
@Inerdia: huiswerk.
toegevoegd de auteur BalusC, de bron
Waarom niet gewoon Agenda gebruiken ?
toegevoegd de auteur millimoose, de bron
Ik adviseer je om je code in de eerste plaats te ontwarren. Gebruik velden niet als lokale variabelen. Gebruik do..while niet om een ​​lus uit te voeren met een vast aantal iteraties. Wissel gegevens uit tussen functies als parameters en retourneer waarden in plaats van velden. Het is niet duidelijk wat het magische getal is dat is toegewezen aan j . Wat het ook is, het is nooit veranderd en zou een constante moeten zijn. Het doel van calcdate en finaldate is niet duidelijk - welke stap in de berekening vertegenwoordigen ze? Als calcdate1 en calcdate2 dezelfde berekening uitvoeren, zouden ze één functie moeten zijn.
toegevoegd de auteur millimoose, de bron
Het is ook niet nodig om InputMismatchException te betrappen waar het nooit zal worden gegooid.
toegevoegd de auteur millimoose, de bron
Moet er geen maandschaling zijn? Ik bedoel, voor februari zou het (jaar * 365) + 31 (aantal dagen in januari) + dagen zijn. Waarom is er een + 28 in februari? Ik denk dat het algoritme dat y, m, d naar t converteert helemaal verkeerd is. En waarom is het verpakt in een do-while-lus wanneer het maar één keer moet worden uitgevoerd?
toegevoegd de auteur Akron, de bron
Ja, ik dacht hetzelfde.
toegevoegd de auteur CamelSlack, de bron
het is een opdracht voor school
toegevoegd de auteur Theo Lopez de Castilla, de bron

3 antwoord

Ja. doe dat niet. Maak twee GregorianCalendar-klassen, converteer beide naar milliseconden en trek ze af om het verschil te vinden. Converteer vervolgens terug naar dagen.

Zorg ervoor dat je de maand bekijkt omdat GregorianCalendar dom 0 is gebaseerd.

1
toegevoegd
Hoewel het waar is, is het gebruik van bestaande API's meestal niet van toepassing op huiswerkopdrachten.
toegevoegd de auteur BalusC, de bron

Ik zou aanraden om Joda tijd te gebruiken. Hiermee kunt u eenvoudig wiskundige datums uitvoeren zonder al te veel gedoe, en telt u maanden van 1 tot 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
toegevoegd
Er is al vastgesteld dat dit een huiswerkopdracht is, waarbij het gebruik van een bestaande oplossing waarschijnlijk niet wordt geaccepteerd.
toegevoegd de auteur millimoose, de bron
Ach, ik heb het huiswerklabel niet gezien voordat ik antwoordde.
toegevoegd de auteur F.J, de bron

Probeer dit aan te passen aan uw algoritme. Ik heb een reeks ints die het aantal dagen in elke maand weergeeft. Als u bijvoorbeeld naar februari (maand == 2) kijkt, voegt u alle waarden vóór het tweede element in de array toe aan uw totaal (t). Ik heb de methode ook geherstructureerd door parameters toe te voegen omdat je ontwerp momenteel lelijk is (je moet functies gebruiken die precies hetzelfde doen, maar twee keer worden geschreven).

EDIT: Im veronderstellend maand is 0 geïndexeerd wanneer zij het invoeren. Als dat niet het geval is, trek er dan 1 van af voordat u het in deze methode invoert.

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
toegevoegd